From 06eada12731a748496aaa300c3af3541e3ebc5cf Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Sat, 20 May 2023 10:28:59 -0400 Subject: [PATCH 01/26] feat: add ability to dynamically load theme overrides feat: adds support for loading external theme CSS for MFEs Introduces `useAppTheme` in `AppProvider` to load/inject `` elements for the core theme CSS and any theme variant CSS into the HTML document. Exposes the app theme state and a way to mutate it to consumers via `AppContext`. fix: handle missing theme config fix: add env vars to env files fix: remove unused code chore: wip commit fix: prefer runtime config for paragon theme fix: rebase on master and resolve package conflicts fix: revert to original webpack.dev.config config chore: clean up unnecessary comment line fix: grammar Co-authored-by: Adolfo R. Brandes --- .env.development | 6 +- .env.test | 2 + docs/how_tos/theming.md | 40 +++++++ example/index.jsx | 3 +- src/config.js | 4 + src/react/AppProvider.jsx | 26 +++-- src/react/constants.js | 5 + src/react/hooks.js | 219 +++++++++++++++++++++++++++++++++++--- src/react/index.js | 4 +- src/react/reducers.js | 40 +++++++ src/setupTest.js | 2 + 11 files changed, 324 insertions(+), 27 deletions(-) create mode 100644 docs/how_tos/theming.md create mode 100644 src/react/constants.js create mode 100644 src/react/reducers.js diff --git a/.env.development b/.env.development index 21974f265..10335a0b9 100644 --- a/.env.development +++ b/.env.development @@ -17,7 +17,7 @@ STUDIO_BASE_URL=http://localhost:18010 MARKETING_SITE_BASE_URL=http://localhost:18000 ORDER_HISTORY_URL=http://localhost:1996/orders REFRESH_ACCESS_TOKEN_ENDPOINT=http://localhost:18000/login_refresh -SEGMENT_KEY='' +SEGMENT_KEY= SITE_NAME=localhost USER_INFO_COOKIE_NAME=edx-user-info LOGO_URL=https://edx-cdn.org/v3/default/logo.svg @@ -27,4 +27,6 @@ FAVICON_URL=https://edx-cdn.org/v3/default/favicon.ico IGNORED_ERROR_REGEX= MFE_CONFIG_API_URL= APP_ID= -SUPPORT_URL=https://support.edx.org \ No newline at end of file +SUPPORT_URL=https://support.edx.org +PARAGON_THEME_CORE_URL= +PARAGON_THEME_VARIANTS_LIGHT_URL= diff --git a/.env.test b/.env.test index f25231a3b..9936a4376 100644 --- a/.env.test +++ b/.env.test @@ -28,3 +28,5 @@ IGNORED_ERROR_REGEX= MFE_CONFIG_API_URL= APP_ID= SUPPORT_URL=https://support.edx.org +PARAGON_THEME_CORE_URL= +PARAGON_THEME_VARIANTS_LIGHT_URL= diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md new file mode 100644 index 000000000..c93258752 --- /dev/null +++ b/docs/how_tos/theming.md @@ -0,0 +1,40 @@ +# Theming support with Paragon + +Status: Draft + +This document serves as a guide to using `@edx/frontend-platform` to support MFE theming with Paragon using theme CSS loaded externally (e.g., from a CDN). By serving CSS loaded externally, consuming applications of Paragon no longer need to be responsible for compiling the theme SCSS to CSS themselves and instead use a pre-compiled CSS file. In doing so, this allows making changes to the Paragon theme without needing to necessarily re-build and re-deploy all consuming applications. We would also get a meaningful gain in performance as loading the compiled theme CSS from an external CDN means micro-frontends (MFEs) can include cached styles instead of needing to load essentially duplicate theme styles as users navigate across different MFEs. + +## Theme URL configuration + +Paragon supports 2 mechanisms for configuring the Paragon theme URLs: +* Environment variable configuration +* Runtime configuration + +The Paragon theming extension to dynamically load external theme CSS prefers the theme configuration in the runtime config over the environment variable configuration. + +### Environment variable configuration + +The standard way to configure MFEs is to use environment variables specific to the application environment they are running in. For example, during local development, environment variables are defined and loaded via the `.env.development` file. + +Two new environment variables are exposed to configure the Paragon theme URLs: +* `PARAGON_THEME_CORE_URL`. This URL represents the foundational theme styles provided by Paragon's `core.css` file. +* `PARAGON_THEME_VARIANTS_LIGHT_URL`. This URL represents the light theme variant specific styles provided by Paragon's `light.css` file. + +### Runtime configuration + +`@edx/frontend-platform` additionally supports loading application configuration from an API at runtime rather than environment variables. For example, in `edx-platform`, there is an API endpoint for MFE runtime configuration at `http://localhost:18000/api/mfe_config/v1`. The application configuration may be setup via Django settings as follows: + +``` +ENABLE_MFE_CONFIG_API = True +MFE_CONFIG = {} +MFE_CONFIG_OVERRIDES = { + "profile": { + "PARAGON_THEME_URLS": { + 'core': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.15/dist/paragon.css', + 'variants': { + 'light': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.15/scss/core/css/variables.css', + }, + }, + }, +} +``` diff --git a/example/index.jsx b/example/index.jsx index e4e245175..842fc5ade 100644 --- a/example/index.jsx +++ b/example/index.jsx @@ -10,10 +10,11 @@ import { APP_INIT_ERROR, APP_READY, initialize } from '@edx/frontend-platform'; import { subscribe } from '@edx/frontend-platform/pubSub'; import { Routes, Route } from 'react-router-dom'; -import './index.scss'; import ExamplePage from './ExamplePage'; import AuthenticatedPage from './AuthenticatedPage'; +import './index.scss'; + subscribe(APP_READY, () => { ReactDOM.render( diff --git a/src/config.js b/src/config.js index 3adea36dd..03490bd67 100644 --- a/src/config.js +++ b/src/config.js @@ -171,6 +171,8 @@ let config = { MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL, APP_ID: process.env.APP_ID, SUPPORT_URL: process.env.SUPPORT_URL, + PARAGON_THEME_CORE_URL: process.env.PARAGON_THEME_CORE_URL, + PARAGON_THEME_VARIANTS_LIGHT_URL: process.env.PARAGON_THEME_VARIANTS_LIGHT_URL, }; /** @@ -324,4 +326,6 @@ export function ensureConfig(keys, requester = 'unspecified application code') { * @property {string} MFE_CONFIG_API_URL * @property {string} APP_ID * @property {string} SUPPORT_URL + * @property {string} PARAGON_THEME_CORE_URL + * @property {string} PARAGON_THEME_VARIANTS_LIGHT_URL */ diff --git a/src/react/AppProvider.jsx b/src/react/AppProvider.jsx index 79f822b83..cb04aefcc 100644 --- a/src/react/AppProvider.jsx +++ b/src/react/AppProvider.jsx @@ -6,7 +6,10 @@ import OptionalReduxProvider from './OptionalReduxProvider'; import ErrorBoundary from './ErrorBoundary'; import AppContext from './AppContext'; -import { useAppEvent, useTrackColorSchemeChoice } from './hooks'; +import { + useAppEvent, + useParagonTheme, +} from './hooks'; import { getAuthenticatedUser, AUTHENTICATED_USER_CHANGED } from '../auth'; import { getConfig } from '../config'; import { CONFIG_CHANGED } from '../constants'; @@ -49,8 +52,6 @@ export default function AppProvider({ store, children, wrapWithRouter }) { const [authenticatedUser, setAuthenticatedUser] = useState(getAuthenticatedUser()); const [locale, setLocale] = useState(getLocale()); - useTrackColorSchemeChoice(); - useAppEvent(AUTHENTICATED_USER_CHANGED, () => { setAuthenticatedUser(getAuthenticatedUser()); }); @@ -63,7 +64,21 @@ export default function AppProvider({ store, children, wrapWithRouter }) { setLocale(getLocale()); }); - const appContextValue = useMemo(() => ({ authenticatedUser, config, locale }), [authenticatedUser, config, locale]); + const [paragonThemeState, paragonThemeDispatch] = useParagonTheme(config); + + const appContextValue = useMemo(() => ({ + authenticatedUser, + config, + locale, + paragonTheme: { + state: paragonThemeState, + dispatch: paragonThemeDispatch, + }, + }), [authenticatedUser, config, locale, paragonThemeState, paragonThemeDispatch]); + + if (!paragonThemeState?.isThemeLoaded) { + return null; + } return ( @@ -87,8 +102,7 @@ export default function AppProvider({ store, children, wrapWithRouter }) { } AppProvider.propTypes = { - // eslint-disable-next-line react/forbid-prop-types - store: PropTypes.object, + store: PropTypes.shape({}), children: PropTypes.node.isRequired, wrapWithRouter: PropTypes.bool, }; diff --git a/src/react/constants.js b/src/react/constants.js new file mode 100644 index 000000000..33f2b27af --- /dev/null +++ b/src/react/constants.js @@ -0,0 +1,5 @@ +export const PARAGON_THEME_CORE = 'core'; +export const PARAGON_THEME_VARIANT_LIGHT = 'light'; + +export const SET_THEME_VARIANT = 'SET_THEME_VARIANT'; +export const SET_IS_THEME_LOADED = 'SET_IS_THEME_LOADED'; diff --git a/src/react/hooks.js b/src/react/hooks.js index b1d4e219e..1b5ccdc45 100644 --- a/src/react/hooks.js +++ b/src/react/hooks.js @@ -1,7 +1,13 @@ -/* eslint-disable import/prefer-default-export */ -import { useEffect } from 'react'; +import { + useCallback, useEffect, useState, useReducer, +} from 'react'; import { subscribe, unsubscribe } from '../pubSub'; import { sendTrackEvent } from '../analytics'; +import { + PARAGON_THEME_CORE, + PARAGON_THEME_VARIANT_LIGHT, +} from './constants'; +import { paragonThemeReducer, paragonThemeActions } from './reducers'; /** * A React hook that allows functional components to subscribe to application events. This should @@ -23,28 +29,207 @@ export const useAppEvent = (type, callback) => { }, [callback, type]); }; +const initialParagonThemeState = { + isThemeLoaded: false, + themeVariant: PARAGON_THEME_VARIANT_LIGHT, +}; + /** - * A React hook that tracks user's preferred color scheme (light or dark) and sends respective - * event to the tracking service. + * Adds/updates a `` element in the HTML document to load the core application theme CSS. * * @memberof module:React + * @param {object} args + * @param {string} args.coreThemeUrl The url of the core theme CSS. + * @param {string} args.onLoad A callback function called when the core theme CSS is loaded. */ -export const useTrackColorSchemeChoice = () => { +export const useParagonThemeCore = ({ + coreThemeUrl, + onLoad, +}) => { useEffect(() => { - const trackColorSchemeChoice = ({ matches }) => { - const preferredColorScheme = matches ? 'dark' : 'light'; - sendTrackEvent('openedx.ui.frontend-platform.prefers-color-scheme.selected', { preferredColorScheme }); - }; - const colorSchemeQuery = window.matchMedia?.('(prefers-color-scheme: dark)'); - if (colorSchemeQuery) { - // send user's initial choice - trackColorSchemeChoice(colorSchemeQuery); - colorSchemeQuery.addEventListener('change', trackColorSchemeChoice); + // If there is no config for the core theme url, do nothing. + if (!coreThemeUrl) { + return; } - return () => { - if (colorSchemeQuery) { - colorSchemeQuery.removeEventListener('change', trackColorSchemeChoice); + let coreThemeLink = document.head.querySelector(`link[href='${coreThemeUrl}']`); + if (!coreThemeLink) { + coreThemeLink = document.createElement('link'); + coreThemeLink.href = coreThemeUrl; + coreThemeLink.rel = 'stylesheet'; + coreThemeLink.onload = () => { + onLoad(); + }; + document.head.insertAdjacentElement( + 'afterbegin', + coreThemeLink, + ); + } + }, [coreThemeUrl, onLoad]); +}; + +/** + * Adds/updates a `` element in the HTML document to load each theme variant's CSS, setting the + * non-current theme variants as "alternate" stylesheets. That is, the browser will still download + * the CSS for the non-current theme variants, but at a lower priority than the current theme + * variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new + * theme variant will already be loaded. + * + * Note: only "light" theme variant is currently supported. + * + * @memberof module:React + * @param {object} args + * @param {object} args.themeVariantUrls An object representing the URLs for each supported theme variant, e.g.: `{ light: 'https://path/to/light.css' }`. + * @param {string} args.onLoad A callback function called when the core theme CSS is loaded. + */ +const useParagonThemeVariants = ({ + themeVariantUrls, + currentThemeVariant, + onLoadThemeVariantLight, +}) => { + useEffect(() => { + /** + * Determines the value for the `rel` attribute for a given theme variant based + * on if its the currently applied variant. + */ + const generateStylesheetRelAttr = (themeVariant) => (currentThemeVariant === themeVariant ? 'stylesheet' : 'alternate stylesheet'); + + /** + * A helper function to determine which theme variant callback should be used + * based on the current theme variant. + */ + const setThemeVariantLoaded = (themeVariant) => { + if (themeVariant === PARAGON_THEME_VARIANT_LIGHT) { + onLoadThemeVariantLight(); } }; + + /** + * Iterate over each theme variant URL and inject it into the HTML document if it doesn't already exist. + */ + Object.entries(themeVariantUrls).forEach(([themeVariant, themeVariantUrl]) => { + // If there is no config for the theme variant URL, set the theme variant to loaded and continue. + if (!themeVariantUrl) { + setThemeVariantLoaded(themeVariant); + return; + } + let themeVariantLink = document.head.querySelector(`link[href='${themeVariantUrl}']`); + const stylesheetRelForVariant = generateStylesheetRelAttr(themeVariant); + if (!themeVariantLink) { + themeVariantLink = document.createElement('link'); + themeVariantLink.href = themeVariantUrl; + themeVariantLink.rel = stylesheetRelForVariant; + themeVariantLink.onload = () => { + setThemeVariantLoaded(themeVariant); + }; + document.head.insertAdjacentElement( + 'afterbegin', + themeVariantLink, + ); + } else if (themeVariantLink.rel !== stylesheetRelForVariant) { + themeVariantLink.rel = stylesheetRelForVariant; + } + }); + }, [themeVariantUrls, currentThemeVariant, onLoadThemeVariantLight]); +}; + +/** + * TODO + * @param {*} config + * @returns + */ +const getParagonThemeUrls = (config) => { + if (config.PARAGON_THEME_URLS) { + return config.PARAGON_THEME_URLS; + } + return { + [PARAGON_THEME_CORE]: config.PARAGON_THEME_CORE_URL, + // [PARAGON_THEME_CORE]: undefined, + variants: { + [PARAGON_THEME_VARIANT_LIGHT]: config.PARAGON_THEME_VARIANTS_LIGHT_URL, + // [PARAGON_THEME_VARIANT_LIGHT]: undefined, + }, + }; +}; + +/** + * Given the inputs of URLs to the CSS for the core application theme and the theme variants (e.g., light), this hook + * will inject the CSS as `` elements into the HTML document, loading each theme variant's CSS with an appropriate + * priority based on whether its the currently active theme variant. This is done using "alternate" stylesheets. That + * is,the browser will still download the CSS for the non-current theme variants, but at a lower priority than the + * current theme variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new theme + * variant will already be loaded. + * + * Note: only "light" theme variant is currently supported, though the intent is also support "dark" theme + * variant in the future. + * + * @memberof module:React + * @param {object} args + * @param {object} args.themeUrls Should contain the URLs for the theme's core CSS and any theme + * variants, e.g. `{ core: 'https://path/to/core.css', variants: { light: 'https://path/to/light.css' } }`. + * + * @returns An array containing 2 elements: 1) an object containing the app + * theme state, and 2) a dispatch function to mutate the app theme state. + */ +export const useParagonTheme = (config) => { + const paragonThemeUrls = getParagonThemeUrls(config); + const { + core: coreThemeUrl, + variants: themeVariantUrls, + } = paragonThemeUrls; + + const [themeState, dispatch] = useReducer(paragonThemeReducer, initialParagonThemeState); + + const [isCoreThemeLoaded, setIsCoreThemeLoaded] = useState(false); + const [isLightThemeVariantLoaded, setIsLightThemeVariantLoaded] = useState(false); + + const onLoadThemeCore = useCallback(() => { + setIsCoreThemeLoaded(true); + }, []); + + const onLoadThemeVariantLight = useCallback(() => { + setIsLightThemeVariantLoaded(true); }, []); + + // load the core theme CSS + useParagonThemeCore({ + coreThemeUrl, + onLoad: onLoadThemeCore, + }); + + // load the theme variant(s) CSS + useParagonThemeVariants({ + themeVariantUrls, + onLoadThemeVariantLight, + currentThemeVariant: themeState.themeVariant, + }); + + useEffect(() => { + // theme is already loaded, do nothing + if (themeState.isThemeLoaded) { + return; + } + + // the core theme and light theme variant is still loading, do nothing. + const hasDefaultThemeConfig = (coreThemeUrl && themeVariantUrls[PARAGON_THEME_VARIANT_LIGHT]); + if (!hasDefaultThemeConfig) { + // no theme URLs to load, set loading to false. + dispatch(paragonThemeActions.setParagonThemeLoaded(true)); + } + + const isDefaultThemeLoaded = (isCoreThemeLoaded && isLightThemeVariantLoaded); + if (!isDefaultThemeLoaded) { + return; + } + + // All application theme URLs are loaded + dispatch(paragonThemeActions.setParagonThemeLoaded(true)); + }, [ + themeState.isThemeLoaded, + isCoreThemeLoaded, + isLightThemeVariantLoaded, + themeVariantUrls, + coreThemeUrl, + ]); + + return [themeState, dispatch]; }; diff --git a/src/react/index.js b/src/react/index.js index 0985d9271..173967a18 100644 --- a/src/react/index.js +++ b/src/react/index.js @@ -13,4 +13,6 @@ export { default as ErrorBoundary } from './ErrorBoundary'; export { default as ErrorPage } from './ErrorPage'; export { default as LoginRedirect } from './LoginRedirect'; export { default as PageWrap } from './PageWrap'; -export { useAppEvent } from './hooks'; +export { useAppEvent, useParagonTheme } from './hooks'; +export { paragonThemeActions } from './reducers'; +export { PARAGON_THEME_VARIANT_LIGHT } from './constants'; diff --git a/src/react/reducers.js b/src/react/reducers.js new file mode 100644 index 000000000..d10a98501 --- /dev/null +++ b/src/react/reducers.js @@ -0,0 +1,40 @@ +import { + SET_THEME_VARIANT, + SET_IS_THEME_LOADED, +} from './constants'; + +export function paragonThemeReducer(state, action) { + switch (action.type) { + case SET_THEME_VARIANT: { + const requestedThemeVariant = action.payload; + return { + ...state, + themeVariant: requestedThemeVariant, + }; + } + case SET_IS_THEME_LOADED: { + const requestedIsThemeLoaded = action.payload; + return { + ...state, + isThemeLoaded: requestedIsThemeLoaded, + }; + } + default: + return state; + } +} + +const setParagonThemeVariant = (payload) => ({ + type: SET_THEME_VARIANT, + payload, +}); + +const setParagonThemeLoaded = (payload) => ({ + type: SET_IS_THEME_LOADED, + payload, +}); + +export const paragonThemeActions = { + setParagonThemeVariant, + setParagonThemeLoaded, +}; diff --git a/src/setupTest.js b/src/setupTest.js index f2513825c..5a65698cf 100644 --- a/src/setupTest.js +++ b/src/setupTest.js @@ -31,6 +31,8 @@ process.env.FAVICON_URL = 'https://edx-cdn.org/v3/default/favicon.ico'; process.env.MFE_CONFIG_API_URL = ''; process.env.APP_ID = ''; process.env.SUPPORT_URL = 'https://support.edx.org'; +process.env.PARAGON_THEME_CORE_URL = ''; +process.env.PARAGON_THEME_VARIANTS_LIGHT_URL = ''; /* Auth test variables From d59e866c9f3758ec84d862cd4660afc198d1341b Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Sat, 27 May 2023 18:38:45 -0400 Subject: [PATCH 02/26] fix: remove duplicate import chore: refresh package-lock.json to lockfileVersion 3 fix: clean up link nodes in document head when no longer needed fix: fallback to locally installed core and light theme css urls docs: update to docs chore: update docs about fix: expose setThemeVariant --- docs/how_tos/assets/paragon-theme-loader.png | Bin 0 -> 1536601 bytes docs/how_tos/theming.md | 21 +++- src/react/AppProvider.jsx | 6 +- src/react/hooks.js | 106 +++++++++++++++---- 4 files changed, 110 insertions(+), 23 deletions(-) create mode 100644 docs/how_tos/assets/paragon-theme-loader.png diff --git a/docs/how_tos/assets/paragon-theme-loader.png b/docs/how_tos/assets/paragon-theme-loader.png new file mode 100644 index 0000000000000000000000000000000000000000..737a9505280dc4d19d70ed0d5407703a92b7a70f GIT binary patch literal 1536601 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%0DH^kjYZflWq zh=VolxuDWa$bP3e$((3FWU2bM<%pl+?D>OozdvxAl}fHCj?kkc_pJNY8Lw|ge~t6a zRQ=Zo4q~xN#UaIixu@Ftm3Y}X{&1|n7@LtJT!UD4NL z0K@4j`hK#Fkbv>Afw0bvs>64vuiv!fe16|u=k%n13p5&q503mt@0Cx!$>|=s_ITQb zOA295DT|uf9R!YiJ3~%QYTL-?2u}WUfGy|K#muo_T3)cEBIjP;AAYyNhO$HH?!#>5 zGe{k~si3cNYM}+*M8%$baTS-zEW1<)y{!tqQIKOUlA)OxiSjri>*!L%A^9q`o>OV8 z6mrM#)ot#OLS#QO@|Trt)i(mh4rtT~p&S~0?o4(<|vP(``9T)POgFG@=AMz2-N%v;CB;H=0s?80MT&cQEnbQt)d@a zHt`ij9e(m~XEwQvukx)oYSHamLi=PMuQAK4yM-AGnl=o%e6{~ujFtS*6-IyOJ|K#7 zo6;y%eJuvd2V=M2WrUvQKysjT(Kvy=cJBv1Gw)u|?@L((i=rGBFS-rNlN;grV9C>K zxFtj%_oY(2H4Nys3;gmFLjr?5vD4kSl||&uu1}F8UzBIY3d;Ay*++{r>$$Ut#Y8?l zY8?0+d_1u`s`n}(LlwQPMjW)|-XCp_=rdiI4*Zq)18Lutt>n1TSh!Y@PP9*J;ku+i zWN~qbEdu!pWz^-}(L(2E(7lV9q_Uu*-{-KVJu*{Sg-MWlmAESH?5_OP&y5DNAN9;= zE7Ag#$F%#DlL*t%@2&>nyw~0kX9!a#Y3~)tKGpb0Fd>XY92>o~KqOWJsQo8lcOt>( z#AH>bX~h8)_I&u}^bHlByvg4%haE#n6PKgt`-ZP@^ew|9{0yC8l#x^s&9JprN~ z$$s?O198P7Yvrx`wS_mleMg8|ZKmux>hV2ni5xxY^4I#W)*}M ze<@&WBIi|2c#hIHX5^0oJ3(g(kz#Tx^VK*0jP zgSgpxoS{uSHre;=U^mWZ7cAQQN`L>jJ5PU@U>>^|vgI_8PgI*Bw{1n=5TEP#zri0 z_`-w85wSqeA{n~aC9lIMM%?P*iK;3Hkk*{1Xa)s+w9d)I#9*csy-E1-MXDkpmQelh z%wahUxc4gZmF$Vm4mJ6>JLt?tV9pc~X(>{?7yJbo)=XsbnbdE5r!0Cal2~ zvxpl>z>Gp)W-Cb&vu^nqoJoZES^~pqPaWjsJ~%jEv@R#|4?h|2M5KQ{Y=r?xL6^O& z#sf$}jgkURQyc-(TUxmeCGMP*rGSBAnColE~bDcIK-|EioX zh`8a$p|HkOyFVLWz?;`p%X}=s!SbTvzsYwB6t_Ps9KoPgQRt&S3h$Wf#)Vs_XF_

mrRx`z1}Ga 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%0Af;hW$DKcY3 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

{{mJv_w9O|iAp)r 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 z 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

o}B*CKIiM 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

<}DAa3<$I zwaO%K4cMdakJy^h{Qi|8D%~XJ5Jh;S{#nF;*g;_#a?(b}yAp3;FDr0YUJ54fX&2hL_SdoVHE-E^b{nPmNZ*BBQ|M#ysRR zdt;I?HNf>^&GU|rIDy^KhhJ_8LR{xr_PdTmoGG<*?O%Te1A`J|g`cX!9xmBWvxia; zg)e*UC+eHc)}LNcXesppD|ixWb+mYR#K*dhna=I{xz{{CQYXw3%8kHPL0oQ9?2YGe z&^8uHAx=#{Q6C)jx z$${S6PZkWs$5Me+R+-POwdQpbR>{8DUOS7x@E8&}zUzZ%>-E7iF+}o06q+g4?YS3l zlT`0$I%%G%jh#$2c(ix6itRdE4wd*ZEN(2X7MiJsi)%fx1M~tK^ioC#j09F41J4Q# z)^u7m(m8ChJ$g-+V=OUJC$IiYDb|@)GL}L;X4M|QT{~H~aVojgJXr2Fu88hS+o}xb zFrDS0Wo>5E(fa-kW={1Si?_&~`VqV1fvCL=%(slIov_7W60v3vysuus#~wR8J-bFg zNn-akLaVSvhpoL9NgX=d*kbvw9{o6JU5h@1teo%3TY6nUPRpS!tHc~l)J={`Y_AHL z1(%#oY?aVu8Tu$5KV}Byp3=|6k|W!T8W~Ru89mMa))gWkwf?S0ybu{iWTqK6D_Wx% zm@=tGUX?qy8Gl8dW#rbE3lYz}DZ|t60#2itcHG;?n9<{C*RC=laJMrrd87UrqSq&r z)}Juineyi=q<3I=Zk>S zORXY+eVi-DNsz1mftu$Y<))zPTSaJPiU6lOYFZt!bp5t?45oI5_LvGw1ISS8=ndF%frPh38TBP@8p6XTLH-DGJ9*z{t zSFvwNPfTQa(0;#fIT-b@b%bL{qS+~U|HNdoy|5JZJ}D|rN^g_8TTmnSPpC@LhY@AR zB>sCi*_IUjcC||;ooJ9O-jc8`{tm?OglDdH$S-SYL^s$l^<4LGR34??B?)4*t{*}o zdK)GBwR-A^{Ezl7#1)@oKYBprq`c~s-reeN7k>4wBkkN4-SkMJpj9qS9y#!HYEzT{^W4)@ z-iRD#9LQW!w|+pebf5TAAn@ADpIrZszW&O&j?b*WBtvKQp>rQva@$)T_{=b8bdqaS zPdZqMEOeJrpWVVeCXdy)2Y+H-dV_fhQ62uaSTuWHH-;wiXjyTTS8Txw=cD<)V}j3h zOp8OJU|j1qIO7l}tmezx_xes%%P%N2#k`(+9^rjO>H(Yf(2Dq<&?X+k_Os}v_wLH3 zp|Q6hW>%fs|9S_%;TK|_vrUPZVfAxdU<-3X97xjr6#a@3a zO#a0Co~l*wb*LcL>4I|h>tb4mp2#S!;Bq~ez!zM<5?PPQ8TVeOJ~19i{kuPZby;#R z`e}YCOxqW72tPw|dWmNqH;9>X2{f3^VASp59-nM?s(Et#9Riad3Y&Tl=As1%q1BeR zg)x`RzW0}2^;W0|;OuQZD0>5MR5mcG2Rb~-O~eL#nKzBA4{U4rU~7R(lA-61kEv}? zpAjNT>BCENDThZGP^%FPo7P-<*pUqR?+*1Xd6dY=5c~+h&{X^Ey7YSYQO1?Dk>t zv%kTvJ7jy1ty!_J1*Or@vaz^|N0ri$0?}d^(n6>dj@rbFeb9%7$hpbeV$Q>^@|Z_v zF92jv1LfRM?rcFcT$i{IS%#UHG~LB*?z^9UysIBN16J5o_o8Fs;+jnh@hFcj6)Bt# z1OLx#_h0`P#0zxxEvvuRf&cpA|A4`+tYlbvU)5@X*RCu37QKNd68Ob#dTdQI!SP~h zdjg8J4c&0&C*>?``V5L9zn`kV&kJ)^8bf}sZuuGaY|42{ZIdLy?~=}2%^pXzt*ZNE zSy*_HmP7tV7a-JI0SyhqfVDD7Ah;7FYKwC@&-TKhom5duH`)Cu1j)iAUKYt7Kclz> z4FGucaZi>%*a}Su#$dEb_EY>ifJxa#K)s<4?{V1gTo=;K#b>RdrB=HvH)?`lXS_iuMy|s;7}70=5GQxQfJ!(|Y{>|>SAQR01~$OhV?t{S zoZWB$wlmTOYI{XeVK?DBc5pCem~u<&QL?^($@j#hR7#r&v@le&M?de$nG_wSNhPi0 z^Ai|>UW-qS*K~hIV}ii=*EQSXY#*xZ{qY<*GVh=G{oVfr+ZF2M+xPQGumJ4)`1BXT zz+0dxe)dU?#}OXeXs%dMh*Dn`s8}0AXWxBEEFt#k zpi%l`M=)=F;5kJaw(18Vf4nl#*)Jh8yPw3Gt&2zp!o$S4nSFrBQ9Cx!Zxyh*LRRL~ ztK-JcZaguRyqT4Oa@2Xu*759C7UM%LA$QPZ6qV2ABv54E^&QAF(cZ)8OHDnNwQ2oL zs{DD9IR_6I^B@pYy(IOxt0%t$M{PqlJkq*XEL5GDy|ER;K$lrkl-$OZTXlojKZ${8 z)JV6sIwvhR>(WWUaKD|cQ&i7ADRHzr3dZ)t)f(uCX!*ZjX;TqXj3XAo#Ta#S)nR3qrbww0E>9=h4tA z>blb_4xYcEow2A09?wpc3KJrO6Idk<17uzNSdIr&l`s`-HMW1J*ppdsVRL(H&F(>W z6Rzdsuf_kzdHkym&v#l$H%^PEf0Rd5W4^(k^AMg=fU}4$)9>b8dwDY~^}CS_>T*xv z2Dd$8zbg+HRsmv_Swv`$h1~3SZ$G9}U;Zm`t>%K*S<>)DB$@c`*GBUOJ)a4hET&Na&CFbYZTF{x+tUSN!V>GBDsskwyH6I zL&Jt`BtB4ifpw(OUuK;2(F~5Ed@Nm$4WgFj#PqJ#b1;p@+p)7~L>pNDlN79)CjF<2 zG^Gc*2d5fcDL)z?mw1S)>XBe;006FYpr0#E|f*eh^@@awXS&ES1ho1AW>u)tuF5%^x{<_yTN%DwLCf zq7QY(2C<_s`uZ{kH!Vf}sI<;{@{l21$-*J=6Eg6+OF5zy854mmq7g&!4;?ZAe(kqU z?N-R+X(Hvk(`_&%eHM88Q$t+vY86^Ope9?Ab-4df@ z+Dj8__xBlFNl!MLA(iL|6_UObIR~F36&poDch#TLk{Q@|&tUnxZCQKn@4HZp?eb+# zd-h@tS0OT@r1D5m2ate|1s+(qs$6Rw`8VR=VxQ!H4OapG`UE(ix{ac2mF_@|CL+C+ zR9t3$?dEZGpTlryO-_}}b&yQ3_(7AgIpzo!I;+8~7YMo^oaWO0e;!)$bpCV9gWS-d zYn-fP`0p?N=i3mgk%OthExO{b$9jm)2!J%9EuU%Y6MgUIYk!qv8QGJRo0{0gSj)~n zFsY}P>Xosq@-r>vhz5OXPU(e%t)sQwIul>oj6E1Vn5iy+-5d?w{CoFeoy#Ord;EmX zLdSvhDgLf|6@NRLi`$69(-qNon{3mjyl`D#3IqpBNkS*mm_ahH^}&CX)9Nf-%i(z* z?&D3X53-2fhx?*2gX4S>Yb(%&<{YAYIBI&QObbFEjkC6nyRB+VVS-&J>eu;`h|OHq z+N7h)w#AO8v|JkzEL*m1hz}f{v|c-2faSJH#wEqQj~%;ex&BTya49k}EnU2HO*#(L z#tFvRt;?iT|2B;m3+=RhhId^LSFn`NJ(9DGO;}g+-6=Z54GA}jp!R>&I?#UWB$V>E zjHW1(+6z4r8qZWIe&iU}gW|^>coCcHDi|Lg2=B@({d7ra^J&%eGQQ%(xAm^j;C3F`m*r#a| z&x;!1WPh`m7tfd?+j)fMg6dh^R(K}Oc30kyM#sN} zgpX`VpzM&}YKJkqJggvDjTD6DN$6$jfyu7vn;=?8^eZ{(qLell_c8A_^XZ|^0vB7N z$!pxbn2TLN{W;`qQ@3(ZV4YceAx)HU) zY8?^doEx$UemZ#e=c(6~_CS!#Fx`DKi1yaPUet9iE0Nv0XZ7Cm`M6SA8RN+IRJQ7e zc+aTcnuUIAxN@P++V$Q5u6{i;tBa=_4s!fWv>_n;hPwJo!}uq*K*?K}2>M_<`G6J05u z@1~qeJhI&TZ55c^hMQ6zLU1HL)VO5n=0NApRQ2A}Tlduva$aYM>_8 zAZ5aY>%Y6M0MfL>eJ;LPK(VEg18K!)&QrB2lenLEuW;rX?tIUIEXA6WwMo~bnu=f@ zwrY@U>w6Po2B71RjXTu)@c(J*c9E1gu%Lz&bMYZ)0jB=6%Qd06Z z5lq@ianocYLZIoxu%lF%=2RopzWZztS+Ki1{X6Drk-P=X-Nl@|{SySb1aRQ{1YtDK z(9Nv9wK7m+I~v!|%$)OutIX3Um!Kb>z7vhl|Gz5pe-3TX3o_{(Uwpemwltv>1Np~G zg@Q}?RWmL%d=K@rVBi_MKnpfAlR*81MaOjijGllmm+`VOnp!NUJHBFUb!Vd2LYh>s zLyczuZ7f@8mSy(W!>o<+feb*XMLc@!DE&Q!E%eU?H#a5ytr|H~zK(;IQ}3_vi~6eI zmkkd@j1cB~lldEDUoG%RgbcZx^-G~*xYDY3B!VhF#3Jd~2BU(DJFe;&KLc*;$w6ZL zI??BULyXmfI3|$!W#BqH_(8iizL=$IYg`ThvMu;(FVo(taBK_ZcA1lqzQ9VRElH|mqde3Ju$FG{gI;=Eq%0*WP?5R*=dI-A6GP- zkxX*~(rCEQU!yP!l88Nqf2F{*(62P;7Wc(Pi+xc;FiR;7*PoxD{%pb^z}+NTKeHkG z3sG5~Cgf9SiLvL87vd|t=4LS)4g*j-GYi>@;lt+FUI@cX|MVsy+w3kT~ z(l#b;O;^VG`lvt6MLf?)_hib#%ru`$p`I+B&7L^nOt&+!lsJk^_eSO5@NCh`wo)(@ z9VE9f$^+EG3~qrm*WwvsZ(S^J(nLDeN~lB6E!J_=mc$lKz|zl)8J=|m;|ZVZ#cVM--gfR+qf zLU=_A(t1eG(F!Pa-9)p+-9;F&a-m@enH|uQxW^Itfb?B0LV4XrM@8Hx?MQ3T7iv_Y z)i(rh|AS4o%xj$yFxiAPJ?T%f{XhqHJxLuugK;qSf?(wYhUoYOI)(|sw610?S4hMU z6z5wpePuXTsoR4gSNFda_OA?FmE9;17Gn#af1U3F$R^}ViaF;>uK+;f1u?2O0qdC$ zy~z3}8*dCFb<*}tT)coy*o)&!F!UZ=;>o^#;>wy>Ye9HTad|Dxn- z>L%$Ua{oDUd1>*mL%WC20eQ1_sv2 zwWk1=*bDT z0f47gbE9$SVJc_dH!Ye9hYE3Fo!AA&kU|;-H*t)*tJqMJWCo#(;Lmwx-a3mX(JEh2 zJ`bS%=R?0U3Y9oyEHcA^R!@O6AVwi;4o#nfUK<)fJ7lD{Ry4@ z`*yelAocYjFPTp(Rafa}FVGo2!Sj4~dPUu|c}^`gfNNX=)es?MA%j;Qu{PogeMq~5 zLwy<*vl&Xi_2JnRb0Tm#N|R8w8yk8N5Gt$Ng_PQ3AVO~$?SsOTs2-F<#g^T>X4YNm z6+d<;Pd&&68f3#f>xhYV(%h!st^ML)SX5KSC_mKlT_|7!SCv>;!pDcRk0An}5)gG~}qBea?8Y2Ot=brm! zQNuA1>PfhYi=Ekte|s4RBz|FwVVLl7`1;2Skg~+TSt7+22#DI~N$VoN?k|`>PwHv7 zBEvsxFxax>Up>`&(nOD|S}M=?P!|$PjAkkA5gDE^x^`L%5(0#(sUVSZ+4}E4i6@*q zc#T^btcn+CAc(vniw4UOlc<2^F7CLXdXgT)9?GfLb^co*TQ`>;kqG?GnackJA?h&f z1J^5VhSnbQJySq7tQ;r&PRAtH_~-)_G1K#*Rpt1=rAM@#sBhxi-RU2`6seorT|5x~ zFx2E&p0HlZ1u#|1{Oy~PLju=IHX$PJR(n8M7?<= zn}(xw?OGh|j{ocG<|XUtgs}P2?k7Zo$?%9CN}B_y43 zjf$dyw0p5>HE8SkrW%R=8w$_>2}}#tb_R{R;p4W$Blh$gw~J9#q1S-8tRd$un!^*w z7#-sEd?Te7?M$#|_ii+G>K;Ui@)C^7FcfPY3Cy1di6i_78m(t8#& z*q~;DERZv6jZKRSSon{3kf090QI}HWc`FMR=WE4AQWa@3zC73D$*OJ{-)yK)#GY&g z$@{{33sk;8@vJv1x^lk(MPb-oetlE-wK&B)( zp?|KQoI~%Cg8pg}g_$phi8(y*1Pz59fZjHI$`fB$0W+gfY06|*Sbda}bPlvNcCKZ~Fm4!WitA`M-b|?*-3mZg? zNMBr?v?%i=lv}!OFh~_Hy7f8VFMQ>6piG27JE&p^OCCvsg)MICO$e_30oqfdCk?(b zVP8tZnE?asZhI?+)TZ5N2m7Q{_MfA#7A)0_dhO8j98l?3sRXvo}uS|9O8f81({8( z=yTZC@ZJ5*4*lV0Vtr*CSG@+;g9J-i>mAHyNT686rn>p)tD762Y2T^5cyozD`Dv2; zN^V)g8zUHG;8I&-lFoJwTx|I92@0m8jY^wN&=JVj>YACTktwu_O7oiJ zv^MskzK1ClwBeGBc9K1dgJ`&LeTXGGWT9}4y@<f+By|RGZ#(qA-@3Bam!Pe2y4qvjzRrRXr3lfCIoah(F zD(G7QrLo6q*B!oBXTj6Q^K?LPwDJAe_M-8d-$D#0{$_D*<&=Q5vjfhQYDN+qh**(m zkB2}To!;6}F10~Oreq3&z)i<)k%V9%0IQpZ{|=4Z=aI>aTHtlpPTGxr; zw%?AHYe%C3NDVAMYnB39uYh5ND!CU-$`n`g5eQ%E48$F^owML+)J4MGGY{yw6Lyi z)=ds@9$i0ye_#sQHsy4i=rkYXLTqA^Tso9o9fwk>i^5YrY3x-EU*^$CH%M;mprW$2 z;E))@Yh;g6^U(Ie{BSUqF0)X(>mqO}Y%mM+*$)5J{B{XD2lk^Z*DtKd{8x?HPO^(M z(cdj+Gc7t7Ygi>-=QCNJ zz_%Q6i?AtIUmDoj&7u6Dy6QD+!(y~;E7%wuneC?9_HLAowWhgQ=VO#pL!tBd6k-{g zet`awpEk57DTotqia)x#ZVjIVYY!WOH0_|>0vWyI~&O8-9n^_)W-RBw`6v=&HY76TG7#%A9g&Ip-|3Xtrju?U|l?N>NQ`-;l@T&*E*=Z&H>Q zDyV0Mznq!bTQw?%ti5H-W^aQx_;p@<8#MTy*0Be zOLm_3rIajZOkF~ETtjA|5%FzByk%J}3Qel@@`sy;xV$zmt5sdcJoP0NnhZrCsxjs( ziF$6iJdd`wQPDH$-AlIZ*mCpPfeq*EubfkO!@)_*MUjLSGkxnOF02FDlPddQI!wuj z1s%2Br5g&zaoHawD`~Stm`9Q7X~nlKWcPvl7Z(MLVB-=bW9z49f1$WkqR1@Ni}S3g z8?Jbm%Xsa@%ZWbWH`4?X#{!09B40GVZ`}Yi4T0mC^uJ5 zRtNmkru=^>8JYcL_uR6I()DX7R<$2jpM1)T)~%$)3`Tf$$OHU0)V|pm=@o^J^cxK{ z&{whBkL?iy+kFJNFX0mD|CESS6MS^eSJJgIL!U3VYRQblEdSC{g4SdCAl?1NUj54y zM`WS@z80=w8rQ=vTo^1X)_3H(neF$7CF*8{qS`ZLh9+4xy3N?!C_RXan1?HKz!06_ z9@4*(G_}dWQs&F-@wXyRbI6`_E!;M>v3cO zGk;Q)@#z}xB3jZGqcnl3!PoC9y695(aw)D#1>ifL>E?6=Cc5b*PvPr%1sJNI-+VtE zD}!z~UVkF~{Jm4T7+gd!*y;`4r}|m-$v?8`T$cVkhwD!`@dB?{@`_r|gslBvJ2>x+mR+Whj@bIE*L~t%23=hA zh+e(Z^o8=YMA$QHNq(nI*+<2E;uzhI_79w$EOG4dCaX#|JcEmF{Q-Q~isFpHs=mIP z`1%_SH$)8{vYM+D=hS|`t()RAnV^o0$-2SXf!&cbX%eZoGT2UYLHD)4ChsKLyc5W% z-pkTI#WKS!_xqLDPn02b?ykve=6SRKNS^UblN+dbm)VOyeFpfNj3R!3nb9no<@Dsx zF-~l5+Nz(c1jnu*^tyNVdQ4Z!vq<0Wx6ODUyvEkx>Ddf)X)i2aLs?Xbk|&=#<(MpO zevPS41}QXm!94#6fHqY7Rk(CvO_y02-~Mdgb)Vqixm%_SWftSWd4xFJ2HH~zc~-z+ zB&3%0$bLG6d{D(c)AVloZAMQwp{m86?4kmSo#ft3@_T zo*NGB;9KeSVbwUv2$5KNf63&UutmCyB=^qTERl(fisuUFvJxkUF5z2YxQ}ZM8}nI0 z%r=;^VdqN!oz*RLDkPx&9Ad`LFH-GAW4Q0T*T8SdCM$7FC_LYh&hW2F&nlAdqOkOV z{d~2)ll-<_yH9<5&0!5Z5ql$ES$^T#uY)U{uS+w(DIbJ>Lwe*t#UOLkF-4m18dDDs z6w|`xl%gZ@9=M)Izx3(uVB|fi=syiME*9-wyxGf&iX(s~<#tB+6{7#Cw@ij(r0NnQ z8y^x(c|-hVG1VbvO2D}IX$=nvLnO9H#?_&nduh2WL|un;BTA-5yNqGP3tUCJY@IKjD*a!TaT+=~LKXKPzSIh9 zj@rk8nOF&lS@|Ax$D0OTmgl?#f*^+fD6t`V>HB zKeuVtHitv(Dgp7rjh4WN|i$_qn`U_Wp z;ub{zlV?Dhh2KkJvG;3J%O`xec+85>z$#6BTzmF0jR(l}n~?Qz&Hca(L-s=RA*J)? zHbaR+4@Fbhw;AZ}w5%T5VU*t#ZticoBV$qT1Nt)$e1%_JJro-jY%9%G44slo!$(9Y z>$m$f0k=6Re(L@6x3!GWtXJtnS97!X?kzhNpl&z$!_StV_GCV0gs_kg&>FvLs(jAS%*a;}sne0= zr{SB$u!A{ao7urk89af4m4$n!&)3%^_aNX&enaw}>(*VxMKvbv-+4ufe@8a$_eKE@ zcBCZ#EA;}8Hu<>k+_H$6@8iBl>iU^O#I#h8eZVD5Cm}mQI-(qD_4!sWp>ly%a2kME zc_1A2V{QSp=u2xPU6n*aM?rC1pB!0xn=>^>Qcr2U=mY5Ko_>A3g?ks=^5j>SZ1&2|HN~q;Q5Oeui$TCuRrCI4*J;rlEyZJd{qz@pU;FZ;oMmXl@R@vsKi5T+A!QBI_(+F7LYD^eiWcoqLFmAj`y%^!b`Y_elKm$+ zo&vhPzsBS@q-)KE+&QC~bjwj^?Lm1{wk_@NJUY-i{F;_L_5P9+sEEA_2XZ3!C=wqi z4c$$DykW0;*R=c=v;F`5FlC&{RJOM7x!^n_u~!h&S^p@omV6(agiZSCQBgN?eJFqc zv8t@~X##ol?r;^hWvO~! zF81hHZPJtR*Q$H&9C$DEGt=B(W z>6R?0j~OE_{uLR!o~%K?EVgLHeBQo4!Y!;D$g5f@n{{-)S5==>;^Ivrx(*Q5FJHOR zvLINIVI)Vt7w)V2v=W+~fj-#mn>UanJ+z%y>f%=Uh=-RDn{|{&19gp??zn_`L-J#uG zL^|z6-6A1UC>aeSLb7*cMOI3SD20-hJu))0%ZU`(WGl+fPTkh;dUej{`*{2wzj}N> z=l9QfbUHY<_xtsFj_Y|{*RvL^BWJFS$mpU_-QLRA`!XHs=6S{RLz4aLzl)5Ei~Wi~ z4AaLhzmh{~pf$WOQrmxBA`%cY)p+YGM|N2%1I09BiGBS;z#0{5VYL@kr^Jt?rOgLD zgbFdZ2tnK{=m3G;4Y?VIRv5@x;`isSA#pN&g^t*-@AYq5p0cxeMBP_%1}VR(6GnJ( z-N&*;2}SV-+=KN{S6c(%F7xH_c(7YT1tkxszOT%C=WNtZ!i}<;tf(HFGz)yYNPj_)$GUf zzsfz>#zSuo{ZnprAtwnb#A1{HjwI?Hd$c#I6~3o6g|4nIy6zr)B7Z!=cL^$61yBG# z3Rqw+anwUSc4P@S*ODqp=eA?y$xdmM_uJyF_s(CQPzSpXEZ-d!x(X!n&D2a6IM-pa z?6X1qiW;eefQI^mkRd}f5QE;gEl8;}J)p6RH8CKL+&OjM6wvO~+dm%HpMo}OyX@UDqLZo?m*W>jsPxNnI65HlW zr0M>_kS6xKlYX24h~AMazr$$ZGwl8rw=AdCWuUf|?j3^g$nshvJaBl;#*fw(QNMRD zcC~(X@EnggSsfOs7}~yHN$By+^5+ehekv870|`R78DY zSp1fq?S>m`7STNHZB_26Ly}93ogaL4UUO*j5U)UMeVZ?ixaLXluJ6MV->r}M(Af!BdUDr$eun1%_8<3OkPtrO*2MM8UY3pfZ@@_U)Z)PF-dps@yI;aTT(P|Y>Ar0*_1=Bjslt-)OzQ+PuPA%Z^yNS2!&2y_w3l}otuD2 zJ;by`8Cw1Ah#)?C6_1sP;J-GR;nrm(!jRx#O#GPC-stUTJMnkk9f;g+zUd4uGMm_1 z|LYPrS!gNBg&Joc4vc5-Osr4JA8=BRypfwT+&G;@!Sdq{o-Yb^#hQ5z)!(^vRKVc# zMGoDXE0)GX;)p-8rT6Dr!{L7wM{ey#n7D9f-|vXW>^!7*dn0+|`(8-VczY^C0}woq zp@fLS5*wbgR@<H~l3N_pZhhyK|>3KWMjHvTulrbZAfOXPyZ|@|!JAd%8t`C;K60CwR^-faMLM2lM z=JaRe)cfMjj$Kq-iyNb%EQ?pdUtOKTQ$K06pbz)o%arT~{dhrkBpW8R{7>?*N8E8Q zJd2opHpVj~X&3SlUlknhqsWfBB4%iJx*r*a2pskij0~jDGrG>tW?9K=q5ohjgF4)( zsB#IXRL6>XS4>?OJsqlx^MgWUpQLWp0b^30sJj}-a6e(BHpJ_%8R_Tx8voLQUKvkY zEBN@8X4@22X^*X5ZETB}=<{4LK;gmwg^DAMNI-QSwNII+vG}L~8d6Dp9H_ANSv7 zoLhsF@)jR@SFx@6LVja@M62o^=2iLRun#w-S~Djy(>m+zVt!GRqFY2AzZ1SOxwP_b~@z$@l-OpMV00bE$(^e9v~c&NXSl z3CaZ6ok6LpvoY?`paUcl8B+HQt@HuyrwsHIlP6d~Yv^S)=~#{>tgWa{q>EBR%KQ|?w*#?RWTKVN z3bf%uvudbcQYx`aV_u*dtMu`Udh0>snwJJeZ+o4 zA0m@mIje`uXxFgX@@2{NVg9J(A#fP{0SYtMihZK@P6ri~VAOJEqVN!qjv5T%Ya4e^ z9yC;4a@OSE=`7wWOtmprwhMQCxu7o(bXX2&&Zkca?A$AMQ01;$mRn(?V`IfWTB~w# z3-KlvUb_EXTueh#p?+6ZQcV>&l5)&@U*(VroahzIbM0{JN zxsCY==^wcxfI}&)9__}Nyt4zuFU^faJ zc5E|6{dfv=W1m9fZRwsx>eusfr~`s0;nSgH&bzs**9G&kulpK6l;gI{pHz|k!e+qk zEZt^mA{OXH9DTmq83YrCXaGS@a zbF*MW8RV&4R>f%K#QfKGh0q?lx=H2@th71_OX!tv#w;?G0}wfnBiH;1W(n84&3p8I zEP{N&n`Ce}-W*t>a#ez#k@_`W@WNkgwO{G$P8Mrs3?43=bSiMEw9fd$KVd|EQjpP4nM9Ixgv>@(A)vJG# zc4Vc=af&FmNqLCh=%(j}oPe_qa^P#|q0d?-y%Me^w>Xvus3~J(N$rAW*=0N*KzuP` zkMLZ^dYZV-akM_zboBQ5oS<*j60dQk97TzU0Ih|>n=e)Fv=eD47oS6D;(K>M>;oA2 zJ0RktI4q-d4#8Io&NKTv3z{XRmO~%A1@QUO_`+HR(u#6~^=mF!!}nmX{##+rEr~-U znKL)CIt5Q_JYn_gyTlDTS#$+fBbZ;4a#96Q7m0a|(EJQc29JaEq7ULy=4!MK0bt$n z4H}x}vS+aZ^b5cTquXHqaa2k2wR^dFy-KJQ{p_n-aehBomu=XFL}XJ_7vasizY=*1 z+97>M3JA|F4x9}cCb7oZrpQ8Lpr_JLq@ic`F+E;fi=*_(=m7Ogg40M6Mr~!_d2a9y z_lB&DkBCx7p9n1Rw-aTjM37cGR(Q+mTW&sXg;gq3MJl=6YMdX$mhL}rngoizetW@L zuR%@7HTcCfhzM^1W0_*n!4GIIyX{K`K~?&%gM!BE!v$~2Q4?wS9s zw_1vbii}iChe+Z_XF6$o2&(pKQ{K8sY$<<>JNy~o$*C|222>E<`c)&yM@N{pVPDP4 zetie87(-F;s9wP5()mm3-`;pA7C#$I1Fxy=a&6hIRxF}@W%OvS!L4uETDstgPd!rf zI4C&i0C9=+r@t0ekJKaM-42NesYJ2s)#HS@L^p{Z(1os>k8`i2etU!|QrI`t&n&!e zn#|o+|Q{&c#Vi*if;d<^WYqd_vo)~HQ(>adf9Zu z3RDWF_Jf@Nlbg7l80lv(!>D2}2|yL5=M(%{^XaBB=I6|FZ3kBG^JUIwb*&?%w0Mg{ z2b&(m$pAq7Iu}O&Q}d7xF;%Ac)qj8Z2sHPI)I5U{P0M~)^PnwKjX8C%$pY!71{%Pi zJGE}2XifPKrJ1zlWQ=Cp8w(R8Qy;im4Hik3hF?muf?3{fs)V76ds4MR4&ME9xLk%B zAdY9WI#0FPwJ|x0hMUe~5sTNzYo!LPPS{Mer&n*-{9$vE68$m+{&$lH?GDT1-e z9YNXifUd~29n$PSF~z$_IGOvG)|lO!OOhJ?M!WzH-^nYsSizW}6N@J(_lDiyIYvIn zK;#?9ygR8b8{XE8Uq-1Y#&{W@!L|<(t&#@%li%@&JIav5IQK|u?*s;H$ed~NA(qw8 zMC}pl`R0e;z?e)T#S52wGWr#4QNlK0o@lygoqEc7cV?=c3UZuof$a7e_Yn6)ReAW% znB{#7zybj)Rp+k+zLMUSP}mO>QI6Or0=m)>k37W&OuY;I&(>qww+B;=G|f8&_Qpj6 z7?zp0WEMWM4!(~|CoyaA{E@|gOOKFK}q5G)!r_1+M zzClkAe8M%Yf)o;Nho+t{USMY#(UX`A8x==WiScS-I_XE}_USDw)9wT(iDq##Y`*-s zl*Z&fFF(8HLsgXr%Z>&TTrAS1G6;+otB4yYPE{wQ8IcVr+pZka*%|gXbZ~*-;epNN z*Z*4xmwX-jJ0z}>vA#6>Ux&q;#y`QK?~tzTMuZ#xaEZg9%D?Urpg7cr zl@O2-t?vr{+pMod>Aexrvy7S%ZQbyw05Ub6goHuWp@k=2OVljp5$vqeHs()eoq#2= z1kHgTNvPxyrN91sCEAy1o5qv^)GI72m3qbApwBd<-p;-9!y33kV29w=zc%}(9e@Pt zOrlz~RREN??;xGqkYP_9i?6(a6xu4fMl1rY^KDN#_3J}`Yxu)bPRJ}-EpSypu=`!E zh~3~epfA=UUJ-T#ig$#iu(Dl9bb!%ZM-klj=W{}zg7dKOMU(5kAIa5 zRme%L_cQGHbuMHdCtcyxpZu_lS_iRz=@wG=9ycYWe9?mON-J^|28o+TA_ zY!It!l3MCv5Ht*1Tu|GP2Bli*WLiyX`{f?aIL+M5NV$Ob=@p!7|0Al8&DgfTI`q{^OorWv1Z?XT{1tc`_j8D+>}DuHZp!u?t;D z+EQ2IJ{N^rQT#NQsDsj}7=@v6`vmT0Y_(X+kWJlSs!Y8w$f-VPlHguD(3l(my}yHv z>I!FPyHk!815REc8B@Xv^x7>sr0z)?zmQR;T{JoOc~7Tu$M9rEJ34)`J=TAwdc#-W zFx4AMv^!LH(zpuER1KelFrMFnEu!#UuRPO){l>J)u#;&AR^ML0c#IH_?r&sR@*8yK zH=&0E=UTTrtZB>dlHcymx%s+hKE~N0tnZYndBP+m+ZiONj9EIxthJPM^sx{`4vh!0 z?onsaHqoWD)w-3!UtSWG#)W2AB$#M-E0O{W6hpLtM1!p_YSX<#0z#}H8DeVoNl5k7c`R0m%x|>Ly0?G5*R9&4 zT7@oc!WxuuTXhpC@w8>3A2Q1&lTqnyamwdYSw~FRBE)aZ)RXkL(Rt#Yz900O>v#&n z6EVpLZm4<1a}c_6O#2Q#IK3`B2CZ*$WgxXC{-y8NNgxWxPzsv$Y~(-h);plc9e$r^ zF*qd5SA8Ftd(t>kN!XZ4#kuYw8LayTLToJ!l0Bda^@D8ytEio@2;m^OFujlxjPYEk zalI@49_x@gi^qUzD}M5jki&7Q6G-63?*wSff`AC4Th_r%(Thv0c~s@u;kVFD?Vviu zM@hcL40P|+tCNqbM#eyl#60+{#rtu>s>L>no_)!zqo1+Zr)L;g@_me>4r;|D=-`oi zSBVcLxThFoSbsiV+Y_r5L-id@r)@sbQxldV5fY?O8l$O428-)@igvK`PcI!x!n`{9 zrb|fm^TiJJmBZBg3fT!iCXZC@tW4|PoC4iq*LZflp~dXnLA^KZq3f+SZ)N(14N4yg z_aU#q>t79r-3YfqHHqcd=TU-NnkCOeOOPflWf0rTzE;TM39%Crzaxg(x$&Ej!V#qe z&fFW@A>up*?9j5=21O-TxI>ck&qD^-P?|r&UOq(hEH>Yr%>BwB#?{-5(T~Zsqv|Z_ zB9zaf|D?5Hb>don8Q!wwe2qe4775Oexbw63Rrxw$TNKu;1y=You{zkCqK?ETD^v4g z=i81M7bPiQe5%zL>iq4I`GVy45j+7ZI;r$*&x^)JcH88VFXw;DPe9dBlV#bVr0^%H zu+U}y@QUjhhrQvCnS69=PhSSBMCs_GB|W2LI)lg^iK7{dxSs$97 zPtoi%9fIg$Cv^i@Ow?-27erc zk1Ne*Sq>JCzdyJadfnV8N6{pm_eni3ShWw0z2S|n-0k}E3q(QtUWHB#Hg!2zWp29wsaSDMPwEgWA>T)o*ROe~Mw>1D6# z(3}{LFAN&ZwtFh1*b6pBH!xd~{iPU>a}!CFcVNVMo?mCq-;Bk|z?yH=b15?WU7AiI z!?v7c3dQdV^pwu~M==SLgP8ov9G8)7nCGZ*)f1=73wyJhF%J_8vRg)L+t8U_ zc?@4ANiL^Bfq%}SV4Y&|Y~l?PU*$9+|nauO7-k1xO4A-L@u(&ZmUpB)uU0!3_13f+s6 zB(X3aI#v5{0D^vTSmfpb2+kfxlybXFVKjK7I)mELUU7%6qrt&4(Qi zT1|A&jeNU&Xd_mfU4b#IxF$?;cA&b+XpLZP>7Sk=Rq8<_sma43Z(R7~Qf z&PGJQ2O+!QZ_dtd4w}R#eA8oLvXc4NIrYdBG@Kmvn;CZZ;_mOKoUG$lpfFGH4Uc~l zYC=Ej6(%uUGm?$wA%i41EMIEPpne-8{tzUQN;GO=uQCx7 zRBk|v>W3~(7Fds2PotYS<$Aru$=sThTAZb3!STzjI}#@#T+W1p@8j*d;eLXDk~NY0t5b}{a#2HlP>4zv zq|?KBUKvD%htgXw?xC!$Z*0E!(DMu$YWrx043Xsbmdb$c1(4$ygEV!&=UU`3x%`K4 z|7Z@#(L=QFbo3yBvn+i%_9>3LJ3v0F!?q_wGv~ItFs)oV>{Gl)M!~Sojpp(hXa}gW zr&4s>i!k!ZX%Z!;Y50WN$+6WJmyejN`WnBNI&wVQ^kO3$1~M^YS#-NEjo4f@Lob#eY9b7%fBnz9LUF*yQ#+g z>m$bfPrve5EyAKDQyyN;z5CiA>d?8C{vyEhsL}UGzp*v^>9FTV&v+M)o&P(Ktmzps zUqO+xLCRGFI3iJC*JMf=$v$OeHF3M`*<>sm&C2{(ncH+8K|c~jd32Z2hfr2q;W+$^ zvr@Ke9Irfc{=zY`-%j2GV6qFBLFKW4>ZSw_;@Zs0oHudDNS01 zCy$ywS$A6T0JU+4O?7-)t!YhJw~AykaP)hiCO0j!!U&)%M;jX?&XGyztvdc)2{lUV zD33>zplf}Db@87@4HLo|&wJdgXwX}AG2V0+X6~sfnrVKI4_t~q6Mv>GJeWg2g!$Te2ksJ3NW71K7T^)%Qz1+b>~n|f+OG<$L)XWx?L z1$IM^AM83?Q#ym)Dg2akS&xY@RXQx0HDjT*3-xwl@+x|3&Ah_V7zBjs%NB_ubmkeB zynd(Kb7?5VhPBk0^R^7OLa7kAF`rjTqOjvYKF95*+mpHBcO{SdxVcnT4TsU!-?Hzk zP{4TK^2NH@yP4?XL5a^A)r>{mF$T+B>B=u>jsO36d{P9rsM1MO{!Ot~q)Dbq1zfcB zGamDK?{+!xiHmEIjx<+?!t+=_*VDN7iCshIi=P!xgya*dc#o!gVzr&sCh2XVp5vDT zJUugwYfJ2I0%Ex1sh{1C<%suSSp7C#o7+?y1|ddl&+N&vMQA44{CN*`aN)eO=+@Y=f(15JQCi%n>Qg5ktI_YIc8n}~SrylI0GPz}@xEpar7 zidE4D4c~#^>`f9HR?o4CBbZud*Nt4se_)R2TB9OG^e~KCSH=G*KYZOL48*Nt09d^R zX0P`xqtawQefp#abcmsHxS#*>nBKcfnNIUH67>L8SZGt=;dyg!PUx(~Sos*5Zn2Up zo$d=sc_cobz3@{GSGvhS`&sSvw8VqxH~dX4>*I@l$ov0?3-HiLE!&A@JSTZp@Plec z0xeKQDmU0a>2#bNCCj zZ27M8ASjK>iJVAIsfJ1nd;j@7`^owfLItoO;X5opwZTsvkY{0TysDA(XABJN34EQDJl#cYe_DBPc*p5zFQdQ|%}3W2OpKnh76(4`d}Sh>X#ePX zmgl}+WsfMqNLePC{DdR7mP=>HHh>}Y8Or(5cjwn!coqy)R&l##PI{#<@n{vD9!#?< z*Kut;G8Twjbj}# zP?%Nko4#!ym{p)U+?*kY%HZRNrreJoi*I;OnYG2#*7Q6Hc{pV#6EkZZKtn9r;(ah} zi={h}=zj<+m_nJDmBS@;x~h_w{z9|3C$4I-gR4T#Fjv1k5BqLL;CzeKX&Pzm{Dj;q zD88`2!g9trnM=ebmS)~eQ_tk89iUC;4Kr2;t$Q>(7v(cxxf1Hu^mNmj$XizXw#+V7 zv3z6O zMOK@m%6mENd1!iYU!jg;(tAkppBtqFJ7G{r_~a%c1+{`A2fQ%@qcS+RN9kOrZt73A zsmQS#CL19MXGPL9Yq29I{9Ht_fZnCi7F-?l6M$J8o%6WV?ux5!lams~I_3Rf{61u0V*M@}S-HZwAUi<$dz9x}qIYpO ztBrW(nb&`bjv`_|XR-5a4idHU0ZMAa95rN!^YO$)ts)udvrlLpuCLzVrdrwvO4WsY zd@rY>;biMYO3L5r#emU6SR=FvnEB+o7O|x&8|!+?fkAGkMkX?J8ASD*1c!(BO+3iA z_tDE1nl=bvMr+n29lDUJ_87F2mi&2a8ZU9WS$H0fGwX+9h9%oSbGjua_mTBi9T~k& z_dI)=>ruHy0>c)sD46}Gv0W+5P1C-mRB(Z2v4&t|0vEAs0$K?_b~f3A7hypMrqhmy>BmbqDxwJr8fOX^X&Ktpdzm#quD$Q<(KVj zoA%N!7_Kr9I%Pf7-r=o_!tryj(B|1^Nk9Thh8NL;PZkbG1GTbqYlFfBL(j;kqLWpIZwA9Z9an zoUzqzPGbEGPD)LfBvY-$S4sbN3cP4`VQGOUxHk2~MZhlTdoUn>;VSY4LH!a%tC;i`6Q2@bM{N2&zX{Lo*a9d+*a1U8;2)PqjhR%Ls(1 zB@=Is6dO-Z^zlMnw|^+1G1qfA`j}sd1NoF|C9STT8rwMHZkzU|+cw|ssdtU=aY zL^`Rp#L8fW(ypGWOAU>er^ZuF2$O8Bg-Wv6*N<(~91RF~L&GO5iTeAqBP~qX;|N3$ zTTvPBy?QL864XPkl+(x!`bZr9v$R3wWMb%ZJ0u|YC7I?H5QP&#O6|T9cXifLxq6HcCM{n zKs!!DOR>WH@vZx*ZZ57>jk*by5Z9Va2D0XvtmR$hg8y1t4X{X=RwA_yfG&;MmkJG5Dxtfess9rq; zvnfL;I3biM`G6|?c(=xW8E#OkM%nJ!+CE==+9pSOtDoswO|-YpkDFNp$QGPaX$JCO zogKu=(|2Yi8k}* z*!MUEIv|tB?~}JU=5N+Fz8D|!s8C{~m?h;+>f(7Z+x`b2Cbv1rkEv1W)NhzlXQ?O>W|=Ccy_;_QUNZrdL_R(6_aYW+Y#Nu;C0*15oV-k{M@PJN1&& z7x^FpezelB`@ml1rb=m8mOimBV>Lsv``bSg#lW{8kFc*~YZ(kb&8Fk6< z76l7wjyI8Xr|T}I3ITk6mKM)M; za&o8J?7t#RZT2TI{m%-~-^KK6iyRi__s^d$)XY}BX3p~^U>wZ;cLbT-fC%5qQPK>1 z>$500;u=YbF4gs<0qHynBuw!N!ShNzlYB9zHhT+Mt%%KDw7j6%J|N2CKAM=ku&M98 zRKtG<5W!i6A)6skR6w-q!DMB3X^pQeWoW#yBtPx!hzVLPQAU=EEw!DeC_EYQ-@iM= zsXTjJSxnCYw7-&Jk<-%M{}e&+X4XtEm4x zShz4lMEXy|BS<^RaU_8unY!0lmC87cyy8F`ciD5v^&-APNb1l~NkgfiUNj{8;_{QW zhqd?I&zU&ToUDDQ@Lkmc70SZ;o(JLqG%q!6`w78QOs9vAOWD-#2E-v<3u?$Q^nkmP z1rmzR=U!%XZrx!dSYpV-(2 z>|c!DyUw^X)xOVAnBr*vP>YHBRezP8c?LV>O??r6+LXL%D4ZpN3JRFh4^VHAo;_v7 zKFPf+Wo3(YeoQ)MFA2QT=3Ds&DnowRRhQMaduHb*$Z}bQFrgjQDXs~NCxkY(EHY+a z&Oi~;1Wfl?ZO-ET7;5Stv%7Z&vUrM2C|ibwOG37pe@qd>+F~*J=j%g(tJ_DK{W~hy zVKV-%^3XZ^yCa>AFQ8;y{9ft`$nU7fANi($FQ0zAlk|MCZ&gY*p8r`^arGeysr6*i zFq-1I#DXZici|w%>#ypMb@!)=_GrNZ=$?K1Wf>rqrXqQ)Q_8VQFRl9}8pO>$@SmJg zdT{nl!d>Vwl`mtm=#5!&l%%WU7wSl_CUP^`wENhuQKA&rNLarXm4~8!U=u;&+RwCB(2CThycy#l@Hmad$3wM$2D-hM_+s0vqRm9}Ju0P9d=fY-csm@~ zgFD0$pj-`72ngiMnS#Qh4DMU6Qf<2)Pc3V-4mCpC&&AN6RGOEZ1`XyJ)}?FDBeWIH zYvDeusiOZ!z|t2n+=ljd^m{IA(trp~Xz_&e>p`)X9T#Y8zr(1X-?`ni5E(`etQDr_ zKfG6{LX55q9;5wki!tBqo|k6#_H@q8T+C5Vs2oz5uH_?Lo@dFullK*fFM+s_e$}ue zo%78x^VaO@Y@O@%Q@dt0e=`5bK)l0nQd+_>f-?IxqN8P_V=vFv+Nv!_80TC9tmIR% z;k2#M!fxiMZ+WL>0Ni`DL0NcNNAr+x*TIQgY zpmdrNka#BUeyM{(W3LSd>Y>!7X-058<6uTLe5^WbMViv_Mp05U5jj)ve&39FfYeWU z!l-;fzGKV!Cb>z<8L{>AYx|m>ff?m36KMbZ~n(m1n>@B>pEt^ZH z)1)PsYK2c?iYUL*V9POSM%V%P5~RUShVGcqabO}N@b*%Ix_50*J37K>5ZX1dFUqfR zb7La4Cb>gD(F71lNsq{ENcVrpz|4gVj;xzIyGw-WPX6s?uj5g|SJw91Uv*opSFKh! z-*3rHm^rA~MW{8$Za#}}-?0CAuFj2OoeN3pB$EZ~yUo`AEAr4S^5Hi*ME`Dm-FE4=Q~Hr1?|I zubU^)(5uHoH4{RGxmA8P(`vci^4?~IMU!h@tf#5vXr#`N>fPKP(JiGB1Dxi}`p!yB zo!cUUJ@1*sCfFlJ%VX~O#r{Oh7OHiu`}1SURHN^&mh5SLqV5ZzX1XcaB3WIep6iGyzCL);TotqvDoj=7;KiSQ zD#-%@!SnSZVWomc$jYkwU?0A7q0$n1#4sWXGN&EM0$YHg;QX7{UbI zjS2mXo{&qR!=AC(=7C^=_2=7Gx?6ICnEQH0TP$)b?Cg<_7B@{DPAHq8S9S1C*vD#E zym&qQn5cfLhXZaY)2BV>-b=D$3jmHs=N_5Ve@$Z_UY!)N#S{eBVl&m?UAV3@P~ z0hRK%MHdc&`VpxR+-&GUEs1$~5xwvJt7BNNy_WV0RH7puUs?xnzKB2CcdvC|d#_Ia z$5UqT@ek)bfH!xU&N6A{diJnV=OT6d38b(0_CeWb0UX46h?J;9sgRfhpdP%E#6qE6 zfy2Xz9`$_342}i8$xj{|8JR&;v0-?79Rs>AvIZKoz$i60vp=K;Dv6&=tgoyLn=B_`+^oe_;gz1!)2J-4rd0;yFa+aQ=jhb zY2Pn?F6v_-HO%~54s~MlqQO}A7J}-U3#Szt(?&F;oN6Z=^_rOtO&!Q8}koA#uNE+mG;=~l<7BMD`?#< z>tm-<*#%6xeW`Lo<4cTTTJBobOL#n(^qMHw)L$+BY}nj!*)3&Ue19TxZ?Gv}aSd&X zWLWi|1}qb{wt$IB4h`41HA)=nDBY#E-26#c4xTUz?UTpa8+*Pe0n(-#bh>f#iA8`|Z zTA9%Yl8I(0b390}s$=<94DIk6e``7P7TTs1>W9l_A_=xCrDX=cKIID-dT@+IvTk?#Q>7#4|DY$CK-vEEx~W}%-7$=Ej(AMa zu0?`!8hs`l)cs6zePB(JobSl;#%pa5zrQ*;f4+f;%6Vl~rL>)s=Dgt7^7bK1?*9`=ZmgRzBLye2U(3zO6_2?9@`G;IY~6rto9V;) z8vmPOHd9!p9FgG5^jKKk3E+x@Qc|BWaLE>GH{uw^lc{@-P%0T1kWi~79Vs_ld=?i z(p+}wy+yJDS0nc*2*|?5$AdN#-p{ShNBjGk6WhDk9K1s!HunlTzQ6sDz8LC>qr?R! zbRqrQkkfbxgL{rV)SMI2obD=M?0Hqr%vmsU^aiHSA7YpddD;>59b=7IN{cUT=p1-szfXdDC-# z^vW`C)2qQk{&bEBs$5Kk)^8j^eqAu!C#xtU>kKV^2YM|+UnPHdhF$U5O9yJ_2wdnT?b7BjF=9SL+xBObi^#DQ)5fBA=w!<< ztJp*w0Z4#l+gX>gm{LknhViT7UK9+xVNz0icBmv8U7II}g8ylwn-}2FEcQwjwo!XP zh>VNKV9|Yg33Joa;J^Q=ASIV46sB_*oL67Cxx53sFuU9WodBC7VI|jhHbEw}zA;7I za6<4TlO3&B@Jy7h>6HzO$*`>&6lUE;>5Pl6TX{cgY%)#G-$K>v<6LYkRH$wm zo6LGE{*LEs6fSq;-qRh!zltRJC+&tQ$t7>4whqanwTz_Q|Q*B&&nODq$gZsF1JpaW5G@+qBuy?uj$xKK*$z_^}Y7A z*|xIWC++2jU1O>`?oUhy&ZSKUzZO&k({k4Hg^6#XmaF6VvRN_7!l{7*)I$bW0&0fO z(+~QeLon-S+qqQ#yV(U{QweWRUnAL@ zo_PAPwU|0!(Ym zV|`0(#My!nLtwAvj_uYrKFT{dDViR>;S)Ot z;}Bv+u%0I;e3x_RTK@A3c#^}9P`cF6>T(2x`#p5qIq2mEbuNr}Bc=w`Ufg7*W36k| zjSGm5HF=lE!)`$=YSAkDG9PHT*_GkO%1M<~@j<(o^GEcWN0ISP0X3D$g+pB+_8GNi zK2w%Wv3mj(wd=>Z6@Bu;G@44G6i6`=WQJ8}+6y(SQKu^4sr1$$wh--+Z5YESb*t-}Pc~T4XeG&6C|B!1Ky} z2M zsq!zIWQuk?*m`bfT_-n%{kW`g(IC?wqMiG$u?Apd!OJ5hbF>2$#4S&;Sz@mPZ9tcE z?T(b~F!a7JWT{2`bs|AMeJXjHPQCPQch-^DT4%fGVNvk59u-#VCVcwDCpKekF=wkx z5oWx7E6xv~qSIt7Sj_cd+nFDr-Q!q?upOF_)%lWAKpRPbeW@UKXoWlI zb;nU3akilUli8y1#Hhsuy<3U=`8+vG#&L8)AHLbwbov~c^CkQfav9!zL4WnfcLR1( zGGCdfmJ!$Omp?key8ny=0UDF{MEom6p1Ttf>!IoI%;|2PWJu$_h0gM?Sk{*RG)*y# z)Yb6}aa7?A?}A})0@Iu_p|F8A$vFU|h?hh=59b-kElx)Fc8eFm-&Y97;;4r8X- z_9~1%9>GM-cnxK9!}(7V@kHa%WxOq^z3A3rVwL)l?1KAE9Qbviat=ka_3qyhd;akd z5&h@kaWgX#cN=2Nj<>yydVXd6TgV4RK_@(g-G~sgsmXf6qvmhF)WrXBlw9b+&2CJZ z%;sAuTrfZ;?tdTePagV8EVYobt-rP&0RC~E_&iyEDc_D-Md;%w1J^M$B+geQh=B!a zRm#Q9k7XXaxh$+6-efS@WEgr3W=YOjfl5Uk zSn-$YU06i_92?4WlSJ=I)Gf|lD2$6JPqq>WOl#Cx_+BShXPyN6QNHUSw-BF)qf9&g z;1tn2Ukbv|C}fJqXxQ$oOK-gUH&-saK}S|8w1+d39uOnnkT5XPr|X* zgEYu^c$>|e(@$kz)OnXgh)6_r^)iX-8z;11NpU#-Zx^JtzU4-1+!--_hp4DIFewpG z&ln=pJ6<2rPvhAxLS!}Z&|NNQ#)$i(VlINrx|i=>J`k@YJOX0%#c4=5PdtCMcahzF z**|2s>oGw^ytyN@CZFL(`%RC`xX0jc&dZ29|rUz7Z4 z&JD^-6V{S*%tXx-0lUu#55<-YZV8K!l)1#x2-e5kOA|&nobq@;7}%pS6csAjOxt6? z$b28(UX79W4Yjaw(~M!bNQAPfe!-C)>5Q0R-$V3h@)XZ8sIMx4AW|0Y?#t7C(E(_p zNZkg6;yyv~?kc0k;1x|Hs*SCRTrJ-g8N;y?0vTTb(+*1`g!X_JfIKqweHx%@B-k8x zqj&wCiw~H{MZ8%dj2+?}-SIp{?NOE9`0RHwiNj817Y>b}#nX?;6V2Fy`k?QF!mCrH z2nJYn6EVu^ihawAONK>(5H0@{PBTo_a_bKFTtdmEkL$?bE!EXYQs#Sat$%q#h#yhd zg>;!;T316Bev90YZtkZ4IKY2j6^lK~W?07)QSpyC#L;E$dL;8c7gOI4^gs(S#dGR@ z75_Y_s&9cwan>CnIw2U^3U(H(;XCIGst9oeX8bxm{~`Ae{uc?>uAO_qQ`+`F`qn5-)1$Y&Ed(Q;%(Z5!te!9KWU_ik=^|kuqKH^xZixYn|R5AP^60Os&+`;E}LPG)RU-^0| zbf=RT%Aq?@REuD)z9MvPB1ZSGn;iPu30?3b#hPoMhK7bfF(}MOK~e~$o`h?X5-;)Qy`bIa!b%vPgQl}C^f9-N((PV;JmFpPj9?;_52-{ zs&6v8X0LpOAB%GiEkAl?Zj+39CAhwHn*aOR73>quhlEr)xFy^cFfcN+vHvfBa4%TQ z<~WoPIQPphHDYIwOr|`)=P&v9PkXRZ)?FIJgB=boAbX}_gSa1WRSM%(Eewfvdo6Gm z#h2F~Tn^I@g)5_Xw7sxV`I3a+IW)YfwF(Cx3YGxE+K3f3s^_kZzFxH?;snEeELDEv znf0wMDf`oHEK9J?;xnGzzH5Kh?2x7F9j0Z%++-z z+2nT4T0?A+w`wuZTJ>!5!D)qCY41gLPM@=GHV86bOpi*N%t&^AR+<6xp$aSLaVc@7 zN7rbsl-Xc)B-B)vCoRY#$M~gf*`Gg*>esMOs5|TK``@1M|GWkF&D_292Y&fJB>eCe z%xk=}%znPIsw0fS!NI9m{;@joJH|;~8I4-Gw>Iy}Xkup0-`{dqV~_inRrtRL=g+^> zo?BkJ;nE3`)0slf;}qS+Biie)Y1hP6N^pPP>v}2|-p|}RCEE{q2WOCF!R0cl-3Of; z4*1#}F|wV#6l;LnhElP%Xe+@GpPvJE6Y>FT|I(b1nn#6k^55koB?seR`%&EGhb?Ol z0qh!3L!_M+IZ;TDvDL&MM{$f-=g)x{>|MO6Kf{r!_HKhik#lPd$;rY6PEwQ>Hg>0heaZ#-0=A2g^=ID-J5YtsQvjO z@**WTmk>GSy;tsNgra1_b+-SNv2$14hv%naKj1~28#%Lh`9NQe$d*$g?uinqVT~&{ z>_>_i9KZTx!%9YG>QMx{&-P<~xPF(~0DKO{3{P%TTu{)jq;x2*Ap6vAf{*bUw{^#U z?KpS77v1-TyM3i@i)-%c6|^NwJ#}yW>HkLS67a#-i?%*dvJ1v~0@HK2Gfi{gXL_~S zwd~e%8p?Q{yivB4T#wv_iv2B#=L08PKv?3sNlLL6!#3N-q46_lIJ}dueBL>Vcks7+FzGpJg>y(t%zKqtN9<7dWt(z3+XVUgV+ zRt%(~IWh3KvvBNy2~L0&_?&A_Tn5%y0tmT7V|z%ln*{xbV(5~wpvr}-iUgVe=fMAO ze|W>eKG84y%li{{j0GpXuS8@2&mR(d+C3Co0RG8i0Y!u-D zer6Xq9A3E4aovK3!L}+-tlw@&bRVv-amp-62Xp83Y7H|EM7!IEX8ROJK?{D3i^92N z^{!sqKqRmd$%UL}s)q4!D?CHLWNFX#tELV z`%f$LoamXT4V|<3=DNLAaQ4bG#JbT@AJ@DK<75NqJr~w-jhsiNw|Byi;PTQl>R2ya z`%k3*GlJxJn6;tPxcuq_?Qxrl6#J6`fhcdrB zHZ9Th5%UlJf+c*n(OcRE?H!VDj%aVjTw)`f2OSDG)O^_9J-#pW#|g{Yy0-DYo{vr) z(^}OzQ;-g3|8bB*lJb!8lOR@G7^eLfuj-#NKr;FLFW(jO z<1>g`einK9D@b~B7g;GQnY8BIMaiMw#rfMpEkjlUOL=77{Ax<4lKLwHPB|aOq zC!Sk-Xvug}SCJFJJDV0m7HIzE<2uu2);R!N`i`CaOEPEng4SY}%UojG``dT#-n}{p z>gCOq7P;6^e!n(4rF>@UiDvL0BE4aO!d4fmP2pWUBnJip;mxd79SeHCCIP4jW_4k<6rnay&Y&Uz|jzP3uw!)6p? z#xAdY@3)C)h^)a*a>cAm4fUyY-n$gUe{>5&4S%I?hZN z&O4dGmFMK(bZ2`>eD`>t;dYk2J(>Rg{!b4%J$%xrHoqJpkM>``G542vt|G$k4S0T4 z&Ph}(Vsm`EVead?>Ccoz3_T|M@wJzoHEBg!Z{8{Uwl~~bS)dN==-8;K8Z%$OU`nSgf z!>jpdsREDB_QAB6OiYFKq-Fy!^?tr44>lx&Pdczx@Q#+>M)9Cm`%d39aFKI=^kblG z=u)k`&})=dt7SNC&xm5saWq+RSZ>@>wyJ&^X2#x;1nK}zj$`68)2cHXjq)p+TUvN$Te~ysRWzQJrZkaB%U#j2H_wOUSURG^ z+LQP{o^cg9UAAl8Fp4ItPq(&yqjqc9ad=b_6AUkuMN!=+Fu>J@aanZlI2MYXyYgjU z=ynIbq02b}N8{`eWM1Pd&rS4Uf%?Je1BSrGe85U}VP~d`A8nprxg)s6y3(*i#^$Ii z^X*xC_mwumT0VmRq8QnWdU7ds+UziP5Xx{9(0|MF2w`vkwDU zD7cB`>Takv!v^dN#)Ch=o;#?a=2egs-sPpiH09;o>`g^)SDtICXRe4Zi+G#d z{hFjBp`H)}lpAsvP`S6|OssS`p!4dQtWI21v(639)vzS__=$hMAaMj^cOTju$epJq zp05mi+%6QIiTcZ+`1Ev*MfOL}4_2j|X#oU{6#&EXX+VrpC9dg8=dUq`W{o%4R7tW_ zMs+qJ8WxsX*U(9+;()EO&lys-vwZ_AtFmCBmT}a>3#fD|S-qpDUW4pyW0weptbx>} zagC&-UoRQwt$g2f`h$5u2M)+aQWrK%fGT&hV}5Q5O~uS6EJ7{&J`r<>vu{IGPmNlO zS(^Myr^%JyAB(D}>0B=`EB2jm#&4Wv_ywz*wu`trn$rgj4{1El44vuTY6Tp6jcDk% zohDAJyZ+9fDWM&RUX(8ZDpSU`pAU0ViJYK%<#$QkO_(eB9nn`=0wQt#hZr_5X z5yJ~ml`Lbg`uwXm_sdHiwiKm^K6l^Y|2uX5{o>uFSE5_HnQJ2df7tu(cq-ff@e&dZ zl@JN_R0yf8NKSi_?Ceq*$7mQKbW|E5EfwL2?3oq9DWQoX$EGNIBwP5sucMq(-JYE1 z_5J<#`KQ<2agXbI?|o6;M_kKb})FXUmOJvkx7*Mx;I83EXs#H6; zEx|p~m{lWlq_5HgPTtzpiG1GEz{AV@0}q?5uqX9=yJ>a!IxmZ^i1z?e$)nL9PVW8q zxViVA>}uF>0#GISWb+&?KO)(^Qk88Pmej=1fCL^ugw8p?2mfI5ab6eXLG#w;FHw`Q zN?;!d9BDH-L7G1ERjq| zcF3)fY~eOpri{_i{_JZ#HLWo3zC}thwd}#k!a~Q^7_FW!TyRFymhwYywlej@be!jN z<=a#wMxgra@P$R1+>wubPZ~gzdRjZD5*F=a`3C1i1)6NVpDOLddVrvVOpMj?L377( zMARcdFzz{w13xHP1*7wnH-3FS@QEv1TUpDQr6idI%_t9&lch44H^)5mq_hCHwJDk~724~1P)-tymcLJ1wY>i)fzsuV9 z6-wi`>*T{sZ&q=1=G5VvO464h7Ft*vK`>sZo0NXo9lbw*!TTyz+od<&D#uHk<(QVqli2?9^cp5 z-{ha=zByA9R@s0ZiTJ4A$S<7lI2bQQf7_ zdh$JJl_C~oTqJss4V)~cRn}$C0oRlF*<%=ArFHDVvS4-jrd}|IFF_uMD`pJ*4-e4Y z&mr$%4Dp8c6P_HD^&2Twpupx^Wc!+D4&EZr-X z%puR9BnU({Dlbh0dPd;}y823`SlVc769)lg0g7G;yEdoof8p;o4cD9yiF~ z{685O;%Gp9XFf|hK?q$%@gVXbVhW41tssy0^eJslZ*FwRU8L1!`{Zdy7s#wU;jsG) z6o=kjV?Nq4bLnY;_k)Gj&FlB4zuTT54fW*O5d50?Fl$s*K)7M2vbu+AAG zX4dCF>&zfLg2<;&Zpgyv408kkCF}f9LG*Jd_}w$t=b0j4ur%`g@zD4W(3+pzR0Z?T z?e2q>=xoq{vJ4t#5uEfcVIDv2d#v6 z4S^BV(sx=;9(-s1#Ia!%4K|ynD)7xbD#mAIQ%30wOQ*!}3yn;frO(8}2~*`D9(}M` zf;;1TG1Cad^GJaGh^CtUL*Q6yQ|~ErY({1}gCWduUWjDRneLl`79kIH*a!w-GWYEX znE{AfhTKeE2Z&SV0h%*qe~UTMaG!MPQ)ze`8H9aU5a=f@I zz9iP8yYUU5=!J)&Mit+Eo*h+tVewEm!8>0vAI#E4VG!;6)I9pVQ86D%duxM_T3HG| zw*eNpifqocD0TZ0y&y{Y5sEa6KS>wZh}i#wsQLd%-q4BNX7ZH zL0sV59Q94Va^#Q4hgN&@_f&wX%E!ky!dGDXLxd81*#{s#eRs~l9>F+ai^v!FQ?c>SSj$}iX$I0~dqDlZa6exIa~6&=opc%f7I+ON?kpnM+jGElHFq4hR@~#+Aj6 z*o-YbWT<5JS> zm;Q`hn_mc*NnPLsIm|B}RRVg^Wb5T`mB3a!@IC#f^>FOe(U;#;M3$sPZ;31t9#jB@ zeBB_p*d#HFam+`p01OVU_V)JAHXp(+k)URn^}C$B{6S2 zN{g)`ZckttH^?x!ISv9ZpFc^2rKF_1II`~ZywFvEX>)Br)Mx2cOkr@;Wb^hJxV>-J zof$xrS`-e0MO)yW<;5c<;-h08v5D*U7C|T@(k-<$D>!;bUz)eOf@}v_pFD8xwT>Tj zY}=_gbl_>dnSyZ0Nf;sya|?jWJfN|_F5?)ajS86GbMm%AUs0jlmsCjE=0mMhQCQmR z<}+~OOdiBtbc=dXd=y;DjJmIfgSqv?HU{%< zuq*^N`?*ge2y(rc=eX#YLcG|)B+~=ZPfiLDt|LDoI(u{o`Jwqhz8tO5iOQmxJ?}F) zrGXzFLrB@Nom@K?i5O!jP};s`|Djlv*kB6)_ptRakX-w>TQIEj3Wu+6Z5E_J^T&o= z$KvX~ay;^jhH3-tEeSyqRUpir5*)l-M@Q#MDV+ND{4UIgeYp3sLVwlz z_ci1_eh`e6Zb%Lj_=p0p1>o5uG0Uvp2R@4Kx)(A`nV}?dl{7?w9)r%hQgF|u;}}fM zBRVpl{K`Mtb+PQoO(o`a+X7>ioNU0p>u=`qA6o$_OtUG9At2d*&5;sUf@&yjND;b1 zCGPEvCu=)Rz|pd{F7#T>n6T^#vmlP>&Un(W^GV*EGsbX&;JJYca+aoKcv5yS#0tM8 zlppgunqw#fK9x48csBPvhr$d8o^gpR)l7qs@b)1EZHt1cWvaWryj&IdWFUw`XE3wV zInMA-HCxC7OrdJnrtDZ_E=9zdx8%tLj%94(@@`7-63lLg;A4_N{_yWv%mEy3V2G#$l+C z7zwb45h$oQARo;7LGJa(_LbLH*^>3kyt|3JZjD{_LWzo5XCF$g1t*fdC)pitz%TWgnv&13yZ z`=J2GtLGbvZth^cELQqH{ieNGQqmZpSLdawczV+V*-w|2i>S6BUbARA5uqu{F#wJ1 zmmtZvDDy~oZLK~eSRr7}rS&`%@7;6i{<9zmca1=ZMeHzi8zsEovs%N(>loj@B79=U z6I)7b7E`zW3TToMr1kmsS)Rfc?(Rsq7abF#CeUyffF(4!OO7+Llte?&sm1aws+d3- zh%>!WhMqvHS{4sD>SUqzP5aorqgTA{eNoz+s5tm?KSap_gjQSFy_F(g<+CdjM5@<< zI0%lceuCq$d=XIp5|ltms^JiDd^T&a9-08d2R=7D_n-`!{q2ga34)KsNFoDwCP0iK2!t%Y%}_01k9lq%qMF=DI(WU>&P=0XO{Kd21->=lX_2Hauvr5$B|KlSx5r@%qoB7Lm}A^rcRt5Bpls~sF>w= zTg(F(vbq*Ac}==Q)@DX1mwJTqwolEo2H#rep;+7csEt6d^+4BpdW8_m;6-IHXPUP1 zN9uS!e0JbxRP{;$N*F>tiOYPbQnxz;j#8YCr8A%Gg*CNcke8F)ANuHsZ0e2Jp9>zl zF%UJS>}!TE99j0kBL4U~rNUXK+oMh%9b$8gxf*0R87-y33LgIF}+k z7(hqX-COw~e!S|360G)IQB+aEBm7)A+t$Wr+upr*^2b9YUL9`t-a7X(u zX_L%3-yuqv%Re@dKTwvxNz?jaRH`!5Nmu(&KU|34X45I}}voIkz42f1|47tWb@Jlpf(`l?t~%qmy4FYz@*OYcg!)Pjw);6>x+UVf24(BRRrIKLYzN+J}IpzH=tq( zRNFV>-6=6b3+tOeMaB2S*S_09rP6b-OmwSXdMcmA?S?z%{>XYv>}~Rka8zv5GQ{JL zxq7M9;Qk*=-EoKtL}pP5Xf+30uT$EKNS>a^11qJbV#YX5w?u?}BF&g5+I3e7uNe(l zqx&rE+{<89TN$l&FzE^-3unp$4=5#m;M_AIf@m%X9mt;oSNOVHAav$Tuy+fRgCm_m zi`WHJAYx1IzTdM_F`kPWUZfx+?Dz;oH;16FmA(98RbEZfc#weo3R{TB;C zT?@Wo>kNR#fEU3RN!3K%Unf+jop)%!?jNhMK};AG@t$jOlE8P=t2^ z)W40>aj;pgGZ=xkbXNw4rKsHR9>ymym*-1OC1W6(hy&5Rm0BW1JOTEKbVrTO;^_?4 zOkkul>d5mkn(wWHXr$N0rHW&@1)@F&zovR=f?BifEpt*qFZ6JQt`!m^&V2&XzIB zeold!8&fm0#a(60Al`9esMh3RwaVULR!Z_8(!8fp-g(UlF!rx+(S^vLnoT)$ADLS~ ztbnOd0TRhyuU|V8av&nw1E-G=m5bWxw1t zPFDyRQiRBZ^Id%{2F6IiI(ri-bL2lxQ7*>mOnxG`4Uv0Wa-|4XqgN|eSEC0p@=-B zC=9CIkdTgJaIqf`u+m@_Lkv#nXl`!+?ewo{*xIHSiD{R9WttiX$Au8;uswCL=K03` zXK|UV4Ouk~F;QfFb$c;3sHjl93tGM2V#%Yoq6CqUKy zuFcI6$QTc+YblUq$8SrP{`x z)2|s%V_;-n2|0Wtm)Mn9pT<-|nXrL&r5E2Ysn=9xy6c;2A}{_R_0OYFYS9Bl=JB@>B|M zre}bncwMi>cuylh4pVtL;VIW?SXDg~^LW6Zs>tYl1SaPG(VeqF~6VqCz?T+@0$ZxhLy zI=T!fOMudKYhk?CQa0XAXHI_~$XE126+$VTL>>ku5ecZd-z9Ut$sF1wltd1dV*vtF z1QH#AR-#PsN3iu_62Q*4W+~J}{sbO(JQ9`*k!32!4jetxFXXv9=K$~@XQRKp0ZNcJ z$z}iO=y_kn%()X{_E6qh>?!bmjv%c;NktL%${xYWR=1jAKT_fe%SbO5xj?0orbL|8 zS+#UoCfSDqt5C?>6Id_#on47z%K;-8_5@>>uA<7=ClEy`Ux8}SLzVq`KrTBgi0^*O z$fF73CC4g;M)yx_8uJ1-2U!3?Z&g?^1qZVlSei!WejY!Oe3n#)qF;K}iSq>{Y#3r< zVy+u}Q{77_6)w|Rjx#c49ED2s=TNo91%t#cLH2wdN=*a_KZn6Fw;(CfavT#*STsiX z_c-S%hQXlyKq*pM!N~FXiQ1-Yl(2b_nd$s>n(%-GlYlvpk*Opy(o%v;De;OA94|)h z7f~$kP~YOk69hc52xo(5QtF0{(dV?tU?EI|NAEJxyEcvig2Pl_b$ z0F$?(N#4Slk;P^f7!INNRd4dj$Der!cgyijo!tN32fvTVy>bB)mE6O_aV}klz)VR> zN>aC(dk+3WW8;wvM`3;csV~I}z2>c^@T~~~p}n}h@WmWQr9=CL zdv?=^XyOTYNV>p4XV!EE1vWUzVFi@`a@n`EwQYl_G@`>>?0})VW9(jV#}wBR?giU! zdCWu2snIS(O3a(rZCO)tXzHF5)E5q|kbquXEAp%pEnLAKEbQSk2;YfXarU_4yvsS}DWSvS?HNBC$Y(&((=?%3W{3<`tx@~QGqERQhC2E(yd>*(rc%qbezz$5%6 zw*gM!2MFKE8#l*Er5|{O7J%|&WB$TTwl7k*O{c<_86UAdpGFp)o$e-XZemd>n1a^>QdG+#)w*q`!;x^J3aa5n+ymfbUq z2CU^|Nj>#hZG&+Ix8Ty{CY0{}SyD6O{Fr3w0EYp;+{^1o7i*5ZwaJd`kC$ zz)z@vy$3$a#(gvF!M3tEGXtPcEM@GT5qp9Bp<-^tMf4JP9V19`U3W3GlgeIw(Q)US z{n-1b+0qY)ctV|O@^yQ11tvACY=Ia_FinhPEmQZ5`{|m(P04HfDQG#o5)>M>#oB_ewFkhKI1V;PP9#jf5sER(<}pbn61lDESvw}IURprnl#n(1 z(((Yu#IuCyY!D~1q{L;{*CotBB1>n{i?M*^ADTm@lhbuuC{iqlqF%l|RcSlBVaj6t z9#UGxR=TSvzD9d7Don9nUCXLJoDY=cp@NcUt5L&?>r8C(8%nsH@QWB(dPKd)h8i>G zu5za!@%vs-y+_7%a~)Ioib1`o! zI?pf~pD|0O`o;v9c?^(+YMsEeK%nT{PgCv0yv=c5Y?QSEA5}^8K$vgW<~StxFyBl4 z_)qRuQ2=`VkSMhd^AU4o7QeOfd`5j+kFJ0WN!Z?-qu~~VKQhlHAEE4x4&KDXWcix% zaVda12pZ`1;rEw+0X_94f2uo5V?eIZoNYfBM!QtP5K6c!Iz3dS?&~w_Emp@xHrla7 zNVSz@kl?J546)5cwwaybLkMU_M21ma5{^lK%7Tn>NE}F`^H?k`vrKFNx0R*AJuoRb zdHc$nW|wRaQX6{-$Dl1qw(TU?snM&RrO%QK#ErHRJLP>lXKN#|!eRp^Y|FMk_dLlj z;E+O;ci_u0Y&%2=1rIM`rr{1}SWv}aaB?d)eJGfb$J5r1s=*LASWMn?V96Vl_Nfx7>3K$$BG zD9+vkjBRy!rN)##VT(yv?vW8o!*P z*)cE<*)I1OyR9vXdn@j~JmP!#sSe_H;!CD(SN^H}|s#DYT#3h6(UfGaoVO2$1onK$iFS!WiK;Z3U1>-HjsrF3S z*E+6@R=|R|(%<>zOkHa;Ll0YP-9bNWsVTMUM|!ZZ^aF6(7NWV82M1ML5_b|fT70+M zSKTWZ7h%hk$$IJ}m{X>jgsM*Y^x0=R-$jQ#O$W#n-DgOXIk$@exUF$R{DkHFH?HGG zX~V7cR+`vYJdd;L+Rb`lk84{D4LhnRG6*+F$&@9p?vaXt*6u_X&Id?@t7{7=)+ra^ zFA(NXx|^g{dpoVaq#n{ainoj6_~FY^X@Lf1ztH&{G^}E?Oz9(R{CVN5itsIKSR$85 zIaBW_fuFq(v98_M`BiP<7j=23kOg4(f^DamP!IDZT*3~Po$pa=`Q;l?ta3rd_Lo@FY|Knre#h=K5nDE9Z`A*g{6h^B?bFx$_^;rESlHC>itt*kZEaVpRKhsE`);AwkrYp`E~7`=vAu*s zKDc0(2GLeyYKp|u<~`3Qzbf>b(J-}RHu ziTIT_4=(xcJF37WNAcjh))2mTD!gBBWmA8C9DB1GTy``K-LE^fd3k$$@=v1q<5RzZ z1gC&P#$nZ}*q%_N5DKd02E)phB?VDeHXA3v^dyu$EY|0lABy+Q%no(ke`wssx8Zs* zQWM;|xYkv61^OB^ybT7V0@1^ah&tka!VHv z{#p!j+un+(h`yv>K~eTl%4Mq%HZ#cv1i_*U2`KH;m#!wt&08gI&M1D~%XnuipL}wrBzH%bzGs zg}jHjVyIuEy?4<9O4#c2ky$kdy1vjx*lrTyNIFMtsO{)ef&xdQc*G(hD(i*qU4&Fb}wi8Y77 z(e3*Tv<@K_$*V3Jc~!`u7P{|pUtgbS^_UQPzy+Y9&fFVK^UwLnk1s zu+VxFS4qLri1Qf0!K5@_RB-gIBl9*j5JMyLh&TbojUu+YrmNCA(_2A*xA?w1@+c^F z@M+vu-Jo*dQ?POdWzw4?tLz1O6EBJY#&C&1Xkz;V=c^V)P1%}(%A6P=^q^iDdCc{K z)jl@wc_n1YnRe4g7H50nM&~S6Wj|!q6@?26D(6aEAfQsqko(NQd8TTuQ=}uvUP%vJ zhY6udD$JYQQ%;XL;|>9U)}kT5Ns8E3L6ylre=MitE%$pRZp3`{E#?gV?#B$@>^X}( z!P>T!F}up3jw}l5$Z*8#Ox@ND?~*lTTumGFQ>WZY87>2+Xm5%!HgAvwz!~;u*|3<= zMvW>kgq9W6)GTd2Hao%={48%WN7t=k?u|$*HD%xu{Hj9^oSFCDeyg)S;KKRB z|J_@D=KNYwOn#!FlnJ6IE`fD@7HXzC3lo0=?pX;nhc@ra%gc|j`s|(fgHaRHN$Y3c z&-_&PepJ?1A{G~QUI!mL+?t?zD9*sJ)yYr;;ukO)LugTVh3(c$JMu6?!}&Wfn+8w>Wrx_fT~-dM2G+;#&8aqN(3&q~st`JK%1e?R=KXOlj1 zg`vda7ORtOu^%BV-52qi$SUvQasgNMj}5m^NiV=8U5t;jheO{ad5;he_8hu7LMoyS z+sg1Wtddqt=$n!dN;TGnbh~7Z8cFEB&wU!#d}8`}sWjUw%Wy{02rb;T3DcObdHY@wVhg1v@C<%bIm-Xyn%Lh9K+ZEm$$)NyL}B zE=a573!a$KEGVnJ3tAZ5276t?*_(1TD%3);k_$M;c>y&Z_Q@dZm%g6o66298bOXL( z`;SVSlecQ>&Xov)W49bdfal!*q3ZV$sxX(=IGc{{UE}{F16bU_xiLJ-x z4K5$pSEQ&$$1KmMfJiy+S6_b8J5?H>kMObGVwG)fYm2Ve5T;5uoF!|6`-X=SWR5!Z zwuFjk0}WV&>1={(?FE}mahW_3$f*I^%?}bml-jJnWV2p+%Kde~)=D5DlGD~iVkRYV zO0%vm+3<+C^y5mY`E9|t{WPh|7JcNizN@H6KfSow z*^c$ZD_7CXnPl`~qvMR-hJFM?zMh}802#*?J(7_fMRU7w>sfn%5I4SmD^N8Mw0OU} z6sG!}5RlZ1znIVND!8&%_D_BknS_=>{K%wA#Ithj6JwHj2thw@tsu8Ku8g8k_rtTO zNw_U}^{tE@d$l;xeoO9wesnwhFsxSI>br`GUnC3`pBfBJ_W(*Ko$CV01BBA13(ePF z7xUl4)4a4tUqG=a0(!Tg+jP-)-yQp|QIxubB*VjJ25M4Jf?a;rYMi!uw1{D~>-CM( zzixH4)yJF%LyNSDg)>8%u(i(5?>eSTv0eQmp0q|MJD!|gt$ASr6SISGj;{VSCLlAo zWkJrm<)3Gn`*Gzx1l#%LUF|)-{=Cophb!7`E7np>!%^_mmhLhRsTEGkwm$!)Z)d3# z%~pS5yg$}r)CB(8T>s2_RF{Y50hK!p&kR~mR&q?pN|kdA!cQWSlWk8Nh1xdM0%;`} z*PLLZ#zcXZ`Bs5UD=skeXWXwSf|Fp}{JxUx zK(9KjAZ1>BKs!8dB*3nidQmYuV{3ZRCdJqK(uf9&X3d^qQ2+ITP;CFm$UNsu`6CK- z=@YV*26VrXz>oC|L*qeuZB03LZeEk?l1yNKPWbuE*qQ~r6E7=!OzK)H$8i7r6RRg? zDZsFVRSY@va+>+Y!wWxC%tOKBYZ`j9$40CdWbgdmaoqop-A^#_Zx@7mNdG7(uhGB^ zD-$#r#qYchwDoxKILj=Pcm62PwOlQ#g+;o@6ng$iUgoKQMw4Tz$jz`5X6HY@P_Z%J zoxH=YT-6V}I?^%*Wh%jX#5H(AQm-kFyiuQt3!JwfrGRrQL ztB>bezTbyARN^;T!0kSo>wH47PD=FrlYr(cDiFij$;F+eye?X+uJv8qwBGpw$L$CS z?BtFB#Zk^n+4F{SY8gzj50_vXY*iWmg{iR&1YJ>%!C^&{`*^>TL0%`c|ugZj(b>ZSpi%`4ir0+VNq_A=ze zlgo6^Yvpn?>-W|+Wj*9+qnffLc?M%aW#ezN9GrKSr=eBdfmJ#8zP3WE+Ah#BT;J&Q zU1rHwL6fhCOpIN5pSOOh#(z;OJuw>#XV_4SUjsJ5aLb))Oc8Cw#bA6W?rUh@=~GVU zGw0S0)F`BSe6m0$`S|NdGYGO)R8IuzSi!0!6h7Nz#QR%G{m6BU|@Ww-)muay34$FY=MfkfHTl$)hcr< zhAItco+T_~o1GJzZWP7h<|*?epZt-1!0{8?j^-aPBJi^_uKdMUbixXomjaw!%n)k;Yd+?ryL$)VZRH5U~Rp8j3=P*3t`r+Ah3vCmdWYg zsZZX`c)N=2%%a2H3zBb6+>|BSCDap9dBv%6jZE%ISZ!GlDR|!V=CMteYlRgR70G1v z*$CqUS8?C>b!>T@zbRZ)v)%PlPGGu5~j{4CTWJWxE+e8J{p;I39LWkNp+Y8<4gD4h@YX#J4>eb_x2d1j>p~ z%xd#7_N!c9=DSQEzBs(1Tutq?u*|C*n4Nk*iFksV(M2pGJr*p?16rgAr@uM*9Ca;i zb=&<3e>K7Q)7OtD3@ei^OhA&Q2Udx*y~uX@WHW`(MlqxfRG#M zAmgVT-oqPN?b}_l^2jWwoqGuLMg+=wd*BMLN_Z*mq2`lQZsVF=R6R28S?FujpLZ%U97?(0-mD)P{9jt5ReW5%NGS=Q^ zWKP11uBuOtj?7#tpU5*s|Q3vaTZ zzk6->#%yPn^2Fohj)C=Qk=Vt-6FaB9I1S~19~NO+C({|CSgY7hddd{rTSs4;Q^V%o zF3o>v#fc|HH#92E;P`XO-bq1>%j%@^N>suhUqp)o+@><76UhV4QY(6-`aWb@z0dse z$@Z4D?Q1zkmNPm;{uZ9v{Ud2*nW0ro&o;@Y@-q)N`%b-nk&&fM4Zyo;_!yaX9~0V4 z_7*9Vot)5B8bOGg{!es+%AL!Heo8v+o{ONhRsUk#;{4WpHPAAT0|WW{N1W1dZBr-DXfzS@GqZNUFU<9G zEsUe9x`dwhekdZ}RdCyLJ}aFX>t8y{=FkB(w}5n~ebeJ&g%P03B5_s}PP`Rij-$V(dP5|uRE{ynQ0z#QL&2k!Y^bn=Qlh|h2WOt^s7e{0dcZk(yrmXuc<+B0* zc7vTDPcgf!C+XIhq2bfh&=TKYAJ=C6YQu;Mp1({#1eO*@nM+2AXQe0701_hX{a5Foi*uw^;z zFY;NIf{vRwuE+}KIxp`J3bus?v)E5-Q0Uspc|c=#Bc@cRQIRx)#2AU%Ns_Vg4g`~r zG1Y!wJ1=DIAQZao>3Eyqu!MI)s@(mjh^g%D9DC1~^)r~qRm5>l!YE!yU)E7;IFYPX za5w}CVN=!=T}aKt=T)<}q>p5kV@HlAsFLPF7A5kQ+Z>of3%m(%%U&lX7LkdUWZJm4 zpU`NoDXL|Qh=-ZJyeEwJj)Y?AWCGxHWwwQ4Yb!Lf43!nKy%PSl76qv(8e>!hYw% z)4kR~)+0*&Eu)*>g-MMmy7chmNsvCYrUo`;O}W4oG^7@|6nup##$BA@Bs<*OH1Z*p)tcwz2aG7RbY>oG z@L2Nwm2+2Ae{EcJ@2d?Sq`P#OJcz~kfYQY$qx4J?GysWz4`Tb)!e!|5xi|3C)~y|H zg-s9N+l#kS%+qw{mFwJ7p zOQv)cFBVIG-lBK&EJg}lM^D|p>hS4n+9_MhrkQ3vIY%3rEuN&iwAEL87u%P5_0}qk zHQY%WFDE1IWDKqHsFMG3u&C`;T443^o=(G028S;XU+ypv%~Gze-`S;vIZ=UzH!;Z` zf&37p-@4#Vay+t{X0$Dn_aBzv+sPWb@Abk zd5w)7jE(>H`FMVy%;DzS{+MnRGW*ldCOr}zi%#mVONu$~?<~)qRQp_NcB%HaoH38P z6s>6|F7Y|wOZnPDH#4z56wVN` z-LQ8(9oE3qUQBf~1dgi$kFBzNGJgKo{{@a|UjCCHw9y!rlRn4(t8|(Q?CL_m5ZYgH z8s&kfa{qt2CmywoeinU8t-}3Juld&nlF->-0ZCt9O|{_Wzc7l?20;7kgTC06$8=K> z=7tF9R6hl?`r8wk9L(GP%krsEC!slacM>IGGWP$?sAtg!H^p|Wf2|p{y#;6A)O|L-~SW|9s1xGMdG;RLD0`y04lH2@wO>QivKAUIwZya zlnRzypG?yJC#6DSB!rsXkW^Z=q#2EGq(jgQL$hOgph3AX9cwhwVlXDe9`sr9^>jev z?gJbdk@?3kLu`|B(nfR^-_WGO4{HP3dPLFJA(4@;4Ek&Cyta%kNod zMDn~GzeysnSU`fZ1Pw5*qPlhOPx4+Y(m0N$lEgAMdw)Xdnz$6P(WM-MJ2%nfgq+g;2-ZSSUe^`z?{nlzU4iY>1?XBG=OS*Hj6e}K>B`j<2+Hh;`3f07t5_Lrd?1|+#-h*c!D*y8Wsj-O6|Q^O-8Z#)u>%Xs~5qwtl( zGvt$*=!5Qmid5~s0p0A2X~FP|#K5Ae`v(9ci!)-etLd>{MViT!=Vp+`VDVS8p3=%_F4$%W^Dvktn4#dv>LleYO=s1Dfvtq8wA*E**X6-G!TTEsgipS?9rI|v}v?A zf*(ZfxnO+nWN`SCAxRH_%D6sDLOUoO4=IBf?Fc!LLPyyudzlAGqA8i8s9O8JZQOt5 zLD^p6K6>5&meeDF=u7pv*rE1Gws02?+OoZJ!*dCu}ikGQFL5~z+&TRMCP8~#Pc*3qMlA0gy^z0 zMc|uZ=BbD2vB3k8TFlfFPu;$JK#IYLUS098wT{@^jDJ8%gh5f3T2=lJ=~*e%h#*U| z(c7mv$a0XMW)?Kkl z>Sr*QDiFUJ5XftBMU0-zKp!NLY~%bBt?6L=X#{&vFj=dc&d~LcAAqvAv2m5~>+Yd5 z6!$cVE@os|q6$zEtc(<*a^HIOa_RZ@HOSVDaK}t}*dm1! zq+#BXZT*}_3iN3hx?l6z-rO0Jj!tx&&CKm+)zcks7O zQb34F^v78MCKpYEmtp=DlhR;O2GH9!#New&*F$+sk3{$ShNf-0*XXd|Y24cPl1eS< zdGr}>b@2e&d6hb}^NS{1ei%W(qj&=u%Ctw zwamAr#PZF_KclE&!U0 z;mXi3wDz87Qy)qMZ^{6tIDME?ih-n99-t3hvQJ=F zIjP$8ME3}tERsq$j~whPJPfggdh11W@Xa)WE!cjst=6`5JVZLg2;q-nq-Qqm^JK*= z%bN^s0>@z-S`?lxiDfh&5a1!e0T)$UWW2cYdryW=h#H%|f4i^Uh*6N4^3DhjlaQ zWDC?t>M!-ijvi&acb1;`ol14f%9<<`WiBe^p5Mbmh*QhcE^591EiC#YHyzXg@X|%? zl^+Vq=ux$GISeB>^2WlO(9^lPhV86#3g70q!t-z%%ajoSEe}V4Qg(L4Vo&(`9brGh zLh~2_{*WhG`i?2HFGq($*8vt~fpPM}1=k#YHq}gV70|NR^Rs1ds&vqWtAn6hfMun0 z^TlLw0R1WPwadKwpyWKTs7yQ@4v$^ovz9L9G>vcvxpey)x6y$((kRo=(^$whC>86C zc^n}3Dn5<8Cel&(fiHC%ih!gl^fr2UleO3HXwxri9gW*b6MIYY6n^-#7T|Z)@QW~| zV6zXkJQP+Z+S9W-KZcRxrIJe4gvhn+Ro^2^Rn>jlH@?%rg38-IGN z41subTHy+*x73qz|IT^P{01UowO~w+gTcMvLb9aNjicqgK`a5DW9OfAbTK3zrDsRG zQD`OP9qL${BDX=?@PfyB;;sR)twTJ~awgk^@aGfl>ThotY6V)&>}eFgvh1?JLAtcf zS&}BK!|LI}KFr2NT1%CNvb7J4r|T-`8q6}&U)LnHMc+6pL9oF#mo4}GR0RQL-zXT9 zE=%+3zw^_L{fwC@mcx(QBqUS(cD-nQ9imJR4A}?J0WkAs(3Jp()~DB>Pga_PE9M)T zn6hcMiSw$aqSd{`~VD+HI?YDHRKf zVOi^IS34a?6C;+O;Tbxa zGyAsc7|t>kd%Z3qvL$c9=7jm&_(^s;$*arG0og0qyj)6;x-ewtX3pI4!u))UGG8am zz*oBYe5jheTTY{z9?uwTBvcP{Te*xLy$-nuN>uo7fy0i_> z2%YumVBkfMWxPbwh`UEl<~T|ZT2!R?w{d)Ylwc>btU;=ju1py8WumxGK>E?Rsnf_b z!aUa5=M0P^HV|UsC@?>A&@Rf{>T%o54Rj`8jeKD52leLCwRbHe?sT5p%5xm~0_1z2 zxX4;WYmsdi9Ezip-_R*=)w=m@*dt7_!O^vupmk2maF!!TnakhO=TDED-$UukpR$Hz zFAGLwZud5T9x~^L*%)zO90EADf3<=99!llsE6uXtW6sHQ0DGsA&fr_05LkTI^b<|! zkqj3ZhX^qV&%@y8L&77qXNMHkADPj!2SyfAlqICokMn{FHIDu~q>6b~&UVTNeRf9| z^Fxf{L;yYJ0OSqhK(6&yY#648($4GxPvHB#G|S4c)oer+&j(psZ-(p zZU)GP;xsgNAM{E6v@A)A;UK@KFwEa7{%3wq1;5&tO`(q>r>@UI*#DP2Z=Dj#^HNm0 zy$K)l;~hd4jF0E;guyxq)sO9~{3`7!4X0DqFfgbD7G3j{M^7b;5r!7>;3&B&$FXPQkC5w=RC5r0;{PrM~~bY@ht|% z;&i%9|JtHEvA|z1ME^ku7p_d<^B)AM=diKxTZqt=R^ySzr5AF=la3bCLp?0)+Dc$o znD=nfBX2EqiDte~3{bgpczW!Je=VCMn3I>|%dARl{kN4x(E~>a`CbB{d#y}k>Z4qN z>N$})nRm;wa`c`<+guB#7N$J57B$*oDAEnJjiN9VT2o zg<{X_?Cjkd8mXr)PETO7cuQY7E~7M@4sEN}9>16lSwTu+gzV+AH_5ydKcZ@s?@;W~ zgQMj(=bz>|R9~vE-$*ARUI*`aXC&#M^($gqTRfmY$|9Hn;ylVrp@J={4 z9RzoRqtDY)md@1w7XY_a)^=%nbiK9~GIA0LDVA~96j)Jm{xXqXEw>mXT|m%lb9yY3 zCxQ~3J-(hja4j|CRURC#Xpd{%#MTkbZ_6CQ33&lh>F&vV|)lzR2? zs@Sz|o0&#FIkJQcvF=bsE0mjvT?$Hc~pKQEM`Ll}U1 zNCtyFS<|jUj-EAJatLws@Z{*36bAUq;%7T}2GWjXoq`rIhx#mhOk0vIJzK62V$adL zID7F8N1NHFJ?T204NMn;4wwo$dowI!=n>b_tUYbz>w8~tck|>J&< zuI#4kn*j>+73ZSco246iSbU1P37mfXsV+%21u2 z#DI`I!QI_m#n7nQVzJ>M<|L)1HQz-}eYQGfSvWbc8Jh3+&^0fCMGyo);=P=v zcfng{6FglHzrfFSqOZJ$rNkF#NT>2d>%>So8eeEK95eS6^=m0@8dN2vbjsq@(mGVeIuzM#Ml0i0K|CO0B0G z&{NpK&&5a~BW8zm#X5S77T%Tl{lwidWS8cHyX_$s7xG zn-YDtm|rOH`Oqgaez^H0;^V(KEVxFNBx%NosZDfO5V-@*O(*eGi@L~T8Z zQOJbCJ!ESL{O134wewDV*l6s=Fo$E|vBUeOS=hFReVBw4DZ*H26-cnpNxbG$_c8Sa zz}3tC9$8-JYt9lc%rQ+}R6DuoaqMi47Prc0E7Vw$J~xJl8CNVgQt8tgqJ8qM?PbOO zulv7eezeEEwajJ$LM4hYe!3^%Ss`T4GBdmF5@{ftB3apcl^vPcBO%#)@89)y&gb(x_4%Ir zbpAL!9?s2uzwc{4ujh4LuNNI%k@?|`A<1g&aIbXxo?C_1Bm_AERqUZ}FY1q6upsc7 zteZ+4FpQHoNmxdxX7u|bbN5vUE=`U|~4K$wP zlV)yQ7v=UTtNF2}WjAPZ3)8JXv2P%`+rNx|fXV8A(j)39p{+rNnIid1g_q|_q+ec+ zy@HeVQNCx-P%^HU0za63o9^gNV9K+IPY5zqxPlD~OPHw$M>qc(F;89Y69El&9Q^nr zbr+XHPvCU=A6K;Sl*1%AQ*8iijf2<+e)kDu!{K?}rx7^S`v~XqFI#_p#oItIa@&J6 zWg;+(8awx75dC`iRxxyd7uIyPqsG_nn6)n>RVum@-}Y{XndQ4FD10@Qe9GXl-U*@m zm)vIO+EzKMHp(wL)nKX{-f4qPcNFK}`t7|aeim}c>tF|pX+rd$=?+R~4ZSz1CG@;5 zl?tcOsjvi*c$r$zzHCY4C?eoQ4oA@93?gBYcQ$P15nLmlt0vYe3FDT3h*BrWSxJpq zcJ3rPUTJ$t$Tf5Y}q+WkM`E;^6suH+$qTrmSrt*cLuF=jE}Tqy5B zy|_e$Z)dUfl~(#8YK1UIfS7~+U01pL9{FDWA78(XFz1H>>4wb@v4ioY(Qb$^?a=+% zZkg_U?02d5W~zJ2JLg!YF!Vs)Ay*URx*bvz|6Sy%{1O#z-L|)CPj-Nf2U-p_Z@v#X26Ku8$^LHjz zo1u_z_dyYR)ccs_Q?{I1P7;_slmb~3rGY-rV^bH?AS{;l9+BoaEjq_&Cw{O?d$onv z`3^OvIwKe<78UKUM`7}`zdD%03v3f?ZBTbkhU=%vJ!7-becs$B z=X1U2?;y9pD?dbqXFKnn8&(%v+t$HqP)4p5PnKh9R2O$|U6>y1?pCv-rp9>ECCUa= zJ^TB6X$n5rT(~7Q)`_&_NA{|y4_+~B45tD|B7A?j!0f1H7G&{vN6~r`3fMYkKW=3x zz*FAE(V(9Xci*kuZzGK|D@;emC>sz@HSN;NK1jVpg;6xN$YNR`HUIJ7wM24bUsT+~ zuK3taJ*=A*T78*^eIRti;$T;M#CnMZ9~gKEpLhBsT5oKvUomR5!Fc2)azryFc6HNc zp^{^(B%y-VUlsB{NCcUtCH#8f|KHa54}OeV!KWm23>Z4Tv$aOXyUo-08256u!n^+6 zjyHFa3!vYTqV`u{qVg&Md%qYT3eP$;5bv!XlnwWoTC_m()lhQrEcFz=1kwO@D zwRTHTF$Y$9aA9pSRK6%?bSF-kQ>*6|rn75Mc95mh-tXkl!Q1|Wtp50J@0ie+KBlFS zI8x1ONJP9>hQDLMuOffPEa}72i|=~B0p0~NxrURp~kBz691}N1kDV{78V!TOu00 zHsY>nimffG%Xb@DCN_X2kK(vL_~Q`i4$OzO#HPXX^l=z5{JnC2(YvuHO0mw&txidR zmV=$)I+HSe3kfq6+WB9d%w7rG7le_Uys)NgN}bdJ4%OIX^%oUbvqvDh!F0yR`D zA5I%inaG+$ja&hy@kn$VtcG%>rT1Wp-#^*Hhx_Op=5!JglE!wNONGzi0#E5XHBXM} zc4z1|6x+^yz1Z)*x1$?n*C~zb@b$r%cLR5^`GY}5`)=mj?mH`R`{G3KTP0#=S;B2g zb92g74Z8bqr7|j33)|bx%IK6`v=vP{GPM4V1HC>cwlL_YVcN8#k~>O`A!REd_cEB7 zS91OKM5l-j>Vw%>MDYo<21UX6YyS#w8tv}8J-q8HPxzXyN!@FaIOLre?UXD%NV_fK zIR8y~#Ev5X6?foW>zk{-w6yP#Dizg5#1ge)lX7Ifcf~m#8*KmO8x|$M0BB8=KXopxz0*puZN&hRa>HK5YFFm*%|s*6!Ba zaXkg&aO#6TdMyf;5$8=5TffDfx0(7PhA!Y)C}weY_Y%u(?l6XDwDo!z)D@_39+`JG z)nuAb=TxmKEYF)GOTh#)ZotC^7g`~)vd+h=I@UXybSx0 z5UNe5ch=03{=Bims|yeACtoKMoz6H5H(;{4);>LcJn+I|9U|val;QyZbZy1O$N>9u z9KCh>?b6%tgqw@4kf;<3s1%nG41+MYsHmu=ySqD_eFb9+C6)*Qbj)QkzYFM4c7!ar z;-fwnsR(_J;HyNfd8!;9Cq|!nUvMJQrb$?qyCYqv{H#T9j&kU65nE%&<<_ea%Z#G- z=Cu5#%E=2Nc7e!O$mnXybU>Cs@8Wuu6w&NIJ0!0P?Wir8I7_(d1NlGyw>T3JzL!oF zag6`_7k>F$Q~)6*(Sx+~bTZzOllj#TyFfCZk0bj87KaNqCsQiJjG}w)8qa+#tvpC} zA;`4oWT4Oq5cf&h%|Ke-6Os14CP_6@?GNBKP|@bzV0f?~o)*Qrlu&^Jo&D!7g;)B{ z7-KqKAH4{tCTJYniv8`Z_6{4J=Tj1R>|zn&Eh_>r&4drZs@g}J#I~l{SeM6JPgV`e znDl1oR#rSY$`@|Sh;+cgw8MusZL=O`bjjg42!jy4$e(L>2YDY}oTNqyWpv;XV|L{W z+9!AE6}P{({=JMrgr{}DtVfFlIWQ%lziI$Yc;p)4Ftl%p?d%wLpw;*k)(I3+K~ubue* zFgy|e?0dLq-hu%CL0Z~QUT+(L%jQJlP$ii-ag6J#`ub{qIb+#sZhG*no*|n8EA~a_ zRn7t!&R5C$6oO%ZPazn-NXmUpuHT-q6p=yInHfnJ!+H@HL8S9+;m~3Ok5wnD1zgAb z(X+C@&?e%^phf;bg^H>cZrNv$cE|=E`%@@as83TaYN)Ex(9zSMak6-Ps-+d%s%*p1 zaUvnK!k?#%RvQx3d=0&o*HiIbAx`xy7EbMwf}T;Ql}W1A9-|oR4_Jr1LMk{#i{zFL zzhgniyW7;KiM!EM&#_=!-9axRGbY+walenN&Y}TAdC`_Uv*-y5h*vm`#Xyx;SkI~; zfo&9d?+Ow85K<%}oM2 zO@yF7*{_;1DTGdt3H3S3XXthH*aMauF=7`f#(P8ZAV&C_e0l3FD>#tDRT;pnu!1dZ zw9_w@=vsKSLsFdy1K2^IL%!XWh&W125$&&L`i>KQi8+14T?bU5SC;~{Fj|oy(rGej z2xM=5ZU>LvoZPS}GHmiW8o3)~G@FLwcbPbd6Yr2EPDP<8;~G7}M=gQRUid8+4jVJL@pp|2bwX+L`-v7~d&Q zt)iT}cD3`}bFOpFtPz7%I2>B2ZnK2B*i8&D&lH)W;hM?I{q3ydi~rqM+@SI{k$1U$ zos=w6ol)al31sNuY|qsxchl|7F-hv*T%P#CSztEZovGXY?k1!eWicc+m@7WX=vwTd z4~BZ>DE3BNPo^o4)w?I9XVy4$AX=Wa9dF5STo}$6u}AJm$fY4z|MNC8MUuqXOM`JnePZ@Y>6^7aN9-@2y{ToGV?c@ICHEdrRFQ zIHO5q$_sIhp+n;95^C@%eXfiY|{;MrxOwh5x*oDka zm$Wq>sWK0ggDqMwH3}N-evT0rPc7S=)J-p4CFEVdKVa9D7Nl}II|L_CXxMMQ?&Q<+ z>Wd%H2P^Hmv_c;g+CtO4Uv&xM6STreBJww|c64`5|h9fW^DSuz71#HSIBn?6;Ap;-nGgS<-qv zywBi5ZPIZ*^6|#kr}w4 zZUUMmbKPA2lxp`TK%gF{rAFK=HS>zvgVEs1EQ5wiIY<~2no7++*L*7zlqnZBmY##o zC!*mdUi<27Rj|^j$!C+BTOB)~Bqz+8no&V$5mh0Ct#u-3`E{V0pN)H{xvxJa$25jB z6+2}AF3~<>xiIseS%CkIaEgTB$JIey(7E%beHUtRNn1%Tm@*%5i9=XeXE1+ zd#^|APRm0o8ZG2WK7oQ#)v!65ad^$p&3|l%b~X91ary_4{V~#u%Pk&XF3f*8_-HJ% z9}9d#gZAtl)G)(>6y=vhc`}flT&tpf_axRKhL-7RHQPIveASv`B|IwvMQ3RVapm*Q z&kgSFuH6_ncPY~_NeI^9WPUG>SNYYx&thm}EXGQv@R2@u;rHhmAaI9n7q$~E5O*NS znQ?36yyLrWjd|W%1JLc{Dn@tz397T>ELO(o#ZE!MV*SqVtz}l^0!}jobtXRKX!nXA z5mv_p`mHNFiRXgK*7|Ma*BhyrT}RRZE;7lb}X ziROPA^(8xgjP1rNg`D`cL3eTU%xdb!O)a|)72W&+`!gcizKc|KWVb2Q)XJO_;3(yy zTTJY+ZF8UB54NMr5h|}^o`Cj97On?>@JB9RFqDs&Fc9n)pKz#HZ zOBGy54dZC%-1XjF$*U$0pnV&ctHs2AX9eOYG1Ty;YWJ$C`o!*?xr*eAp~;kVZlTG3 zn`RR6jZg9w+{M#bCGx~VkB219-WM94Nq;Mf4m|u{K=n!Q&O*Vxk;mFhK87nZefjF* zST#};^<|Q7>q^_Rk3V|vAB?}fhg~@4V&v>_B?+2m=8*Qd60)_@ zwM#1?5BhU6@3FE~;~~WjgMGJd*jS9LKo1Mz?$tgylS}KIuCN>b7`4w;;!Ur1e%ofj;Wk3q2W=xmdAVMZlrJq4sb8iNc6ebeDE8?Z+^)E~b z3JBOYRcj>};sDx6$r$pXr`EDsn;npJ!KxuVlN!{$RxlDsk)MR}Q*6XBy@hlvEla(B+t=yP{qu>m+mxEb?g6so z%5)!xUB!0SM>0OKMNm$6hr#*y+D;}2JMd9s`0E5`=;+0E+MMtZA~%yo|y zCIxJCnd_Dht4zrGu#N4dX0r12YM#g177N4G%wNklEC8z_86Lq3yVyW+#+8-1J&60S zXeV%o=c?DYc=I7wPKT8*Qx#lF!!OyIEgq^B-@TVSx(k7wG{UOvf!-hl(Tjld%Bvsf zJ)Fwxvy7P3s6FOv?$^~|rC%FJ^5#mwb^fbYZ8<0vd)oRJMi~|im>0sP&2+XjQtInm z!y1qpXm{RM+$$~rYmti0_zl1~i_M#bxgcEOnU|Qx`2RhQPr4Wyh5arXx5A$WI5Lc7?^Y z4WRcNwp4Znn2%^E&ZScz8n{@v`d zQ_+rku-+2Y@w_Qhx+^d)_2iW&_@0NzNC%1?tW+QDQxe1eJQZE#yDRpM`e)Ji4?`xJ z#3dWelAOel#^3Qnt(TiO()rtm_9Wr@5Fb6Fhp((iu^1knXO+O0=)X+6iE{d+^>2VNU z&RDt7%|bZp5F9~wsKOh!i#nzni8mSWd_E9ZsrXyas5HXw<=xCv-*Cxtovx~3I5`ld z3eAF<>#i7q{!e^a7L^}XI`09Fq+5vaS{hgRiqofKUtjmb#sH z=c7kPJx2;9gu_uNNlOV`lOs!&;D#T@Q$e;(Ye#$om-v-z&^FB%1#d%BCCNmu#f;dc z(c;iC$2+h1jO1E{MNW*bcu~mVgR!LhYp1*siFDuH7XwnB8W4sD{cxFHH5yTiL>1)pr7=|BDIS$kE+0lqu=rP@MtAz&_ zn9d(`Ypfx{l6|D3J8*xFDo&m%??F8)DpnFg%0|-~V}0dU7GV;so)a^;VkvRn{TdoXX@9!4S#b|BsZrFDl-w6 zG10*ZzlK+yC|P`#i!>rjT~(c$EI)n8pEz$+7%~Z(O>*y^e$vg2YGZoE1hH)8$yGL!cQct|?8^~&P{ zQyTye_sIY$Bgf%Krz)6z8QS7?h=rnov~A54QI1AQN=gDm($OwJ4c7NbQc*Cq*rVfZ z%9dRFE(UON&sWpv#EU!~ZOVbt&9`{A$ZSI=3f?J6N1*MnM7ngdc(rP8*)i`5YaOSF zgp6L(lw7O(ZwT6hP`m2l#kRWX{I(Qo7>>?9frMF&K2l3)3-GR&Td3N%uz!bgC z0c-dhu)H@SB#a{GFF?)N_?F_@;LVC3Nvy~Ojr~B=cCPIqwKIP&Jd`jZU|%hT-@ek} zWxyY{w;_wKY?43Tt|U(as8oMgN`qo~6EK-isE(U3;sONXK&dNHxk91kg*1&a=fJrX zGTyKE3|IR{Jo#?}Y|8#hB9aug7oNHk^Uky5m9XVPz84{;7vP)*%2F3NuQTfEye(@w zdz-53NMjh`vY?uJMv>%QN4pY304Uvn3c|4A5COfWPy!6B@9gD1$@)J=sl*ydFbl zA9s@ucJhNsQ&Ur+JaT>-cC*>gA8t`*nuwfRiz$w8$A(y9Ahb1|t?3#DroqDib?VUi z$WtF;ZBllXpem><{%lxHO$~Xac5WL! z!j&>OenUTckx1ecpnI8@oV{-qkefA-tG>`Z$i34V)rEcfaxGewp%*GvOXIdMY>7txvYlKY8VKw4=NB4H$ZiVL7CMY2k2b>{Z4-Im`R zH*lNHgW`^jl@+(tvT!tH2w<6X?(X{bQWb@~*VW^$=OMbBq*(3^>10!L)Q`|9CLY>4 zE(_HeeU`=iXRJZ=WB}K3iJmf}c+JlzSpZ!Z78?s>2k*iX*d^_Ar!FmrU{a3i&-Y{z z{4Ep0DcxH9AXI#J;c1-v-Y!?5D^#o%pipYP596Ct>Bm7T=}3*m7Puk4H@0{836b~2 zv3pgAhaAecv?5GrCM9CrHceiMxjL;+>Fm)_^Jp_r1BJ|@%<)x{w}oR@-C@8^lDM%~ zA9m}%Dp_bXe~}kwB!%MIuu}h`N$+T=&atM8YyE6mBh6pH)PfBQ#HcvP-34K{k0)Jh zW=AouK?SZL=jRS`Z*nM0U!Z^eBIJ1U$U?#qZ{$6x^MH9HO=A-~^n{L|qa)HAjyeZE zW**o%n#hxQ#WiE;>ozOk#=c0Or(@;5Xk&yRPZf>qT}{Onv;Q=Lh1L*0eYk;T7rJ)_ zrm{}zGAaI>?gxjR%Jz2V^6d)l;nZJ3@D5jfSUG3j)x#L5Z+<2ipu-dBIr6)8GE>xt zAZE!U2lbHUNzbxbkF?> zVK~<}Bn~lBMnj@ui;<5I;6f1jr@?)n!`3|goxiWJd!@HD_Q(zLgRwOM^j(vv0q}at zlCfS5L&ZDyh(ld}gc&Ky3Y)aWTZ7XIOwg~bdk}G7gU(bvWgVG2-9;x`T0X-Y2HaO5 z)sde*v9Caf23wyG?MX_N>kA_kJXA5R2=VmUVUE$Ezg2gX!D&2h2u2H}`E}xAyM!ED zVkLCbay#owGMIK9f>myPD(PnONvYv8%v^HK#2(Ha@fXWVYstPt{N8nKz=5y%#&Or> z*2P`k(|Kt;d8cn_UZAfXJW7YY4h_%c$*uI~4k|MkG#8BQhCjEL`Rx^W1x0l9MQ4Es zalDcmCgQYZ>`GrUGBWXP>ue$_BBuamNhm|u)$YWRx2BhEa%`{HigVMFpEv7F%>WLA zDpHW0wg9SZUBL8QdaeK%nDIXUI3!XX+XW%9MEcuJvvvTUoz@iur*aIheJtZ`nRs+6 z8b2j1Pa|7wZ?mhs0{Ema({uW#Es1Lz^W?=gSP+P-ySu$1W%jsht8Z|Zx@;l9igKo} zgAr*3kypmNFBpC-5PD>8DM0XRLF35MAvSN@>Wvp}(a*W*4%X?Bt6Pe~I0O;i3p=$T zw#obG{<({T4q9c5gwT}tLSn6yKXvfD>07pWciiXN#LsdcjqQT_^4Z{t0dXSwB$c0s z%9wpTx03MstJ7j@RiSJMPzsYD1iYLv8loAp_&hCKv}~HGY#DV@VFFuvuV!?VG`K8f z64TfXCDfw9SxS=_S3>?mt)QP1evZBV zD%Z-8Cw>@!m6K-jpMvu-sk-Y*ha?h7B86=puX0gZE1w>>1J;_^XVS25&TXxjZLho= z7bwN$dGWm^@#-SGi7~L#n|>dK$i&v~6i@nXkmJ~$cJ z5QE!lb_`WXJJJsLEJF%|QvMm$)S6!Fi;r`-#B3t%I@N~&Oj!!V^Xu+KF)q_Jf8gyG z5W8vtDZ9b!Y4f!O+`|dxyth}22X`#h%+hizkkPz(Xd)P48`5y!rlsao%h+zqtU>Dd zFOYvHkVe9^lUJ1LW>a#^&#?Tj1yAe|;J9y9a3}rt4OG{;$w86$%9ivHQrOyWPBEZq z1!z65Eo#EC_OyhQm1x3T01)S<0Y5j29plxz>^L6hd&F1k{wG#l0L+&6hE84$B<5vc z&#%4{`(Wt@YoNbGxXElHZ9nC~yZQ%ihTB8(Jmqs?G%z3zP}_`E=%G5d?SjA|t_y~4sK)|y{Q&b{%@&hhla0%zDnb#n76Iq$ z|GN5NAFXYlqCZwFj8Mo-R%nM_KIHf_sK*kbF5 z7g2eFBJK{9=GW(RjHCe#LLK+x9)LFkaTb1wFXX~0Yw=;r!$LJ0d2@GdfXqcr18w!Vs z@h-0-W1a)$3bhwkyH75e1G^|1GRh}aOk<3VZ9!fqK2^(J(jP|>bQ(l#!_0|r z*JF}*^^J|=R)L)GDqZb8gHX_SVravaInSFyQ$=^OJ*n{rrDB|PG<&G>YXR4BINRszF343_#zl3mOJzMDc$h?(L2jH@8Er}5G`WOUDZG+0&O=y67yN>R=53wZZO2d_d*a08;BpEX?gKCyIM><#oRvzdb|ZGysj13TX7w0A(CQkSFV;eMaLlKJ!EZu1Spn z$ttw_Zje-Kw?DI&+kvxNP>L-nElZ}ox|oh{IjxEe{S@&{{_epbXgP{HvWJgpsIfat zwi|esm%qr<5N|wT&VWG$OT~7G(nt0QUhgIZiJxsWcitEct!#!|%&ckg!KlsjY84wax*pRxOWqu9qG>BK z?00g%^M6azA~&aU`J_TN_Qs%h8JXGYtqkkGA4NmU!9g>k`xu>3_MqcVH&sh^Viva-7~h(t7)DomC{Ld@TR_+>8eqh z!aHT+r;lTTWt<^YR;IhHq*UG4du2(?^!1J>$>R{`diF#wXi*j3DHl>Do_V|`tJw>I z=NxlU;mo@?frJPGP?GJ+w;Ig2`{_BG>&Q+7+cn`1Tw4z3KTi@WFOie*GblG8WI+L; z3WdKUaaNOn(Ke-VQI2M;+6VVGBF-!tiwP;x%w}XB6S$+ilA84a#`4OgzPe{8E2U3G zDcf>!;g;6$S*}VQK>9Yku>$OzS>sZQw%0@&*hrvlBedGBUkR!W*1H8uK6Ql9SR5I2 zF7({ObPgfP1X+&m?3(^5#s0M+@e3WO@B@1TOChr#&hhe$&1s@qho)8(0gJ3D@2k52 zi*$BdpjQazRT5NB7Nf$ax?4Z|E)dv#J&p?NXl;*azMD}}L7XiFafyc$m zzMbdowyE$U(1ps348g6u5B_=O{ zL7zjJNw6f1e@)(-TeSza=^i4?@mQF-O-(vlmdBHolwKh9TaTF76aocsQ=W{~I1W-f zg;fLkI0pPn1l!s&RAk-eWo|p0{LTcZHYp-dXHZudpOKH6y!n~597Sn^5uyvvwNZy- zn32db5A!ZQ;5y>dg=5jIX_en`l2w@4$5qxJM2i>~92ABMw zYak;UFwD$QWH%LJdgy)8WU_Uqx)J}B^Jm^#FQhR2#&C$i8YKku<^HD5jTjh0h#5L1 zz9Fr*2MmE15Y^{5IDK+fXZi$H0xV{1YmORu(JBVFKlUE|5%_2q>_O)RG>*p*izmCd ztdK2J0@k(rRQ-&)n@ksa*!H9-kwLHmsAxq}aJrZkI&?WoI;!T|U&xCIyFkVq0#T95UtCd6zGUO6J@z?_0-3V#7-_@d z86_>7&T6Ota|=xlG*6^GFA60`#_;1a0!IabG`9wdkF6>9&u$^--ZT(K%{bK|$rivi z3<1VILz^c8vy&do85{fqP%;lCitm`{B_TADA6jLDYxWC}f?CO=3DJT+19H(93f1>$ zeGno@c?m{t&rfGmk~Vsz5R!$zr6@m zj}Jmj8>;|ngFzXf{li+iXpa>G4+@o?QDe0~jo=n%nYk_$3l<9+2rbxWo=q-3^<)*G zq%TYx#rGr(+bFfk@Qb`*>ta#}z?N=y2?z*ab`#%U9{k&AX^UKm7AVMn@|PI;w|}7Q zhjN1h2sB%yx-7K^%UmfWdG#Oe2h_KJG^k^W>iT254xhZ@1?|n#_skIwL`F3|hTckh z?w_b8+vh_Wx&*5nmH5;^@!DduUbhmlYrPe3kjZ#U+z>F-H#8Nq z-FUnC@V>s!tf9jldnI6@K`Ur^yVa~}z8Cm%%4wLjYc{x)vZxuZko=lv?jb33pKa6% ztaV?6A)N0%_YVMkD(Ss75Pd$-suochG*3hdLS5*HS#`XMkNwt()3ypzM^y^F{nV1; zFow5xt0T^4l;}GiifZfV`|S=5EG+B}PK5faN&hjx{WQ0l2J1F70&)F?A+u@P$vx#M z@PpooB^USEvdhEaX75cp$Kqee5kj?Ye$QMOZjFN2@Q8=TPa;3xOslZq{5jFR|BM?dhx(Vx^d2ed zgWW9hN?Xk@{~e}2dd|2d_Uwbj@5*0T((I7bjEwifAo@jYUM3+o!5X&pB&XGm>-g=j zQL}T|1-roYb)4|zcX*C+3A^l)bXjHw>A?@~%sPmcyuPHHwh-ysd~q$uvGkJuh|F2Q zWnYJK*<^));6%n41h>Wk(UB%b-oKtq_Z1{L59PHNP+m++V-URSFX$NT?Lo)%2m&WQ z$E;WQShC zU(f>PdP{5dKO*$h*vemrPBB4i~XAr4@H`iI6Gz=0Q{eT>eWZ7sZw-WSL@k=lR=Q!FGX0 z{^cZM^!9<%AN_(et&&+#v4yBvhlo(&0?F&_^ZDgFTnujOLtNS?#2n`g-pszyr z1n~+HvWyw8pbUaXWAv$B4F?zM03K5{gJ6|j5pU?9z`RId^P0Z8Rp{_fD)^Z+;J6JM z^tOs!{A~@+z*u6RrE2oC>Pwejyr-{4fR!#JXA33u|MYA%F53S&86j0W07REA5D8~` z=U)4B6CyAa0_E-Vc!@Rk)l{lpu-BNV9s|p|oG@ry@Qq)uWeQ&aiWxayOPzh8a^=5_jHl$?DJP&{^BSu3P1MkvUPD;H33^ZG7-X|)2$oNb zn>1dH<-~a&y;ag3$C-BpQ_o8Uu2ab+6zq78L9;)-#1w_HtdoKxVExec8eN3QG|~{{ zBU!D>mb3;jVy+c!2{KAg0~qxWm=Wt)$N&kxqd`3R#3m4$d`}of1v-|O#+u2X#qX>) zh)nAvtlNJ#r#chW{FIWh74093pF#L9y*YsA2A6KAs_A+wXIGa7I!6!cp)`qIX6ic? zja7*|1DrdM_B}En>rF)CBfc{sA4c9CGW)UMt>|pQ$?Q;G7eSvT>Z~Vb;>#_Pl~s=@ zDq$9+{X{jCagxN7^;SHk%Zh3ixgC$svF%KoXEzEAt@c^*h}`m>q^R4mqzqJZ-7=HH zF_mBvA6GH94XLJ7=$A5|~BpU`()58PUfBVlfCh%RB zX>1$R0W2Ky-~9)_@S)iON{MvlLF_MBI&K>VVZt_V(>^JuX{Z3?yZ8y1yPM^3yhxVY zj+3SZ-Y$vL0z#vhbmH`V$4 z)hlBh@1hU|pZg*{sG=tQnciH*Bt_P~=m-Ie=kK+Oi#ocPR7fO9jHKn{LSTx^DbfQk z--*!F&OFs_rDPYzryDjGU~C~Ca^bN`-IW{TbC=QBxSV6>9Ov)6vFgfl*|?vip8Zz! z%Ebn!w^|KQy1I&#Yae=jNf}=V54A8rOQl)Eav1eN3gMk!JM4UZ9vvNc7+d0S2E}sG zy^$-0KPApt<>S~uWWn*`QDBaz3zzX zv^L8HseM6&fTVOAI_e29E2VD7e?Y}kVFpGLiyTQ7b0*DTCFTk$F>w)`Njga}VOp;C zoe>rHCP30USS>vbi?ku}@ho4&I^O72KNbrZlQ&3-?fNXd**2D5zRLloXl>S3^1!CS zZnMqZell9zU3(TPzG>TM9eKcrK7aoFgrU8t{d704(CV#Y-VjJ|U9oOCm@=+Ig&z7=HX^*~qf*Nh3@asQmpVzrYtRV4mrgKleO*&tAAE+MCk~>)Rka_LvG`t>KCFbjjO|i*$A|a#?gHXQT_7Z1rh8i4 z6n^-3-39r*c*K-+)5E-DyXu4}>CP=eGr%$GiTZpCOs5%m(K3qKe>QU_S?MXb_r~~6 zs`w~mu$LiRni>L(XYV{DraNCZ_MYc<0aHhcs)JdgZUkLb&fQN(9>6Hsjjay8G>MFl z+^}Q%QrPB40ZF!57dQLO*Ivz)n%+;KK+boYd)oXW!#MV%8eK+2)P3lL)I)8+0f94b z`bu+2w5yfWL2ElPZ$hg3$wjskibv1g_0wE}{>oM8jk#J4&{^b?bzK^Ns#^3a?HlcZ zYGJ<~3qxJ}s`vvuHh!Nh0>-6G)XKgZHP!!TW|;Te|;pB@+2MphwP?w!xc)yOqnghbtlf4{@%CGdMa>k#31*%jmcZo?o7 z7UPR1azARUu0852Oinq|3`>_WhAKY+ED!BB7PYTuBT{57`|tl*rVk7giRs9S=Hh(pHuA2v5x9VUYMJ zV#y%UBL0g`%kSb75$8C1#U|3^flHLt3!@v&=Z)Lt5(izD z0+0m;OBL9%Bs%$uJ#ut$wBhwo@*%Qg%Vu#Apv-SKUb%d17S9G6oMz$LH6 z{5OcPa7ysWm+KD`_&!uuOZtlCygYt5YeH>c%odwoz&wbMild-WO6R5Ss!iHEp1k?x z*B&UY&q@mKqj>4g8#8SxK7sTqSs%*7mrRK8%?)XXWEjKPBo~Qq2_@5 zVG+LnJtGw{f0M5FQKMr@Z*M#UO3O%Qb+RMniuDU0wnAzWITKjQ8Qj?ew5FJEsg=JP zHk3(cTMXXRunUyT$;NR0C1)2=68>pBm^OIL{5sdHD+CtIKS6-8N=!0|f+ntvqM~A_ z5zO;EgVCfu!fPwe3K1mDG2%Q>SA@cUedf&fA^7{vet{`1vObHPVIb@-dsbYaB6-k} zq1x4!XQBB;IM2LC5thX#GMk~MXvD8OcV=@7D(t5lIiws{%OC0=pd5VGS{{>n0PT3> zn*r%UPT#ZaTO>CaFF0nTs%2g}@2DI@0bh)!jlij>c_I>KxbBJ^&knsYF2ldfO`m+u zep(GuWD}j7&bgpx&vZpf%09rN?6I>hX6^3|A8sa!yRXN9gUt*GfQfSA;6LR5Ic%I# zC&Aa4gX6DW^@L!$zfkEs4o5Z~%2pwKrDZY^dYA&(MwFYCiTZ*2@9|CppUAAOXt zO$~nj4Qc6nlUF^@!!a;N$RlCH)X&H4Z9;;A2%k8+peyn1$ zGP|(DY-D@7&fvN2YxE|LGAXyx%+=LpSK%OpAYdfwKwVOma{L#P72+#qc`@v9;p>bIPc=vc_xO3jy#5z8{|;84PMEpvkMdqAw%Wh3j}TKgEA ztGWb`=Lm#hu5J&#Ha$?> zIr%f%x?bz1!en8R3-lkZe3*iX#2;of$EM6^$HMu|o{+cq=96y$=`ehD4SC z(JM>8mUQGQY&E?EIDfs&W#h@7j_0c@PiTkkS<s?&$i`C^KsaHS^^AT~W9@jeC!eetsl^n&ih;w^xLqxKS=cHB4tHT(Dk6I=Ipt0jzM~E3G z{_?8JKK@5e$4F6eaw>XyQGpTtjmWrr3id26SE|C2k|p4C_s&>4pS~;u8DZ;h54#>g zdcFev^^?IID(A2z`L2Hlag{VVq5?ro&!kSXb-8+WJRgzna`X`kzmrsVc4@@IOprwW7j!x z8sU`cpgY^Iu#9`ad2JS#2tp5e?cDWIrtx4&^e-{wmmg8zaPgf;O4u)+_&2clasfD< z*`-S!#`u)DXk&_&v(0%HeROe=Wt1cj>LUcxn`h3|!V)@-#pDU{QtZINU@vj0Ik9s# zpxHZPO;K$iyi`_-WjgudW(`JM`?;@NAR4=(IdR~@+EP?`Vi7HPXbT_wA3*-|V|t;$ z@5q_>a4@R=*YA9n04za$>!bNLjgZ~s%frU@!&L-(q6={bP}kgr(FaAa$m1F}sjzTf z-+VY%Z`{xS;|a;E{I#U;`==L&*dY6UShvF8j0#hC zOgiX`jX4FNKOk@DsN{qhfc=7s{j9NS6^O98PPk;hidIEGc|sg^;XxLxIJTG#Oe>!T zhhjN(%72#!7Yj#E=L7#)-isG6uF^CT9!4=G<1!pfwqxENcsx0CcX3~`5=X3e%5LmK z0NhylssGFZv@-=<$^Qq@S0w`GSSXxJrNjI+e|pu=4757pw54yq09fM%FhmVN>th$y zz`xgF^eG;I!Tp_;u0uIiB9eemsMq0CqG)~z68ARp(?}F1Pr?rTXy?@_HObA(gP zH6q1X#yc(;u@BmjoN1i@n0*-kzcO?o0wIXdw`+&|_|edjt%vPVW_EUVH?A4rFhe2u z$wO^=hKfTu2+kVX>L3e%n6!z@;HiCxl;QNFM~_;|Pu~KIv<~{e>+@p=*Cn^1+a`=$~aR%yt(8ynN%K_|rrvQlbTRgbUy$+rEEQt5g z^71q!?j7#%Y;{?u6=EO0D6EJ%VaNv}$`lI-ZdDz(1}s7QZ*}(Bl{1`kx=s6d-r&kY%s`c?H9_A!o%#ir8$! z@bGXB0s?}Y=WO0S+J6JoIL@EgSP-v$?)pwsJo2rdaeQDDS9I`surJ)p;SWa~-Zlk5 zx!=e9!xQ5Nlg|JSyRt=k&K;xq{HmT9TzvFm*b}_{?{M$*H&{t%ICX%7lnhJe3e#hp zf|0AOhP*2K_L+gyx3}Ezu3|*+eg_f9xbs5&#J`DT53?WY$KuA>MUwvU^q+C0;$$CrXRi{Fv|{ zM+AJ7HIT-jvY+EJqLfZ-ug-fS`vyav!SjtaQ0~A>S3%Pg4^hUr1tY$l5v}{Lz1D;f zKK@nQ@F`|RZ6J!;J;p2fZxn?-Kq%ycVr60R^Xa_#$D^P=-2T9eV+zyBz>MKjAu;71 z^49$!XPNgEhEI(!en`eQ^C@Xz_7L<>+Bd78-Rm!+xSRly@MfXKjeipfQ6F?b<2%7` z7!id73j)u17>JNl5BX1$Gh+8IywQ(&#k&96T_`Z=j&6P6{PPR^jUnl&f*`vGG;jG} z6yz_8x^n`BPg(nCs@lR1WL5xwdmbKcTF%Q4j0~EbU_PJYatrak8dF0Bv374&w^?RU@9XCd67bD+ zH~+z*91w@v!O3vL_^3ZSHd7N0Sb8>zQQ^LNdyZIde{By08Y8>ocmN`eJBTWXRW|oi zwx0@ogub1TIt}u`e=BrUJn~2Eq8~3{*55C$UOEBs``W9cILIS1`QYsCu9X|5`M{`m zuUd!)iWtE#k`bR2_y5d;``hL@-#^?Of3tx2@1JJ>F;NI-LB}K7DDtmJH)5==vqaca zLbQK;T}RMzFa>0QXWa0p@pI%$l89;gv4B`knh3rk!Ymd}Bry6H*Z%`=`-@nBE>x?< zlGyiw4`mNW)(lNelUZ0;x~*==B7(xf4wOiT{p6QbRaN9q>dF6j)XNB1X)Uz+jM+t* zoDls-m+HO6q|pD-G}aL?cT|w=A3j2Z4FQ;(#Ix;Ei`i{+VgJiaaO|E_KoOUI#s0hM zQo?UPSto`Ri{VqqX%JVd7RbK#FYNaK)>V+bFxdjzJj{aC1167$<2u@a-eOmNr%-Y@ zLmP*@4sJeq-1FfLJ2t-8<%i`;%({l;$VZ@Q!P>3#OFlFE2!teHuxEJe%U&SP!v-t+_rC~+aTr+9sxSc(U|Fu%)?k!%^S*>{w7ZTVo-nl2r&kH*+fv?Ul0vj zuu{N$|4^3o)Ts?*oJwPlISCGh$c+I9?AsPi$|zFT6eSv9Liz^{bJDf`Gui%^MgL~H zzlVIBi>LZAOg8YV7e6cpu}403Jo1X)EaXO%NQcQMsPY9o=-I)L9x`H)$hVVAas3&; z6OY;R$5 zl*kl~V3Dx_qnUqr{=XV9Dw2>Khboc&cw$2|pHbkANTF7f6@-R_12Ain@Ed?!b;rS% zUb`9~0BC>%Yj!Q}xgo>8Q>Y#OR?K(H{<+;>-|v4N_wsAd%(H?sp9wHN{jXo<9k!P` zPH>Yq(8OYzl!pDmmZ$=f7N}3T36`~bb8L|R^TM|B8*a$s6+2G+7z)h ze6T}oaD}^wtOlcCrKTSG_iS)ZSO^pm(v?0WlHvrwI$A|bI;(dX-}=}IJ^EKT*kT0pgEcP0uh0F1n8m=5 zCn;!x|DBlsA93FukM-XFpOKvEDwWL$Rk=(3YUR90oD?47;S zlD+pzvMGCn-|MY&?(bdq{na`D{Jwvj$KyCoa(zDU_iH>~&*$?c3XfT(O`_%c)jlBW z2LWL=UrA0*E~j(r9J&w;0N%hwe8>vd!oU_j60QO4Y;r^a+ct>@wwS^3as%yyeS#i@ z9U)tYozSoP{l@dnF|aMf*^r8|-ijalCrQOsWeAXZ`C_rS{}22RMjGzwhZQ z@m+c=$@rUJ!5AK@;r)9T|NR~R8W8{EBBmehqtZKV-X|g@BjfX8F#P~&DCxTgv?nVn zDrC=|1am(Ceh)Ik-&~pv7dAUS&T9*?HbMqo4a25~V3_sPnbZwd21~=^789VB+)=P) zh+$lv;?~|=K$2 zNLS~3>&bzB4%hZrAV*%fc+p!yADf+N(wSYlQ-q!9Ajs?ve})k`*SUw=_nn~lx;8?A zLYdq2U!lxRQ|#Dk$pFl$C15=AiD$SaS^Wjn1W{o-pWo4NnW30x^NRZe99hLc^?!<* zn)+SgWXZadYT9+z&j1ZXf2p`h?l8D>( zx1FT9Jady1a1OE`mB9b{CdpsIktu6>VfLGY`_qqc^+MI&k({^qD<0*frhdTQA2=|o zR$ybIns0^gBa4c4A%}c)878{}^99I>fh@+EUzA>e*yDuWdB1FUw#Gzjl3Uf=^46E< z#wx+#r;AL;>3i;H7`4B8toml3H#1%{>iN4K9|$?q8&-L#Qf&LR}NpjgvhfzRq>5NrQ zR;vJRTqu82+5imrwwY2mZ1*Y!3vCH84UI~$G7%?nWG44eaG{SgALW9w!)|Y%S-_d7 zQbPE{hYT8hS=yn=t^xI779k$1pmbq^`#>c0soT_Q!1KCOge8znMZ~QnQ$h(`N z`(+$e5-`#%0C&&HgE77`i&DbA{YGBFQq$ekzwb+5qaiDA6ZPJI^qGx`>krK41BXhr z&@LTfpakkYupN9bTtp+Bww)T=cD>;o(P2s=JlCWk$#LS?GAZZ?n1LJ|X<(43!>pPSb4v?w{j|Yo z-re;%y=CFIVBiueOz1EP`7=Yg3kj~S(3jfA?p9Hh_$%4``)mH6|5l0`Ljvh@{(p4I zt#-hG(vV!r(9lr))Wvd*0;`cvJUL94o_+wh`xv-cYDd_neWCI;54m0~H2&-p=f8rG z+{)b8aWT)Gx1JdmhKP62>DCMZ9SXPV$bEa!d;~`NA}?2A(kKN6bvIj6G)z}1i}z7{ z3YqYrj|=HmJK!lIL;m#)i&dxH=MR+lrnrZlE>KfG7A7ovpew^cM2Ig1Qu?Kp#)IbY zjN~nbYD|{-h8V7QQgG2WCn!lncQ%wA4ih#h*j;c#FDyNcqF6vj`=BbxrVl_Q28FeF zf%3xt{uuw~f&TPwZbv9CiKglig*`ceZHU(n>pxZYROiHNZ8zM4`P99!MW95x&;TQ8 z0JKb1F=wM|p(0Pj+XD1OQu43hc2i6|g|1k_5NH`ye}=SJW`$ zJ4or?=@?x;@;4z{oS&b|i2}!)JIL$Glmy0v8X)-Dn}3hvN-62AX`HQiVl+`P_Op>P z?{1<_&ybN1qpD8esoGHDyq;t|y5odw82>T-+VDUyBm4kx|1quN+ZN@RGanEk;$)qgSR9!VhE+6Yt1mIKY|CplQtW{5X+r5 zyfPd^blI46s@y*#MXVg8fs-2fR=1W_1)ppjs^h0mUj|m!7oH*y4^pX1m#UYSAQ<^@ z#K7EK%4uy$pOHqY+>d)-yof9DBXAf*6dT1PmCMtgD+Zb(*1D;H^>a)V7?HX_WP5bR ztmlI64NdJm^yDluUw1-LkxjaINcTQ7eIWO~VjwJ-5=K^|U{H>-*twHn;;Q%rI`Q|S z$7Mq3fi`53SZ+@~p(#;r0KY^KjOH5Sc}zN*7VRM|cUE3VYI(`d_(Z@q-hYy5WMm}6dEH6< zc_6E5!*Htjy*;XPXO}+jwFgO>P_|in#tTpzidlTA!W+@ByuG_cRQ_9fZPFfBgMH>j zy+*wGo-qn;jQ+r0gxG05c6)Vs&H{Lgr26s>n1oW`eEaIlC7Rb%l?AhFox&NlSUue_ z#1N;x*E;Mll-*F2uDR3-Kt|#I8n{OV+D_NG80d-r*J=%Yg9a+-LBZeDu0Qt_ZvsWQ zw-y=t*SHXo2u{kOc`&%-qLJiX-NWvu-^<@AC)JtMZYO1Tf4a4(CR|7zY$BcWvV0Cc zzR-0X)6(#@8^A|WD+ge$`2!hJZw_xuWAfaDnfxXc1aDOVk-4xR^&0{+;Pd+dhyq?}(0mUKz|@35>YU;4SwMxZjnK zs0Zt!#4Nt{i7r9n9fX)Hs`?&y8ZnT9L`MX|1qPiC*A~=v{HB2TTfoat@eYcbXwqoV zZ1%(DV;Xqxw?Gv#4ZM{KkhmP=(bpQHlIrIut`Rc+&`#CHIy?u`S$`mJJekMtW@_)7 zEf@i|%HWT-#c6f!DzGelXoPR8tPR1!L2?QHTc137366$~V5?UFvzX9??;v!S^lybE z%=!#=cqni$2D^zsIW8Z%6+j3@NNr*TTn=~ZhIY3`vl}52D(a4j_Sdb9!eCikYkN8z z+?-;Zfda`HS~ymb>J;f=_$}t}Y6n41tNmmExHM?$uT3owv<;qGWkF@f=4b0QdTP10 zF5fnPxWD|6b1bltVdoQJLVjZi+$V-G_f&U{Lc7aX6cl{rX)~_}0#+sklVQRHPvqQ0 z)n$_NjHhYd)pV6lJPWH%0J_r6n>Tr_zX9Xp0>m5E0$=OL<95p(%I+G-f~=k*-#j2* zA@*W{&4kR|HPG1}WoDLw+D>=bK4#ry=Ush4zY!`@+@Jli{;rk>TZk!-Qs6~XAvin) z$fN?u+rG|tC$>FHe{liuc*(RCAb*_zuq+6ul+wOfTnw-^9sy&8{L!m3f#Cm?f9Gv5 zt173lEp4JIFgR*0#@kNo?0!JQcLZ3M0l<-wg;L9KTomXmG4QusiMc@OxWg|~4RHX# zr$e!LbzXf5Bt|F|O#`o5y2xQJ^l0>;p!n-~iLoc&!8-UeQsXddKjG9xj96|bxjEG@ zAS~K3viOaY3Wx|9jj#oFvv@#HgV1NOu+#tOg}r8?@D)vcq5?rF2(Z?V@L@m0oqGgU zv5Yi^;Bo?5njDYnrd!t&`5@LS0#o#G1K%=s*IrEV+7^D#oSWH*894}Ax9JXzq^EWo zb}lSHPu<;+u5+I6)+ccnhuI!q&tQCRDp?4uJrJWKA#gc1+MBkei2}Gxj}=jh6d}q3 zrojuSqIKhntZ?ul!vy_DV zbbP2b;!KM|wD`RwXHb#`LvY!4+jxTGO0Agufia!fbPFcQa25k#zv4*)8szoub`2MR7}6FXkE%e5 z{#W0Id5aO!GPSBdM=qWrlIy04qi}|knPD+_QMJe+E7|<&)%W{PDqnzuf86F5NR1ssKrJ2bRF6AqE(P(XMCO+3M+bJ?@^n zo4E=(A_lquQw3gVZqZ^9qGxI_Mim6>SJTyzC1$0B0Lr6EAcP*!O26^;Gi3Ha7}gzH zzX+nurRl*PZP$*(KNs0rlu!?^;Q0}k6GB27vk_}-OW=#VSmt8Z^3;56+6o9iR6MPh8v&cqffRLWjl0_L zd08T2j)MxSb5-UkcLn+Wxh&|M)zorK!;<~Ai=LN&6<{>=UxevP_fYmrTG85p@NTK#-Qo(eODqPx4LGib3)&NRXX!fM-9`Hd`t@9b6QpEB z)h_*V+J5?`)WwU_1!pmw$%^rhP`3xZQalKm`Zfg~wtox@CNtT=Eo1ECt#i!;rA;6> z2DO?6S9yZw+OH7YY1$``tI!&FjRFz*GrZV`@U$IiUqXo|>2(Df^%pP%(j3!|bzAGH zh7x(!?1@f&T082-L9CY1NVt}DY#5i4{p{@#3MJyQT@I^2Gme3lGy^(dm;B*X6)|$y z1&S}|1^MPhpk-%#iMBnldg_qy?c9KqS8Hs}t|`L{WPbq{)3iFm?$aOkpe|pXXi+X0 zX^g!uT)8#Fpl<|9Qy&or=Som4_|Eh%)9A*Qz$U#5u!>|{5jPqtU@J=p7KHT$x9Ppf zo*I%Tl&~+557~dscEUu_o^>khwfzP|U_{gv6h16I`easbU~CBX?F2zieG-1FsCBH@ z1J(gjvwuY%Trd8lp66)Kw#S+E78mcDQXmkteJ491aS{xNRPq2JMFSipc3YifRKxC> z#j**!72LcU0s3iV>jwSwZyu42Zl*6sq>!|TPSCE7+*8nTKB)`bV-QsziJ0O$A*TAe z98Qd8UgTcV&*SFSqDMMW!DYY7_ z{Sv7Aso>vP6&uMeFw+H6r1XUpiJ`q8I4!@(*n=krNxQDH77!viYEX6k0+zG2(}{^` zH0#cdHe1XNU)FJ^DbKKymxwt@ySo$n99**PJ=oCDZzx!4_-&vR~fDdoqG- zVq|S(T_aJMjnRkStf$bl+S&<32#u=ml(Uw%l2@T;;b=FPz#teH1OZN0x+rVXTU>-U zPjZ?v;*B@52S28p&;z$q_vol63M7XS&4s_v&NU1hiC8MZUU?Gc(git)v2(0Nz6uhP zy@q#>5x4vdtasBKTfQPnc=Y)33kcQ4++3rcV}f?i;>bRYt_rcSRjVucMT|`igXZO^ z^V)aQxg&EjdPZe**a$)U2Hx0Z8hh}QfzSgxWgdc-x;Z(pc=+79a^3+#%?Q-<@-O4q z6;+FG=TS~3t{nD?c1;B)E6i7Z1A$k3ip^X(CwpL z1=bFP#ggrt=qc)qJ;fcMRDKQu$fSZm^6hV*BpA&NV5%3beFN(qv(7ET10|U3Dm1LN z(L<$K+{SJ4VCC62(^h62*{_Vfy)Q29H0E0vkIB>4G+ZmkS&acG$=E@f`m)pFyf0RF z+48-2{&Dz?9;3?m@kyp-rePdY_CpDJipRudI~|(MtD$~a*=NuLh5kTs^ujl&c}`vb z0>$24N+&ZV?$Vy#sZ5aMP(}H|*h95@tf*;DGrD(GZ=o3+AsTY0NE5+JTLI>E`UQ?* zwosuAg8%kISjAIeBT%p(r#KBhPXU16b((xi4^O#7;wlsv5U`ILd_P6rSx$(TPa*Xc ze7p#`)w^(O1^2OcXl`Alu1= z3$~L>P3IU;nL&T~-DI+*hV{eMmDXFt8p6xNjG!Abi!87nn*xdE^vSeJ)423zVn~Tc zv0VqMqRSMqOhamJl*Hpx{8kSPzrpNfrSr~vn~nu=*8Xz9?OFTqUqZyWZ!p!q05k1O zrXBhwxNSrhBSkwgmtK`WWFq}boc^{e0JB~Igwccu zY&uI9g>Mnk-ICw&un-_+O@lj#T1!&_0qo*TWt5d`R#u7KC1H&%5;&kZzI7&mNFZ zoRbaZ?YB08;s$qa6~LpZtdx@d+~2Q~oSX~YnlMc307f}M-6Qt}XKDD!zU3>Mwj@1y zW!U_Y+^5;R6RP-o!V$wx$Y&{9G`)v-8FxZKivl%8_44abmmOMI0XBTSm1#f!Ze@8e z`G00L+Eg*?lb;*kIBFUPFU zd22MV*To(o=n5LOK-kH65mFVKJ4LdaCIkg$fbKYGQ1OhEjjd^i-&;NxmBTLHRJ#4- zdCm+~f_X@l{Y_hhNET44Wx@toGwGQ{dw>c*kHkg<0X!@PWFD~J=V{rJ0IZmn_`{e+ z2hea8%}@B#aV4-G2GAn90of$cL}l9(*3Gp--DOpp zpC79BPOhqGy^OMDPOR$!>1QSM4Z7gnE$e8C%P|kz#&sN1Hqn)rN%?U!epsUzo{lOz zIWK6i&jpj51!801jRWi&l&a@NXgW zRR9Vt)49lh-i+if3ytK^!|psIkt(o1V_sR9TF7S2sRhl9A(rKNSvbl}249tIygj*L zBv})Ge`TtqceqobB1KBC7bP9!R}dYQzATqKi?+KsN=Zxa#mqL#GiiCpS`K&ALT?~W z@&K`mv^+UR6N=iqtZKPMa=>0dcmW^lsuQB8w>s{bqw1Sj_U1uUUOo?ozy_Lf^}U$O z4IIa`yu$~e8kX89=8SRQZJ|v>C}3*0f!8C?BA_=k#+zDLWT4cOTr_zLoGcLl{1|Mr zt70jPCS(@485qjO3P0r$1DIF1l0*yQA9B6A#FXz~W|L`c)^hL&_<`@0q`1yOtc9ch z29znDZXbvsAx>vI+VlPlvX>H5uH{_;v@2*%mBUSlc3VrZszFGykxF9E;iPaen$D{U ziWRwz2HmhptgL35kdO%|d(uID6`W!vq?Wup3+vFrHl%0>H0qO?MXmkS`&eBl>IA!h zx`~>bxDseGD_~dPO=!JLZM%VsL%o&~RieBQ11B~!3tE`!-1lnxS67=HKf_L(8)_0- zir-+xP>9n@O>Ebg%8@~tWh)mkMOAl?Ipf>|-6RBinMiM8oi;*H(-1S}G|!I5EkpY- zSuMSP2yF{T&H{$^vcy>_@^fN!MsYFJ+cvGk=rs|T)f%SX{l5p!|CopXK~h|&E|JU+ zdchu(_uL+DSWAZ?4p~6?P|!TpTT%i}Kq|0Ej2+amGfSif<_&=MUFuwdlj;8BWQOG# z8Q@`>TS)fWfWv=M3fR3b0RFiG-rtNjhd~g!H}kq&Sg_}}`N{6iLxJyWwd@D?Gp4;u z=LXaiwyj(HO=ReNs`S8lAzQ9!*H<=`5Igm#98PxRU=29}W21-iA&$s8K3}l}XKpM* z9M*GGZQNtf;aNoU5VVz?nDyo@`e6$6mC&-?gmO?;Lv8DbVcILtqINbIZ=H6VtonGS z_ckN{JanysHu?wDVx8UL%nr7k;>wK&Gk^>*=PhWgN@#t4emCR3kQ;#TpNs_^_Yo!f zHi)R#QhSBev%z9DQrpv^muJVmSIw>x$1wb@kry+gqaLq4$kDH*0}_NUz68obONW#? z`B~IG=~HWVB5AsnoJM(1^<JywmE)@1miI{=xw+*x*W z^V05yJhZM&#whXn)Rgz;Y2})Wa#u-_*d~7jpdK7lp=vW$8-#UVkHDb( z@XH9iR~7WRrr0lI)$B8tn9D$GO;NDMOh1LG%==T{ap?l=$+mN&N(f7&^wiBUC=DRH zWPcLdz-8RV;m43V8o8>Jq*9+z06XJKrx(gb7iv4Z3JIDePK5eMoz`hsl)Y6@{(_hf zcjU)(l{;lh#y&kygV1<67cWEY%1cRZQ3$GiNCMz8d ze{EH6&qQc%m2b(~UOjifV0?^bf)q2>+YehiE66#s)o1T8EE9V{Zs>d^#o;tHUc=@; z2NLBNCc@@@Dt#YdpC@DgnIa*DH2U2N1i2f8vK1f!dBb<`G={Nvpm5t2p$&v9#-Hfi64$pWd_2AHh%x7r|o)wHmTCP zFpo#Uvf#|A%G&cjR7f={8v*0;$B5p4a4m~k{> zg#l)}W~wss3qbwCOB2JUI0h*EYqwu&j5IVGYE60$2qu-NS%)%-cC|NI&C}K7IsEC< zsPv)gxfbLp60pPL$gt8q?hBeFk7u1;^gpt>Pv$a8sA(*EEvuzWH0yAtRUrTDAW9A3 z?eHWe7Ge@7&>&(>37GjN$7-~+aRW!3c0&_tG)>$hktlzOR^EL8=dubOjuz@IKs37v zwu@+P-6`GTB1IUv<2m@{V_>C?z38T!cLoU9glOIg7Vh? zbW>^@;Y^f;pykuMl?~egz9WqFb=<8P*UN|p3NKe7<@8*azqb z*M6}~_&nAtT4Xk+kq@g%v)#rtR%gvp$rSPrV5D0M9-VzVo)Xet3xwqtFx!*uR;w;c zf8?29GuCqHDL4KG_3ebHr&y=NS~g_~l8(K5_g*>+&KMb#H6uo)$-)XFJJ?{p!~hj* z=B1Z2$uMQtU4>@knQ*Eqt}a+;`2OzMcC@&6X3@e6Y~iG#%8@D9F4-2-UdfsSimJ(( z$ddau5tN)nb4wS?)p0S6R0@OR)h`XE&H4R-6A{DZP@ z3$f`&Uvj_hIs=Bvf)$?TnOkh&<5FzU_qaPcDg+x4K;7fA|I=Swfa!#ZYhq_PR~jN8 z1HAFfW}*_#ARC;)Co^AlCt**Rv#+^a>*|N`%F_W2jr=&?mr!2?t=`OTb~%Z;HXUmq zA7Ar6-EMoeMbgmydtrHayHwA;Qyp2Avet~eiX?ZZ@`mWt=eSN;mweP}C(B{>6@U|Bm{W@D zO<;cu1qw>6?H9pyr?z4r3uadF1i>i-9cE+RvddNu%V!=cwE%Gin=w z`xK)p<>GYu$Ug^=iW>Or)HgQ-**oA)LOGm1m4sQNLkI;!b2g>WNE8QY5rIplHf= zsV-HhOBCJ>00>W~j%pE=n6q3GaY&|+ffqkarT!B8{;${zMGoqLCt5Pi|3ME-FT4S} zxL@JscnejLjG=rq8B+&y$9ot7kL-hkm2~a`ZeI(FPem}F!!z}`*V>#z{gqv~?+Rif z)&H_f3DUovQWk>c(2czfiy0C3qAeb>55U1l77!bOm)C>fQaC?&|6Xhjw1P()P9x6rlWv8jwF#t>40pIhU#MXH}f8paev9c7XLGlk;s@_&o9aEei`f z?XZ?GWtg6FUhhoyCMz`zN!R%X%P%42Axo^VLHnfV+Syp93ALwZ%uY#3Nxky}?hOk- zA{jVkKRO|wEqtwrwhoem^Ic9UqHlmWlhtf1s0?5soo(2L)VqJXLv>RmSPWNLYNb#(dmL%w^&Tep9J;%E#4bXhnycM1HdE64b0 zP6DWOxFJ%MgpaWN3NMhErkd%ELU{P)*}?tF>^dAqv13hBPMFNr_09w&_u#h~H(34# z;Hm_PsJoJt2J%+KFF-{?ba)*#ERZThhZijtDukw28xX>`V%4npkbkM z?$wZHEu?pgY!wNmSpJ1)@avbQYM|wWtxNwPsEJ(rL)@q?(Q`MxF4_nT%)G#w<^9O} z$4r+Vff;V~Sg~Qq!+BtU-)hW93;|%_^AVI&uJN@4W``$eeHk{fh}wR)BJ?i14{%fhTJw-_FHtsZr5>k^>8#tTMY^l;lS_{P4=t-WFemNv=y z`)8MdZs66d|A1g{-Op2KsxwC}0i-Zkr>ih6X&f;KgEk_MFb}!A;0}f3c86w{0vP74 z6nsvyIjNk)fnjL*+6r;`&>Z(pId`?9{g@X{uukPDENC)S!rjh=)M#3E9sKeGV4ur7 z_10S}e1M-8%(2qAdL1OUtutcs?-}DBw+1RKn*Mc~I>^}rvFHT=BXpfsKSJ`T^83d7 zR7w0z`dbNlUlps)iGve65ueR?2%Zb0+~gvmbzjLpdj2_4BAl4)?iXb5N2PahM=DJ5 z+1wXCI3n~4=wFZ6wS;r@fUp)X2sDqE-7j9eK#1wYu0hKp2x}j~Vp67aE90;=_`^o` zm!(K7RLq6b*39&cnDU!;@ec4QPrY3W5-F-;P|lmBy9qYXS#+pC?{D>?9ixe?$S`H3`2xUIodRX7Fl)@GWd|qYLyEcbYCXrC0fK9*b zpB%y4J3_V|d-?L^#dGJ*iI>B+4@EHl*2v*|y4A3869dg?(3wfKm}h&cGO7a8QGQK6PI6G9EON!NIJ`Z z0OL13x6lylzGpD-4+r0A%*|!;H)$dm9AAP%!vfsQSlz=4W8seukatr)dS`Z8-#Ng)_fanTOwn1X+pN@Gp<- z{hIw{2~5fb0Nr#75l6H0)N}R88Kmck65BHs`R<>rP1cl;s^#kme}Xe;n_Ezh$a(ze zQE1Tq@yM$}0?RA<%HY<2G7s$PUss1FfBVCs`oM;D#Ac`LD+{o8t{!3e4_t23>Bl3H zS7b$McS2wV`xRJe(f>*UdPqc4bm+?dlc*xtQg2=b1#@0=J$)58NOw;R6<5{QJlQV6 zEAvJ0_LGA4!f@b?BHPn(R%z~?A5FI;=-dS&PWJx3v9@=tRp9N0wADa9eYHZO@J zk)TD~T@+%Ad_%tLb~PULR5BZU#PU@S z#Us|{xJ&>|>PwvyGr$AWuWZ7G4AN!@Wfy)(f~q5;XB(`N!Njh__v}VMU1R^N;$oHl z2Lh96T(l8mz&nxx^L|{Tjmvk)fdYtQHtM_T8h=j<6PWfJiF}4ikQu79jLh4O{L1snw0g%En-1=! z)e;lKi5r10w`S|rR|c2MMcs?ws0?NmcW>7lYtFVIz60N5grAWv5TGu!8U~vxy<55Z zOkCjXR=}XLI|0W2l{yqpd8mLtR0#YVQxn|q9AFWgv>hz+s^z}iX>6Hx+dWqR;)#J( zW<5cAOL?9F0F_E18Ikh&@<#4!`LF|P8VHY-uzie1ZyYLblaNNa*0Gj?Gn0qj4%K2XNb50!bp?;c9)hgBCL0ROd)(m1>WRWS1}} z^jH=~wEt0-b6Q3jNr0%dV|!#~XUxOyBG^ILIq$$~J8*#5f)k@smqTyE%sCH?9&Zgb z^1SulKXd2Ab?Zz^CK8@|^wv$l#b`X}ob+SjqQ^H1Ymk`XAX=>y{ut8>#zq*m8N%tl zw1VX^4gse9`=RDla87$SV|?YxBi&9FdrdfeLj$5Dzv(1yBkPajr&u;02>%j4#S2h` zOi|1F$QdUt76FPTZDU{0Ry5-n;K7$F0++nd^o7y~Z%_Os;1DDib@MsUF0Qk99D(F} z3X(4il>$i!w_R(}cUT6tAA?5%&%x=FN(nbT%qCuZ0`9q$0Lb!v1*3<1r3d~4+JK;X@WF{bhcF(_Y{5)-=(CKO==~AX%fJ z#mFnmrVncz&^`hcVGLmG!pV%9Ea1zyA;I(#c9lo+zb~M{ILg2v%B_Mh31L?}Z+_1o zwC?z7{#>Z{eGhWw20_^V0P5kdm^XH;=X}FKRg=ose{;$Q_}TATQSpC zJ0CPVDge7*uxDv@EwVpGdBF_|K`D^ZqOAOlmo_m{60_9gr~&gMUm;}BntZ*zs%*CB zx#)xV_;|YatzTOZ2J`TUgpUJ%FN|C4jk!R;IS>v$=}ua4LI5jIw@T)d3Eg*P4G%w# zb7?zmb@tkjXt`^3OL8sWvcQ242c_E5F|AKtapjmdBWrHdcA40%3Qb!@v=*#`@A2mr z(^3~ARK>?etV3UQ1=wVjB_=lE5u5@|`e7i3Xj>FI}#dS|mL0<6b8c8D9+B`TeWGJOx~a?@?hFh7!uE|XV&;k>>^C$?Xs6EEKc zP>27xmeKHIPtE)T1(vTIJx=1rpLhbE;}Vd%e9fak6HxhW;Qb)pTUCl8X8$)#|vPzoM63j zSH1;pW9lWJ21&4K8F`n%N*XOf9{>|9*<#Q%b{Z}haDjgcGCU?c>dLoHMDy=~sXhSE zUqD?}vAhb$%h&Od{QjcereKPrY=D|CVEt2FpDha{)?$EC9t8g2<+%r2R`$!Wb6=o| zz3}jeq+LNz4mfY0XMpS4a2YlU6O5Ee~kj<0RoygEro z`!ra`IgS32M`|t`MZ9P#h(#X*P!lrw85$VVbw|1W6IiBYc$w1ge5g$#$T5*<;-^l) zh=U!xZHBX%?E{-_yU`T!eQ;jwQ=Bv`nHaf6Z8*Ukhr{b6uhgGEd~64~0Jza}oAq?* z@Fsb-z#bWaN6ZRLm3fHUHQbqHa9t1T0HKt!gL^Y;1C@rb?*bvGqXBIfv@wz=Qpi#b z>*>=VN?wGb!5nST+Xl^I69&{ z$K}d{5!gd&hBrtL0ufOKa0Y$pU$}4E?M>!kzy0H-ap~GvvK*$>;^}>?u`9yRYewW& zyCn(ntu)#1QwE~Y_A`OU7{HS=3LpoHb)Y`v$Bz_+^l%vs=dlmMFZs?aZOw@m0Pf`Y z2U#`~YB|oSqM2CUG4cA|PH5<{{oZ;DDSGU7b^hYG*1DGK`-;xA;6~3@d-p^P3*9rS zKS*N`SK|3``3iR*;@EK$9^RRsfz1XLP;2Q};g5fAu{JK!Z*`Qy6gLaaSxuSpm?Z{l z8E6oe+{1-p@3#v*dJt9SpR)33&yeWUdz?>8(xRmtRh-tv@CuP3x}_es)xq(*+H@{`5`e?LhD2W;P+b3?pPDt zG|L?vLufX|phWf|Ro2#LANKsCGJ1R?^pf!ffuhzVDy3ft5(zbq{%T02AGq zX{5|!)?*y{ht@|RM4ccR`w(vs0$ke;(}R zj*eZKy2IVpJ+g8ZL%9lUDBpv`DuIiOc9jQN;#Q4Pi zQr^W!nN)P)Wdpk6e%(6a#_FEgr#EJI`fQrQDHstR|3NZS<~LRJPiND0eLu&JrY3)J zOx+&~HxB4McRh~1{YVAv)BtJeBbXB$Q5B0(!Mu0+vMmZ3apD%fPn^28@nr$CYMab~s{U3>N)?XHTV!w9QCJmP!QwQ+*$U z9N`#kxw_XiC>mlwOo!NI_2vqhF0F6YtfrEQgZ7LW)P053+MlvzTIDm}YzJOnFtDe$ zy&g+Xu2}#UFUM*Mzx{L!DuCGpvmp|40-+;f=oR?aBV!l!f(uKRzS@@&@c^74BJz~c zMWl}O9DuU0I)*B0rpLSIxKW)WveaKGgc2Jo8jk($H1p-s5@PT4euIrOAE4U(3`3?M zjZq;2Sf^b|JuGM^A5NH8^_!^18m1-oJOk;(_`EL0xcT7DabT$@-}8)yH4MEIy%GG@ zAMF@CJZl6l&uU6drQ^t(73y77<@7p~SL)`_%I98!b&TkCuWC?KGIPN=$Gra> zwV<7OhUsh<(#mCw$w%CUSA-ng^!N{VI}=3RimmAP9iyqad7@>cl4_Y+DOf}r4u#JU zr`#aOoEmb>v{bVUl_JZJ8Ku_JF8AImBpm1CHy{^a9L9OH?cBWL1b#dm*U#CR2LIr= z(%Wo3!Z)l`E*-?K6>dDkZ7|)tz6MDfc!s*jfIxzTeQzZMJ9@aoUyTNEDj#s-=};?8 zL%uJV(}&c~wCAHaRhS>UWh)0Y=Bf|~-@;zxHg9M)fCrsJ5-Mmt4faz=a9;S}xu|;i z-Q9A^wF(Ato`>-v0kJn)#fM^NWbW-be3%`girj%uNxKjk&WIlyE=X9mQZJKF>E~4@ zF;odAb8BaI$cBr+1P&?b3f&nGJa6H7uR(MZnzsZA47j(YsMD_A9vkXPs`^o9P}hCG zc4$nM2D*{BlGtc%3qRpygAA8$C`>v!*fX7Qysfx>2|y5gkXm~=Y2T<%Wa~aReHBuQ zuPhV^kypdKdTdFT4^3E$O0f(Vd6Lzs2cq^5ws{+OFAPuR_plq%7q_pLK{Eaf8b-?< zmz#(D08|c<6(zZ0eLIoNKfGXa?Osxa4@i7+bI*&MfG=#lY+HDBSG;Kzus;PbXW#jmLwHMn+#740*9-k|}S4`8uA+ zpD5S99kzl>t1ThWpmwTyUq-9BqD4gj5qZ@uc@pp)1xY`;iFDs)RRch|M`&=YGr+U{ z))uR=7em(QkHhrK+>2%q1UJ+?p;u(9244f&wNtUt^RR7IDpRl8c9&*@f@l*o`9|2x3Ke4U?aR@Kib6X1y9*Eje;DwMr)H> z8C4p0UU6r^g_tDZX#U~?^vc$MZHKN)p8NZ?sr9)Y8Im1y;h8XnLCX`EH4AfFdpm$< z+)1w7v_ig`Jk=Ec_}0{D@`jazd@;Lgs>AL`*D-APm^9Kf_=5BEs;VZea*YF1KV`rPfs&GDRQ7_EC=Lry>WclwH;I8J# z13T3AZr*QbYd??Kc~4PPh^FS4c0YndjP`$-78rNuD}nFAQ0`-+yYM9ZAz5PA)ygj- zsy1pYyWd$mJc!zP_nZDC)-wy%jn(@z$Z0FUU=!zNi<58Yodz)eqZcKkPv5E54L+`l zG|8=N_dVsZ4C-G`^p1rdICX9K7JqTbcL5oNTC392b*Ulp5}NMY-P2x0l6p;)GJRWv%-YAza~I7vPr;N zUlViUE>$5>oY=Q&s#0K+Oc@vB+~e(F;B^Iv;J&r)v3=ZT1U_pae3~iTL*H6U;8ur? z3L7qiM9nb!(H(jUYvQP#4oZd47*WIG(Yh&HPzkdgyBOdVx4H}(XP@g57~Niw%6tcS z@sTjW0rgzNQx~Gn-4PetKgV|jmU%m+ULxs$S9=MW_Vg0k@Vqd38xXFSt#_OROh?74 zw`#I=V)o&y2gUxPT2+w}S~ntV_c+uBs?6?WBI{l0$mxcKQWISBpmnT5^RI$x)7BmH z_PI6_Pbuq0*k-S4eTig0U!Q3Z3nSXI@A#C>Fm1T8UYr*nO>InA7FofAVsps|N&+)5 zQyxMD<==B7sa6T=luT5VpSrBtpx*@~tqaf$_)NV70`MYdQCz%qol%qVu^oST_x|_r zN3H$hQXj*|3g=AD6~7s#nC+SeM)G! z4#YOZbbR|AJ{IzY;)5!Rk~e{<5cyhB(me+AHjyRYd92t*YyzGx`%(L>Gtca!|-se^+Uks-GhG^clkB|;nVOb`S*-Iu{t=n zcJtGldk9+LX}wZ|4{(MnqGiE^kl0On-dXNa1rj%$M>aTa zX&=lU!3ScEtzjTBFa=bnGi%6M1lyNT7K(idzpR>m&>k>!t*e(vA zALxaJHPI*!=+XW<1LqyjgKss@>xTqphuvW~Bjtf(6wBB8jnV=Aa5~a2vz*@}GP;h$ zcec-rI8r8EoqF*U#xP7cGP=Y~;b)E?!_Ic3YMs@IIPpuN@gHCI`GA70hPPpJr~F^9 ztp|Ef42K3eFTK`2V%ZyFeVrIvlPIbM!yK!z3nUML=Wz^dL4wiZ-ZWPOUl$BS2NU|s zuoCEsIQ=nq&Bvz}VH_vfHU?f6HzA@$v!BcbA!YnMPjRS#i#CkXpxISSxuy!fJs0b= zU5*dKAT4J>L~JMSTC?Hq=`Ynri$fKU&x1kTDQp@v<;+rGWapBZ)_Sd6V)tQTR+#zX z+$0-gq!=Z<_dSFWVB46BS_LVhL4dcyxeto7!na{JnCAQYFB~j%`%H{5=ib=0@W0o>KR*dCK{x`8X0;)w zQ3w#RLnnxCW1~o^27RczW;^VKAx|!aQ-kDpoZwM~wgBq54*`0wmTk-oblBkBT;BJ~ zFBnO$Tm)f9z$5)@|2-G|`761qP(uBqZ1dE5b9cL6J}lTNgHO}O>-&xd(`V19F}R3) z1#&B<_%tIu1)dn%CKEeqe1g9@yIW2b$m^!ed0e~WSr$d73w>-=(LLZ9$&``Iw z>E;i#9zo39<427C?z7zZ|I&`ZTVP{i`BB{UF@f~pE=UhvE4fU?ns-xwxg+v%2jKnE z5Wbm^2M4r_hn$gn1YFXt@KDcuXv(!N2Ap6(9t_Bl5Eg|7Oh48qBPT_c5A>fJaGM6} zEyPF8)t!9*^IQJSC!p6u?a`BDy{L^RvTFxL%rM7^ZUz?@9pc+(`6Q*zZ~XVuXz_@T zF?Z$WnEQp(aHJG`!d-te^!oXiI)`l2;@(nkY)hb5BPGA$6BKrnmRvkyORrpgPHYl6 z>hS1u0U{u44et5P&xZXYT$^5&UrrZ21sB2|s+2S3H_q7It>jm%r~)Rz5BxMyaRklt zm>`bp zgR=vQP2~;26vZ`oyzXPtQ@{M_U%!OivwtoH_?u_JiyD5gj$Web33R|*%Hi+l-+9p% zjNC)u6+F1yuwfxD;)6m2Q*xEPq~y7BcmrO&i6}>NnIx^x248KY{$gemze={oFF}6~QgO^ZDsNZvIE$ z05HLc^sJENz@Sg*>V?*&eaiOvgYnm+3U}9<{E_KzGFuw>3I#s@&C6AspY z-3d2M+W(t7QS`4n0n5Su5AHi^N5(ERI8K*aq2aVJU<4HN-Eoes#n84O_k zsJ9*P-Z(5Ssc=e{StJQal>=AfU;9xED9terzJ7keaDOB!r&WGO)n-PkqP)$B_Wqm} zesijS`8&}a>97fyqo)vpUrVx9Gh@%j<*7q43#%`=d9&=Lfdb$^wH&lWiK8nh^GBe& z`>)$riZ=Ps9)Gd1md^DA3IQL_gbZ#D`o!eIGh{B_D)TpE_K$}}uZTj$#izG6o>nxF zNm>m$FSodh%%aaNz^3@g?LNWC~4)LekbmDn-ax$UKu-DMJ*?oVkt6L$wSUfA_ny&vVZ1c}|`EyRPp)``T-_ zvzE_#53kq#x(812W7?%>1Q&g`$Ul4RYK!9hUEK?R`iuSlN?gSom7D+TjnuKCZXE1} zzF-|2$Mg4WQo{fEWV>cN9xynQukrmm`|Be3w=Y<{hhFUS#22`6yakxBMKM6+ zM7Y9wJA|)Kt$nPzi;I;fH*i;aI`1!X_js{mD0eLMmi?{OA52UXSG;xmUhc5Ele?fT zHgVhB&AJ?`uJ!EH&EW;C`+@-Z#X`}9zYBSdbjHPQ-aTJn+9kE79s1-@;8Z6dvgU## zS>2gQXyV#42Xj1gr^icJ;=qwiEgZi7?ltF`&Gt)l9EMepnf|8Vr}vu=B0}5C0uQ`W zUG8704TdeFx3OEBv%*OB$aYU7i-Cr)?Z2=L6~p_X+rhMu51 zfdRFy=fCZl|G1g{=MTOY)l!|Rx|ufeNZT--yV5j>^8KRBv%`VmzbEtvDx8yK`OwOb zyR3irmKZj`BgWF(vhl?xk{O2yM5T>=3z=gPy3SUBtJf6E_w#Z?lAH=` zDcW+Ye*Q%N`llSMcp^;nMP;c(5e&v=&qzBnCUIb~EGR49&4Vw8;~FU6I#S(8=*)rBY6`XB1;C=Z~-4|%vlOLc>N*CzVR#=f)FFlr~# z&aC%}E=Q~_;Yhvb+71l*xQHIQ{_et=--bX3TjQML{1D)iX~nZ!5UNWP<1O)wkeFL} z7}d9Dk2VXW5XUj%kI-L#hc9RQ__xuNE}fAsdVXCQVNce6x?5d4DCD4zAFZ(kvzxoa zesy#pb8geb?Xhs;uGf;MQ=2B1 ze|MfZ5zZD`@qK}Jl5*kwg8;Om` zat*`*d91k+HeKhm%g#WY77Aj~U3WIh`t)hX9$)%Zf<>;LV%(G{d# zKD6(m0T~KPVSY-_^Tn}4QkMwE^7<-%>aO@=UN&cz6*otMYKf==ysjO#pD?L;gbCaW z?ON6%EZ=>JPvJyCo3mB0E(rpW2ROj5PJrx!)aNlJs!{pu1)?+yfR~XZ* ziKW3237Tj9!=2iixN|mBr9d|wzn6$7CyT3c8@yClr#2ui%cU!QRFzhA36>aNUN2X? z6h(c|3oGJ#fbli%Rzvo|j*yaWYwbAKZE@O}LP6<-_*qwoN!Z*f5B~yud5@s0eW6k< zxMGK9mBQ)`y%=;!kRbpW%|_uy-^*F&1t)Z5oc)TP_}@Yi)yCDU>IZ$9mj7*N3PwO3b=k#eO}ol}NgolrL@irtjR?--t2cZOIOTN6 z>N1{y;ia_Ou!wbNFTH#=;)UbyME~3)^}mIrf7lIoF&OCCZhYI;W~5Jp9CZyMv^=Ak z=_xL;1KY^;C+UfWOi%WUp6A@fcJotEE%w+^XwXG0YcP=DjdQ{%mRL|FdJ>MWce*Id}B%=0e zFYzu@u-3AMyW}Rk$pcW8is(as5Q}IQW`*LAk1vQz){|G50e66TkSh2Fe3%ljhTT{j z#cw-W5hD`h?<|+z6J{a!OfBE=-CI-}?iaeO62=Faj!rZ{h`nO_vAmW|A(89hc$DJL z%lxke_J8~v$6`_{=gaH=y{yQW1mxWt%T?VAn*A0rvF3}H6ob{c1a%8Yqwqb=Qo336 z(_L}KLdgs8+zBSCg!5kqGJ1D@NWTzX_)ZjBKxlib4DJ~Qg>&xQslZI3ZXqVTP|184 z7ywa@#DM`(Ig$4VDAjB;&z8vltv;dl)VmkaQV-G(A0`NQV(QKtM+uHOxbE!Z%l zCU(CKI!~CtST<*AV8*-?Zh$FG3Oqf{Hn2ZUbZ9B_D(v3SoEwPT$ zg{1>s%%7Xgn^6l&qcYh7DqR6J4n;KHN8r#7ZCM%SY)I9VAw%i4?jC2aEz3CY#>@@Z zXAxmNQOC{GOzQd&S^ErzF*bhcHRjD(>D}LOh~7mXP}n(b?Oz`rp2Wae`c@03Q1(k4 zHt@?(u|T)3E#Cd}@8=bX9FA|IZu_~x=nw0^H5uQ%!kw@)PJfmJJ_@e{Sv$d#`7TBU zgKslN?JK8d@VJGhcb_gbnM4__hylG{;+<0$Nsaz*r=uPVY#w`2b%PU?{RqbuQBY;6 zELX%O{4CPh0}}f4y`9)JQmwr>i#mukdErsbk4UfC{Yt##Ay-?9e|S(W7PF70Nl+W! z#66u)E48$DP3%hA6=eyY%23(P3k}jHB;TDFq;x0`H+Fqn@a#~XSRF1) zy6ZzbIfB1UT16{)Q5}3mIb?QAl1r)7DCay?BdB*O&@~%+EA8&8R(PDGU;_jB6Csid za-T2+2)iXM6+7<{9>m(Rg1{?ZZpj6THL>KUDB;-c{Cws^w*fqc6Oqr57D-IR_Py4q z4cZhJa4lkionXt#YdZZ;RC|5^Pkwyanu}*Y-9TUVw|3Mk>?rqm%GcdZ28DNzf;BB? zZu&wQGM;vr+Y$?BkC%K$_pcGT6mQbH^n2^sIy1NQS`aqXVTlxy(#h(Uch=u-?acIxccU zd@V`Zu1K}e(rPjZianrE{|ywzXP66Ewvj6z76s=fT2P6!NCka;$fYFd5(XCm1yF0F z$$_J#QrRo~9^`rXIMcl3@Vw?{?zAC|^-g0S=a<--u=F8=bPLV~$9IChYuS+flljYl zu7lWbXY1yD`e8@?{3Yu$G`$k9);&0g^PLo}4>|)bzyJIh>f0S)5ZPww3X`$;W)=K! z>85?3+{GD-$d`p@@Ju(?F;yrQ>fYTDq{dm>_SJ0yMzT95eD*D<;Xckf;0wt z-8&hqMPMh%pnu#^Yq=_;Co0L@fl|MoW^%7ENSo6B&VT=Ce;8bNlU9~S1xMRMabUW6 z{E&zETabPUcmF%0SK;1bVLgfce`%_5%aS2{C$glGqbeQ<7xprz6CH;2j&Zk`mV;;= zVemVwe0v4gW^j;~O@+r9;k}Emo%T$vH9vRmoK9wyXq7d>Dr*ug(E)XUi+MMrEKO~l z-%1wylm&+ce{pS1q8F%E-0S;u1mlOTDH(vBc|XM%{>k1?4mdTBk-Vf1!fAS5Mcf5} z%N*2l8}Uas8#Js~NcPk-Qbw5WFSx>XbG@_4Li_BqAFnCLXjYr&o%&;-p3-{~avx$m zVtL~b6BX!R@6{!Dn&ZF&RAKBZiNp#$3Kc6in12E>Cy05Fpm{E}k6oJ1uc`P{?lJ$Sd-|_p`^nx#Z|kKW5|=&V3)Jk*XS!;?NE^7_>&X zX5`@gPQX7DvU&HmukyE+gvdU>rA`(u{_>vB$JL zoY_(MIJ|>-P(?i;7~BB4EbKi7H3_8<3tqsYt*T@-LClEFh@79$yYmq}v70jK%Cw?N zvvV4ys;$8_wu>pkB`FkyZRQlZ80 za;``4uCrio-wzoLvVQ6Pp+JpPk$$H)IfHYRnIS^6XPEdv)y?HOKH6Q`IU-2ukA~Zi zX%i7$;mcdk)u_`+NWpCamLnRa54k)$WEJKtu&)+{Cqr;UBRVZI&mI*vju}G6#hRDd z)HM#sB`Xm+9cZPrkMC4O@&^Ow7n zZ(*EQf5z({gK^Zxe_i~4zPz^?a7!4=ewV*DzPWx?rMwqcHri3Ktzj!Z8|WY$5{V9c z+H=1ut2MT1}YXXkg);iCXH!(=Db35*cE#IEjN@`#V2x)-_JMW*XiX3$V5- zn@sCE6Xh?^mBaZ-G?t??w7%`Ao{8ZI?A0&3Ih`)LH(Oxt861*kcW$ANzBgwMot1&w zU8U_X3uH{^mRGH2Guhit^mR5C5KIwytVfT%;xUwDl~)S@5tGQ^k43TF*{-e!-#^}! zzxz6!_vDFul^c|`pM>UXd&idD3Sq{lcm$rd{S_Vh%PRIt2TgMSmM}B>DmyRd`DZ?zC=VpTltVRgZwYE3RIj7uu1tw9S$khhvr%>OY z#2iA)_%yC9okMmlp1B$w&>lQtZzS4@(qq>*>F*Pu(I7!15vno1ZGjZgLF5~L0RVc-aS6>(wJgU~{P<=?oYX}P zI2^^JStKROd;e7HhH0gO@lT)lgoTxiY-Ozm7^)6awE{zoMxsNkK*TxtDZQFO6A3iN!W2yj}eV`F=@=$zeM#{tC!s| zX9*9u1*eD?6gKHR(--~0Iah))q6({w)J%y?SUR3%k5k~tdfKHl$Ym@Yaz^USfeNe+ z^kHa7G@u1-O16O0h#@eU2OxsSIbhhMA$+k*PgAiB-q=#Q3g@OL?buPmc8^L{6kN}; z-)b8LV(8%MAnXe089Q{Co)f!|5U}Ne29NBkT8`&0|qV$ETpT{#FqR9x~J@ z9zVCc%Ni@#>*cQ5ip{d~k!Jl6t^ia8>M;XVTGl71cKEMZ2%41K3Yo16#{C0CYDr_1 zKr*GI_?19lZ#-l@wVtoeIIqQyuF#G$U+NML?}jU%wj+#Q?#W)d`91HnyVgsnj4)%} zvfCQ;cr}W(8LGb5^EX`ndNZsS1K3K-#8q=cWH~BabaKCaT1(76y2DVJ6^_YQ$Jc`W zoL;?ak%D#1v)NBh>&L^M_ddF7d(p+zx>#pF;#m3W#ITssOxC>c44dfDOri<=o~acI z*^_Ux0I~gqrSmS2uS62^`OrN72AGz(vrm9*7*WAah!p=O8mGZF`EGbm>=gj{QE{oJ5xpWpsDo)Ce?Cj!>}@A zo#JCjk37JGTnc3QW4~_FWi+|T=qO7mXuHuM3wvrNK z|H;Q#vP_qwgCr~g0-m_CN-$3*Ka;Vpo-$EkhsRm7yK(0|>++g^&1TO^aXfI*5qzf1 zwD6td{$WRr{Jo1-Z0Epa?>?&V3}-C(_m@nshVMqmA!lh*WS7G!WG}eo$vPa(gPQ~= zQFXFCj&#bIjMZ`vHYbKBKux!6tjsq4!g%HKI;aqj;tsRZCx9rx_Vwmw_B38eZy7OU zkT7akUH6naFMg^MrWk11XzsI;G7CM~<--#D1Yhi_ds8VIr~#lj&}>$uKf%K|C9Tmv z703$p&2{k|-fz_`Ldr1zO%9O)e-<>Reng&v8_V7NC5wHvF_UOZEE%*Dg>_)f{p3VP zKGHmVnYWzu5$Bq;=$)U)^%?c)bB5!d5ex|vR{PDR`LLLuv2lvy8@c7-;Sv9cU;7u= z%_}9G=R=LFPybx0{X?tFI+vVT64gUol=;JZcni&F6i>1r<@wBm5P#?(7iY?P98Kag z$S9>)9xa8ch7YU*HvAd4y|3*oVa@_uV&%I&^t_RM|CKTp$%h`nbBrMnzW24>E zRVVZ7XwOQELpDW?+a)d>AGYS5y3(ytrMGW?2Ox!zz;1xqA0h@+J3&ImR?hp4;!k3O&dq$%q~)m$R*SBja-YI{WU2`RN&|$fXa)1u~44i8CCC-wg1k?{>7E{Kjjb01+q>W zIFicOXNm&WD`rV8_1fVF0?uI!M0kN73Qp%Tr-mK%EJ%zZ9Rl;x4QHw%a3g;XcaE*E zNipeq9KZ9J#M9CLSY8+Sruk$^8U3oh=pF@cY}PXKF<;kAvpl7sf3|?)nZXXM zWQ4SNr#4I<#OJ_6l4La{o2;xLJQxU0yDU~m#Y;P+(pjApw_;TE*;}ZtDIN`Y2|mYj*B9`J0JKd#8^hRFT~*3B+0^b+OPSGHbw6U1_AqJs=hPW{@ZnMb0OA2zg63xUID3V zP1NOyC$9q}i)TiAkl7MQn$sq~O>$TC6Z`oN`UV0Repm|)oW9xmxoX=2sy|`7l4@fCC zOO|Ql2xb~6jC4W3$WauFMs{Lo?+mDY?Pb^h)DRDab6FfBG9Z?F?3j8?F1z_Us1{Ow zEmz)xH*eU3Z-5Dv+aJuw-vvgLUm5seJix$`E>56xZV$e(;Y&$%ixgE=0|-t8C>ph_ z1;lz1zv1Nix1BcBB@t!ZBzH$=vwmmCLb0XGq$n`<+t!H#{v=ex7J3qv8DV*v4q&L$$Z#iyE~OETeCt{=m24 z_a)H?&*Lc9dg0^f2aLXD4Iv!#gb@~K; z zui_he`)uaV^*$Z}?})4z)xA-8hLJzew_=oxym6qo)U#~H>^9M`ETC!3Z5o>)Bv_NE zKhgLUqxtxFZV5H-6Lp+;UDEUF0UBQN&t+a{Zc>e_R;0$EFQKpWWpF+=rk#tWE{+Ti!sL?nzO%(? z#-eeNd7epyv4F#ddQ8=i^Oc9ZETxv8QKd<%G8t*#(I_`3#{<$>x98iJRguwrrgpgREhurZ<8BfQ2+KQ<(*1MJ!>rkggm@zM zmk#$=1C>*F%xV)_7JJIiBO*kq&J@$XKHC93c?#Eh9CBJ7RM&cV`prKg)BK2elW9?y z>lQn17+pRL53rZP9dkyRBqQMVP^O7gMw;XuLpY-x-weju#OdlttxCj+tv*> z#pCV|1zNYe-gqyD0C~HQzpq}m{ync`^}sBkz)>d0;#4Bk;sOvQSZN;Q6HpAws1|d9 z*}e0a1zRnB8mx{zIJ}10Ymb!Y-b zUzLS}qrmEhtL!$fvrFu&Cyq=}s#{JZVRW~qEvG(3eO|WN&8O4NT93pBwHayOaJ=lE zqb;~yWl-^Jdod?gq!%i}c~>SepX(H4X|Cj;Zqr3W#F>|ZnPte=>I1s3PBZC9uCe8Z zeE5!Y4&?jnGPubU27%X>uFb*6R4&z&i zNfeVeURdE}Wi-rMkt z#W4hGH%}*^$Y1<_|8_BbXQrp*RueumHYH&I6-rV2AOs&>6MPqrCUQB}{`}UJY86k4~jt6Y1GT zGVsc1?gb>qoSLBA{8x zTO^Xjk(OxJG9!|EvY1~iq_#g}@ei>zf5YKoz-9b^)aiV`uH)4c|uT|8C z{exMYU+O6mXrh*H1~~I$8}D>nMh@ekZda=&L!-Lq%-DW)+~)Fud#WWm^}`7Tw*sBLhjTvl zO4RHZ|F4(RutgNw$0K&Q4@8(_w)7vD*a?vGk5$z6hUYoeHCL(RIwRq+pO(3WeB521 zt3n@&0Mu~X^^)cz3`vV0zkTL=IenOgAZ2_eTWHa zgJCV_$HjHSLumnNn8oQ;B&p)qBEz9>e(IOV2{Tn4`|hok0(}-aRFS9)0z6b-k|toK z{X%;NgrRnyHUC4|b zeU8z9z%>N^RC7ORDvTM57{>;&Vqc+&gVyekTfeyhe7VdTC>)-+sT^}1R7%+q1*lyK z``!{mlgw?LQf~KfUfQWt>CKS*YjaV>m4q>1hXjks9tqu@<#6w4^Wi2wF2f%UpTggY z%J&5hE-y^etg=44o{NonOJ>w*vV=%QEP4k`drG!3*vnJ8Y_H~AdR-iE=uorka>DP- zgCOozj!+4CXIxHS1%ny+?v%|3<8*F4|Dogk@g;f#=#pO_G58xN(JW_aB9j_z8pj%U z6ZggJs=*yY;vIxvg;KJ?W~~!Xta`#BoSbbnSzvRJD58mm7^6&7BGLeeIK`j!%dfs+8J>Lw*Z+0RC1#TeMrht0m1s~;(5F*GB>Kl z^%kNSy!T+veM}Ny8{;v%4?zB-M$i$x+^7X4WH3X!wxt6=j|_|kF?V~{Z;yp4H@Ih5 z=a_`DQliPFP}ls-Rh07DiOVvrb5uuf*C#ROp^mLP&l+XSTg!~iwCkFrsOZEc&0EzU zQq7d$N=Kh%Ae!4ekju215i?(rPrv-KVYXT-_qZDgeMu`Be-gx}S)Qkstu|6^hiT*P zOGA2<`alCOaH&Q=wz|VOrZu=ACPxkPCk_$|5R-sx_{yw5TZQ=Q)sIAQ$i7|hi&p5r zm9YQYorMPal{5;U86k;$)i4ErZm`quDy}yve?AQt<=SwY9Az@FrRpUZg54D1tq)c z@~YY|Z+YU1kWu0pa^a5GOSoHYr^cJA_FcacAYyldF>iw^ACGjO+Td&e&}XPZeeWui z_L^0sj{h;wUzWJUTl;LTMIT{5ak<5M4iz)G&!;N&G##4DS6lFErOMGBR%;OxLL;>I z#Cyt0#l4r>1?yYm%8aK+JcO==_;V9WF(ivMCuf2d^lin7sFvBPWlCe5uGu91^@~0-}VMMgHf-m*#y=y2c#m4lFm>nlR+Wd6M|G zYnkD5oz__SI>TN8@a$$_9%+JFl;$1Sfu`D&2a&}0-LX%VG%Xjq%3oSqKMjcG!oU)f z3!u(A4fgxfboK`wI!5Y8Za)7bFRoTk8U2yS;zSu>z5(wy@GshdDzj3YX*~8;q?9Tq z0OQ=Go))|pvCj_~J*oOJK0tCg(@Nr3L)`JTssTW}#pScCQ9gm5>1ur{0M zoL}2X}-fL7W|MwpJ{}@l7CLI}J&i?lmHR;G|^U}s~XNMeoK+Otq-kI|dXv)#D0MXD> zZ*J$%zN*)9OD17)?*_JASU|r^Fpj~TiP)zO+xq30^ihd#CnUx7Pcf*MT5~Ua8PHGM z;v-b?@tNtC8BY=bn;eC?pEQ;P?~Mg%0<6&#`d716@nHp^WO!m)Y`X6~4B?n)U+BL+#Yw3C#qIo5&bQ*YEg&>-e2rS^a`H zD~KQ12&;53nVLdA#(@>EC-OJum-QC1+3j;au4D9Y(ZtqFJRf~9eu$Y8lD5zkw1u$R z^7neB?@|<_E-#`4SMzJ)E~1K=SuY(Y^lg&+cbU{K#SkBLCFC&MzenE4rQqvLClD)^ zW-Rj?lXO3liS2WzM*PmjIejW+cgh?}_vgDDUbdOYZaUVCPoW#t3GBR=?3}Zh#H4r` z%QMB`x9F{0^XF*8H&%zVvJL#!>j6{rh4P*CV?x`j@KWzZOy7A))Dp#T0k) z`w;t6;s70GKpCV5aX4Myt1&Md|KTKIaoXs3^XUq`(!z7#LCuhs#i)=ahQQ%AYOyEp zgECi)jIqX%Zj0Zsr)6>L$opk3>OM!SD1U(>D^01~8ZB5wax<7FlKFB?kIwF68u--x zu9I4CxY8@Kvl;PLJ)bWsq9p41yh7+q9S07r3tBTEy`IRlv8c4i_Vgy6kro>RRO^7^ z0PJb0>`Co4-Tv6O*`~oFwV{IJ5-AAFeD8185+C%1CicUr$;!$hwQIWBEu(NosLr*3 zq;kknUr4KG${LK+^Poqs-4SzbnR#`jQDcjQcIg~3YlZ2Y!t3__!RvI(0s|zH$nd8v zy-e32sGeID7Gbcf{>0%^| zh$1E@ZIR<(_9z+qn)aBgD?*V{dBqC1eMOGL<;rOqhcWzDH{3|~vHm{eMLWjZc^R`u z5&+gP42N?SqCZa!P&I*8vJbU>L~K-^M$}yiJ7y8h=yx(?rc9=45#+oVS+ZRWO@s(0 zuc=b8AbJxXvBg@-UbDs*38tc=cL-wIASM#SPeyi#7BaP-n#Kj#UYB4HVB;O8gA%fX zi1Z3yrt44+apuAlpl7v|@U8RC#DDGGLcuIS>(4ZXN(1X;&o})Ag~0GucWcwu93H$t zW$1=T-lFAqx0p<=4afo1CBZnnAea~6V4P8WwtuGT_FC2j21}_lX`H*p!YY)}D&sYo z~S)VP4{L7YBfgyxzjUoC`lpnP<&8PCTEKt@!TzEz2@# z^0)NL@-dZj=kQKzwl7f~YC~sxSmN}_d9yX%os>8Y(5jP>z?^Jy>|rLcn=An+QmITV zV9_KAnda1H+FB9x<4Hyo4sjFy$XEwt8-4)`vQG0dgxrRZAz9{I+CumYcC2mMI?mQg z?bf?bJqdUW@6{*cS8zUu9)BujS-3lj^|nB3wPX{mBEA}efxXogdX0XT8O8ngfau(Z z_OXB_U8~)O`#gg(+>~tUS;=nA$OLtV5Ud(0ZS+o@W1bj-3QxJ2v|(6HJ*Z1u@?PDi z^%X17_4uazpX|4_-2d+R+RfN85_8Mq*|y#j10B%Qc5Z>$W8?85btiYW;;HLe7#d`Q z-Ek6}-DPKMkg-*S>OsDc&Z_8eUwr%odhWLO)VCqFR@p9oD-{P020yvH#XY8ME4YDs z{1d~=WKO%!eCymu*bzG<4A)yQ=B*%;t1AT!Ac~40a6mz#t7H{zOO5Aw5OiSki)wAH zE}@Tq{)4U1X$Fi5oW3jDdU5?dBv$CU&@cl?zP(0w{MypYvS8JNZv#p{So-719R)(r zFC-f=*fWoZ5kM(R&vS$dC{=y3y-eUId-@V2D{nGkhi}Q!2Yl%C}TDIML z;oW#e%Hm;Kdn9UzkYT{4XUvySpPR1QpajhV@i;v>VvRGWQd~aiY%nprjos?-JS>*P z#O!*dE2vx;ZL(brTF+1n8A9~62<oVA68RdfPqvVW;Her3>+A+>Oe8y^B_r223#Q{z$3SN$S%I^d5en3k97<&Xx3- zePdse&J0h;25w@6?w;o6%NYwnzF9@Y{=$-zlY$B_MkLD3Ukoh%`tyPKO<0=!Y2Wn2 z`uf?+t6KP5P0PNeT;pUYyPPe(W>m2>?Bx!W)Wh4ys^}xwECh+Iv@;*`h+?fqQ@qys zNp}fBgUiGw&b&>-5vWV&4`3Y51;3nGRzN#9_A+d)r8tgbbGkWNW)G`2yoVkwe&vt= zQeGmUy6M=fYF^7cy?7y|fIZ&5`ydku>s^TsHvtRgP4a3=d$rzXwb@q05p|Bc?xm0O zN_%H9_L4AR@n$YFt&7p@ zPOpu_Ivh99WU$R42i(>7_t^MaS*}z&S$;@-qwbL_p$EAqb&`tUxsS^j8OCKB2e7)_BlemkEi^Y~Ek||mTQ@CPaYF{r%gO7kg2|L8{v8(|_ ztL(y%+WdhzD#JdL|CrxUE8T~YtFGQbTntjC-avcc!(&uy&V(O z=~Jr$R-tigaTxU{vK@m(Ry^RDYPl|1Zx;0p2Z{l;BI2beHPvus5wM<(#Y{^@T4}0# z17~aTZ&02_G}6;F>WU8>rhb6X|vEU+p`rYBqp#B`^xPmqU_CC*u)*)?J*rC z)W+<**PgSX{xB!Gx4)@m$5v+9U1$qkoz`UISL;B`6IgPEct{Hff6z-!w&Sj3ih6Bc}d@Du7dIcq^V#sr?RTjNXL2yVV|I`t8suBC{NPko5 zWAIKaoD%!i?kV-)Wz9di0A!nmj}!Y4qZjvG(*dcLN64dUX~#TEZh3|^2JYk_?l(K_rj7BH{j1@TVRSD1SK*_6*pwM{BE z{%AwCP!-Ho8J&_6(c2R?=?#xo>TWuh5M0E~c6LWA%T<5egU9LGmtO2wJkk|aBd{pi zwpQ$f*i!5AUNoof-t%8@LsPOMJ8t|0W58nM+BMWKx7$je4d^n733gRRLyN4NVbkAJ za`B2;CIr3RKxU0L5(9tCRL5viyfmV`?z*#vab;h??~M0xd>cvl(&wzuQH`iS%5p#2 z|5melcGm^Z@KGhv8;D_J@r$8CH7Ei;yTaGw#+2!*K%_mM;8=E;Nny+5zuSyF&A1~<d(k1&@iUpzRbl8Ql#IjN^oY zoPKTvC7ZZ1WPxNJHZ|H)Eeo;X{Z9h^2FQex?>+GO^>RY%w-Zsb;=w_$3eHt~Ro2P$ z^I@CPn(xBV;}mgKQ2KiI08?{pt;&969klW~tw_43)~}ZD0izBRYNMBZBdJwb0^a%x zMt!zu3PA90lWzAt&G(=%8gscJwpko#8B5)kur-h7OfPhD|5RR! zBuyld%Al+G^rcTeP)r+0eOu+XNzBRQB{rleQM&hJ&hM377=37uVDbswI@U-+`}aPW zbiH^c*PnjxJ%D5?U*i~RZ}&J@Y?(~`VU+U$2(PZk zRo7dvdB|gYQ*gOk*%CFpGos8ac)PvsdkAx$yEt|y=>YiH0=pQ~u&2Qh)b_rf!|d23 zk5H-J%;A6SjgSL5c91PhR|B^7#ODtC)`ye83zpUsyPuU=2tLM=OFaQXPT<7(i~JZX zR?e&r($CoFG?~x>_;27v+mgy@!ivM(d$d>mV;wu{_7^;*3x0qV{`!)`m(=ZHO@=#u zRx16kGJYrO_Tho6#DposcF^*Jx{JmznU`M{$wO1vfzX@fQ^w;V`i8e|-P$lJ2x}ON$Oy zDJ7z=@oq9>sfNtjeO3%`!=p&Z-O+1)*1KjjW!>Jh;@^!H+?h+d(*b+>#pRca%^}a^ zs{Eby27)YY-GP)268lQ*u*AzrC>O0V?>@J&pAXj?!?)f65nvCA zZY@%AQHlvT(6~d{MNY6U1yw#YK5XGVHoDOtEkz1DRX;wpck&mpJMU{r2;tQ0ePtn| zx(*A9p#rs>n_f^@D2o%=Jr0r#74+H$y#vCqS@40lrenqMo6X}DOPv~TXit@n47Rjz zt<#W?dF41|>YEdX+j{NnBow%N+;JPJ#m$i2Y#_g z9+OdB@ehd9&tDRMcD(*1ilJuTuGr;#H%H7 z#4;=doQD@+J zc-4T1=JwfopmCpp1NBp+?zkxBTy-4o_Y#mkMY`+5g;DtJDG<2qO6S*h__R>+13*@h zucZQ}10K|c!k_@s@*V!X72?8!_zcT0Tm&8?3k;_NDeL?JqEjk>rb01>@M`KVk-R8B z{o+C|N9;8%Yd&x)yiV`TXx3Zd5JnH`hLZsGV+}QAZP6E8EyTN_gZ3H&1-I32#-h}x zbgGAYWCczIqYYk^SxWux=lLJUBZpwXZ@zt){pZ@*A7(2Y&*#jowkw<>S#q;uUvg8Q zjHB(a6M2%!FQX`2F+`;0c#B?V18m0@ioxb1+G16xVOO?nm@}@K8Ftp1~=HA zM|A)U@dCi7&fMiofeoJ^J!m)O=y{b_Q;X}EQ|NlQ^d8*1r}y;tn+P%Qt2=I)(Y?*1 z!L&;a(?)_gcv-C56pK1_*Q>VDR}Tcw+JO(d!J{`e#C1*P!jrwIQ;4gL_MR&nK9XfK zL@^xSwYAlJ$Q-ktH*B-kE;t*^Vvn*ol8x6?m9b%hX!Zb0OcvMzf#fuyM-n?3sUoAE zkWF8R0i%+7X7dCoh0@aP8t8-=gf*a8d2(}fpf^7#>o-{@G0(r!-uU|ChsY@rZ!d^)tY$~4E+La-pm>iRCrP>%nq=ZS z#{va#uMVBEy_!fW0;edfYBsVDEn0!jSFfr|Q66&d3;57|5Bh^ys7x80WS9e(CsU3{G}KGg&Em_F}lc9uQUU)jF3BLTQ|}=5RX^ z=LbFfpksc6D*a49UXxa*#*|z^CIaPg;G~+=K!JEvMkev35{{w6`4LwZ2v4In>HyB; zg{&Nv?{1CHjf(Ca#5iYFMc$q`q1_ADejXJd;k0kuuBN?=quQ)q5FCfKS$(yPpatEF zMRAxAkvGj&z-fK*E`x$1#G4q`H=#&=hMWF>8%(>u32Y$H;`HZy1!KvP2!bR*iS2!VlqN5r`256be`|S zJ=;ciI^j^`&>@iFKn4vrm@LJI=v|3MD0v23jQY{Ly97-&$xBvf$;HXD<+tDNIL6MF zp^Dg(f!fETIoHp*eq|qGX(*JjX9g^~1pt)5HEAmxeI$#H5PcmfN5+wnOMpA=BiBc$qw)W7ay{o^|H==qSES z_R(pE?K-|pMuv}A3z6aVj(n^+7I>km#{06je}0UyOdbHdx9?Y;j(=L)~NZ1+3fa`st{$$oAI*UF@`DAO4*yIiJ&iN1F%nOM>X~cVAgrW;0toQ4$UHR(U z;yQJyD&^{{0XVQ^vB%m$(}PcF;#@-uK;7Ob&0h3p!n9MW&Kwu3J8M=|@H^m!UiiZj z08{S!dc8A=>kT{TbeU#XHt5Zsc4S`jcz}&1`0Dg}f~N0cQoN>{zk?yT;$WOv=*Lle zj|rS=&v3>_J$DQ$A%qk%qb;Z=!d80uXjO2MbAUwhNSwY8)t7yT5iXbwqDhh^_Dl&& z9K`(4=ze}cGS{Rrv|-xirWANpcYz6!)KG(^FkXv19hOC4f=T?TGGT2egi`1rcbFO@Np%k`6X=%rm5dFT{Ow4P7 z1DtnKS)wPx_|BD2WIGbwuVvO}DWt?c?H3C~=>htr-O&7CQRkK0x*uHrG}J66p8&5$b|mg+6pZ1?xyGAl(TbU(p~ry^b@G^Q9dvxVyf$R!rO4rdHdw7~-xc zk=NnTwae$M2-Cra$7|L~=j#yvJPiI8)xRx-0X0(A7S~@|Y`7C3o4~GJ$03|tycV{V z5m#OF?SAuD@ecJ}L-Iy&!qncH1s$xhL9fUE* z)Y}JJ@AwZi)l?h%1C9u{yLJ8U0Z`$&5Qg3`qAbp#I*+(y2%IkE*UoV*DUgu{FDhYt zd0xiPEBkB2O+Wq_`~1H`5b($)}#q1VgQ zX-zB0V;7ecd;YfHntjQ^IMrUa-vwIZMDIRxB;03U1*<8Niwx;kw^Ed20m5+H2)0^E z5Diwufx%h%g=|&+<+Ms!HgF@<$Nu`tb7~H&N86F}uhWoQXqB5)`&m*E3a#2=j3$;(k)Z$z%psfWk_~Jlgo4t*Q(EE8gKhq9+2*{rmy` zwK|x4jf8!a7e93rr|9`(yTg=6ULjDdKW*5oNDdq&P&Ln^4m#9JU@26C9;wan{( z56#12W(0g}H@?%{_lgo#jJ`c*>W)E|GF89F-;R$AHf)k5IjHkqaWNht1w%wXSfdh3 zW22gAjefBf64+vO|*+;cu|I+lLkXdkMON<;i)PSpQPJ&rQ#uflgX z+h@}cAN+@xr-)I}<7UTI9zSfypS^tT1z0m7rRC+xevpefF&KD=@1MvzEtbZ-jHU8^ zEtgn&G*sqMyO);b(aIal#Q?@DB6Jber&O6&Hisa$U=OY}o&mz0dbw7w7C;WWv93fl z%5%%irPR4Pgp#*bV9uQT+^jw2YREenZs$j7CC)K6XZ6mLtPa!sJZJ~JQ8~?bI(E0kPcu>AGs!Prme ze2hq(Xx9M;F3==Hj%bl*lsXr#s+_oX1hg3#;1EChT}*(v|0lrVhd%3HFIkAHantws z?SK8pU;UeNE1)Rql?ze~k39U+q{^`A>BAi4At|CuzS4$N zCakaL2v0W+sN)EgGkx&*ao2@Q(f*$!zGsQB?wd2d`8J-ppTZ?vCIzxwr$X@_Jp11X z|9qPsBIn%mcJ|eO>zwN%=bZnO*;8B2LLpCtu1Z#aPNv38SC9~xxurO>It=mo)8;rY zagg7re55=oZU5o@k~-#^|J9x`MLP``XPL;$DRvp`{}~{ zVJnJD<55x;>~|SI*op^y0*fU)0LzQqMT~rwizG5aoq&Vg_~LZu^}&_(65=d~HvmF4dUz) z{B(EeA`-HawTk!#Jp}VHVhVY?&j3s4jIO;!0R-_{+u;3=AMmg5eV>G=Z0TQh;d@rf zuh#TGm(S2qs1^dpOxB%pM*BpD$`z%Xq2B$1VonBQTnUl=u197$n~>l;Ut8~#O{~JR zt>)-1U$*QS7*JfE+u*}6QCNhJCcb51vRSnZ7@$vfTRVg)$jCeZ-YWIS`K$l|2y`mx ztp9w^|M1y7@U;)$Bo0=8vw&6IOPpx)+1W$nPLdCti zm^fH3%%SpkZoiwSrpSsih8N=m(|XW8cX#9t3&cqLLllxH*9wZ>7XZH{MBnBy9MFIh z=5anOqduiRnfLSBZLS8sUJe(5b-!9#|Na|_cfmrmr{c!p-z{z2+^(8CqZBFvDC^Ii zV%4GpxPy5kejF=58Z#y-*+P~v-h0CQ)!N2rsL!cweb;F-o~l$^v*m;e64=AHY}vB+ z-TfdntHY)w!RK{Y9_}IHzVHAfW#TY$bS`Su^9>rbpMFH~e|RbgN&GD{yX(Xzw|rb6 z!)gxU7>HnE66Q}_O9^|Wg*k}CV(M)I{rL#zs=0l0A4%EknQa*`K7T&3JGpXx_110M zZs!y^|1(jg1{>+T@PE9v{_zJa(KyeYf1NYe1N;B#=nX02ZT1`#3og<#C<(Yj%-5e?jw^r4tAyu@=68~7Kb;O4uhkeIi-s69- z^?0xyqSo)|`T2?Y?<)hJLXvn0vt>KT=}6MbtwH_x|CoF4xSadGe_W}~!#K!krzk7C z)REDkl!~VIp4v%LN<)i8B&$J78ro4B(xwpYDJ4RC;3%Z@eZD)L*L8ATcW(C|zsK*d z>+GU*d_M2-dOcsy5xa=or_cy>kQju|y4bx1m!A*t))mEv`yX~Ogz;+OhH3Rl##Fhx z+QR)Wb@OJ-U+epA%Mo?wk-qg1U<@S0xXM>0mZ_-xl@VI_VKDAQqM?VRUu-mRmH3&STS+`{~IYP053`#nWFj zUG`8fa~610ue$XpZluCx(w`<@%7OI(-v;A4zKMaoYO~$%pC9Z$KMci_6a}JY(*N=6 zPVuok|4OWLlpKyIB>t=zQ(lH5LC66}>?Egeg5@SReqj5=V#+5Fvl41J)zaHlidDSb z&-I_Y!otT}Um@(3N}rIVkDPlxW5qV@h^!7v{rrsKhk{&OVl}6W{-pQ#tvfVX4j2*7 zT8-A@4d?OFe_A5{_>y%Kp04+rXFI0&JO6pMa*^P>H`;|vW1K^n{>Y$#4|9HwK{Pz+ zz8L~=aturhCs(G4XXHBu$h>FepF~i*5S6NK1hf9;^2P zLn@UyJRM(awgtME8Xf8nAA1_Jy*i=@q6F>@I63?2X?l~tp!m@BozMCsrrr z;&Vk7%=>6|iSi)9Lp8wC$SBHbe$x_4Ssla8`DdK>(f(;ik%BGH{hS4osjy>7nmEis;fSXHR7+!&fvcaR({$=o`uAt zcZas~Us-WK_1XW^mlS@i*Ai>-VELyr%sF4wD(nt3ZH1EKGHm}Igfh>9VHnd&uCDr5 zA-m{XFNGSrrR1OV^bw@f0!QS%uMBrS-B71dqI(yY9@D8)k&ThO{1mc1L>CaT!>Q{} zE=_$T7ZYJrTJy}ce_uKOt8K$-PHy7OvJ;f-MW2zA5(655#RlB5;xL+~B7yegZPC@t zdDq61=NfC(#-HLFQsI76{y9J6e1_ZEm@k&uiHpX++}Thx$I0QTH`ayVnWV|Itis8t zFy+hnQ~%Pe(jW(Jq&f7e5pHH}ALg$m_NB7mVykdo^3rq2 zXB)evf6Q<9p8ez1r(2IJukaL|VP2S+XsgblK3xwLAEN+s);Lb3K;Q4GfnYr6Cq+O1 zYd`%~oVKL-s0a+7y0Q7`Qx}uyMcx+H*!f2p!Dq-r%2<;{D-oi=RJb(s53CI(CZ#{} zECb?KNvM`^2)wz7w^+R@@>Pmfu}FJ8mpqbJL-P!hC&ThE&3**5CK~NzO`4(j89%>S z4MXSVKV&3mFsZjN>4^qVOvW(bN1~hxZW>ykj4#=8hh@sW?P&|sUjZFQpX0w(D1E=S zYq%IQnNGkZo!GW0FB|^`xX~z)X9J4XA<_bc3#{T|oynk3qU&J8Hjuw=C40s-9eVNnM~#XY9svp6AY1{ZWVlpQhR2nC-IU6D%6)T0JD278_4E@KN=KK zB+lY6yLd3jwkMz*1ZPsWbKHyuy>YT8WfgOEsd$K0~ccxGT;D^cZK2Jbb-6R+tq z)S&y(`!R?YZuA6-un)L-*z;``H4kpSOxL6CU&Z7~Ovt4~uT5Qs!Uj%SE48&7@V_NmoS&?*)ld?->`Sbdi>P#x=E?<*v8_Vf2pW*N?c z{zG8r&YjksPaf>yNrRK*agb`|xJf|B`U6oCUEGgnuT(NXJB=ylw78tkzYY+Ni&jQ8 z)qu&Y=!07~{#By=w4wg>B_#|`^+vkc!7111&nGn}0W%KT`iOIe6@mvvqz8zH@Jz@0EduQVp(VP?Jl7-D=gwuQpX~|z7-C1)R*VsH=(^6w*l74|6e5l%K+o`RXvZ!cOgzSSMHU)Nhj7%$)4dBtS{B&;5%vI~# z>u;~Z4u97?yFTgV@lKAV818is!L;}azVD=^<+)|A7(rqRijH1gtJ?RnK%WHlyxMqh zw0a%h4Q*h9)h}vFViH?o!X5m3ORkU^CZ;%Q&na#MKEb4C03!5<;#oX9sC0~dq@e|1 z+|3|~6E~GK%V*C^Qcg;U;tK4_YpnhA3`1&sW1!%zEjxEM*P1BvurP!Aw-(G1KHcLe z3RECzWl`0*vzv)T7hcL?4cU%c&H zcWG!L(D79yn~Gx~L2&|S#w}HdiLkX zgq<6p`=Ix&**LZ91BFaJOAadp&-=y4|M86QAO|(;rq-41HwsA_1k5z$?@nM+vkym^ zaNnBy3D1JJiesb^&bMASLNoY~)3a;MoCYvuR(CKw8FF?cRI?8C zXaFz?A2?y%2n|}o0v^2=e;NWESHhcYk~A9Dn?ZVNLN;sOb}7Q)KI4r84=B-do$JqV zb8|~Q9Sd3ai%;;1kX3dJ&N=#fWR*mmHYeUj!)kmM@=4U;{Mc7F@O=TbjGww!1UD1n zA1Ys~0jf9l(T2KOV^^jzTn~va*L71EBA96}RQ=kl`WH~0&d1s|)>*;2redFO>pk#p z&{!vEFoM@5Ngw23X2@myt{%|d)`El-5}Rq0RVT&SP7adLV1}Q{g`d7OLV$1Mk~Y^s z|0(;WpB5=0GvChaNZS5_2_~^yU~6N0P0h~EE?cht<`;rxL8d;a^69%q)2Z%{tE|4n zS9O(PP_S{vEYwP^w(0_B-k~K8pHFA&k9)bhSNm@|UOMOq`(U9s#=j)*!IeVd!VNe* z&`K}c_C|TYtKedz+lB<&)j0IW<*8SyFCYHRo7Uo*bAIuje^{v=gy0=IhiT77UZ_Tw zZnx37whs{pq-f=Me&+bjQMesN?>RM7J{kI5Jx%0T2IbYv_8cO6aBSq{(uY1Cu-@cq zuOB{v&$ev$-29XeBtZrih1$nzq3$JwV?uakVTMuQ7NWG+*vQ%hh`TIuw#*!oNl@Z; zI+$QtKR)(Pr%`E#O?xD&`VCN*tmoP zh0Rhq4n>gt@r5?l4$agh#4hH`uDB>#YNlka^B1 zf-)b2?Q5)Z+Qem}Ej;xJC8hiwF<~beEJ95Etdw9pS%#Z2zj78j8L2*pVakvH(_;N+ z0b&4dAsX$JxyRNohUf%zaz*Y;Ur{r|j;be6p70I5$ zL^mrKd0u~LV}VXBU>NlgI#!4*xz87Ibv z)sJ`GI4!%81Gy_iH*m4nsD=^^oZ>3Kr)WD9t-b!bt$Nr29GGkH-fS=X1%v}54>&*b z6^#e8T&TV5cY4DIZyy9*dv?h9_)B=A%-IK*8y$H!kcdEiKP9cR{HQ-kZold3tvR*% zwx~22-LK#6{fi>=$A!&AoSF?R`4=%(Fan#t3bIJtmq<(k`Cvuw`vz|;5OezL6>gyF z5zjVXoyC_WIrGR9oxwD=k#sUijCulv^#{tV4>Ic2CID}H`Elv_JU9m(hViCqkjygJ z*As(EwxG&ujO!wKl5nh?E}uvAa_CB_?VGyT7zRnDP;nmKg+Km!KYjT(-Z}Nz^HZ-k zX%lqe|nZBo5(~>rdjXVvu9{6 zJJ%{?NpXP&WC1^%3#6?J;)fH!+-PiBuFy5&Qc;DtO%B4>XG>g4Cl4HGE@lhAV}FYa zMDhzuy6}{X)-!-W2udedeoqb)i_J(8Yfk3cktkKsiHdHKI#@y{E@IS! zcO#-*viz86}MhwVjTY}uc*CyKVr0O)i70i%uZh+7rvu|(7eE|7x?5EyQm(V$k`op7N&+{$IcRC!90{@yrw4K($X({t|g!NV^8gvHK>dlP;o*XLi#Apf{ho zsvP6lsxnhirX+GfS#!4QiB8vh=B0f%X4UM;x(-hhs`h^n^>Y{9;ktV*Y9A0J-yb74`H z`$<3rnwwHaslrC-DyzaXOQ-&noIW_^&%b(R);;x_`QcARlL+u>B~;;DBKJ4=LaY5- z>}SYd59`Or@Eh?Ki~!p4nB;F0R}%9`Q#cuV3-0pfYL`bZ;JC+ic`u`>qpU!+hdMQ= zj#Xo`saTr7;BA|(@=>h+y*%5VBcn+X<&;@Y6YdbwW3OcFz>~jov{QcPk=G|fce!bi z*qH6D_Lm=&mBqP2yH!akjb_q|1gQf#v3BL2#r>LP$`^^P0O*e-bj=QqM%B|Apd5O1 zD62Klu7Zr}6mpMh4mRq$UxjZC4j0#z@Q)q7r65oM_N;J%%o;14&O14Ncnm*PF8GoO zAFHvjxrYB2%kPIDBN|Mers=X`dn5Ts2u9^!i5$-V5=(q73=NOK!|eD_(I3+VgYdD- zp-whnn%@c}hLGXCvKcqXcYcE>UHyu)^m)%1y9a~gr|S*#kMGx~I1Rr%gFkQ&tbSgL zJp<=NuE6qT$c~1U%$lSicW@$zuqjC|j|3FGu}j%$_a*@BG#RY4^NVME&NUzE1Rva# z>6vAuH3T83@YX5Gw$j7`bw_b-S@0 zHet7rY_gqmsWhYkZq1r+$aOBD6Y_nkacS*$MSivUol0lj+&7nGN z9aVf->b(Hd;|Q@-B6Nd6Wa*0X4+(Rrb*e4kfN8)UKLyp*(i&-ocrzr7deU89Dam!~8bDS)Q0VxPoz-@r+TUPdKC zT&iEb7a1E@iA7LGNSinP?TS}g^nn-A`{u_9WrTgPtSU&+A3Sl)Z{RJmiqF}~EBN_; zf)L;=OTlO^&U*y_T&BY5(OcNE0sB=&7N~FybF3fN!hyFL^tn&hID<#nq)CKOYG(p< zIA#%>eaeKaF4V84p)1DSY_a_#N^NN=+F2>)9{dlt<6v|9c$4rHrmB@w$PMN?;sParn(82+BQa0tGZiU_#=Qi7c!zjvM4x*0(m%Gs4tE8JES3a~=rCv{5AtCG{_ zMLtPY+a^L#+O$Hqxrg{K5x>;xDlG*WIJF)Gq9is~_oMxZx>=;>xbbqjDeF>3Q%`rM z`z$90mHw!=FoZzmLGEvuzF~x5;G}?%WekbLlS^ z9+oA(m&+skkRY@l=4cX~ujDiVtGutFsPC=x+cme#Z^z6)%FKKSW?PrgHjL|?1iQY_Lqt$FKCco-rJgZ<+_ z9nrnKea(^)|Kr`2%D5r&LSikhgMzq}=W?kl?jJ*nTmTk98n zWBY!T02RN76i<>ppC>nnCO{Ui<+Cg2S{Tbdiyg{f>K)=S!f2cH&8emJMKt;_kth@& z#)q?X850%wjL`bGIQn;;I{MxI10H%n+jyq4%npD%OjXA=|FfiMN0_1D-CEHYY}e+2 z%IdgxR#3tAcD#Up7Mb^zf^y?}8`OkBsvZi0IVw`ts%E9(&3edT%mVkA8z0KNNT zT)>BJSPmt&So;dVZg{qn|Rv+xlUr{-&YEW@6NuA3AyBudB0- z7~H=9FiqdDO@X-kHJ{I~TeW`u`e&W!SOalV#(W89S!P8^Qhk(o^G@#j8im!s*t2&N zpw}TsC2!*eHi0MWrSAdbBLcj*Otu}#MYU~L44Qji(0DcVZC_W^4`5+{SZBes$E7yw z+ooQAGx%=Id*@m!w|(gZ2t9EKvwGC++7z~8c!I#g@{GSYhCB&0XPZes_fwHD<(I6) zK-9-ZyiQMCFK@>2BTuzTPGGU}kd$L{F5s{N#U^SgI^74{9IrzDcg`abn!S68J@uVz z=VBgS=50aS{s??u9#|`|QaNg>ZlaQOu|5jVnd89Q2&Sp`Ox4?k#@VnbyFNj@^($~E zA-6Fs!D}o}o%n8xp5k;PVbcZf?vJmmzf5v`Ki7yhq7@dBlkpydeCIXYjj9IDbtrfF zP>w%~CwRUxF#H}+)@P%{d8(Lt?%w4f+u=)CE3dNxn3)cU4hpjkNzDisrTy_QqXvO@ zI9o|1lwOu2%@rr5g!eY(#d)1wZrlz_k+}Ty`u573@9F+}Fu}@l7&hBaed;xw%+{Ni z?Ks%Beub4meA}|xAS{(fC>UQX5@q&8w>l#~H_b zu!t~e<}vo{<4nw*!M@A2i84zI;W_)A0)1}DgLy;qc$|c8R|Xn^(Bc#t#StV@Qe--o z5dZ0ORXX}-D-^u<3Ivp0CZ@!spbty1d6}q{TMO~Oqfh!cyNeahM2lV zH?V&cPlw+tt*&H6%wGT#&E0px@7iJWVn>8y5+wUb zCtL9tmKlw1AxP#ha}IhIz~x;%hy@*u7HIi}199>kA-mk}m5-9~C$T79{wd_%YrqKS zBTsC;_YFK!q2XHi0CecF+mI78%F#ug=dlwswdaRw(OR9J(lZ%pu6trus>y8!WvP= zL?cUnOI#D+cj5>};_%i8t4CxFo4MoReSo^VX{O<}WwH_6!_B(xdK?7`ec1;ZT~Oxa zW!+r!i}PgwWsU>)gU+98nJEjO1H{v5D61yIFjVj>@p;8w*tD1&imM(y*1dHx^-ng- zXt8*h4sPw=-$~MAml>uJ>uPe%#lMQ-4 zNsY8zC0GEi3h2Qrb5vKQpF`VIcSvNz1AkJ-rZ*-n@RXh}?Ovb&dpq=)QqTEno~oA! zf^ylXx~{-S@!Bcx9uCn%!qhH>xlQrP+(hbnx%a!gHR{t&>N)#`vX+_aa~%gWU2{Br zu5Poed(@j(_cf*C;as(kgNWF8&v@E)Be5|xrzESAlZXf*ZQ_zqJXF=9rV4Io{cGN} z=`Fuwhb6Aijc0cq-4TA6h?FASMnc|4Q4_16{aOy=iCT7=ZGB%wys<0Rq~ti@{ryNw zX}KGl63LZgT9ofEIBGXrUvDPbum!8eRHiFnRaiL>^t0r#wCHW7TaR__p17T%3upT7 zqt-nv#8}{jdLH!UneN{>#z{X6RsV8r7g>`D!uDJtH7RwN;yft?ZAZO=`4=nehZXhL zl;cJ62u)FCdK_G`xkykBF+PHG;u>5tX`y{keXaq=Pd*}dru^L=*%BT&9jwA#bCDQY zQN%{!BxnK|h0Sd^A5KrVZ|j!9#;RfBuoyZ3BgI;kTG40-g)8jXsiylmA``^+ppv@+ zgTUfD=ToG1R}%d$2UXb;HI2Tvt-y{xf?>}8(`4IcD2L6@h2`U%BXfxMhL!_d3%I0H z)^3Mq&MIpGx9UheY9ICB(p|3EPyv^`WhKTZ#kWCxId-!RedhVJH>7OGf|PB^2X0Ri zfJNoQ@>dah6QzYW)=zZy3<?LV+3m$yIX>(@RZu9CO zhOSv_bQb2hWJ2|raW-6cm?q?sqStVPCtrHvPd}W@AK$k=uN{6SWWQtKLHo(R-eFvmY(D7SJm|{!jq@kc8<3(Z??=KO$+5GX2L?l#lEJcQnZlljVwz}L5xSm;oy)(`GNciMS;_5Y za5hD?#D^W3Fqks+@KtSd+tCLN$3a-e+cd^~tgc#~9#tg6_U)}jbwCVk3-%D}xaxMz zM4}wlgcT8nu_br>n=2#K;<`IMcN4zVU#6}F;`duli&_n?`nGIgM=H6I7`FM38&xi5)LMlgnL{Qz{-d@2^gD(%~%;{J6J}+QP#~8p49vICq?IlA|lT9Kn zg1g5x(*;{bUyQ)A@Lp@2VskIQ28u|z&N!~eqei~4fXWGTADuaxD_VImoZqeJ40@}x?``0K7aO|Y*D?^Ww>XJpcHkRohtNY zo$)uWsqHPfi9Deg+KTJUvF7j={==er+G^?^J5^94pU*I_7hOf&#<1x%DaULtg9W>*lc5qZgu;yENGsw{MdH+ zo=SnxM9i)Nan{?H$R;Qj?~mR@EJSAUn`Leu#34r4gTrO`83UuR12 ztSEp%L~QFHJ$o4^zErxOTWk=#P@rb9W!J~+s@1%epb){^CB#T;Z;8hgk=Uh!ied{` z)fD%A2u~adYYrJm80ZNf2$}QpE4zOszgtN^Sd!f2s~=Vsg1MC1js?G8*wOu zCH+Us!?S0~;jM_Lr-aV*RAi-G#ZZQ8fNe>9(Zzvl`Q~E!rtJw9kx6l%iko#)#B>Wp`sTVeVhwW$ zbZWmpXk36j+v)x5Ez@0wpO?d9^a$0m-HOidRYNdbM&c|0{cLC$JBTISNT_Szn_k2Xl9i;QTXVyX> zHzv*8Tlecn?XIPIVDYT4uG;c@toK6~v5=#YXfR&nIw|M279j952 z#9-J~aX}$Wa19*q6OwOQDUuB@`&AxnY2tD_8sg(&A$?0z`Rj5K=LcV;t!^}W=LQCI zNe_%*y*I z|0_~cHfo#Ya}sr=uU}ciJjxMI#Tm|ru#K!+@6~5$IlqjFXt6+L6ogq?PG15Kd)3#) z3R>WC5)-=2)8<|GJN#y{A=F5Vrz}?NhVw*JKl)E4pc1tXmJLbki6vvLA0=s9jN#Q} zt-E%)X6`;8b9G-tmjL#|eqI|ZK75J||2u4|RSuV=a~Hw>K2D2cv9;Wh+IF)gXG_Mw z=$*M`$B=2h9!PQjU58epj|5C;T&lsGEto%6+!LU z3utPRbB}egZKS&b2eoZZMrTcO)M|GDwA<eao!_UBI%<)-Ck-PMvF)EBUB zyKV8g7iW9eiF}xjUz|2Sus7RRPX@f8_g#*c8kbSMJ%K`sUEH~H$|WNjMNSNJ`ljE4 zI0LFsUXALHp=rFtZzf-R3fV3eYy)o+b#rDqCnFHH-$PaX>utdZmbo0ePY9dd;x^Q1 z3!fm)d_Wu6JT?3efkcBGnf@KSmkU^4aYg!{O;D{tGbtSV91*KfZp%x3pP+cdtM)Ud zq(aP(0@oebLt9s`Dgy+<(ZIB`W^0O9*o$Wt!(V{WoI5_=Ow)nE$k;a>uN-ehbbg$h z*t8`%WtsMHbvd93A>k--XWv$YY13}$mpt#Mg^73GsinQJ2X*KJ$W6KZz)1>P^0!y< zKFfM}qQ$-f{KK>P>_xZ1ao9(U%Ez*aeGS*;37Eu?Q_$uUTk8!tnD9Z2*fLJ?n=taZ z)A}-kBUx`{q!mo!tK(!ULw72(%wg}U-D#|#23(|?Q{TpjU(fVuuwk$3`~K(xZCLzo7#%b3Jhk9KwIKEOe=wAl=tE{U(Xme?*NBe;1b!QJNR zylEm790Kf(=4f&zu$;9_yOkK&gqwvo$xE-^3|Q8HPx)ky*^njgbss4Ug99WEwG0DM z`G!>e!DI4=h3tFk_O-cv(mi~df6GaHKuCK3Xl{hf=>QipW z4eot9Km{ps1Jq&{V@Sv-+z4c zNV>XnZ`q(`pVn`cMsXKnZE9oBljdY?RpZSf`$b-QIh0>@WD(>gr<<7m7Ai1}++h>UU*M9A`$0H% zmgcD!pRqdd-~-|i&ir0)e@P-uqW<>P&Dv^+?q2xO*qtS>bWXAe=nhxlOlh(Ed)Zm~ zCCBHmZjRl<7|*cw`mPy&U#Hg;ypNHXQ2Ix32zH*@Yf=%aNq6Z^SOdsA*ROPgMlv)D zd~T!mjwNr?D|cOn6GLft7B0QGv?!3C_JejJ*NOa}kkvAQPaB-omeow#Ox+=KY4w>F zky@@XV71hOYezvu+e?-U1`BJ@kDL`Bcr4P49~F%_7kRG00n1=P2g@%QxV=S)h+Q+W zyCs2HL2mXbSiCZ*mUKoE;b{nvW2O8GYFC}8;vv&TqaV@owcL}ccKL>zSaU#ZFz0Ep zOgdz>sG~3Y`cfRNPfWN10OJGpUhCkxl-{$U&=Hp{L0c!CWcPRh$Z)c^q4xE|rNE@? zF#R9~1eY+T&JAtR^+=nOc~7CC^D5lgmwmi0646W*sOPL9CSF{{rg9M$^ydPzy4-M3 zgjOt}j9}F-bbDuO4bzWBZelV z@6~M2gqJx*9<`L*;+nJ->P0f|Tf-6~8-aLe`y70(`w6ihl1}GRI-1zMRROwM-n!!R z05jK?hHW&BVMLhtbtB|MghUKLGvTp3*F_L6ve7a@75yh@5A1O-%a1=TK9^C8LYPEy z$dBtXt1<7PToR&CH`Z41mBqf&V7v4-Wg$WgQ}hd#$6fc45P*$mMdhMR8l1r1?5@ds zpQk%&!zK2-2OpJ%f7YQp&rkcWz^!H;nG$yhuuK#~{=F0*;l(_9IyA+NC?Lb-_fAYB z!?nU$4@Oui#-57ELc7%SvKfS@?4*IQEiB=Ga{<65i9!60o<0M5tnCBSb(lj_G}9&N zdX1{J(`1FX{6;rL8YbP=_L;r(4TK`47id>dyN4aw)#%a+iEp;ZO`o@xO|h!AM`3p^ zO0te&Ja)9_UE*T#?ABY?=cw^0R~b6L3;}un^A^K%`Vb|Ub0!+|yZBeR*yRN^S{1#| z7jVAcu&+1nMxmCn&>?_z#QVHF<=FI-4qiBX;yN>6G5mOv9I;$D0JA*7WL&Dth#hLH zjp}r-;kUEZ4xvjVBdU($weK|#R7M&;CXA@1%PAvjJhf?GXLl^x9L_Lbni;umSIWw-AhYEeTlSv&nG{wX-u z@4rT~kZqiK5|xcP3JF%Kgq=0p>s*w^K_wvDTc5lsxUH<+U|dJ;8Kb9wbrx>LBe7L4 z9eR=(j+hobc%CD1=1<8bjftuG8*uB|JIcmYChvLq{kr_*w2Or)6A#Bzcg3;O@Za3g z_7bAe76cQ2id#=Pj=OdKcBX=C!&6RT8VDMZaWSvWsibb%4SUy4X^YO8zngdCeC|^9yys8&B zmV|!8P@S^EK4{h?2IpfQ`0jl^J^TpPaA1e<@ndyWMrCGqG1*_%cv-c|3SF))OLp5m z2bqlJU=?KEm2!(e)#fd=!sTbf=7YxWr=u6Pi-~0KFi! zN`c!!^)F3ET~3-#ipS*XQwtD93zv~G-vQ&nL~jQ!;A>RL}$^+9nXk z&wVsb znBgCbi_#AuNm{E<8C|EGydk=dDG$c>`uU$<&#LW#5qC8u1%*)#Ounl==cW_|16R0x zfBX4xX>SAgXjz=p=@Eu4f7bmyv<$tHbjP#fA^vh)`#EFQUC(u^tbn~o@QGXDYAR!@r5q`ZR zr=I`nH~*@_MjVK>F6!e0SCOz~k?O45>tHr=e}3y1#9#Q%_i}yxUulwWd&J8;>nsmYEsb>AtP0gXJS^pjuEpFW zz@T*b(`#)mUF8&d+hqfospmWPAXMDII9)3TgT zRF8Lm;V9rg)@x9&P+|-Q+LDjAPiz;ExCcNzv&7XQ?c1E{#lGj3ZLhGC8BNMFdN?zP z=Y{X!@jWKOpfxJ(t00DPKi;hW{F2p|Ok<2xn|>9&{LgRl@Oa6@?!5_3sK{Lw4X~5i z_@uc<&SKCK2n<{r%;h!6w}0RE6ot`VajT?jEKktJR8vBZzdE(pXpad9FPqs6oJk19 zY?9~|<*AXPg)-?NB1z>9H3Um_k&G1?0h{|rK)N;uo#kk$2aGL(@MBqw9sA7x_NV}r|r#~ z@bmTMJ@Fz%S4b10*xCjf>j;EANA8&&ab!v7l+8E zTdDP$ccQyP!2Afl#cgyEoEb`qC?9<7)2hf>n3EM(JC2wMtpG z`w3jd;ThlCrZ69K-#g*T;$E#HWlg%NP?tx&Oo!L@6ARz`)x^qKes^Q%oh~aO);?Y4 zydD_|BGL*fQ7a%IL4!)fvbt3$i!nnA$uNu-!6V4fq(0@+-)6W9T4fTcI0*fvFbDzwq4RUyDH zl5en0d%LBo-Z~0Ax^hTENK$NUZ}v>*eli*EYvwl%MKyu+nGdMx?J&7CYI&zrNd+$th=^I+&Fz>$x!-ea6|S<3ud zLRh+h&i8TN~dA*An)#bcGdFamcdAs62IjZ#o=L!Ni(Aqzq%3=y{l+&d;Y@^Na z=#E>TM^z#TKCYOy$bak}zvxpYxp(iw(?v@XKR!i_-8YQv|}&?ayU ziZ}^**89z|-{r>gUR9$T@~}08(cfwc^yU1JocnfaGKuS~pygPLCesX0itr4e<-KqciIGTj4+KCy#xLNtr zAI_X9k1>27!(_j(aPM>p0jG!8IaOO@STrmj)xp@#d~7@5$4o|dr~$Ue1Gq#=Oe@dn zdJiH>Q<+3_3h*gdY%#gmDbHJl;nG`(yN_IxneIhfO#@WizmsO*fO_P}sD(iV=q%^n zlL5%2Bg#!KZS(~Ja00)lTcZ01^=(ZWahwi5miHZ!qNfwCIMP+S>6)aB6UsW#hTs5# z5nHHJc^gFUf-m(1i}Speh8uT=DVs*nwnJKRIka2mP}Ia)5pq*0+l=}QJps!)Uflu6 zMVB+v*3^Y-a-YD{EUmmyP2p_cO(rj@T#4-mgq*>S;AiCTzrU`i`l;o&rW;YXiY}p3 zeQ1yHzce(m4;tJOI>ww=M1Sf5>FLbJYMiof(U4yTE8mZ$%%z2noE&=hr7gOGLCPS! z*E>Bv+2IzFpCLM!JU`K*FxIE;nt(cw^pJhQXp&mY{)Od+qe@<=DVzn9rN&o?I3K(} zCOZA>O>Nh);by5+uCh!FD>|Cx^w+)aPmiyNU#_*n(J)%AQm>k;*wa8Ch&qb1uyBE()wyqmESN`*#52i(+;rZq8RQu=Mh_Yx~7Et1xO*=J~-E!y@ctRlf8(K zu^H6$w|hdD{=|0q@k`DdK#AnmSv35X#+O3DTAZIb8$m8Xz-NS*cOK83MNQp+L)kq0 z3QM7cq-5y~x%1)bC9bGZI{W!zJ802&!J<`4H1|4IPP*zDPt&x@1+t&c%ZE#DgkYCn3ZwFo1<0t&d0TZ*Rvc)V9p(UMm7{)i>wM);?IIvC0$2lAM8UAPg~D7;h|~kG2<0Ulpu4xVV2?-fk$& z9M4ZX=J@LJ?aqw(BU*^znD_^#m?&xd5BrxLH!ywvi!87M*@n$02}x?-Vi>)5+&blkU+|H8ll zao_$-lmSa$UT)e9*w#I;X#^~f4AHWDM=(QO+x_DA zIM2bz``&%_IX|wHpM;W}7s>N^!*$+Wh6&!KoFdEG}C9bNCvq7ING zNMQu~$t%PBLM&E3Yy-G`XBzFmbqj*u>3-C+)~6*=OI1+TpKYZns+L@O`W%?rc{if; zzQnDt{5bdwA~Snyb|Pc)5UA_>Lc4+5S}?tWl1HAfMlv#d94&l}W7^ofZQz zpGIG~2Ea+WiSV&LjW76FVWXBFgQ%A<$@76pQb&LU)b0;-cWH-6N^MeP7 z(PemSJ+`8iy$>Nl;Wv4j}jBv z*maHAwb1pH2G1vH(Z?;IRXeBXe)u_z(m^xM`@`PaS^quo`cVOid?Y!P=J}<>Fa$VH zENi9p>F>^R(Z7ahabm6^v3Kur+4pd0EC*_9TpE%WT-33zW2fj~>f%irtY(WGh-YJ$ zTYBnq6rC|xGh4(RhTC-Y*Ug(Z@73@f_wnJNdF@}(6h9`}Hl%+8(kM@FtL|xQYbwP3x+o>+~wg+>?ibs=Z2;KVvu4s34AT3)nwHHWI>A98y_X48K zES-pG8iCo;McmuE^oN|cwX37{nxK$|Pbu-0xT&0Y?Eb(_>oLsYFFyLTSTlJ}{EdPh%WYXK$3vJ!$O>zn zwxKM5SApc27>0u zO&`j2**M<)Vag>o7+oDFWz3PoY!RF_Sf`KC{Jn)9Gh>`_y8G*{W`WPgP*QCz&vtqD z{@Cu(J7@4PbJ$Z}MX>oKzB_ikt)w@-5ySb8&{ZQ&?x&9QI7&^|Pe1tB=$`KQ7}lh~ z9*tqPbFFkuZa^SPX$E2zpwqk$^HU(x$XAMqYMVPo&$j;AvJ2O>r0-#CZ%|xHziJjg zk#T?NI$W20gKnslESMACU&o&Y=mp7Qd*= z{xMJVsKl8#yfeORK8C3WXrhu67TIR5*ID!t?)jpDhQZk-C<4SF+U8`7qz}Ck?}%VI z7rXCr>E}4ZU6`w;3q<6~vsou_sj*#qo4B(zIsV3ewy4XXa0I8Y*(Vwv@IM5FxFm0& zX01UR8TYb0+J(*b0Z8zEH2&u%O5-dv;#oeH&iQ0f9d!yy&34ocRI)s-izwE?fdSuf|W6z;HT*&5O7Xavmi4tzv*V*JpZ z4U&UAT}UNTl%ckAHwYI*>f0~Sy+oKiCxzsu^^C99vOWQUK}|-zv;M0?URnKDR%)pN zQePi^>`Fh|_7Sr%Y5JN4qm?V<8mn2A(plZhhH0WmYke)rn&5L%vQez}CJ&|R>ptr2 z1`n>B;de4v7%ez-5X2Mn+&7ghkn$K5&j(&eGUAlfWmq&1@3olBt z{XMS6z0*IS9O6a^WGD0%+y2~;K2;G-ds~v(%~Rp{?QWAE?@t(@F(!7n@cx8o~y{ zDtJ-2@mC#D{k2talhJ-Pk*^^Pm9^v}Gw2*$x9TcZ&Knp(VY|@HziM$|Ut69wX5m{J zQ}wqe$Lnn;a&bVn4=E1k&z|Me8@+_6;>diKKdnCE(F6+jPCX$y=}i`;qDjT?F^MPD zHoCJX!)rzpUR}XJZ$8!A?OljjGysZA=yckJ6j$~+p@OMFepK95ET0Wf7|WmJIG%M7 z4-qJSA?0yRuiC^QBlApYj570tG9IowT%woPdXl9c%SFlg)4-vz#w6TVVk=j!ysztZ zgn<~yOe{+UAJOHGy zCuqRJ8ftr`Q@ORwQCzTHb9k#lIq5|4zpWV$y zU`#-dpRL{2&Lo!N(-W8Xu`n=w<8EI%4Wu^S6b2?&PFqr)5b+H-*?P~^aODt= zAp$Iv>^dtplX}B4+?M^M+YU96SCz6DW?qMB$y5(P^fNiWcHMm!J=Nd(snM9mxN=X` z#vrjBGtJjoVwM}`pAQR}^*Y(MikDfv=r2DYrDl>;z39!wDP=r^q)P)tU3lHgXO8^9_<8!+tKr2%RGt{SxjiMciv#e@w*nvqyQZK zXWLwQ3osokwH6;-MGBhxtdTIYSHc7VOWZdaq_G=WY<9hdE9}-#Z%v11mEv0i{;5A5 z7je|}U3jHq$_?@J&&UP~_3Fme?93$i3l_5{YpaPw6_6oy#-DovzNwdDJC@`2dP77L z=*g=m^wDKN*ThL`P7H*()}GtQ$ESpotLKAO)wE{7JHaDgK9uup7B>)o%{c3$I9|@X z#nZ~9I6VlE*I@TG{%^bTROJKwRgJywHTz z_6rDPdfI%K|MmQcsYe7J9uqixh9frf|JKfAio`*|ps^tH3Mb>mix;sa!gg2< zch^b@!tjf;H(h#Y7Qwp-1!r&@j+aqM^l>m+j z*;(12**T^}A^vr&Pu>Cl+K!scV7IJVw$0kt`yybG=6p9HQA*RFX)~QM_)j7f@&3qZ4Ir_H&-zZpg=!5X@R<89?B z4{c9^)qQyPY+0N>N_*MqCtKwuPe+n_^$oBrXo12MY3dCu1&DbhX`)?t|*9V;LqQvlCabw9}DFuwguv;{h_3PA5!W2`o z`*NK7erJP=7LsE@WUa9%Wd;sMDNOs#oTCT|jFi|tT^a1ms6b$V)y@eHgHzshs)8N7tNXGi3zq0ngdx!!hA%o z+OcVUmo_7TB9a`4<_isXBe`ias-}e91y1i*ihf@}?Xc!k-!ktPNAwssKGB4A$kd?z zkEfz2=QOgy3!~Cvm=+QY89@QhES_OQ6Jwk|?RhpKhO7u@o|SFg8Qqnv{$$M<*YBJZ z@_6vzgAJcrdGwzP`M;cVlZhbeEK?S8KYg3126-TAZ{MY@WrPUpGBNC#ybmKPV2=%q z^#XAnZ-<}5#>G&NGbLavcxr`IwFT)p5>s}}lcdoRt^xXU!>yfFm_uN8QIy^43;3|Z z!RHu$u`!!alGJZo$nhH+gMn#}7}mDpt(9iJsfC2-2-JG3VJb?=0F1;p=GXEq$KN4& zZmgR(mF?kVA}h{wB}?->Vqd!+twyLWWMAq)1D77;p7F9@sbnZwg!=+X?@(v@#k2cH z=*aGwPk&4I!0LgQ$zpJzNhyjlhN2vzB{Ji{A-Vd=a*YKHOkU!g$0#Z)Dp$f9J;&D2-ewNl%^`PQD#ild`pbII?;ZTjOD{b^H7^W-H(={dj3>fcxbp0+r5|2^D)O?qut`Vyc< ze;>$))~11=O<>VlDG+FxHc2zxG7MO7_R#2LF4z3@pLW4dUy3dv$9(C-&aPjq-+%5$ z(H*2r@K^2pYc~9z)U~^u&mr{h@7rwK{2id?)urgRbl*h9F9SlE=qyGC%Oy;Ejr?Zd zp;~$IrcVat{Pg?$`%6)h?7|j%sga@gQpp6}f(A%}h_@WR3I@Q(T=H%!%KAErs9j zpKsyckLvILIvJ0JXsG4nKlLsBV}W*(cI$kmPP3_6}s_n^E4CBVgZB}q9<_d->^V!SdeBL?SL*YeQFK8&&g7SC? zJ{J2izC$6oa>vZ_Eh6N;Fy>>K`i*lMpsrMJQL&#orRC>BmKlp~FA+*HWy54n6XT@S z@QAv1f9yl~4Mn|*01rlJYDfm}W8m|v2v%2kRr5($Ax4iT(D@NfA_k5(;PoR7VcUA} zkhgI-e|WQxc+r6UBeinXs!1jTu*e*3pUM(xTv5Cmwn^>fd_=COJ6@*>j}3>%V`MJR z-F(j>kzmy{`?}uO`~7;qhULbNyGz3v5T5D6v4A_4%C+i`mvq+b7IO7<51jaO zSNQt}bIRk?Vn^adV}9X^$pesb2!HJOh<#tv1}w4eV49~syFn<@Ai3@2*_iw+5ZtXh zZKeLoV8=#dw{Qqn=iOU$o{W$rb3hqx8Gs( ze}(`@Wu?S|LP8x+)X6COa$=LlBR;~|d2SeX;nUR@k{k)^NndxhjQ$D5cQ;Rkr@@Hg zJd%&Q<9r`SoFF3L2hL9*NHHo|ZeuuIg$P(03cT8v`K{qnjPW|%eXgy90$A_y@qtC$ zI|TvGF82HMMEO6tvDg0+kIQ-i&1J$~y>ova_I^K<_8zbR(kk&=ZNuk>mA5IQECLRn+zn{?CoYPg)Yaj#tZC*#?O%GP%i~k zeG&+dIC|9Msh?Ov77L3sj4wcUVXtJn2R+^TGV!HFhyP)8K=QKvGWXsvBLKCL5lN{J zrs23~oVggm92&gC89=jdLdn(G*1^$4y1w&M@1>a{gxEUdQb2IHMexWC&nhD1W6;G# z=miGIG{SVpIA7&?Y6x;nxZQpX1jsnWbNNwAlA;stI+!0w?p4nj451@0v!gEX)}I$> ze1+s&G-S5_^)dTPwM1cS*I49g2&v|d#}vQt4Y$; zM3P0j_*Da59TAFjwUN<}f>_#Wglns|HDp>+t&?UmQX8SE_SLyijpp3=k{}YdiXXJf za1N1cY}Xyw1mZ`i>x9L=K%sjFzWPdEO^%p36s^=cl;e4PH|E!vLp{rohr&7>u9-G@ zL{mhIwP-#|%hjaagCn8W*twW$L~TPpxXrlS6SoSq7#JS!g`w!PgIe~Tsrb0KZ*BR# zDgC{OHsXtHh>hg^%WUvVMHvX@ zfq4qd(^EKRCrq>MulZO86O{{T(gY!nzs~Zs5dLF>?@jz2#1Cv=2n|gHomraLYmu9q zyx48dIY-^QFpM}1!nV~MR>+K-S(g@^?++#95t6J4eIHGT$%5`!2bR{pIJFQV{{s77 zoyz`b6KHYnFI+8Eqq~_mKZ{r>d0Q(eTw)AekotzRSp~DVp#CD3gRrzJV_o`PgAht! z4kUSkA{{lYRwLVe$`aG*;S9-5Owahq(LOrbLXv`L7FBarZp#y&L)-v3r5(?4QJ#x> zc7F=@nn@svC7($hm#nwLSkDVvQ_e_p}yeEdItQNQ$_JVA4xi+79w zQYS&>Sn?3A01bDwob_sr zXep{i$@#K?Rco;KMN-AUcuq|r47?&4#;6`HGDUgwAm$c^Gb$TpqzT(i;&tE5);5Ih zf#X>u(77kIEiEC$P>4v2^iH5@90W1?zH1@m*PTEq^1Bk&J|SM}1FQFYvo(Qf_Zomo zTd)AAS8%u57M3^zSI=^|Vp(@({43urQl^RyA?!yq#)uaMn};n?E`_l2kfL~y&a=EC zK$9}x7Y-!yDT+F$FptgDcEag?5N?Lr>}rN}Pr%LlC@7RSOcs3puQ~owE!=I;7}*@I zT=M(9_~qmN?Go`UpMy`|4jz+RPkodvUuq9Q5`vB`CdRSoA)W>@B1K+>b@2z~VRgkr z9qzQ5B&J@lp#88&V)fpR1W7Y2vyS6UlgY3TR$;zMgtMf4V<9$XlLVG?`S$B9!O3{f zy6woO1ixGPwtK_-2d>{fdJsGJ2mq;g*ogeVlNMFcSMyqJclB39c#=HJbVGPQ5sPozcGf$KaOn5*Oa8+Y zAwUj24$nSFNy;y?f>DpG*22LT`{Wkj?xvRpz&^@Z&w%Y?cBL^R>{VSzIOD zYh~hsw99R{;|96O2F5{skD}$C5W78KczNAj!{b1_$z_OLtHXWZ#8z3)jcDv_=j@H$ zf2VBaVU{mkIJ&n$bSOtT*Y7iwm&wpCa+Nk{e}l~=4wNFS&Q_&399uk%<%B7o*F6{F zSn@yQoGleN+ig%Z{&m&9`?QA#z7Cy$x%qb`&@uEE5z$c6!;u{^G9YIL;#Fy+n$+z} zxeP>s)8if3aRzh~@l#lDlyI-s1;_a~zKj8#lh~Q>`S@6)xk|k%a>{vypGBq?94$j)f@6 zi6@&}Zr`EkG?v2e*i_Ma)b>2>)D`gw-sY!bC7uPLvA#ttO_Fk0%5jPI|FrK^3r6=ywyr-QL?0w&2m42b zV)dz7;>(Scrlg|S^E*S^yzztv=1gH$UJ_xc`7ZT-E+=9Q6K zt>24AtuM5OB=GL}4-Td0%J2eE8Br3d%pPdO`v>!h3XyVeK1e=r1q$AAf1Imd#HN_ul>v=&yPC z>q#sf5b$$O&3IOiVD<4e)6jW`xjFITBf17|)fltw5GU+4+1Z=uagVzB;p}Miui0_M zp2;($ZLN8p>ac9$?D*huUY{e(Qqm6(W296}sU&OCnto6N!2Y?TkfHh}oIyB#5bbsi z{-8d|#e<&WJN;wmfJ1KvBlx+i^u5RU5~`y1F5Y){bBI8((4=LM6@VR;T{FZj1Q*pH zNz8fd)IE%G<*A4`e5}`)pvdgZhJ~mBPv#XsUvsP~NLp$P#QR&wa2ML)QUwy`XKZlx zsJmcw<6AKZ5-aD-a6kCelKhy>eKv)T?d@lzgdL7gC_G{Uq36{iNqZw@cj~pKA~!=? zIFYh#e#_;iSZ&QbY?M7ku2TpDZmdBLHq&)y(m5zb~H-rYv-e*C_6a+XNfNu)CP z1OhQ$UGq|OtVV3A5aB9dAaE4hX%n@`7Vo$g6mTZeq!TrL!#s2NBFs4i#i~<}uLN zmbhp$3)2Xw_cr&;#y_FuD_3wiv7 z_ma#K-H<5Uslh5`k$oUm!%IUb@T|p0E3iz1FKR5?)S*$_`lj%_-#-&!2_gyK#R_?79Kr);$7K@AJ(-ZX)h#lfsmYSMzXq&L@O<+{-{q8oJN4!&ilH> zVa+agN6s6e+mXI6v0MsG;CzkG3t2BE%Z9TQ5Y|5KUfbCV2~M_QA}=n*GLh`~-F?t+ zx-)n#pc%a6L~(=Eh$#1xR*K_+*)!}AzPN^Mb@$E>xV#Y53qjd?2zF^9 z8&y9Ch)zi^F({C9`*)gBbD;^@!-K;%Wh7pId zXYi_)>z*t)eu>$N7$GSz%i^+iRqh<<{edO9NiQ6!azh@0OTE=`*gR`0QOZ2K6WvjW zjEvi~b8vrw>kRFi9jbsW0{~_QLNfNzOc{+Q>|EF(00*zr$f*HM&wh+pdInCd)WJvI z7%~fQci{26$`ha^mqI<~3T<#@g=4{$ADwYwpCQ0oSs+n0YYck!Nk#b?d%X0uB4@=O zI?YZCs30Di(1=QpdUh^hV`?=hCOl%O2d!(5VYC_SN=RwwQjYt$OewJ_?3utzzrU+11n3E7|DFKFfk;vL7(|C0N~Ax3$WM3zl}ZWR)EG1)ww_m; zRY|_as@CGdoke-#CT_`$FUStJu~I^}MO?HpC+>q&`tY#IW1AkjKbPdX12W^$)ofF? zR@sAarf*8F$D@j`_yJJG?B4G8aw#h)fp*r^bxyEB(mjg~OauB*MR;}%e|U^hd-II#*kM~@Y=U0PZS%9H&2!Mb2x0X1sh00QKFmMMlCxP zgUr0BWx`-zKMs!jPg5;eO&7nNfh!do27{r!M5B>1C2UxzM|)G-^P_T^KV<7PCED!< z1O^eqhrqqL7zzyi5@yFzO)cxre15eSPq^Q>IeubWd3&6F5$f|hfaQvMBq9W`3yr-k zc<}j`5e}yV{}N;z3se)Hw%~g1$2%b0-VB+-LJm>cpZQ_EB$ukSAk^zCK$FIxmP7Eq~pJ=6S?$^TE@e23NBPlc!3HaA%1sdFHmPVmSLF&?&Drg@x4;zR_@@n>E<*46R^ zq&zu7rF7giL_pY%2_be(SGk&2qArx$#WnUb(=Kh2C-5q4(XBBHgnnQQCg_H@ zPeWT?IRc`yAm>(7R;8Opi4h_^(k`4n$q(t;7;uJO4!&99&NOd)RBV<%J@7BjmnIe4&xBFFb%R&F;BVCxO?!20Ohol$PHKs-|mw zN?x}XvlKizEE1C<;(&6~n)l+49se;la0qI>q8_o-^|g;TPi=m0L)r&Q#$YC1U{%rs z(e%3eH^0DxFikwj%3!0Qzu6G+9+i(jV}Vlt;p_j{Y)(P{yAB-M%wTLC^sC?@bk{hC zcz{<5G_ArC&vou8*EvkOJZn9>z`XvlEq|ws4#3wtaP{IGZJM|^S6Y|Qk;M2-T!hrK zZ1vG{zwa$xyz4fMhsQ7Qx2Q58&LBSE)t3-F9RRt{q-g|1TDl}nnVP<)8D)kK%8cX# zUq`?2J=2mm4Bqv9hW*(2LIS&?i|@6MGYpu=_qm166J?zD+vE8AFJBN!)P-eR|GPY5 z(Rr5~p%U&f*P_o%waiG~QDheBZ^|*z*}Ow8g*32;MBeVpkbQ(ceqwklNY)<1FdjIk zMoA5U(y7{vo>}Nm+xYI@8O)4?Tw6ZS;x)rinVp#q`;ylzLmE$s* z`5B`8b0;xh+dCM3eeD7Et!X}6ajLLEz7|Zr`47Zi>+HTh^guW`Kzz9Cqbo-=BQdlw zv2&^qz9Ppa4qYL(V}1U zrK}_24B}@(x`D&*V8`^Dv@z80mI8?fiZw7de57TGcpiZi`e*1VCj2tgULld|sDS%P z_vnnUkAH|1v^ofz9A)g9T+Upzc*;P-ttgDf)>10YOU<(4prCj{Kq-lKg{!e|l;s6= zRD?D?Lu&fNh-~WqFZ-%lYHCvOTP~rN|HkpsmKRcqh(f-|NBI&6><9 zM9YbX^K^q5?u+lN_h_pmUD#VHs?eqfv3S&vH@9YUCh$D&a3x6Tm;NnjpMoyiDUMdR z2tZ_dl`~fE?ZkN_RF%!$T!ty`h2Ht^gX{a<|Fet^U75Cpuou21$?l$8JHE9e1D#Vz zOB6v8*^6IVPwZwbD4l?m&sTjfWpS<12u^Itk7`JxoU9FP)cc1Pb8Y7-^=Q@>h%KeVJkgk&MwtTGI1u{L&NRD3sH79Zs`r@Nmk ztsS|eb(6dc;R$M&c)2do+rJPbkSR?@MiHj0zX5C$f_bv}TD zIq}U*n6luhgPh8D-Q&KhUWjP>P)FyP$PHrr)|{|%B;F?;i%oO!MafO7d_XZ z&g)&KaVqFtDsdftS}SBK`27V{p$7i0+pVp&>vf5c0I0*#%zpZLAI&8v3C@F(qOp zmyywnUM$`H*8#@tBfCWW@8{K;(w2kM3mvj@TZZAuT3CS& z^1u~`TEnm?O&RML~!FQNz$$-_Y8rT502w*TaIpiA6_eSwo*xFiqn&;~5oy zt}Sgr#PZ2)cvP;#N6;`|Vr7imN*!U|k>i>4g zfJ41lW=-x!}k2fAY*= zoR@i8xMP|oczC9B+7JG!buUwk@!XS^p4)%H=h--cWQU7}mxG~?!9t%~&gx*Yo+S2? z+A2k8Q>lzLRNi%D1W*k3c!CYi4S>C+ohK0~^=uE`-c0fHJ!+0`U13~s2F#Fgyg0r_ z=~&%(!-IHgvczq~=`I9Hm1$qb+!QN z2*nA`uiv<~RIPs9QXRG@DVI%OCo5#jD_v&OcJ-%^Wc#-S-|N1gbK>iLNij2nmeRJJ zxhIG8!&)T=}$OiOx#A6=-kGTQB;~%{SmWJ#==1uLIo~a6l ztyUnmIb*e10jt7Y+3nyIILEhN103wc)2XdnOroSVPBh<=JbMD$sVKz4RzxMcYC0|0 zdH&cxP<;tNkAD*oHP6RBns+KjgV|v=;-*LCZNyb-Y)QP&Fdfq9=Jm!2aUvesL+^G- zmn`60Se>!V<$J|PL&|YVw0S^5-!1LRc24Ou-8(PZU&tad7rGP3pbI;jR(3Sy;*WuQcWJ)5gNEtzIsSZs0Pa(H675?`4=-BcyzLksWV!X@8^e zgkH+pw4?L~_7nRoMmcv_**{t&m!h_>YVjX0!Yrmx;4Eh}{#aIjzaB4c%kHN*lA%N; zNc7n`5dg}YFzIZSSwMpiurOSYEgh1~D`LE~kN}Y!D=U=nagCcuA=+tb z>y|!5lF+=%9(DYn841E8hS)WjxPsCo&SWP3`DpQ;5J75mj7Ro{B(1sq#6Ez8l4|Fk zd)Q&e-WAFC2uaUo5=O{Twz21D)*f6$!Vc#l#OAax1pIYlsq;nOlA_mG;VvBPDCxQZ`8Y+W>@5d@vxNEuztGvm)`) z=+dbs>mvPsY6_g-GISi8g4uL=3f9ZQ)F9=7=sVYs^K9O%2BWOGEAf#B^f0w9 zbgX>|A>$DPw<)_e{@GL|1DL-M9AZGa#~_jE{fIU9qqJKr+BjL7!{bjMiY14pO%8XO z1dsNzOY@rN$$kxQDF=yI)WGxxu3(-TX*PapA$_lX_Ti?LSkF1+M8)#rKT*kXCt*16lCq9+hqEIk}x zVKuc{7n8(*bt2%(5!WvU1gZq5Vo;LVuGamlY*>U&maWa4!iiPif|vG-$)v7M#Dd&2 z=-gkH6Yhirthe;{v-8J;wuL`j&JK<~TD0&D4cA#D?eNr{;{?A-^y1i3PmZ_1OJ`vi zOETcZi~gVo^Z4>;<2xrJZW7ZCpi2VXN0E#rizz5H@ht1hkJLzu6@Ar_iVHe{L66OE zusdde)@RFZSMl4g61C~)5_zK+n%Wsfe#@2ifmh^f~-iB_pIK4Yw{aB(@&(yleab)jd&*dYE zbNjx)VljZ^UWFxF*Vb0ZPpQ?W-K$n)elNaUKTO1Vg>)Ltw&^`B{DY=0gKl`Cb#B{_ zl^cvxV1@dC#Qt$BSD0;Zi5<*>=(urvn1xd8vg4?bXP`O0a4rMSX?eFQv$MFVSU@Cw zp1;gQ{1;9;ydlJXxjeZz!<8{_d%+ct?8{MaiOkxt#%SdE9e7MoMfNKRIkr@YM)!kvd(Qkz0rQ#WLCZ)%hMsL>3I>ZW zPk!T5{rQ*P8$52a59eAjHuFAxnP@)t37E-e{Kbj}PV4CfbHS{CpB=^K(8`lv$i4#< zyY=N6k=;s4N&y&-wfsnqBBw{@>w_4;`2nlnLjT5J`fcr+A*_YSLtcHF=9~ZqONn?4 z=&=G`*u#wpN5K-g|AemDdPwAT;!s{6^^#DM7vb;eK(p8e(L^* zW`%^dLr4pRqQj&$k{CIoYshgL0S1x?S21Th0osJGn0wvZoBY>5zYA#`YdNYY-!J~- zLjj?eSnWugCM&Eq>k|T>HJC-k9}fZaHptRU$-v*OCCabws_O~+@3rCevMH+)cuYdv zLk%%&*-EyYN^Y@Rs@7*5@5Z>;S%hZj36d(RH`8w0VIbcp;{@{_-vEu#LBhO*7%pE; z(Xa&inQWt2r>G>Becj4>&LMAab<4E9TE`o|?4kj$xmeKrKR$V~*GLxbOPdV~{$h&z z>md7WeZb9&2B1KiT{5)n@Yg2oFo{ImH+T?Ga*2mntyqZO&t~ogJw;ZJYCjJ*91Il@d0^Hl#S=WtQm} zj~iYDVMphVHxq2$wjN509BcbCFoQeJvSRB3z`EMAA22h@T4~DkF#mk)m2ZN?WSq+UNrG93EfNK)lmZX)s8$bIOhMu#A{o>5?Nhu=yLD;QyXjiD2KT1g*=3j(8 zZvae!9gb-5j<#<~LL&RxFuC;P5R3QbSiTgz(=;rpOfx&s7Q;P}c)GViys|>oCFgRe z!<%baD=%d4`bQu$Ye>j^Tj0AmxLL(|6gt{hw<{++e)n0+?GrV)LEeyY@QkaBNy$Po zeyGHS7xkkr8N5(f*G_TiJ0(IK>7aJe+Pqi()`-j}(}zbM-b5-@ZFl{yrcq7-#>#yz zkYDf1d#3jbO!>d?kwf?K%x$pQtNph=>z9YnUDMTJM>!b(Z?qB)bRaJ3>l2|jtzTwb|v7E`iJbtVMGE1sY3D_*V7TKyGwQ{O* z{Gmqbv6p-($q^iz*G-b>u^4=|v1iZ1BQ;!&5;Z7c`li4{+_fX(io)dgQpwv4^G{sm zw>R+Ow%3``5Fn?g~Tx0bG1vu4;;=W;Q>eLh?e+H%hclU*+$PDh_9 zSb_zyysZz3c4AdOmItQfs-hybisktj2G&f5(DFgP`k?pVWN;y&PWz4@@`ps0vHsA#&3`OWvzUyD zseaGrh5wbqM?f&s2L28^G;oAhckd88N)qjZX8Rjl|B?bp?-2@jBbsVr|1bH+5<`pU=XfMMqWf)81GWhi|TUyl# z!q{eydOh>vokn_jj{1bhm_8F&0J7gKo>}`8Xu0?pto=9zx`neZm!D}?KMo5!fdbQQUJaN5U18zjgoGYX`AdZ z9R^35F-@gpMVjSem&fUmax@}oLO&PT)_i7Jfc;8_osZeoRXweL@pKHR3ui>%3AyO2 zz3@%346a{R?lv=N_)sU~(XJzz-S_8mC;z7?-icl;Ed~mBt$h(D$UE3~Xw@-3HfS0+ zyzIVL+La#{;<&&uW4;+QCXbfLSY^S-^a!xwV>X2d~#vm%f^vtk%Ec}%e>?NG6|w`z4lvW_XvbJAFFTL*d&P> zm)Cv0#Bol+p0?yIW`AtYJj{vSO2_`1!(TYD{||tNE$sGn0ZT6$fIYs~0g>uL(j@wd zIDT}tpFVvW%&!5yF#Pa)i1B!R3oh{&pu-to4AadIk`9tM5$<8V#lm9Ihy`e)bVH2Rm24Vmk#bJ}rHD~x zO~TG12DOm;?GMVgGyPA?G(F2|${#*KJ+x@f&9FF+C*`J7UruSAx;<0)8>S{}J8sWA zKp38>n!RRKxFO5;PXYH1dli_%_C!2v^`_Q!9@(;^EpHTB0C@+5NAh9ClzF9g)(BR$ z+Fo1iJ1XShpL{y12(GDAllL1?;l!C{^slotOITDXfQWm%;c{Lh_5*y2cl~%A()#03 z6rJX{{p?AS*+veS$~!iI)sLc-5bz{z!TD z1g6ue87!39wy*^INh~eQeHf;_uWzI~_+qoXuF~rxP%GMkU&K{iIWl(@)-PGX_d<)_ zCOf#Wr{|h=T;Cje;nO_bgj#h5F!2jDwUgyg+gR6M@k5A=A79v&Nf{F>kApf_!x@6j z+hhN{-ep?>9AeMQZCm#J@htxS{>IITl~D#AT5SZST}rOGM~7#ac9 zAW4VSUerXQ3#z6MpHD)6dWQJids-SX0Hg7Pem#Al&rNuGYSb{NJ2{WZGNrA1g4?lU zZDlw^Nsw9*EvI@yu|3}S-BHF6A?ScO%B?D{j@{Fv*&=lCy4*%Xf#SGN+MSGddN}(j zb@;0RiMt>Kh2B)cPUcjJ3t=0!d~gVAB60QYGBO`r1!{n zW>2@~#`U8Ub~4ZUA`Ua|RZj&aZ92WMU=NwAbG`)X3SFsf{|d<4$vN3f+C{C(OnCIE zrc2=kv~kXx6-yZ_w*?jaKvTV`M68YQFeWS8?*r=-7#BiO3tQmxX?|Zz*v>VI11GlH z{qZb$c#}ckQ|6_4f95;?23cG>#M9tuApWCr?Jj~wJJB#_7rn~0kWp7_epKmo!1ygg#cw{)&6rQaV~Pcb;)$5x@m0wttyb@ zi*=Cvr}+sUD&^3WDadOwZ#c@x)G%~>n}zf*T7}@D=laXqbKPcK;UJL7UktKJzE=a; zDD3g)?yW4uTe*iPfkpT@+{I3wC^#QzE!imF%-6p@kz?k0VYQlwMmP$|GyuHveXQ^acUyC#Y&Cqh0fUPU&~ zGv|nMjk`Zr&eA=~>x$*Wqe=IV%O-SdQSG~gKesfV&z|I*!4I)V{WGQrmAg^xGSV|0 zT-R4@S`PujO%QX-2rNwvedKhTV`Dyy^CRq{`<-S&Q?K zFQEu-&N+CXJz1^m5w z8jJ`R9dp)t*kE?0g*wfp^d!PykZw;s7ri!;Y92MSqpA#xFQ0GP6sxV9J~$IgaBcKe z3s-GZfwaEQ&Vt$z91vi1X-A{5lt|hs3A>sW!Xs_$Ei)^?o}wHVQ@X1Fd)6v27Q%YL zJ}gMV0xLG+pbpp`jkinseO%pg*(ul3Ce)s^h>3#(=J9dvI>`<@So<9U^}%1U>wKz) zs0Giu4}@fSp@H+TXLAeo$o`KAqiTtfrNjk8`W-|7eV2@OZKpqwphtyzWo`xmtF47Z z4h4JQDKwiC1z@(8bsy1f(o<>Q4iOz_eqHU#W!dxsG<}(&si>lSsQE*ZcV#!3hxfzZ zt0OH(W?9$yY^Q@KrLDB@KrK@SV{(g$rWl(*w0Ltmb?zu>yNNn=ER*2e*fEmaJ`DQo zeZLO?9C?E^NBe;*Zgbs5EFO3}v{LrEY`L=Q<%naJqs*z^18#=m=5>s;i`uhJ9@_-(o4MeX z()7`BOdKIGsc4$6NI!m5+w&5D<6bcpB~Pu9hM^VdU!+Q~uq5n^ z0gj`dzBHesZi|P{hofMDcJ{%$X*Gqz3GQ+V%pq_01Fwt$_BM#en`5@>#95@x@J4r{ zyGUPnWh7I}j`0447gL7Q?>7<%A4K%bi2;p$@*bc_p473yD_ezr*ifHuT+cHh>EbZz z+kt%*2`-x~*SX7%&5hjBK}_A;Ey6a|{REDA#ottGR*sl!MW-CIE36I}$0#vo$$gXlcK2>&0EuYGhowG{#3(3J z7rYKmKP*mYI%MP4&M^@jFEa16NJA-UMqn>KG^Rp-h$d_caYaNBEg0d^(eeKpK_LOh<7>U%rporEU`# zKF%cOd$+_g0izX{Qp|oTC`>}7_Ue0TS6UsUn}0BT>zvyn@=D`FT3p5ny9l5>{J#N#`9vswbLpv~QL7jL5& z#jYyg4v;DO!wBZCcBnOpQ)G3f{qr;?Dy@V{2#v@kH_GWk|H)yz%l^7SH6XrQVDdQG z5bNQ4+fPS+F1u51#vmLyA1=wNs1GO=d>8>`8U@Z@{&(;z-bSGe6Eu$mmSmP9;2_C7 zJVCqiX$#sZC(791whDmQyx1l8$4qN=#{UD6q(Y4KanPBAXobNpFa^=3Rjs-km+~4}# zvU~Ng6yOfxvEHe79@fgp_f`BtS^vH( z;m<%=Ai)r8JJ3D@#Jb8-V)5!>(HE4gyWnW(Zd>p|huOf+O+37ZtS91zL3U6Ei+3s{ z(_FL`3Ywh_gtReCjebu|l|q+g!12go&N}H1jiUCE$qxnZ=WVK$?L}o0u&`tgHeUhX zF7@1QccLdlUwzLu`P~=Dpl+fAx~}o9P+OjIQUuCr#)7XXdW2nCE#(osBRE?sY4`5) z|0yC{SAW7>_>-1IrwPuWo+%CXK%>e@qI#C}Il*_mdV1Ko3Es~R2(xhsy^&Ps47Fqq ztl7UnNX)H)bP5tWajF5EQEiqft72?|6u2*ZoSl+>BXe5zd&O0&($_LgGqJ6vEqyMX z3wFI>@+R6x3*^HlMT|^Gk6IXh0ia7O=(D4v94?7+5Na}WmXsWq1cAV^ifprgMRtDu z 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%0AT}!bqDqkG6kf9hb))yUl;gwr95M7&7_^ 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 KT&nC@um1!8eV-}- literal 0 HcmV?d00001 diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md index c93258752..d0a16b829 100644 --- a/docs/how_tos/theming.md +++ b/docs/how_tos/theming.md @@ -1,14 +1,17 @@ # Theming support with Paragon -Status: Draft - This document serves as a guide to using `@edx/frontend-platform` to support MFE theming with Paragon using theme CSS loaded externally (e.g., from a CDN). By serving CSS loaded externally, consuming applications of Paragon no longer need to be responsible for compiling the theme SCSS to CSS themselves and instead use a pre-compiled CSS file. In doing so, this allows making changes to the Paragon theme without needing to necessarily re-build and re-deploy all consuming applications. We would also get a meaningful gain in performance as loading the compiled theme CSS from an external CDN means micro-frontends (MFEs) can include cached styles instead of needing to load essentially duplicate theme styles as users navigate across different MFEs. +## Overview + +![overview of paragon theme loader](./assets/paragon-theme-loader.png "Paragon theme loader") + ## Theme URL configuration Paragon supports 2 mechanisms for configuring the Paragon theme URLs: * Environment variable configuration * Runtime configuration +* Locally installed `@edx/paragon` The Paragon theming extension to dynamically load external theme CSS prefers the theme configuration in the runtime config over the environment variable configuration. @@ -30,11 +33,21 @@ MFE_CONFIG = {} MFE_CONFIG_OVERRIDES = { "profile": { "PARAGON_THEME_URLS": { - 'core': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.15/dist/paragon.css', + 'core': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.28/dist/paragon.css', 'variants': { - 'light': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.15/scss/core/css/variables.css', + 'light': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.28/scss/core/css/variables.css', }, }, }, } ``` + +### Locally installed `@edx/paragon` + +In the event the other Paragon CSS URLs are configured via one of the other documented mechanisms, but they fail to load (e.g., the CDN url throws a 404), `@edx/frontend-platform` will fallback to injecting the locally installed Paragon CSS from the consuming application into the HTML document. + +If you would like to use the same version of the Paragon CSS URLs as the locally installed `@edx/paragon`, the configuration for the Paragon CSS URLs may contain a wildcard `$paragonVersion` which gets replaced with the locally installed version of `@edx/paragon` in the consuming application, e.g.: + +``` +https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css +``` diff --git a/src/react/AppProvider.jsx b/src/react/AppProvider.jsx index cb04aefcc..3d975e2cf 100644 --- a/src/react/AppProvider.jsx +++ b/src/react/AppProvider.jsx @@ -9,7 +9,9 @@ import AppContext from './AppContext'; import { useAppEvent, useParagonTheme, + useTrackColorSchemeChoice, } from './hooks'; +import { paragonThemeActions } from './reducers'; import { getAuthenticatedUser, AUTHENTICATED_USER_CHANGED } from '../auth'; import { getConfig } from '../config'; import { CONFIG_CHANGED } from '../constants'; @@ -72,7 +74,9 @@ export default function AppProvider({ store, children, wrapWithRouter }) { locale, paragonTheme: { state: paragonThemeState, - dispatch: paragonThemeDispatch, + setThemeVariant: (themeVariant) => { + paragonThemeDispatch(paragonThemeActions.setParagonThemeVariant(themeVariant)); + }, }, }), [authenticatedUser, config, locale, paragonThemeState, paragonThemeDispatch]); diff --git a/src/react/hooks.js b/src/react/hooks.js index 1b5ccdc45..87a8a792e 100644 --- a/src/react/hooks.js +++ b/src/react/hooks.js @@ -8,6 +8,8 @@ import { PARAGON_THEME_VARIANT_LIGHT, } from './constants'; import { paragonThemeReducer, paragonThemeActions } from './reducers'; +import { logError, logInfo } from '../logging'; +import { getConfig } from '../config'; /** * A React hook that allows functional components to subscribe to application events. This should @@ -53,12 +55,44 @@ export const useParagonThemeCore = ({ } let coreThemeLink = document.head.querySelector(`link[href='${coreThemeUrl}']`); if (!coreThemeLink) { - coreThemeLink = document.createElement('link'); - coreThemeLink.href = coreThemeUrl; - coreThemeLink.rel = 'stylesheet'; - coreThemeLink.onload = () => { - onLoad(); + const getExistingCoreThemeLinks = () => document.head.querySelectorAll('link[data-paragon-theme-core="true"]'); + const removeExistingLinks = (existingLinks) => { + existingLinks.forEach((link) => { + link.remove(); + }); }; + // find existing links + const existingLinks = getExistingCoreThemeLinks(); + + // create new link + const createCoreThemeLink = (url) => { + coreThemeLink = document.createElement('link'); + coreThemeLink.href = url; + console.log('createCoreThemeLink', url); + coreThemeLink.rel = 'stylesheet'; + coreThemeLink.dataset.paragonThemeCore = true; + coreThemeLink.onload = () => { + onLoad(); + removeExistingLinks(existingLinks); + }; + coreThemeLink.onerror = () => { + logError(`Failed to load core theme CSS from ${url}`); + if (PARAGON?.themeUrls?.core?.outputChunkName) { + const coreOutputChunkCss = `${PARAGON.themeUrls.core.outputChunkName}.css`; + const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${coreOutputChunkCss}`; + logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); + coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl); + const otherExistingLinks = getExistingCoreThemeLinks(); + removeExistingLinks(otherExistingLinks); + document.head.insertAdjacentElement( + 'afterbegin', + coreThemeLink, + ); + } + }; + return coreThemeLink; + }; + coreThemeLink = createCoreThemeLink(coreThemeUrl); document.head.insertAdjacentElement( 'afterbegin', coreThemeLink, @@ -115,12 +149,42 @@ const useParagonThemeVariants = ({ let themeVariantLink = document.head.querySelector(`link[href='${themeVariantUrl}']`); const stylesheetRelForVariant = generateStylesheetRelAttr(themeVariant); if (!themeVariantLink) { - themeVariantLink = document.createElement('link'); - themeVariantLink.href = themeVariantUrl; - themeVariantLink.rel = stylesheetRelForVariant; - themeVariantLink.onload = () => { - setThemeVariantLoaded(themeVariant); + const getExistingThemeVariantLinks = () => document.head.querySelectorAll(`link[data-paragon-theme-variant='${themeVariant}']`); + // find existing links + const existingLinks = getExistingThemeVariantLinks(); + + // create new link + const createThemeVariantLink = (url) => { + themeVariantLink = document.createElement('link'); + themeVariantLink.href = url; + themeVariantLink.rel = 'stylesheet'; + themeVariantLink.dataset.paragonThemeVariant = themeVariant; + themeVariantLink.onload = () => { + setThemeVariantLoaded(themeVariant); + existingLinks.forEach((link) => { + link.remove(); + }); + }; + themeVariantLink.onerror = () => { + logError(`Failed to load theme variant (${themeVariant}) CSS from ${themeVariantUrl}`); + if (PARAGON?.themeUrls?.variants?.[themeVariant]?.outputChunkName) { + const themeVariantOutputChunkCss = `${PARAGON?.themeUrls?.variants?.[themeVariant]?.outputChunkName}.css`; + const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${themeVariantOutputChunkCss}`; + logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); + themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl); + const otherExistingLinks = getExistingThemeVariantLinks(); + otherExistingLinks.forEach((link) => { + link.remove(); + }); + document.head.insertAdjacentElement( + 'afterbegin', + themeVariantLink, + ); + } + }; + return themeVariantLink; }; + themeVariantLink = createThemeVariantLink(themeVariantUrl); document.head.insertAdjacentElement( 'afterbegin', themeVariantLink, @@ -132,21 +196,27 @@ const useParagonThemeVariants = ({ }, [themeVariantUrls, currentThemeVariant, onLoadThemeVariantLight]); }; +const handleParagonVersionSubstitution = (url) => { + if (!url || !url.includes('$paragonVersion') || !PARAGON?.version) { + return url; + } + return url.replace('$paragonVersion', PARAGON.version); +}; + /** * TODO * @param {*} config - * @returns + * @returns An object containing the URLs for the theme's core CSS and any theme variants. */ const getParagonThemeUrls = (config) => { - if (config.PARAGON_THEME_URLS) { - return config.PARAGON_THEME_URLS; - } + const coreCssUrl = config.PARAGON_THEME_URLS?.[PARAGON_THEME_CORE] ?? config.PARAGON_THEME_CORE_URL; + const lightThemeVariantCssUrl = ( + config.PARAGON_THEME_URLS?.variants?.[PARAGON_THEME_VARIANT_LIGHT] ?? config.PARAGON_THEME_VARIANTS_LIGHT_URL + ); return { - [PARAGON_THEME_CORE]: config.PARAGON_THEME_CORE_URL, - // [PARAGON_THEME_CORE]: undefined, + [PARAGON_THEME_CORE]: handleParagonVersionSubstitution(coreCssUrl), variants: { - [PARAGON_THEME_VARIANT_LIGHT]: config.PARAGON_THEME_VARIANTS_LIGHT_URL, - // [PARAGON_THEME_VARIANT_LIGHT]: undefined, + [PARAGON_THEME_VARIANT_LIGHT]: handleParagonVersionSubstitution(lightThemeVariantCssUrl), }, }; }; From a2c61ebc2ef3c4143a2506dd7adc33de25b36629 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Mon, 29 May 2023 15:16:38 -0400 Subject: [PATCH 03/26] docs: update docs fix: rebase with master and update based on PARAGON changes chore: remove support for env vars config for paragon dynamic theming --- .env.development | 2 -- .env.test | 2 -- docs/how_tos/theming.md | 55 +++++++++++++++++++++++++++++------------ src/config.js | 5 +--- src/react/hooks.js | 23 +++++++++++------ src/setupTest.js | 2 -- 6 files changed, 56 insertions(+), 33 deletions(-) diff --git a/.env.development b/.env.development index 10335a0b9..2d8b6b251 100644 --- a/.env.development +++ b/.env.development @@ -28,5 +28,3 @@ IGNORED_ERROR_REGEX= MFE_CONFIG_API_URL= APP_ID= SUPPORT_URL=https://support.edx.org -PARAGON_THEME_CORE_URL= -PARAGON_THEME_VARIANTS_LIGHT_URL= diff --git a/.env.test b/.env.test index 9936a4376..f25231a3b 100644 --- a/.env.test +++ b/.env.test @@ -28,5 +28,3 @@ IGNORED_ERROR_REGEX= MFE_CONFIG_API_URL= APP_ID= SUPPORT_URL=https://support.edx.org -PARAGON_THEME_CORE_URL= -PARAGON_THEME_VARIANTS_LIGHT_URL= diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md index d0a16b829..46182ea9c 100644 --- a/docs/how_tos/theming.md +++ b/docs/how_tos/theming.md @@ -9,33 +9,55 @@ This document serves as a guide to using `@edx/frontend-platform` to support MFE ## Theme URL configuration Paragon supports 2 mechanisms for configuring the Paragon theme URLs: -* Environment variable configuration -* Runtime configuration -* Locally installed `@edx/paragon` +* JavaScript-based configuration via `env.config.js`. +* MFE runtime configuration API via `edx-platform` -The Paragon theming extension to dynamically load external theme CSS prefers the theme configuration in the runtime config over the environment variable configuration. +Using either configuration mechanism, a `PARAGON_THEME_URLS` configuration setting must be created to point to the externally hosted Paragon theme CSS files, e.g.: -### Environment variable configuration +```js +const config = { + PARAGON_THEME_URLS = { + core: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css', + variants: { + light: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.css', + }, + }, +}; +export default config; +``` -The standard way to configure MFEs is to use environment variables specific to the application environment they are running in. For example, during local development, environment variables are defined and loaded via the `.env.development` file. +### JavaScript-based configuration -Two new environment variables are exposed to configure the Paragon theme URLs: -* `PARAGON_THEME_CORE_URL`. This URL represents the foundational theme styles provided by Paragon's `core.css` file. -* `PARAGON_THEME_VARIANTS_LIGHT_URL`. This URL represents the light theme variant specific styles provided by Paragon's `light.css` file. +Another approach to configuration with `@edx/frontend-platform` is to create a `env.config.js` file in the root of the repository, similar to the environment variable configuration mentioned above. However, in this case, the configuration is defined as a JavaScript file, which affords consumers to use more complex data types than just strings as in the environment variable approach. -### Runtime configuration +To use this JavaScript-based configuration approach, you may set a `PARAGON_THEME_URLS` configuration variable in your `env.config.js` file: + +```js +const config = { + PARAGON_THEME_URLS: { + core: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/paragon.css', + variants: { + light: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/scss/core/css/variables.css', + }, + }, +}; +export default config; +``` + + +### MFE runtime configuration API `@edx/frontend-platform` additionally supports loading application configuration from an API at runtime rather than environment variables. For example, in `edx-platform`, there is an API endpoint for MFE runtime configuration at `http://localhost:18000/api/mfe_config/v1`. The application configuration may be setup via Django settings as follows: -``` +```python ENABLE_MFE_CONFIG_API = True MFE_CONFIG = {} MFE_CONFIG_OVERRIDES = { - "profile": { - "PARAGON_THEME_URLS": { - 'core': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.28/dist/paragon.css', + 'profile': { + 'PARAGON_THEME_URLS': { + 'core': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css', 'variants': { - 'light': 'https://cdn.jsdelivr.net/npm/@edx/paragon@21.0.0-alpha.28/scss/core/css/variables.css', + 'light': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.css', }, }, }, @@ -48,6 +70,7 @@ In the event the other Paragon CSS URLs are configured via one of the other docu If you would like to use the same version of the Paragon CSS URLs as the locally installed `@edx/paragon`, the configuration for the Paragon CSS URLs may contain a wildcard `$paragonVersion` which gets replaced with the locally installed version of `@edx/paragon` in the consuming application, e.g.: -``` +```shell https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css +https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/scss/core/css/variables.css ``` diff --git a/src/config.js b/src/config.js index 03490bd67..2e345c8eb 100644 --- a/src/config.js +++ b/src/config.js @@ -171,8 +171,6 @@ let config = { MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL, APP_ID: process.env.APP_ID, SUPPORT_URL: process.env.SUPPORT_URL, - PARAGON_THEME_CORE_URL: process.env.PARAGON_THEME_CORE_URL, - PARAGON_THEME_VARIANTS_LIGHT_URL: process.env.PARAGON_THEME_VARIANTS_LIGHT_URL, }; /** @@ -326,6 +324,5 @@ export function ensureConfig(keys, requester = 'unspecified application code') { * @property {string} MFE_CONFIG_API_URL * @property {string} APP_ID * @property {string} SUPPORT_URL - * @property {string} PARAGON_THEME_CORE_URL - * @property {string} PARAGON_THEME_VARIANTS_LIGHT_URL + * @property {string} PARAGON_THEME_URLS */ diff --git a/src/react/hooks.js b/src/react/hooks.js index 87a8a792e..710ae6119 100644 --- a/src/react/hooks.js +++ b/src/react/hooks.js @@ -68,7 +68,6 @@ export const useParagonThemeCore = ({ const createCoreThemeLink = (url) => { coreThemeLink = document.createElement('link'); coreThemeLink.href = url; - console.log('createCoreThemeLink', url); coreThemeLink.rel = 'stylesheet'; coreThemeLink.dataset.paragonThemeCore = true; coreThemeLink.onload = () => { @@ -77,9 +76,8 @@ export const useParagonThemeCore = ({ }; coreThemeLink.onerror = () => { logError(`Failed to load core theme CSS from ${url}`); - if (PARAGON?.themeUrls?.core?.outputChunkName) { - const coreOutputChunkCss = `${PARAGON.themeUrls.core.outputChunkName}.css`; - const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${coreOutputChunkCss}`; + if (PARAGON?.themeUrls?.core) { + const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.core}`; logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl); const otherExistingLinks = getExistingCoreThemeLinks(); @@ -167,9 +165,8 @@ const useParagonThemeVariants = ({ }; themeVariantLink.onerror = () => { logError(`Failed to load theme variant (${themeVariant}) CSS from ${themeVariantUrl}`); - if (PARAGON?.themeUrls?.variants?.[themeVariant]?.outputChunkName) { - const themeVariantOutputChunkCss = `${PARAGON?.themeUrls?.variants?.[themeVariant]?.outputChunkName}.css`; - const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${themeVariantOutputChunkCss}`; + if (PARAGON?.themeUrls?.variants?.[themeVariant]) { + const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.variants[themeVariant]}`; logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl); const otherExistingLinks = getExistingThemeVariantLinks(); @@ -213,6 +210,18 @@ const getParagonThemeUrls = (config) => { const lightThemeVariantCssUrl = ( config.PARAGON_THEME_URLS?.variants?.[PARAGON_THEME_VARIANT_LIGHT] ?? config.PARAGON_THEME_VARIANTS_LIGHT_URL ); + + const hasMissingCssUrls = !coreCssUrl || !lightThemeVariantCssUrl; + if (hasMissingCssUrls && !!PARAGON) { + const prependBaseUrl = (url) => `${config.BASE_URL}/${url}`; + return { + [PARAGON_THEME_CORE]: prependBaseUrl(PARAGON.themeUrls.core), + variants: { + [PARAGON_THEME_VARIANT_LIGHT]: prependBaseUrl(PARAGON.themeUrls.variants.light), + }, + }; + } + return { [PARAGON_THEME_CORE]: handleParagonVersionSubstitution(coreCssUrl), variants: { diff --git a/src/setupTest.js b/src/setupTest.js index 5a65698cf..f2513825c 100644 --- a/src/setupTest.js +++ b/src/setupTest.js @@ -31,8 +31,6 @@ process.env.FAVICON_URL = 'https://edx-cdn.org/v3/default/favicon.ico'; process.env.MFE_CONFIG_API_URL = ''; process.env.APP_ID = ''; process.env.SUPPORT_URL = 'https://support.edx.org'; -process.env.PARAGON_THEME_CORE_URL = ''; -process.env.PARAGON_THEME_VARIANTS_LIGHT_URL = ''; /* Auth test variables From adc080f408843358a0cab41a7f77379ee3900f8a Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Thu, 1 Jun 2023 07:23:55 -0400 Subject: [PATCH 04/26] chore: clean up package-lock fix: updates fix: one more update fix: refresh package-lock.json fix: refresh package-lock.json pt2 fix: updates fix: update package-lock.json fix: make it theme variant agnostic docs: update howto theming guide fix: ensure app loads without styles if the PARAGON_THEME_URLS and fallback urls all fail to load fix: ensure fallback theme links are removed if they also error docs: add link to mfe runtime config api adr fix: don't attempt to load paragon css urls if PARAGON_THEME_URLS is absent --- docs/how_tos/theming.md | 26 ++-- src/react/constants.js | 3 - src/react/hooks.js | 281 +++++++++++++++++++++++++++++----------- src/react/index.js | 1 - 4 files changed, 217 insertions(+), 94 deletions(-) diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md index 46182ea9c..dec7eb771 100644 --- a/docs/how_tos/theming.md +++ b/docs/how_tos/theming.md @@ -14,23 +14,20 @@ Paragon supports 2 mechanisms for configuring the Paragon theme URLs: Using either configuration mechanism, a `PARAGON_THEME_URLS` configuration setting must be created to point to the externally hosted Paragon theme CSS files, e.g.: -```js -const config = { - PARAGON_THEME_URLS = { - core: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css', - variants: { - light: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.css', - }, - }, -}; -export default config; +```json +{ + "core": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css", + "variants": { + "light": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.css" + } +} ``` ### JavaScript-based configuration -Another approach to configuration with `@edx/frontend-platform` is to create a `env.config.js` file in the root of the repository, similar to the environment variable configuration mentioned above. However, in this case, the configuration is defined as a JavaScript file, which affords consumers to use more complex data types than just strings as in the environment variable approach. +One approach to configuring the `PARAGON_THEME_URLS` is to create a `env.config.js` file in the root of the repository. The configuration is defined as a JavaScript file, which affords consumers to use more complex data types, amongst other benefits. -To use this JavaScript-based configuration approach, you may set a `PARAGON_THEME_URLS` configuration variable in your `env.config.js` file: +To use this JavaScript-based configuration approach, you may set a `PARAGON_THEME_URLS` configuration variable in a `env.config.js` file: ```js const config = { @@ -47,12 +44,15 @@ export default config; ### MFE runtime configuration API -`@edx/frontend-platform` additionally supports loading application configuration from an API at runtime rather than environment variables. For example, in `edx-platform`, there is an API endpoint for MFE runtime configuration at `http://localhost:18000/api/mfe_config/v1`. The application configuration may be setup via Django settings as follows: +`@edx/frontend-platform` additionally supports loading application configuration from the MFE runtime configuration API via `edx-platform`. The configuration is served by the `http://localhost:18000/api/mfe_config/v1` API endpoint. For more information, refer to [this documentation](https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst) about the MFE runtime configuration API, please see these docs. + +The application configuration may be setup via Django settings as follows: ```python ENABLE_MFE_CONFIG_API = True MFE_CONFIG = {} MFE_CONFIG_OVERRIDES = { + # `APP_ID` defined in your MFE 'profile': { 'PARAGON_THEME_URLS': { 'core': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css', diff --git a/src/react/constants.js b/src/react/constants.js index 33f2b27af..08de95fc0 100644 --- a/src/react/constants.js +++ b/src/react/constants.js @@ -1,5 +1,2 @@ -export const PARAGON_THEME_CORE = 'core'; -export const PARAGON_THEME_VARIANT_LIGHT = 'light'; - export const SET_THEME_VARIANT = 'SET_THEME_VARIANT'; export const SET_IS_THEME_LOADED = 'SET_IS_THEME_LOADED'; diff --git a/src/react/hooks.js b/src/react/hooks.js index 710ae6119..0302f3e5f 100644 --- a/src/react/hooks.js +++ b/src/react/hooks.js @@ -1,12 +1,8 @@ import { - useCallback, useEffect, useState, useReducer, + useCallback, useEffect, useState, useReducer, useMemo, } from 'react'; import { subscribe, unsubscribe } from '../pubSub'; import { sendTrackEvent } from '../analytics'; -import { - PARAGON_THEME_CORE, - PARAGON_THEME_VARIANT_LIGHT, -} from './constants'; import { paragonThemeReducer, paragonThemeActions } from './reducers'; import { logError, logInfo } from '../logging'; import { getConfig } from '../config'; @@ -31,9 +27,30 @@ export const useAppEvent = (type, callback) => { }, [callback, type]); }; -const initialParagonThemeState = { - isThemeLoaded: false, - themeVariant: PARAGON_THEME_VARIANT_LIGHT, +/** + * A React hook that tracks user's preferred color scheme (light or dark) and sends respective + * event to the tracking service. + * + * @memberof module:React + */ +export const useTrackColorSchemeChoice = () => { + useEffect(() => { + const trackColorSchemeChoice = ({ matches }) => { + const preferredColorScheme = matches ? 'dark' : 'light'; + sendTrackEvent('openedx.ui.frontend-platform.prefers-color-scheme.selected', { preferredColorScheme }); + }; + const colorSchemeQuery = window.matchMedia?.('(prefers-color-scheme: dark)'); + if (colorSchemeQuery) { + // send user's initial choice + trackColorSchemeChoice(colorSchemeQuery); + colorSchemeQuery.addEventListener('change', trackColorSchemeChoice); + } + return () => { + if (colorSchemeQuery) { + colorSchemeQuery.removeEventListener('change', trackColorSchemeChoice); + } + }; + }, []); }; /** @@ -41,19 +58,19 @@ const initialParagonThemeState = { * * @memberof module:React * @param {object} args - * @param {string} args.coreThemeUrl The url of the core theme CSS. + * @param {object} args.themeCore Object representing the core Paragon theme CSS. * @param {string} args.onLoad A callback function called when the core theme CSS is loaded. */ export const useParagonThemeCore = ({ - coreThemeUrl, + themeCore, onLoad, }) => { useEffect(() => { // If there is no config for the core theme url, do nothing. - if (!coreThemeUrl) { + if (!themeCore?.url) { return; } - let coreThemeLink = document.head.querySelector(`link[href='${coreThemeUrl}']`); + let coreThemeLink = document.head.querySelector(`link[href='${themeCore.url}']`); if (!coreThemeLink) { const getExistingCoreThemeLinks = () => document.head.querySelectorAll('link[data-paragon-theme-core="true"]'); const removeExistingLinks = (existingLinks) => { @@ -65,7 +82,7 @@ export const useParagonThemeCore = ({ const existingLinks = getExistingCoreThemeLinks(); // create new link - const createCoreThemeLink = (url) => { + const createCoreThemeLink = (url, { isFallbackThemeUrl = false } = {}) => { coreThemeLink = document.createElement('link'); coreThemeLink.href = url; coreThemeLink.rel = 'stylesheet'; @@ -76,10 +93,17 @@ export const useParagonThemeCore = ({ }; coreThemeLink.onerror = () => { logError(`Failed to load core theme CSS from ${url}`); + if (isFallbackThemeUrl) { + logError('Could not load core theme CSS from fallback URL. Aborting.'); + onLoad(); + const otherExistingLinks = getExistingCoreThemeLinks(); + removeExistingLinks(otherExistingLinks); + return; + } if (PARAGON?.themeUrls?.core) { - const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.core}`; + const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.core.fileName}`; logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); - coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl); + coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true }); const otherExistingLinks = getExistingCoreThemeLinks(); removeExistingLinks(otherExistingLinks); document.head.insertAdjacentElement( @@ -90,13 +114,14 @@ export const useParagonThemeCore = ({ }; return coreThemeLink; }; - coreThemeLink = createCoreThemeLink(coreThemeUrl); + console.log('createCoreThemeLink', themeCore); + coreThemeLink = createCoreThemeLink(themeCore.url); document.head.insertAdjacentElement( 'afterbegin', coreThemeLink, ); } - }, [coreThemeUrl, onLoad]); + }, [themeCore?.url, onLoad]); }; /** @@ -106,19 +131,39 @@ export const useParagonThemeCore = ({ * variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new * theme variant will already be loaded. * - * Note: only "light" theme variant is currently supported. - * * @memberof module:React * @param {object} args - * @param {object} args.themeVariantUrls An object representing the URLs for each supported theme variant, e.g.: `{ light: 'https://path/to/light.css' }`. - * @param {string} args.onLoad A callback function called when the core theme CSS is loaded. + * @param {object} args.themeVariant An object containing the URLs for each supported theme variant, e.g.: `{ light: { url: 'https://path/to/light.css' } }`. + * @param {string} args.currentThemeVariant The currently applied theme variant, e.g.: `light`. + * @param {string} args.onLoad A callback function called when the theme variant(s) CSS is loaded. */ const useParagonThemeVariants = ({ - themeVariantUrls, + themeVariants, currentThemeVariant, - onLoadThemeVariantLight, + onLoad, }) => { + const [hasThemeVariantLoadedByName, setHasThemeVariantLoadedByName] = useState({}); + useEffect(() => { + Object.keys(themeVariants || {}).forEach((themeVariant) => { + setHasThemeVariantLoadedByName((prevState) => ({ + ...prevState, + [themeVariant]: false, + })); + }); + }, [themeVariants]); + + useEffect(() => { + if (Object.values(hasThemeVariantLoadedByName).some((hasLoaded) => hasLoaded)) { + onLoad(); + } + }, [hasThemeVariantLoadedByName, onLoad]); + + useEffect(() => { + if (!themeVariants) { + return; + } + /** * Determines the value for the `rel` attribute for a given theme variant based * on if its the currently applied variant. @@ -130,21 +175,27 @@ const useParagonThemeVariants = ({ * based on the current theme variant. */ const setThemeVariantLoaded = (themeVariant) => { - if (themeVariant === PARAGON_THEME_VARIANT_LIGHT) { - onLoadThemeVariantLight(); - } + setHasThemeVariantLoadedByName((prevState) => { + if (themeVariant in prevState) { + return { + ...prevState, + [themeVariant]: true, + }; + } + return prevState; + }); }; /** - * Iterate over each theme variant URL and inject it into the HTML document if it doesn't already exist. + * Iterate over each theme variant URL and inject it into the HTML document, if it doesn't already exist. */ - Object.entries(themeVariantUrls).forEach(([themeVariant, themeVariantUrl]) => { + Object.entries(themeVariants).forEach(([themeVariant, value]) => { // If there is no config for the theme variant URL, set the theme variant to loaded and continue. - if (!themeVariantUrl) { + if (!value.url) { setThemeVariantLoaded(themeVariant); return; } - let themeVariantLink = document.head.querySelector(`link[href='${themeVariantUrl}']`); + let themeVariantLink = document.head.querySelector(`link[href='${value.url}']`); const stylesheetRelForVariant = generateStylesheetRelAttr(themeVariant); if (!themeVariantLink) { const getExistingThemeVariantLinks = () => document.head.querySelectorAll(`link[data-paragon-theme-variant='${themeVariant}']`); @@ -152,7 +203,7 @@ const useParagonThemeVariants = ({ const existingLinks = getExistingThemeVariantLinks(); // create new link - const createThemeVariantLink = (url) => { + const createThemeVariantLink = (url, { isFallbackThemeUrl = false } = {}) => { themeVariantLink = document.createElement('link'); themeVariantLink.href = url; themeVariantLink.rel = 'stylesheet'; @@ -164,11 +215,20 @@ const useParagonThemeVariants = ({ }); }; themeVariantLink.onerror = () => { - logError(`Failed to load theme variant (${themeVariant}) CSS from ${themeVariantUrl}`); + logError(`Failed to load theme variant (${themeVariant}) CSS from ${value.url}`); + if (isFallbackThemeUrl) { + logError('Could not load theme theme variant CSS from fallback URL. Aborting.'); + setThemeVariantLoaded(themeVariant); + const otherExistingLinks = getExistingThemeVariantLinks(); + otherExistingLinks.forEach((link) => { + link.remove(); + }); + return; + } if (PARAGON?.themeUrls?.variants?.[themeVariant]) { - const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.variants[themeVariant]}`; + const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.variants[themeVariant].fileName}`; logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); - themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl); + themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl, { isFallbackThemeUrl: true }); const otherExistingLinks = getExistingThemeVariantLinks(); otherExistingLinks.forEach((link) => { link.remove(); @@ -181,7 +241,7 @@ const useParagonThemeVariants = ({ }; return themeVariantLink; }; - themeVariantLink = createThemeVariantLink(themeVariantUrl); + themeVariantLink = createThemeVariantLink(value.url); document.head.insertAdjacentElement( 'afterbegin', themeVariantLink, @@ -190,7 +250,7 @@ const useParagonThemeVariants = ({ themeVariantLink.rel = stylesheetRelForVariant; } }); - }, [themeVariantUrls, currentThemeVariant, onLoadThemeVariantLight]); + }, [themeVariants, currentThemeVariant, onLoad]); }; const handleParagonVersionSubstitution = (url) => { @@ -201,32 +261,103 @@ const handleParagonVersionSubstitution = (url) => { }; /** - * TODO + * @typedef {Object} ParagonThemeCore + * @property {string} url + */ + +/** + * @typedef {Object} ParagonThemeVariant + * @property {string} url + * @property {boolean} default + * @property {boolean} dark + */ + +/** + * @typedef {Object} ParagonThemeUrls + * @property {ParagonThemeCore} core + * @property {Object.} variants + */ + +/** + * Returns an object containing the URLs for the theme's core CSS and any theme variants. + * * @param {*} config - * @returns An object containing the URLs for the theme's core CSS and any theme variants. + * @returns {ParagonThemeUrls|undefined} An object containing the URLs for the theme's core CSS and any theme variants. */ -const getParagonThemeUrls = (config) => { - const coreCssUrl = config.PARAGON_THEME_URLS?.[PARAGON_THEME_CORE] ?? config.PARAGON_THEME_CORE_URL; - const lightThemeVariantCssUrl = ( - config.PARAGON_THEME_URLS?.variants?.[PARAGON_THEME_VARIANT_LIGHT] ?? config.PARAGON_THEME_VARIANTS_LIGHT_URL - ); - - const hasMissingCssUrls = !coreCssUrl || !lightThemeVariantCssUrl; - if (hasMissingCssUrls && !!PARAGON) { +const useParagonThemeUrls = (config) => useMemo(() => { + if (!config.PARAGON_THEME_URLS) { + return undefined; + } + const paragonThemeUrls = config.PARAGON_THEME_URLS; + const coreCssUrl = handleParagonVersionSubstitution(paragonThemeUrls.core); + + const themeVariantsCss = {}; + Object.entries(paragonThemeUrls.variants || {}).forEach(([themeVariant, { url, ...rest }]) => { + themeVariantsCss[themeVariant] = { + url: handleParagonVersionSubstitution(url), + ...rest, + }; + }); + + const hasMissingCssUrls = !coreCssUrl || Object.keys(themeVariantsCss).length === 0; + if (hasMissingCssUrls) { + if (!PARAGON) { + return undefined; + } + const themeVariants = {}; const prependBaseUrl = (url) => `${config.BASE_URL}/${url}`; + Object.entries(PARAGON.themeUrls.variants).forEach(([themeVariant, { fileName, ...rest }]) => { + themeVariants[themeVariant] = { + url: prependBaseUrl(fileName), + ...rest, + }; + }); return { - [PARAGON_THEME_CORE]: prependBaseUrl(PARAGON.themeUrls.core), - variants: { - [PARAGON_THEME_VARIANT_LIGHT]: prependBaseUrl(PARAGON.themeUrls.variants.light), + core: { + url: prependBaseUrl(PARAGON.themeUrls.core), }, + variants: themeVariants, }; } return { - [PARAGON_THEME_CORE]: handleParagonVersionSubstitution(coreCssUrl), - variants: { - [PARAGON_THEME_VARIANT_LIGHT]: handleParagonVersionSubstitution(lightThemeVariantCssUrl), + core: { + url: handleParagonVersionSubstitution(coreCssUrl), }, + variants: themeVariantsCss, + }; +}, [config.BASE_URL, config.PARAGON_THEME_URLS]); + +/** + * Finds the default theme variant from the given theme variants object. If no default theme exists, the first theme + * variant is returned as a fallback. + * @param {Object.|undefined} themeVariants + * + * @returns {ParagonThemeVariant|undefined} The default theme variant. + */ +const getDefaultThemeVariant = (themeVariants) => { + if (!themeVariants) { + return undefined; + } + const themeVariantKeys = Object.keys(themeVariants); + if (themeVariantKeys.length === 0) { + return undefined; + } + if (themeVariantKeys.length === 1) { + return { + name: themeVariantKeys[0], + metadata: themeVariants[themeVariantKeys[0]], + }; + } + const foundDefaultThemeVariant = Object.entries(themeVariants) + .find(([, { default: isDefault }]) => isDefault === true); + + if (!foundDefaultThemeVariant) { + return undefined; + } + return { + name: foundDefaultThemeVariant[0], + metadata: foundDefaultThemeVariant[1], }; }; @@ -238,47 +369,44 @@ const getParagonThemeUrls = (config) => { * current theme variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new theme * variant will already be loaded. * - * Note: only "light" theme variant is currently supported, though the intent is also support "dark" theme - * variant in the future. - * * @memberof module:React - * @param {object} args - * @param {object} args.themeUrls Should contain the URLs for the theme's core CSS and any theme - * variants, e.g. `{ core: 'https://path/to/core.css', variants: { light: 'https://path/to/light.css' } }`. + * @param {object} config An object containing the URLs for the theme's core CSS and any theme (i.e., `getConfig()`) * * @returns An array containing 2 elements: 1) an object containing the app * theme state, and 2) a dispatch function to mutate the app theme state. */ export const useParagonTheme = (config) => { - const paragonThemeUrls = getParagonThemeUrls(config); + const paragonThemeUrls = useParagonThemeUrls(config); const { - core: coreThemeUrl, - variants: themeVariantUrls, - } = paragonThemeUrls; - + core: themeCore, + variants: themeVariants, + } = paragonThemeUrls || {}; + const initialParagonThemeState = { + isThemeLoaded: false, + themeVariant: getDefaultThemeVariant(themeVariants)?.name, + }; const [themeState, dispatch] = useReducer(paragonThemeReducer, initialParagonThemeState); const [isCoreThemeLoaded, setIsCoreThemeLoaded] = useState(false); - const [isLightThemeVariantLoaded, setIsLightThemeVariantLoaded] = useState(false); - const onLoadThemeCore = useCallback(() => { setIsCoreThemeLoaded(true); }, []); - const onLoadThemeVariantLight = useCallback(() => { - setIsLightThemeVariantLoaded(true); + const [hasLoadedThemeVariants, setHasLoadedThemeVariants] = useState(false); + const onLoadThemeVariants = useCallback(() => { + setHasLoadedThemeVariants(true); }, []); // load the core theme CSS useParagonThemeCore({ - coreThemeUrl, + themeCore, onLoad: onLoadThemeCore, }); // load the theme variant(s) CSS useParagonThemeVariants({ - themeVariantUrls, - onLoadThemeVariantLight, + themeVariants, + onLoad: onLoadThemeVariants, currentThemeVariant: themeState.themeVariant, }); @@ -288,14 +416,13 @@ export const useParagonTheme = (config) => { return; } - // the core theme and light theme variant is still loading, do nothing. - const hasDefaultThemeConfig = (coreThemeUrl && themeVariantUrls[PARAGON_THEME_VARIANT_LIGHT]); - if (!hasDefaultThemeConfig) { + const hasThemeConfig = (themeCore?.url && Object.keys(themeVariants).length > 0); + if (!hasThemeConfig) { // no theme URLs to load, set loading to false. dispatch(paragonThemeActions.setParagonThemeLoaded(true)); } - const isDefaultThemeLoaded = (isCoreThemeLoaded && isLightThemeVariantLoaded); + const isDefaultThemeLoaded = (isCoreThemeLoaded && hasLoadedThemeVariants); if (!isDefaultThemeLoaded) { return; } @@ -305,9 +432,9 @@ export const useParagonTheme = (config) => { }, [ themeState.isThemeLoaded, isCoreThemeLoaded, - isLightThemeVariantLoaded, - themeVariantUrls, - coreThemeUrl, + hasLoadedThemeVariants, + themeCore?.url, + themeVariants, ]); return [themeState, dispatch]; diff --git a/src/react/index.js b/src/react/index.js index 173967a18..aa7493594 100644 --- a/src/react/index.js +++ b/src/react/index.js @@ -15,4 +15,3 @@ export { default as LoginRedirect } from './LoginRedirect'; export { default as PageWrap } from './PageWrap'; export { useAppEvent, useParagonTheme } from './hooks'; export { paragonThemeActions } from './reducers'; -export { PARAGON_THEME_VARIANT_LIGHT } from './constants'; From efc759d1bce59681d7476112dc48095724bb8d76 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Mon, 5 Jun 2023 01:21:25 -0400 Subject: [PATCH 05/26] fix: brand overrides docs: fix code example docs: add missing comma docs: update how to --- docs/how_tos/theming.md | 92 ++++++++-- src/react/hooks.js | 360 ++++++++++++++++++++++++++-------------- 2 files changed, 314 insertions(+), 138 deletions(-) diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md index dec7eb771..52646a7d6 100644 --- a/docs/how_tos/theming.md +++ b/docs/how_tos/theming.md @@ -6,9 +6,9 @@ This document serves as a guide to using `@edx/frontend-platform` to support MFE ![overview of paragon theme loader](./assets/paragon-theme-loader.png "Paragon theme loader") -## Theme URL configuration +## Basic theme URL configuration -Paragon supports 2 mechanisms for configuring the Paragon theme URLs: +Paragon supports 2 mechanisms for configuring the Paragon theme urls: * JavaScript-based configuration via `env.config.js`. * MFE runtime configuration API via `edx-platform` @@ -16,9 +16,15 @@ Using either configuration mechanism, a `PARAGON_THEME_URLS` configuration setti ```json { - "core": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css", + "core": { + "url": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css" + }, "variants": { - "light": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.css" + "light": { + "url": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css", + "default": true, + "dark": false, + } } } ``` @@ -32,16 +38,22 @@ To use this JavaScript-based configuration approach, you may set a `PARAGON_THEM ```js const config = { PARAGON_THEME_URLS: { - core: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/paragon.css', + core: { + url: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', + }, variants: { - light: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/scss/core/css/variables.css', + light: { + url: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', + default: true, + dark: false, + }, }, }, }; + export default config; ``` - ### MFE runtime configuration API `@edx/frontend-platform` additionally supports loading application configuration from the MFE runtime configuration API via `edx-platform`. The configuration is served by the `http://localhost:18000/api/mfe_config/v1` API endpoint. For more information, refer to [this documentation](https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst) about the MFE runtime configuration API, please see these docs. @@ -52,12 +64,18 @@ The application configuration may be setup via Django settings as follows: ENABLE_MFE_CONFIG_API = True MFE_CONFIG = {} MFE_CONFIG_OVERRIDES = { - # `APP_ID` defined in your MFE + # The below key represented the `APP_ID` defined in your MFE 'profile': { 'PARAGON_THEME_URLS': { - 'core': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css', + 'core': { + 'url': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', + }, 'variants': { - 'light': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.css', + 'light': { + 'url': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', + 'default': True, + 'dark': False, + }, }, }, }, @@ -66,11 +84,57 @@ MFE_CONFIG_OVERRIDES = { ### Locally installed `@edx/paragon` -In the event the other Paragon CSS URLs are configured via one of the other documented mechanisms, but they fail to load (e.g., the CDN url throws a 404), `@edx/frontend-platform` will fallback to injecting the locally installed Paragon CSS from the consuming application into the HTML document. +If you would like to use the same version of the Paragon CSS urls as the locally installed `@edx/paragon`, the configuration for the Paragon CSS urls may contain a wildcard `$paragonVersion` which gets replaced with the locally installed version of `@edx/paragon` in the consuming application, e.g.: + +```shell +https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css +https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css +``` + +In the event the other Paragon CSS urls are configured via one of the other documented mechanisms, but they fail to load (e.g., the CDN url throws a 404), `@edx/frontend-platform` will attempt to fallback to injecting the locally installed Paragon CSS from the consuming application into the HTML document. + +## Usage with `@edx/brand` + +The core Paragon design tokens and styles may be optionally overriden by utilizing `@edx/brand`, which allows theme authors to customize the default Paragon theme to match the look and feel of their custom brand. -If you would like to use the same version of the Paragon CSS URLs as the locally installed `@edx/paragon`, the configuration for the Paragon CSS URLs may contain a wildcard `$paragonVersion` which gets replaced with the locally installed version of `@edx/paragon` in the consuming application, e.g.: +This override mechanism works by compiling the design tokens defined in `@edx/brand` with the the core Paragon tokens to generate overrides to Paragon's default CSS variables, and then compiling the output CSS with any SCSS theme customizations not possible through a design token override. + +The CSS urls for `@edx/brand` overrides will be applied after the core Paragon theme urls load, thus overriding any previously set CSS variables and/or styles. + +To enable `@edx/brand` overrides, the `PARAGON_THEME_URLS` setting may be configured as following: + +```js +const config = { + PARAGON_THEME_URLS: { + core: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand-edx.org@#brandVersion/dist/core.min.css', + }, + }, + variants: { + light: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand-edx.org@$brandVersion/dist/light.min.css', + }, + default: true, + dark: false, + }, + }, + }, +}; + +export default config; +``` + +### Locally installed `@edx/brand` + +If you would like to use the same version of the brand override CSS urls as the locally installed `@edx/brand`, the configuration for the brand override CSS urls may contain a wildcard `$brandVersion` which gets replaced with the locally installed version of `@edx/brand` in the consuming application, e.g.: ```shell -https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.css -https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/scss/core/css/variables.css +https://cdn.jsdelivr.net/npm/@edx/brand@$brandVersion/dist/core.min.css +https://cdn.jsdelivr.net/npm/@edx/brand@$brandVersion/dist/light.min.css ``` + +In the event the other brand override CSS urls are configured via one of the other documented mechanisms, but they fail to load (e.g., the CDN is down), `@edx/frontend-platform` will attempt to fallback to injecting the locally installed brand override CSS urls from the consuming application into the HTML document. diff --git a/src/react/hooks.js b/src/react/hooks.js index 0302f3e5f..b31ae90a4 100644 --- a/src/react/hooks.js +++ b/src/react/hooks.js @@ -53,6 +53,12 @@ export const useTrackColorSchemeChoice = () => { }, []); }; +const removeExistingLinks = (existingLinks) => { + existingLinks.forEach((link) => { + link.remove(); + }); +}; + /** * Adds/updates a `` element in the HTML document to load the core application theme CSS. * @@ -65,63 +71,117 @@ export const useParagonThemeCore = ({ themeCore, onLoad, }) => { + const [isParagonThemeCoreLoaded, setIsParagonThemeCoreLoaded] = useState(false); + const [isBrandThemeCoreLoaded, setIsBrandThemeCoreLoaded] = useState(false); + + useEffect(() => { + // Call `onLoad` once both the paragon and brand theme core are loaded. + if (isParagonThemeCoreLoaded && isBrandThemeCoreLoaded) { + onLoad(); + } + }, [isParagonThemeCoreLoaded, isBrandThemeCoreLoaded, onLoad]); + useEffect(() => { // If there is no config for the core theme url, do nothing. - if (!themeCore?.url) { + if (!themeCore?.urls) { + setIsParagonThemeCoreLoaded(true); + setIsBrandThemeCoreLoaded(true); return; } - let coreThemeLink = document.head.querySelector(`link[href='${themeCore.url}']`); - if (!coreThemeLink) { - const getExistingCoreThemeLinks = () => document.head.querySelectorAll('link[data-paragon-theme-core="true"]'); - const removeExistingLinks = (existingLinks) => { - existingLinks.forEach((link) => { - link.remove(); - }); + const getParagonThemeCoreLink = () => document.head.querySelector('link[data-paragon-theme-core="true"'); + const existingCoreThemeLink = document.head.querySelector(`link[href='${themeCore.urls.default}']`); + if (!existingCoreThemeLink) { + const getExistingCoreThemeLinks = (isBrandOverride) => { + const coreThemeLinkSelector = `link[data-${isBrandOverride ? 'brand' : 'paragon'}-theme-core="true"]`; + return document.head.querySelectorAll(coreThemeLinkSelector); }; - // find existing links - const existingLinks = getExistingCoreThemeLinks(); - - // create new link - const createCoreThemeLink = (url, { isFallbackThemeUrl = false } = {}) => { - coreThemeLink = document.createElement('link'); + const createCoreThemeLink = ( + url, + { + isFallbackThemeUrl = false, + isBrandOverride = false, + } = {}, + ) => { + let coreThemeLink = document.createElement('link'); coreThemeLink.href = url; coreThemeLink.rel = 'stylesheet'; - coreThemeLink.dataset.paragonThemeCore = true; + if (isBrandOverride) { + coreThemeLink.dataset.brandThemeCore = true; + } else { + coreThemeLink.dataset.paragonThemeCore = true; + } coreThemeLink.onload = () => { - onLoad(); - removeExistingLinks(existingLinks); + if (isBrandOverride) { + setIsBrandThemeCoreLoaded(true); + } else { + setIsParagonThemeCoreLoaded(true); + } }; coreThemeLink.onerror = () => { logError(`Failed to load core theme CSS from ${url}`); if (isFallbackThemeUrl) { - logError('Could not load core theme CSS from fallback URL. Aborting.'); - onLoad(); - const otherExistingLinks = getExistingCoreThemeLinks(); + logError(`Could not load core theme CSS from ${url} or fallback URL. Aborting.`); + if (isBrandOverride) { + setIsBrandThemeCoreLoaded(true); + } else { + setIsParagonThemeCoreLoaded(true); + } + const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); removeExistingLinks(otherExistingLinks); return; } - if (PARAGON?.themeUrls?.core) { - const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.core.fileName}`; + const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; + const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; + if (themeUrls.core) { + const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.core.fileName}`; logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); - coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true }); - const otherExistingLinks = getExistingCoreThemeLinks(); + coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true, isBrandOverride }); + const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); removeExistingLinks(otherExistingLinks); - document.head.insertAdjacentElement( - 'afterbegin', - coreThemeLink, - ); + const foundParagonThemCoreLink = getParagonThemeCoreLink(); + if (foundParagonThemCoreLink) { + foundParagonThemCoreLink.insertAdjacentElement( + 'afterend', + coreThemeLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + coreThemeLink, + ); + } + } else { + logError(`Failed to load core theme CSS from ${url} or fallback URL. Aborting.`); } }; return coreThemeLink; }; - console.log('createCoreThemeLink', themeCore); - coreThemeLink = createCoreThemeLink(themeCore.url); + + const paragonCoreThemeLink = createCoreThemeLink(themeCore.urls.default); document.head.insertAdjacentElement( 'afterbegin', - coreThemeLink, + paragonCoreThemeLink, ); + + if (themeCore.urls.brandOverride) { + const brandCoreThemeLink = createCoreThemeLink(themeCore.urls.brandOverride, { isBrandOverride: true }); + const foundParagonThemeCoreLink = getParagonThemeCoreLink(); + if (foundParagonThemeCoreLink) { + foundParagonThemeCoreLink.insertAdjacentElement( + 'afterend', + brandCoreThemeLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + brandCoreThemeLink, + ); + } + } else { + setIsBrandThemeCoreLoaded(true); + } } - }, [themeCore?.url, onLoad]); + }, [themeCore?.urls, onLoad]); }; /** @@ -133,8 +193,8 @@ export const useParagonThemeCore = ({ * * @memberof module:React * @param {object} args - * @param {object} args.themeVariant An object containing the URLs for each supported theme variant, e.g.: `{ light: { url: 'https://path/to/light.css' } }`. - * @param {string} args.currentThemeVariant The currently applied theme variant, e.g.: `light`. + * @param {object} [args.themeVariants] An object containing the URLs for each supported theme variant, e.g.: `{ light: { url: 'https://path/to/light.css' } }`. + * @param {string} [args.currentThemeVariant] The currently applied theme variant, e.g.: `light`. * @param {string} args.onLoad A callback function called when the theme variant(s) CSS is loaded. */ const useParagonThemeVariants = ({ @@ -142,22 +202,15 @@ const useParagonThemeVariants = ({ currentThemeVariant, onLoad, }) => { - const [hasThemeVariantLoadedByName, setHasThemeVariantLoadedByName] = useState({}); + const [isParagonThemeVariantLoaded, setIsParagonThemeVariantLoaded] = useState(false); + const [isBrandThemeVariantLoaded, setIsBrandThemeVariantLoaded] = useState(false); useEffect(() => { - Object.keys(themeVariants || {}).forEach((themeVariant) => { - setHasThemeVariantLoadedByName((prevState) => ({ - ...prevState, - [themeVariant]: false, - })); - }); - }, [themeVariants]); - - useEffect(() => { - if (Object.values(hasThemeVariantLoadedByName).some((hasLoaded) => hasLoaded)) { + // Call `onLoad` once both the paragon and brand theme variant are loaded. + if (isParagonThemeVariantLoaded && isBrandThemeVariantLoaded) { onLoad(); } - }, [hasThemeVariantLoadedByName, onLoad]); + }, [isParagonThemeVariantLoaded, isBrandThemeVariantLoaded, onLoad]); useEffect(() => { if (!themeVariants) { @@ -170,106 +223,149 @@ const useParagonThemeVariants = ({ */ const generateStylesheetRelAttr = (themeVariant) => (currentThemeVariant === themeVariant ? 'stylesheet' : 'alternate stylesheet'); - /** - * A helper function to determine which theme variant callback should be used - * based on the current theme variant. - */ - const setThemeVariantLoaded = (themeVariant) => { - setHasThemeVariantLoadedByName((prevState) => { - if (themeVariant in prevState) { - return { - ...prevState, - [themeVariant]: true, - }; - } - return prevState; - }); - }; - /** * Iterate over each theme variant URL and inject it into the HTML document, if it doesn't already exist. */ Object.entries(themeVariants).forEach(([themeVariant, value]) => { // If there is no config for the theme variant URL, set the theme variant to loaded and continue. - if (!value.url) { - setThemeVariantLoaded(themeVariant); + if (!value.urls) { + setIsParagonThemeVariantLoaded(true); + setIsBrandThemeVariantLoaded(true); return; } - let themeVariantLink = document.head.querySelector(`link[href='${value.url}']`); + const getParagonThemeVariantLink = () => document.head.querySelector(`link[data-paragon-theme-variant='${themeVariant}']`); + const existingThemeVariantLink = document.head.querySelector(`link[href='${value.urls.default}']`); const stylesheetRelForVariant = generateStylesheetRelAttr(themeVariant); - if (!themeVariantLink) { - const getExistingThemeVariantLinks = () => document.head.querySelectorAll(`link[data-paragon-theme-variant='${themeVariant}']`); - // find existing links - const existingLinks = getExistingThemeVariantLinks(); - - // create new link - const createThemeVariantLink = (url, { isFallbackThemeUrl = false } = {}) => { - themeVariantLink = document.createElement('link'); + if (!existingThemeVariantLink) { + const getExistingThemeVariantLinks = (isBrandOverride) => { + const themeVariantLinkSelector = `link[data-${isBrandOverride ? 'brand' : 'paragon'}-theme-variant='${themeVariant}']`; + return document.head.querySelectorAll(themeVariantLinkSelector); + }; + const createThemeVariantLink = ( + url, + { + isFallbackThemeUrl = false, + isBrandOverride = false, + } = {}, + ) => { + let themeVariantLink = document.createElement('link'); themeVariantLink.href = url; themeVariantLink.rel = 'stylesheet'; - themeVariantLink.dataset.paragonThemeVariant = themeVariant; + if (isBrandOverride) { + themeVariantLink.dataset.brandThemeVariant = themeVariant; + } else { + themeVariantLink.dataset.paragonThemeVariant = themeVariant; + } themeVariantLink.onload = () => { - setThemeVariantLoaded(themeVariant); - existingLinks.forEach((link) => { - link.remove(); - }); + if (themeVariant === currentThemeVariant) { + if (isBrandOverride) { + setIsBrandThemeVariantLoaded(true); + } else { + setIsParagonThemeVariantLoaded(true); + } + } else { + const existingLinks = getExistingThemeVariantLinks(isBrandOverride); + removeExistingLinks(existingLinks); + } }; themeVariantLink.onerror = () => { - logError(`Failed to load theme variant (${themeVariant}) CSS from ${value.url}`); + logError(`Failed to load theme variant (${themeVariant}) CSS from ${value.urls.default}`); if (isFallbackThemeUrl) { - logError('Could not load theme theme variant CSS from fallback URL. Aborting.'); - setThemeVariantLoaded(themeVariant); - const otherExistingLinks = getExistingThemeVariantLinks(); - otherExistingLinks.forEach((link) => { - link.remove(); - }); + logError(`Could not load theme variant (${themeVariant}) CSS from fallback URL. Aborting.`); + if (isBrandOverride) { + setIsBrandThemeVariantLoaded(true); + } else { + setIsParagonThemeVariantLoaded(true); + } + const otherExistingLinks = getExistingThemeVariantLinks(isBrandOverride); + removeExistingLinks(otherExistingLinks); return; } - if (PARAGON?.themeUrls?.variants?.[themeVariant]) { - const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${PARAGON.themeUrls.variants[themeVariant].fileName}`; + const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; + const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; + if (themeUrls.variants) { + const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.variants[themeVariant].fileName}`; logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); - themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl, { isFallbackThemeUrl: true }); - const otherExistingLinks = getExistingThemeVariantLinks(); - otherExistingLinks.forEach((link) => { - link.remove(); + themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl, { + isFallbackThemeUrl: true, + isBrandOverride, }); - document.head.insertAdjacentElement( - 'afterbegin', - themeVariantLink, - ); + const otherExistingLinks = getExistingThemeVariantLinks(isBrandOverride); + removeExistingLinks(otherExistingLinks); + const foundParagonThemeVariantLink = getParagonThemeVariantLink(); + if (foundParagonThemeVariantLink) { + foundParagonThemeVariantLink.insertAdjacentElement( + 'afterend', + themeVariantLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + themeVariantLink, + ); + } + } else { + logError(`Failed to load theme variant (${themeVariant}) CSS from ${url} or fallback URL. Aborting.`); } }; return themeVariantLink; }; - themeVariantLink = createThemeVariantLink(value.url); + + const paragonThemeVariantLink = createThemeVariantLink(value.urls.default); document.head.insertAdjacentElement( 'afterbegin', - themeVariantLink, + paragonThemeVariantLink, ); - } else if (themeVariantLink.rel !== stylesheetRelForVariant) { - themeVariantLink.rel = stylesheetRelForVariant; + + if (value.urls.brandOverride) { + const brandThemeVariantLink = createThemeVariantLink(value.urls.brandOverride, { isBrandOverride: true }); + const foundParagonThemeVariantLink = getParagonThemeVariantLink(); + if (foundParagonThemeVariantLink) { + foundParagonThemeVariantLink.insertAdjacentElement( + 'afterend', + brandThemeVariantLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + brandThemeVariantLink, + ); + } + } else { + setIsBrandThemeVariantLoaded(true); + } + } else if (existingThemeVariantLink.rel !== stylesheetRelForVariant) { + existingThemeVariantLink.rel = stylesheetRelForVariant; } }); }, [themeVariants, currentThemeVariant, onLoad]); }; -const handleParagonVersionSubstitution = (url) => { - if (!url || !url.includes('$paragonVersion') || !PARAGON?.version) { +const handleParagonVersionSubstitution = (url, { isBrandOverride = false } = {}) => { + const localVersion = isBrandOverride ? PARAGON_THEME?.brand?.version : PARAGON_THEME?.paragon?.version; + const wildcardKeyword = isBrandOverride ? '$brandVersion' : '$paragonVersion'; + if (!url || !url.includes(wildcardKeyword) || !localVersion) { return url; } - return url.replace('$paragonVersion', PARAGON.version); + return url.replace(wildcardKeyword, localVersion); }; +/** + * @typedef {Object} ParagonThemeUrl + * @property {string} default The default URL for Paragon. + * @property {string} brandOverride The URL for a brand override. + */ + /** * @typedef {Object} ParagonThemeCore - * @property {string} url + * @property {ParagonThemeUrl|string} url */ /** * @typedef {Object} ParagonThemeVariant - * @property {string} url - * @property {boolean} default - * @property {boolean} dark + * @property {ParagonThemeUrl|string} url + * @property {boolean} default Whether this is the default theme variant. + * @property {boolean} dark Whether this is the dark theme variant to use for `prefers-color-scheme: "dark"`. */ /** @@ -288,42 +384,58 @@ const useParagonThemeUrls = (config) => useMemo(() => { if (!config.PARAGON_THEME_URLS) { return undefined; } + /** @type {ParagonThemeUrls} */ const paragonThemeUrls = config.PARAGON_THEME_URLS; - const coreCssUrl = handleParagonVersionSubstitution(paragonThemeUrls.core); + const paragonCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.default : paragonThemeUrls.core.url; + const brandCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.brandOverride : undefined; + const coreCss = { + default: handleParagonVersionSubstitution(paragonCoreCssUrl), + brandOverride: handleParagonVersionSubstitution(brandCoreCssUrl, { isBrandOverride: true }), + }; const themeVariantsCss = {}; - Object.entries(paragonThemeUrls.variants || {}).forEach(([themeVariant, { url, ...rest }]) => { - themeVariantsCss[themeVariant] = { - url: handleParagonVersionSubstitution(url), - ...rest, + const themeVariantsEntries = Object.entries(paragonThemeUrls.variants || {}); + themeVariantsEntries.forEach(([themeVariant, { + url, urls, default: isDefaultThemeVariant, dark, + }]) => { + const themeVariantMetadata = { + default: isDefaultThemeVariant, + dark, }; + if (url) { + themeVariantMetadata.urls = { + default: handleParagonVersionSubstitution(url), + }; + } else { + themeVariantMetadata.urls = { + default: handleParagonVersionSubstitution(urls.default), + brandOverride: handleParagonVersionSubstitution(urls.brandOverride, { isBrandOverride: true }), + }; + } + themeVariantsCss[themeVariant] = themeVariantMetadata; }); - const hasMissingCssUrls = !coreCssUrl || Object.keys(themeVariantsCss).length === 0; + const hasMissingCssUrls = !coreCss.default || Object.keys(themeVariantsCss).length === 0; if (hasMissingCssUrls) { - if (!PARAGON) { + if (!PARAGON_THEME) { return undefined; } const themeVariants = {}; const prependBaseUrl = (url) => `${config.BASE_URL}/${url}`; - Object.entries(PARAGON.themeUrls.variants).forEach(([themeVariant, { fileName, ...rest }]) => { + themeVariantsEntries.forEach(([themeVariant, { fileName, ...rest }]) => { themeVariants[themeVariant] = { url: prependBaseUrl(fileName), ...rest, }; }); return { - core: { - url: prependBaseUrl(PARAGON.themeUrls.core), - }, + core: { urls: coreCss }, variants: themeVariants, }; } return { - core: { - url: handleParagonVersionSubstitution(coreCssUrl), - }, + core: { urls: coreCss }, variants: themeVariantsCss, }; }, [config.BASE_URL, config.PARAGON_THEME_URLS]); @@ -349,8 +461,8 @@ const getDefaultThemeVariant = (themeVariants) => { metadata: themeVariants[themeVariantKeys[0]], }; } - const foundDefaultThemeVariant = Object.entries(themeVariants) - .find(([, { default: isDefault }]) => isDefault === true); + const foundDefaultThemeVariant = Object.values(themeVariants) + .find(({ default: isDefault }) => isDefault === true); if (!foundDefaultThemeVariant) { return undefined; @@ -416,7 +528,7 @@ export const useParagonTheme = (config) => { return; } - const hasThemeConfig = (themeCore?.url && Object.keys(themeVariants).length > 0); + const hasThemeConfig = (themeCore?.urls && Object.keys(themeVariants).length > 0); if (!hasThemeConfig) { // no theme URLs to load, set loading to false. dispatch(paragonThemeActions.setParagonThemeLoaded(true)); @@ -433,7 +545,7 @@ export const useParagonTheme = (config) => { themeState.isThemeLoaded, isCoreThemeLoaded, hasLoadedThemeVariants, - themeCore?.url, + themeCore?.urls, themeVariants, ]); From 65fcf0be38c17bceed863dd61d8d64406e231826 Mon Sep 17 00:00:00 2001 From: Diana Olarte Date: Sat, 22 Jul 2023 03:23:36 +1000 Subject: [PATCH 06/26] feat: support dark mode chore: update package-lock.json chore: update package-lock.json take 2 chore: remove console.log statements fix: ignore system preference change when theme variant set in localstorage chore: add tests for updates to AppProvider chore: update react-intl to pass peer dependencies after pinning all deps chore: split hooks.js up into separate files and begin some related tests test: add testing to useParagonTheme hooks (#514) * test: add testing to useParagonThemeCore * test: add test to useThemeVariants hook * fix: Paragon definition and remove onload mock * test: change test message to be clear --- docs/how_tos/theming.md | 90 ++- src/react/AppProvider.jsx | 5 + src/react/AppProvider.test.jsx | 190 +++++- src/react/constants.js | 1 + src/react/hooks.js | 553 ------------------ src/react/hooks/index.js | 3 + src/react/hooks/paragon/index.js | 2 + src/react/hooks/paragon/useParagonTheme.js | 109 ++++ .../hooks/paragon/useParagonThemeCore.js | 133 +++++ .../hooks/paragon/useParagonThemeCore.test.js | 101 ++++ .../hooks/paragon/useParagonThemeUrls.js | 85 +++ .../hooks/paragon/useParagonThemeUrls.test.js | 101 ++++ .../hooks/paragon/useParagonThemeVariants.js | 196 +++++++ .../paragon/useParagonThemeVariants.test.js | 140 +++++ .../paragon/useTrackColorSchemeChoice.js | 31 + .../useTrackColorSchemeChoice.test.js} | 13 +- src/react/hooks/paragon/utils.js | 87 +++ src/react/hooks/useAppEvent.js | 26 + 18 files changed, 1290 insertions(+), 576 deletions(-) delete mode 100644 src/react/hooks.js create mode 100644 src/react/hooks/index.js create mode 100644 src/react/hooks/paragon/index.js create mode 100644 src/react/hooks/paragon/useParagonTheme.js create mode 100644 src/react/hooks/paragon/useParagonThemeCore.js create mode 100644 src/react/hooks/paragon/useParagonThemeCore.test.js create mode 100644 src/react/hooks/paragon/useParagonThemeUrls.js create mode 100644 src/react/hooks/paragon/useParagonThemeUrls.test.js create mode 100644 src/react/hooks/paragon/useParagonThemeVariants.js create mode 100644 src/react/hooks/paragon/useParagonThemeVariants.test.js create mode 100644 src/react/hooks/paragon/useTrackColorSchemeChoice.js rename src/react/{hooks.test.jsx => hooks/paragon/useTrackColorSchemeChoice.test.js} (84%) create mode 100644 src/react/hooks/paragon/utils.js create mode 100644 src/react/hooks/useAppEvent.js diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md index 52646a7d6..c7ff08084 100644 --- a/docs/how_tos/theming.md +++ b/docs/how_tos/theming.md @@ -1,15 +1,47 @@ -# Theming support with Paragon - -This document serves as a guide to using `@edx/frontend-platform` to support MFE theming with Paragon using theme CSS loaded externally (e.g., from a CDN). By serving CSS loaded externally, consuming applications of Paragon no longer need to be responsible for compiling the theme SCSS to CSS themselves and instead use a pre-compiled CSS file. In doing so, this allows making changes to the Paragon theme without needing to necessarily re-build and re-deploy all consuming applications. We would also get a meaningful gain in performance as loading the compiled theme CSS from an external CDN means micro-frontends (MFEs) can include cached styles instead of needing to load essentially duplicate theme styles as users navigate across different MFEs. +# Theming support with `@edx/paragon` and `@edx/brand` ## Overview +This document serves as a guide to using `@edx/frontend-platform` to support MFE theming with Paragon using theme CSS loaded externally (e.g., from a CDN). + +To do this, configured URLs pointing to relevant CSS files from `@edx/paragon` and (optionally) `@edx/brand` are loaded and injected to the HTML document at runtime. This differs than the consuming application importing the styles from `@edx/paragon` and `@edx/brand` directly, which includes these styles in the application's production assets. + +By serving CSS loaded externally, consuming applications of Paragon no longer need to be responsible for compiling the theme SCSS to CSS themselves and instead use a pre-compiled CSS file. In doing so, this allows making changes to the Paragon theme without needing to necessarily re-build and re-deploy all consuming applications. + +### Dark mode and theme variant preferences + +`@edx/frontend-platform` supports both `light` (required) and `dark` (optional) theme variants. The choice of which theme variant should be applied on page load is based on the following preference cascade: + +1. **Get theme preference from localStorage.** Supports persisting and loading the user's preference for their selected theme variant, until cleared. +1. **Detect user system settings.** Rely on the `prefers-color-scheme` media query to detect if the user's system indicates a preference for dark mode. If so, use the default dark theme variant, if one is configured. +1. **Use default theme variant as configured (see below).** Otherwise, load the default theme variant as configured by the `defaults` option described below. + +Whenever the current theme variant changes, an attrivbute `data-paragon-theme-variant="*"` is updated on the `` element. This attribute enables applications' both JS and CSS to have knowledge of the currently applied theme variant. + +### Supporting custom theme variants beyond `light` and `dark` + +If your use case necessitates additional variants beyond the default supported `light` and `dark` theme variants, you may pass any number of custom theme variants. Custom theme variants will work the user's persisted localStorage setting (i.e., if a user switches to a custom theme variant, the MFE will continue to load the custom theme variant by default). By supporting custom theme variants, it also supports having multiple or alternative `light` and/or `dark` theme variants. + +### Performance implications + +There is also a meaningful improvement in performance as loading the compiled theme CSS from an external CDN means micro-frontends (MFEs) can include cached styles instead of needing to load essentially duplicate theme styles included in each individual MFE as users navigate across the platform. + +However, as the styles from `@edx/paragon` and `@edx/brand` get loaded at runtime by `@edx/frontend-platform`, the associated CSS files do not get processed through the consuming application's Webpack build process (e.g., if the MFE used PurgeCSS or any custom PostCSS plugins specifically for Paragon). + +### Falling back to styles installed in consuming application + +If any of the configured external `PARAGON_THEME_URLS` fail to load for whatever reason (e.g., CDN is down, URL is incorrectly configured), `@edx/paragon` will attempt to fallback to the relevant files installed in `node_modules` from the consuming application. + +## Technical architecture + ![overview of paragon theme loader](./assets/paragon-theme-loader.png "Paragon theme loader") -## Basic theme URL configuration +## Development + +### Basic theme URL configuration Paragon supports 2 mechanisms for configuring the Paragon theme urls: -* JavaScript-based configuration via `env.config.js`. +* JavaScript-based configuration via `env.config.js` * MFE runtime configuration API via `edx-platform` Using either configuration mechanism, a `PARAGON_THEME_URLS` configuration setting must be created to point to the externally hosted Paragon theme CSS files, e.g.: @@ -19,16 +51,45 @@ Using either configuration mechanism, a `PARAGON_THEME_URLS` configuration setti "core": { "url": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css" }, + "defaults": { + "light": "light", + }, "variants": { "light": { "url": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css", - "default": true, - "dark": false, } } } ``` +### Configuration options + +The `PARAGON_THEME_URLS` configuration object supports using only the default styles from `@edx/paragon` or, optionally, extended/overridden styles via `@edx/brand`. To utilize `@edx/brand` overrides, see the `core.urls` and `variants.*.urls` options below. + +The `dark` theme variant options are optional. + +| Property | Data Type | Description | +| -------- | ----------- | ----------- | +| `core` | Object | Metadata about the core styles from `@edx/paragon` and `@edx/brand`. | +| `core.url` | String | URL for the `core.css` file from `@edx/paragon`. | +| `core.urls` | Object | URL(s) for the `core.css` files from `@edx/paragon` CSS and (optionally) `@edx/brand`. | +| `core.urls.default` | String | URL for the `core.css` file from `@edx/paragon`. | +| `core.urls.brandOverride` | Object | URL for the `core.css` file from `@edx/brand`. | +| `defaults` | Object | Mapping of theme variants to Paragon's default supported light and dark theme variants. | +| `defaults.light` | String | Default `light` theme variant from the theme variants in the `variants` object. | +| `defaults.dark` | String | Default `dark` theme variant from the theme variants in the `variants` object. | +| `variants` | Object | Metadata about each supported theme variant. | +| `variants.light` | Object | Metadata about the light theme variant styles from `@edx/paragon` and (optionally)`@edx/brand`. | +| `variants.light.url` | String | URL for the `light.css` file from `@edx/paragon`. | +| `variants.light.urls` | Object | URL(s) for the `light.css` files from `@edx/paragon` CSS and (optionally) `@edx/brand`. | +| `variants.light.urls.default` | String | URL for the `light.css` file from `@edx/paragon`. | +| `variants.light.urls.brandOverride` | String | URL for the `light.css` file from `@edx/brand`. | +| `variants.dark` | Object | Metadata about the dark theme variant styles from `@edx/paragon` and (optionally)`@edx/brand`. | +| `variants.dark.url` | String | URL for the `dark.css` file from `@edx/paragon`. | +| `variants.dark.urls` | Object | URL(s) for the `dark.css` files from `@edx/paragon` CSS and (optionally) `@edx/brand`. | +| `variants.dark.urls.default` | String | URL for the `dark.css` file from `@edx/paragon`. | +| `variants.dark.urls.brandOverride` | String | URL for the `dark.css` file from `@edx/brand`. | + ### JavaScript-based configuration One approach to configuring the `PARAGON_THEME_URLS` is to create a `env.config.js` file in the root of the repository. The configuration is defined as a JavaScript file, which affords consumers to use more complex data types, amongst other benefits. @@ -41,11 +102,12 @@ const config = { core: { url: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', }, + defaults: { + light: 'light', + }, variants: { light: { url: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', - default: true, - dark: false, }, }, }, @@ -70,11 +132,12 @@ MFE_CONFIG_OVERRIDES = { 'core': { 'url': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', }, + 'defaults': { + 'light': 'light', + }, 'variants': { 'light': { 'url': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', - 'default': True, - 'dark': False, }, }, }, @@ -112,14 +175,15 @@ const config = { brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand-edx.org@#brandVersion/dist/core.min.css', }, }, + defaults: { + light: 'light', + }, variants: { light: { urls: { default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand-edx.org@$brandVersion/dist/light.min.css', }, - default: true, - dark: false, }, }, }, diff --git a/src/react/AppProvider.jsx b/src/react/AppProvider.jsx index 3d975e2cf..646d661c4 100644 --- a/src/react/AppProvider.jsx +++ b/src/react/AppProvider.jsx @@ -22,6 +22,7 @@ import { LOCALE_CHANGED, } from '../i18n'; import { basename } from '../initialize'; +import { SELECTED_THEME_VARIANT_KEY } from './constants'; /** * A wrapper component for React-based micro-frontends to initialize a number of common data/ @@ -66,6 +67,7 @@ export default function AppProvider({ store, children, wrapWithRouter }) { setLocale(getLocale()); }); + useTrackColorSchemeChoice(); const [paragonThemeState, paragonThemeDispatch] = useParagonTheme(config); const appContextValue = useMemo(() => ({ @@ -76,6 +78,9 @@ export default function AppProvider({ store, children, wrapWithRouter }) { state: paragonThemeState, setThemeVariant: (themeVariant) => { paragonThemeDispatch(paragonThemeActions.setParagonThemeVariant(themeVariant)); + + // Persist selected theme variant to localStorage. + window.localStorage.setItem(SELECTED_THEME_VARIANT_KEY, themeVariant); }, }, }), [authenticatedUser, config, locale, paragonThemeState, paragonThemeDispatch]); diff --git a/src/react/AppProvider.test.jsx b/src/react/AppProvider.test.jsx index af0a7625e..71f076392 100644 --- a/src/react/AppProvider.test.jsx +++ b/src/react/AppProvider.test.jsx @@ -1,30 +1,65 @@ import React from 'react'; import { createStore } from 'redux'; -import { render } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import '@testing-library/jest-dom/extend-expect'; + import AppProvider from './AppProvider'; import { initialize } from '../initialize'; +import { useAppEvent, useTrackColorSchemeChoice, useParagonTheme } from './hooks'; +import { AUTHENTICATED_USER_CHANGED, getAuthenticatedUser } from '../auth'; +import { CONFIG_CHANGED } from '../constants'; +import { getConfig } from '../config'; +import { getLocale, LOCALE_CHANGED } from '../i18n'; +import AppContext from './AppContext'; +import { SELECTED_THEME_VARIANT_KEY, SET_THEME_VARIANT } from './constants'; jest.mock('../auth', () => ({ - configure: () => {}, - getAuthenticatedUser: () => null, - fetchAuthenticatedUser: () => null, - getAuthenticatedHttpClient: () => ({}), + ...jest.requireActual('../auth'), + getAuthenticatedUser: jest.fn(), + fetchAuthenticatedUser: jest.fn(), + getAuthenticatedHttpClient: jest.fn().mockReturnValue({}), AUTHENTICATED_USER_CHANGED: 'user_changed', })); +jest.mock('../config', () => ({ + ...jest.requireActual('../config'), + getConfig: jest.fn().mockReturnValue({ + BASE_URL: 'localhost:8080', + LMS_BASE_URL: 'localhost:18000', + LOGIN_URL: 'localhost:18000/login', + LOGOUT_URL: 'localhost:18000/logout', + REFRESH_ACCESS_TOKEN_ENDPOINT: 'localhost:18000/oauth2/access_token', + ACCESS_TOKEN_COOKIE_NAME: 'access_token', + CSRF_TOKEN_API_PATH: 'localhost:18000/csrf', + }), +})); + +jest.mock('../i18n', () => ({ + ...jest.requireActual('../i18n'), + getLocale: jest.fn().mockReturnValue('en'), +})); + jest.mock('../analytics', () => ({ - configure: () => {}, + configure: () => { }, identifyAnonymousUser: jest.fn(), identifyAuthenticatedUser: jest.fn(), })); jest.mock('./hooks', () => ({ ...jest.requireActual('./hooks'), + useAppEvent: jest.fn(), useTrackColorSchemeChoice: jest.fn(), + useParagonTheme: jest.fn().mockImplementation(() => [ + { isThemeLoaded: true, themeVariant: 'light' }, + jest.fn(), + ]), })); describe('AppProvider', () => { beforeEach(async () => { + jest.clearAllMocks(); + await initialize({ loggingService: jest.fn(() => ({ logError: jest.fn(), @@ -104,4 +139,147 @@ describe('AppProvider', () => { const reduxProvider = wrapper.queryByTestId('redux-provider'); expect(reduxProvider).not.toBeInTheDocument(); }); + + describe('paragon theme and brand', () => { + it('calls trackColorSchemeChoice', () => { + const Component = ( + +

+
Child Two
+ + ); + render(Component); + expect(useTrackColorSchemeChoice).toHaveBeenCalled(); + }); + + it('calls useParagonTheme', () => { + const Component = ( + +
Child One
+
Child Two
+
+ ); + render(Component); + expect(useParagonTheme).toHaveBeenCalled(); + expect(useParagonTheme).toHaveBeenCalledWith( + expect.objectContaining({ + BASE_URL: 'localhost:8080', + LMS_BASE_URL: 'localhost:18000', + LOGIN_URL: 'localhost:18000/login', + LOGOUT_URL: 'localhost:18000/logout', + REFRESH_ACCESS_TOKEN_ENDPOINT: 'localhost:18000/oauth2/access_token', + ACCESS_TOKEN_COOKIE_NAME: 'access_token', + CSRF_TOKEN_API_PATH: 'localhost:18000/csrf', + }), + ); + }); + + it('blocks rendering until paragon theme is loaded', () => { + useParagonTheme.mockImplementationOnce(() => [ + { isThemeLoaded: false }, + jest.fn(), + ]); + const Component = ( + +
Child One
+
Child Two
+
+ ); + const { container } = render(Component); + expect(container).toBeEmptyDOMElement(); + }); + + it('returns correct `paragonTheme` in context value', async () => { + const mockUseParagonThemeDispatch = jest.fn(); + useParagonTheme.mockImplementationOnce(() => [ + { isThemeLoaded: true, themeVariant: 'light' }, + mockUseParagonThemeDispatch, + ]); + const Component = ( + + + {({ paragonTheme }) => ( +
+

Is theme loaded: {paragonTheme.state.isThemeLoaded ? 'yes' : 'no'}

+

Current theme variant: {paragonTheme.state.themeVariant}

+ +
+ )} +
+
+ ); + render(Component); + expect(screen.getByText('Is theme loaded: yes')).toBeInTheDocument(); + expect(screen.getByText('Current theme variant: light')).toBeInTheDocument(); + + const setThemeVariantBtn = screen.getByRole('button', { name: 'Set theme variant' }); + expect(setThemeVariantBtn).toBeInTheDocument(); + await userEvent.click(setThemeVariantBtn); + + expect(mockUseParagonThemeDispatch).toHaveBeenCalledTimes(1); + expect(mockUseParagonThemeDispatch).toHaveBeenCalledWith({ + payload: 'dark', + type: SET_THEME_VARIANT, + }); + expect(localStorage.setItem).toHaveBeenLastCalledWith(SELECTED_THEME_VARIANT_KEY, 'dark'); + }); + }); + + describe('useAppEvent', () => { + it('subscribes to `AUTHENTICATED_USER_CHANGED`', async () => { + const Component = ( + +
Child
+
+ ); + render(Component); + expect(useAppEvent).toHaveBeenCalledWith(AUTHENTICATED_USER_CHANGED, expect.any(Function)); + const useAppEventMockCalls = useAppEvent.mock.calls; + const authUserChangedFn = useAppEventMockCalls.find(([event]) => event === AUTHENTICATED_USER_CHANGED)[1]; + expect(authUserChangedFn).toBeDefined(); + const getAuthUserCallCount = getAuthenticatedUser.mock.calls.length; + authUserChangedFn(); + expect(getAuthUserCallCount + 1).toEqual(getAuthenticatedUser.mock.calls.length); + }); + + it('subscribes to `CONFIG_CHANGED`', async () => { + const Component = ( + +
Child
+
+ ); + render(Component); + expect(useAppEvent).toHaveBeenCalledWith(CONFIG_CHANGED, expect.any(Function)); + const useAppEventMockCalls = useAppEvent.mock.calls; + const configChangedFn = useAppEventMockCalls.find(([event]) => event === CONFIG_CHANGED)[1]; + expect(configChangedFn).toBeDefined(); + const getConfigCallCount = getConfig.mock.calls.length; + configChangedFn(); + expect(getConfig.mock.calls.length).toEqual(getConfigCallCount + 1); + }); + + it('subscribes to `LOCALE_CHANGED`', async () => { + const Component = ( + +
Child
+
+ ); + render(Component); + expect(useAppEvent).toHaveBeenCalledWith(LOCALE_CHANGED, expect.any(Function)); + const useAppEventMockCalls = useAppEvent.mock.calls; + const localeChangedFn = useAppEventMockCalls.find(([event]) => event === LOCALE_CHANGED)[1]; + expect(localeChangedFn).toBeDefined(); + const getLocaleCallCount = getLocale.mock.calls.length; + localeChangedFn(); + expect(getLocale.mock.calls.length).toEqual(getLocaleCallCount + 1); + }); + }); }); diff --git a/src/react/constants.js b/src/react/constants.js index 08de95fc0..89f640bd4 100644 --- a/src/react/constants.js +++ b/src/react/constants.js @@ -1,2 +1,3 @@ export const SET_THEME_VARIANT = 'SET_THEME_VARIANT'; export const SET_IS_THEME_LOADED = 'SET_IS_THEME_LOADED'; +export const SELECTED_THEME_VARIANT_KEY = 'selected-paragon-theme-variant'; diff --git a/src/react/hooks.js b/src/react/hooks.js deleted file mode 100644 index b31ae90a4..000000000 --- a/src/react/hooks.js +++ /dev/null @@ -1,553 +0,0 @@ -import { - useCallback, useEffect, useState, useReducer, useMemo, -} from 'react'; -import { subscribe, unsubscribe } from '../pubSub'; -import { sendTrackEvent } from '../analytics'; -import { paragonThemeReducer, paragonThemeActions } from './reducers'; -import { logError, logInfo } from '../logging'; -import { getConfig } from '../config'; - -/** - * A React hook that allows functional components to subscribe to application events. This should - * be used sparingly - for the most part, Context should be used higher-up in the application to - * provide necessary data to a given component, rather than utilizing a non-React-like Pub/Sub - * mechanism. - * - * @memberof module:React - * @param {string} type - * @param {function} callback - */ -export const useAppEvent = (type, callback) => { - useEffect(() => { - const subscriptionToken = subscribe(type, callback); - - return function cleanup() { - unsubscribe(subscriptionToken); - }; - }, [callback, type]); -}; - -/** - * A React hook that tracks user's preferred color scheme (light or dark) and sends respective - * event to the tracking service. - * - * @memberof module:React - */ -export const useTrackColorSchemeChoice = () => { - useEffect(() => { - const trackColorSchemeChoice = ({ matches }) => { - const preferredColorScheme = matches ? 'dark' : 'light'; - sendTrackEvent('openedx.ui.frontend-platform.prefers-color-scheme.selected', { preferredColorScheme }); - }; - const colorSchemeQuery = window.matchMedia?.('(prefers-color-scheme: dark)'); - if (colorSchemeQuery) { - // send user's initial choice - trackColorSchemeChoice(colorSchemeQuery); - colorSchemeQuery.addEventListener('change', trackColorSchemeChoice); - } - return () => { - if (colorSchemeQuery) { - colorSchemeQuery.removeEventListener('change', trackColorSchemeChoice); - } - }; - }, []); -}; - -const removeExistingLinks = (existingLinks) => { - existingLinks.forEach((link) => { - link.remove(); - }); -}; - -/** - * Adds/updates a `` element in the HTML document to load the core application theme CSS. - * - * @memberof module:React - * @param {object} args - * @param {object} args.themeCore Object representing the core Paragon theme CSS. - * @param {string} args.onLoad A callback function called when the core theme CSS is loaded. - */ -export const useParagonThemeCore = ({ - themeCore, - onLoad, -}) => { - const [isParagonThemeCoreLoaded, setIsParagonThemeCoreLoaded] = useState(false); - const [isBrandThemeCoreLoaded, setIsBrandThemeCoreLoaded] = useState(false); - - useEffect(() => { - // Call `onLoad` once both the paragon and brand theme core are loaded. - if (isParagonThemeCoreLoaded && isBrandThemeCoreLoaded) { - onLoad(); - } - }, [isParagonThemeCoreLoaded, isBrandThemeCoreLoaded, onLoad]); - - useEffect(() => { - // If there is no config for the core theme url, do nothing. - if (!themeCore?.urls) { - setIsParagonThemeCoreLoaded(true); - setIsBrandThemeCoreLoaded(true); - return; - } - const getParagonThemeCoreLink = () => document.head.querySelector('link[data-paragon-theme-core="true"'); - const existingCoreThemeLink = document.head.querySelector(`link[href='${themeCore.urls.default}']`); - if (!existingCoreThemeLink) { - const getExistingCoreThemeLinks = (isBrandOverride) => { - const coreThemeLinkSelector = `link[data-${isBrandOverride ? 'brand' : 'paragon'}-theme-core="true"]`; - return document.head.querySelectorAll(coreThemeLinkSelector); - }; - const createCoreThemeLink = ( - url, - { - isFallbackThemeUrl = false, - isBrandOverride = false, - } = {}, - ) => { - let coreThemeLink = document.createElement('link'); - coreThemeLink.href = url; - coreThemeLink.rel = 'stylesheet'; - if (isBrandOverride) { - coreThemeLink.dataset.brandThemeCore = true; - } else { - coreThemeLink.dataset.paragonThemeCore = true; - } - coreThemeLink.onload = () => { - if (isBrandOverride) { - setIsBrandThemeCoreLoaded(true); - } else { - setIsParagonThemeCoreLoaded(true); - } - }; - coreThemeLink.onerror = () => { - logError(`Failed to load core theme CSS from ${url}`); - if (isFallbackThemeUrl) { - logError(`Could not load core theme CSS from ${url} or fallback URL. Aborting.`); - if (isBrandOverride) { - setIsBrandThemeCoreLoaded(true); - } else { - setIsParagonThemeCoreLoaded(true); - } - const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); - removeExistingLinks(otherExistingLinks); - return; - } - const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; - const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; - if (themeUrls.core) { - const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.core.fileName}`; - logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); - coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true, isBrandOverride }); - const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); - removeExistingLinks(otherExistingLinks); - const foundParagonThemCoreLink = getParagonThemeCoreLink(); - if (foundParagonThemCoreLink) { - foundParagonThemCoreLink.insertAdjacentElement( - 'afterend', - coreThemeLink, - ); - } else { - document.head.insertAdjacentElement( - 'afterbegin', - coreThemeLink, - ); - } - } else { - logError(`Failed to load core theme CSS from ${url} or fallback URL. Aborting.`); - } - }; - return coreThemeLink; - }; - - const paragonCoreThemeLink = createCoreThemeLink(themeCore.urls.default); - document.head.insertAdjacentElement( - 'afterbegin', - paragonCoreThemeLink, - ); - - if (themeCore.urls.brandOverride) { - const brandCoreThemeLink = createCoreThemeLink(themeCore.urls.brandOverride, { isBrandOverride: true }); - const foundParagonThemeCoreLink = getParagonThemeCoreLink(); - if (foundParagonThemeCoreLink) { - foundParagonThemeCoreLink.insertAdjacentElement( - 'afterend', - brandCoreThemeLink, - ); - } else { - document.head.insertAdjacentElement( - 'afterbegin', - brandCoreThemeLink, - ); - } - } else { - setIsBrandThemeCoreLoaded(true); - } - } - }, [themeCore?.urls, onLoad]); -}; - -/** - * Adds/updates a `` element in the HTML document to load each theme variant's CSS, setting the - * non-current theme variants as "alternate" stylesheets. That is, the browser will still download - * the CSS for the non-current theme variants, but at a lower priority than the current theme - * variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new - * theme variant will already be loaded. - * - * @memberof module:React - * @param {object} args - * @param {object} [args.themeVariants] An object containing the URLs for each supported theme variant, e.g.: `{ light: { url: 'https://path/to/light.css' } }`. - * @param {string} [args.currentThemeVariant] The currently applied theme variant, e.g.: `light`. - * @param {string} args.onLoad A callback function called when the theme variant(s) CSS is loaded. - */ -const useParagonThemeVariants = ({ - themeVariants, - currentThemeVariant, - onLoad, -}) => { - const [isParagonThemeVariantLoaded, setIsParagonThemeVariantLoaded] = useState(false); - const [isBrandThemeVariantLoaded, setIsBrandThemeVariantLoaded] = useState(false); - - useEffect(() => { - // Call `onLoad` once both the paragon and brand theme variant are loaded. - if (isParagonThemeVariantLoaded && isBrandThemeVariantLoaded) { - onLoad(); - } - }, [isParagonThemeVariantLoaded, isBrandThemeVariantLoaded, onLoad]); - - useEffect(() => { - if (!themeVariants) { - return; - } - - /** - * Determines the value for the `rel` attribute for a given theme variant based - * on if its the currently applied variant. - */ - const generateStylesheetRelAttr = (themeVariant) => (currentThemeVariant === themeVariant ? 'stylesheet' : 'alternate stylesheet'); - - /** - * Iterate over each theme variant URL and inject it into the HTML document, if it doesn't already exist. - */ - Object.entries(themeVariants).forEach(([themeVariant, value]) => { - // If there is no config for the theme variant URL, set the theme variant to loaded and continue. - if (!value.urls) { - setIsParagonThemeVariantLoaded(true); - setIsBrandThemeVariantLoaded(true); - return; - } - const getParagonThemeVariantLink = () => document.head.querySelector(`link[data-paragon-theme-variant='${themeVariant}']`); - const existingThemeVariantLink = document.head.querySelector(`link[href='${value.urls.default}']`); - const stylesheetRelForVariant = generateStylesheetRelAttr(themeVariant); - if (!existingThemeVariantLink) { - const getExistingThemeVariantLinks = (isBrandOverride) => { - const themeVariantLinkSelector = `link[data-${isBrandOverride ? 'brand' : 'paragon'}-theme-variant='${themeVariant}']`; - return document.head.querySelectorAll(themeVariantLinkSelector); - }; - const createThemeVariantLink = ( - url, - { - isFallbackThemeUrl = false, - isBrandOverride = false, - } = {}, - ) => { - let themeVariantLink = document.createElement('link'); - themeVariantLink.href = url; - themeVariantLink.rel = 'stylesheet'; - if (isBrandOverride) { - themeVariantLink.dataset.brandThemeVariant = themeVariant; - } else { - themeVariantLink.dataset.paragonThemeVariant = themeVariant; - } - themeVariantLink.onload = () => { - if (themeVariant === currentThemeVariant) { - if (isBrandOverride) { - setIsBrandThemeVariantLoaded(true); - } else { - setIsParagonThemeVariantLoaded(true); - } - } else { - const existingLinks = getExistingThemeVariantLinks(isBrandOverride); - removeExistingLinks(existingLinks); - } - }; - themeVariantLink.onerror = () => { - logError(`Failed to load theme variant (${themeVariant}) CSS from ${value.urls.default}`); - if (isFallbackThemeUrl) { - logError(`Could not load theme variant (${themeVariant}) CSS from fallback URL. Aborting.`); - if (isBrandOverride) { - setIsBrandThemeVariantLoaded(true); - } else { - setIsParagonThemeVariantLoaded(true); - } - const otherExistingLinks = getExistingThemeVariantLinks(isBrandOverride); - removeExistingLinks(otherExistingLinks); - return; - } - const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; - const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; - if (themeUrls.variants) { - const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.variants[themeVariant].fileName}`; - logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); - themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl, { - isFallbackThemeUrl: true, - isBrandOverride, - }); - const otherExistingLinks = getExistingThemeVariantLinks(isBrandOverride); - removeExistingLinks(otherExistingLinks); - const foundParagonThemeVariantLink = getParagonThemeVariantLink(); - if (foundParagonThemeVariantLink) { - foundParagonThemeVariantLink.insertAdjacentElement( - 'afterend', - themeVariantLink, - ); - } else { - document.head.insertAdjacentElement( - 'afterbegin', - themeVariantLink, - ); - } - } else { - logError(`Failed to load theme variant (${themeVariant}) CSS from ${url} or fallback URL. Aborting.`); - } - }; - return themeVariantLink; - }; - - const paragonThemeVariantLink = createThemeVariantLink(value.urls.default); - document.head.insertAdjacentElement( - 'afterbegin', - paragonThemeVariantLink, - ); - - if (value.urls.brandOverride) { - const brandThemeVariantLink = createThemeVariantLink(value.urls.brandOverride, { isBrandOverride: true }); - const foundParagonThemeVariantLink = getParagonThemeVariantLink(); - if (foundParagonThemeVariantLink) { - foundParagonThemeVariantLink.insertAdjacentElement( - 'afterend', - brandThemeVariantLink, - ); - } else { - document.head.insertAdjacentElement( - 'afterbegin', - brandThemeVariantLink, - ); - } - } else { - setIsBrandThemeVariantLoaded(true); - } - } else if (existingThemeVariantLink.rel !== stylesheetRelForVariant) { - existingThemeVariantLink.rel = stylesheetRelForVariant; - } - }); - }, [themeVariants, currentThemeVariant, onLoad]); -}; - -const handleParagonVersionSubstitution = (url, { isBrandOverride = false } = {}) => { - const localVersion = isBrandOverride ? PARAGON_THEME?.brand?.version : PARAGON_THEME?.paragon?.version; - const wildcardKeyword = isBrandOverride ? '$brandVersion' : '$paragonVersion'; - if (!url || !url.includes(wildcardKeyword) || !localVersion) { - return url; - } - return url.replace(wildcardKeyword, localVersion); -}; - -/** - * @typedef {Object} ParagonThemeUrl - * @property {string} default The default URL for Paragon. - * @property {string} brandOverride The URL for a brand override. - */ - -/** - * @typedef {Object} ParagonThemeCore - * @property {ParagonThemeUrl|string} url - */ - -/** - * @typedef {Object} ParagonThemeVariant - * @property {ParagonThemeUrl|string} url - * @property {boolean} default Whether this is the default theme variant. - * @property {boolean} dark Whether this is the dark theme variant to use for `prefers-color-scheme: "dark"`. - */ - -/** - * @typedef {Object} ParagonThemeUrls - * @property {ParagonThemeCore} core - * @property {Object.} variants - */ - -/** - * Returns an object containing the URLs for the theme's core CSS and any theme variants. - * - * @param {*} config - * @returns {ParagonThemeUrls|undefined} An object containing the URLs for the theme's core CSS and any theme variants. - */ -const useParagonThemeUrls = (config) => useMemo(() => { - if (!config.PARAGON_THEME_URLS) { - return undefined; - } - /** @type {ParagonThemeUrls} */ - const paragonThemeUrls = config.PARAGON_THEME_URLS; - const paragonCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.default : paragonThemeUrls.core.url; - const brandCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.brandOverride : undefined; - const coreCss = { - default: handleParagonVersionSubstitution(paragonCoreCssUrl), - brandOverride: handleParagonVersionSubstitution(brandCoreCssUrl, { isBrandOverride: true }), - }; - - const themeVariantsCss = {}; - const themeVariantsEntries = Object.entries(paragonThemeUrls.variants || {}); - themeVariantsEntries.forEach(([themeVariant, { - url, urls, default: isDefaultThemeVariant, dark, - }]) => { - const themeVariantMetadata = { - default: isDefaultThemeVariant, - dark, - }; - if (url) { - themeVariantMetadata.urls = { - default: handleParagonVersionSubstitution(url), - }; - } else { - themeVariantMetadata.urls = { - default: handleParagonVersionSubstitution(urls.default), - brandOverride: handleParagonVersionSubstitution(urls.brandOverride, { isBrandOverride: true }), - }; - } - themeVariantsCss[themeVariant] = themeVariantMetadata; - }); - - const hasMissingCssUrls = !coreCss.default || Object.keys(themeVariantsCss).length === 0; - if (hasMissingCssUrls) { - if (!PARAGON_THEME) { - return undefined; - } - const themeVariants = {}; - const prependBaseUrl = (url) => `${config.BASE_URL}/${url}`; - themeVariantsEntries.forEach(([themeVariant, { fileName, ...rest }]) => { - themeVariants[themeVariant] = { - url: prependBaseUrl(fileName), - ...rest, - }; - }); - return { - core: { urls: coreCss }, - variants: themeVariants, - }; - } - - return { - core: { urls: coreCss }, - variants: themeVariantsCss, - }; -}, [config.BASE_URL, config.PARAGON_THEME_URLS]); - -/** - * Finds the default theme variant from the given theme variants object. If no default theme exists, the first theme - * variant is returned as a fallback. - * @param {Object.|undefined} themeVariants - * - * @returns {ParagonThemeVariant|undefined} The default theme variant. - */ -const getDefaultThemeVariant = (themeVariants) => { - if (!themeVariants) { - return undefined; - } - const themeVariantKeys = Object.keys(themeVariants); - if (themeVariantKeys.length === 0) { - return undefined; - } - if (themeVariantKeys.length === 1) { - return { - name: themeVariantKeys[0], - metadata: themeVariants[themeVariantKeys[0]], - }; - } - const foundDefaultThemeVariant = Object.values(themeVariants) - .find(({ default: isDefault }) => isDefault === true); - - if (!foundDefaultThemeVariant) { - return undefined; - } - return { - name: foundDefaultThemeVariant[0], - metadata: foundDefaultThemeVariant[1], - }; -}; - -/** - * Given the inputs of URLs to the CSS for the core application theme and the theme variants (e.g., light), this hook - * will inject the CSS as `` elements into the HTML document, loading each theme variant's CSS with an appropriate - * priority based on whether its the currently active theme variant. This is done using "alternate" stylesheets. That - * is,the browser will still download the CSS for the non-current theme variants, but at a lower priority than the - * current theme variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new theme - * variant will already be loaded. - * - * @memberof module:React - * @param {object} config An object containing the URLs for the theme's core CSS and any theme (i.e., `getConfig()`) - * - * @returns An array containing 2 elements: 1) an object containing the app - * theme state, and 2) a dispatch function to mutate the app theme state. - */ -export const useParagonTheme = (config) => { - const paragonThemeUrls = useParagonThemeUrls(config); - const { - core: themeCore, - variants: themeVariants, - } = paragonThemeUrls || {}; - const initialParagonThemeState = { - isThemeLoaded: false, - themeVariant: getDefaultThemeVariant(themeVariants)?.name, - }; - const [themeState, dispatch] = useReducer(paragonThemeReducer, initialParagonThemeState); - - const [isCoreThemeLoaded, setIsCoreThemeLoaded] = useState(false); - const onLoadThemeCore = useCallback(() => { - setIsCoreThemeLoaded(true); - }, []); - - const [hasLoadedThemeVariants, setHasLoadedThemeVariants] = useState(false); - const onLoadThemeVariants = useCallback(() => { - setHasLoadedThemeVariants(true); - }, []); - - // load the core theme CSS - useParagonThemeCore({ - themeCore, - onLoad: onLoadThemeCore, - }); - - // load the theme variant(s) CSS - useParagonThemeVariants({ - themeVariants, - onLoad: onLoadThemeVariants, - currentThemeVariant: themeState.themeVariant, - }); - - useEffect(() => { - // theme is already loaded, do nothing - if (themeState.isThemeLoaded) { - return; - } - - const hasThemeConfig = (themeCore?.urls && Object.keys(themeVariants).length > 0); - if (!hasThemeConfig) { - // no theme URLs to load, set loading to false. - dispatch(paragonThemeActions.setParagonThemeLoaded(true)); - } - - const isDefaultThemeLoaded = (isCoreThemeLoaded && hasLoadedThemeVariants); - if (!isDefaultThemeLoaded) { - return; - } - - // All application theme URLs are loaded - dispatch(paragonThemeActions.setParagonThemeLoaded(true)); - }, [ - themeState.isThemeLoaded, - isCoreThemeLoaded, - hasLoadedThemeVariants, - themeCore?.urls, - themeVariants, - ]); - - return [themeState, dispatch]; -}; diff --git a/src/react/hooks/index.js b/src/react/hooks/index.js new file mode 100644 index 000000000..059a04a4c --- /dev/null +++ b/src/react/hooks/index.js @@ -0,0 +1,3 @@ +export { default as useAppEvent } from './useAppEvent'; + +export * from './paragon'; diff --git a/src/react/hooks/paragon/index.js b/src/react/hooks/paragon/index.js new file mode 100644 index 000000000..bda7abb66 --- /dev/null +++ b/src/react/hooks/paragon/index.js @@ -0,0 +1,2 @@ +export { default as useTrackColorSchemeChoice } from './useTrackColorSchemeChoice'; +export { default as useParagonTheme } from './useParagonTheme'; diff --git a/src/react/hooks/paragon/useParagonTheme.js b/src/react/hooks/paragon/useParagonTheme.js new file mode 100644 index 000000000..5fd8c49cd --- /dev/null +++ b/src/react/hooks/paragon/useParagonTheme.js @@ -0,0 +1,109 @@ +import { + useCallback, useEffect, useReducer, useState, +} from 'react'; +import useParagonThemeUrls from './useParagonThemeUrls'; +import { getDefaultThemeVariant } from './utils'; +import { paragonThemeActions, paragonThemeReducer } from '../../reducers'; +import useParagonThemeCore from './useParagonThemeCore'; +import { SELECTED_THEME_VARIANT_KEY } from '../../constants'; +import { logError } from '../../../logging'; +import useParagonThemeVariants from './useParagonThemeVariants'; + +/** + * Given the inputs of URLs to the CSS for the core application theme and the theme variants (e.g., light), this hook + * will inject the CSS as `` elements into the HTML document, loading each theme variant's CSS with an appropriate + * priority based on whether its the currently active theme variant. This is done using "alternate" stylesheets. That + * is,the browser will still download the CSS for the non-current theme variants, but at a lower priority than the + * current theme variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new theme + * variant will already be loaded. + * + * @memberof module:React + * @param {object} config An object containing the URLs for the theme's core CSS and any theme (i.e., `getConfig()`) + * + * @returns An array containing 2 elements: 1) an object containing the app + * theme state, and 2) a dispatch function to mutate the app theme state. + */ +const useParagonTheme = (config) => { + const paragonThemeUrls = useParagonThemeUrls(config); + const { + core: themeCore, + defaults: themeVariantDefaults, + variants: themeVariants, + } = paragonThemeUrls || {}; + const initialParagonThemeState = { + isThemeLoaded: false, + themeVariant: getDefaultThemeVariant({ themeVariants, themeVariantDefaults })?.name, + }; + const [themeState, dispatch] = useReducer(paragonThemeReducer, initialParagonThemeState); + + const [isCoreThemeLoaded, setIsCoreThemeLoaded] = useState(false); + const onLoadThemeCore = useCallback(() => { + setIsCoreThemeLoaded(true); + }, []); + + const [hasLoadedThemeVariants, setHasLoadedThemeVariants] = useState(false); + const onLoadThemeVariants = useCallback(() => { + setHasLoadedThemeVariants(true); + }, []); + + // load the core theme CSS + useParagonThemeCore({ + themeCore, + onLoad: onLoadThemeCore, + }); + + // respond to system preference changes with regard to `prefers-color-scheme: dark`. + const handleDarkModeSystemPreferenceChange = useCallback((prefersDarkMode) => { + // Ignore system preference change if the theme variant is already set in localStorage. + if (localStorage.getItem(SELECTED_THEME_VARIANT_KEY)) { + return; + } + + if (prefersDarkMode && themeVariantDefaults.dark) { + dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.dark)); + } else if (!prefersDarkMode && themeVariantDefaults.light) { + dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.light)); + } else { + logError(`Could not set theme variant based on system preference (prefers dark mode: ${prefersDarkMode})`, themeVariantDefaults, themeVariants); + } + }, [themeVariantDefaults, themeVariants]); + + // load the theme variant(s) CSS + useParagonThemeVariants({ + themeVariants, + onLoad: onLoadThemeVariants, + currentThemeVariant: themeState.themeVariant, + onDarkModeSystemPreferenceChange: handleDarkModeSystemPreferenceChange, + }); + + useEffect(() => { + // theme is already loaded, do nothing + if (themeState.isThemeLoaded) { + return; + } + + const hasThemeConfig = (themeCore?.urls && Object.keys(themeVariants).length > 0); + if (!hasThemeConfig) { + // no theme URLs to load, set loading to false. + dispatch(paragonThemeActions.setParagonThemeLoaded(true)); + } + + // Return early if neither the core theme CSS nor any theme variant CSS is loaded. + if (!isCoreThemeLoaded || !hasLoadedThemeVariants) { + return; + } + + // All application theme URLs are loaded + dispatch(paragonThemeActions.setParagonThemeLoaded(true)); + }, [ + themeState.isThemeLoaded, + isCoreThemeLoaded, + hasLoadedThemeVariants, + themeCore?.urls, + themeVariants, + ]); + + return [themeState, dispatch]; +}; + +export default useParagonTheme; diff --git a/src/react/hooks/paragon/useParagonThemeCore.js b/src/react/hooks/paragon/useParagonThemeCore.js new file mode 100644 index 000000000..f1090d52e --- /dev/null +++ b/src/react/hooks/paragon/useParagonThemeCore.js @@ -0,0 +1,133 @@ +import { useEffect, useState } from 'react'; + +import { logError, logInfo } from '../../../logging'; +import { removeExistingLinks } from './utils'; +import { getConfig } from '../../../config'; + +/** + * Adds/updates a `` element in the HTML document to load the core application theme CSS. + * + * @memberof module:React + * + * @param {object} args + * @param {object} args.themeCore Object representing the core Paragon theme CSS. + * @param {string} args.onLoad A callback function called when the core theme CSS is loaded. + */ +const useParagonThemeCore = ({ + themeCore, + onLoad, +}) => { + const [isParagonThemeCoreLoaded, setIsParagonThemeCoreLoaded] = useState(false); + const [isBrandThemeCoreLoaded, setIsBrandThemeCoreLoaded] = useState(false); + + useEffect(() => { + // Call `onLoad` once both the paragon and brand theme core are loaded. + if (isParagonThemeCoreLoaded && isBrandThemeCoreLoaded) { + onLoad(); + } + }, [isParagonThemeCoreLoaded, isBrandThemeCoreLoaded, onLoad]); + + useEffect(() => { + // If there is no config for the core theme url, do nothing. + if (!themeCore?.urls) { + setIsParagonThemeCoreLoaded(true); + setIsBrandThemeCoreLoaded(true); + return; + } + const getParagonThemeCoreLink = () => document.head.querySelector('link[data-paragon-theme-core="true"'); + const existingCoreThemeLink = document.head.querySelector(`link[href='${themeCore.urls.default}']`); + if (!existingCoreThemeLink) { + const getExistingCoreThemeLinks = (isBrandOverride) => { + const coreThemeLinkSelector = `link[data-${isBrandOverride ? 'brand' : 'paragon'}-theme-core="true"]`; + return document.head.querySelectorAll(coreThemeLinkSelector); + }; + const createCoreThemeLink = ( + url, + { + isFallbackThemeUrl = false, + isBrandOverride = false, + } = {}, + ) => { + let coreThemeLink = document.createElement('link'); + coreThemeLink.href = url; + coreThemeLink.rel = 'stylesheet'; + if (isBrandOverride) { + coreThemeLink.dataset.brandThemeCore = true; + } else { + coreThemeLink.dataset.paragonThemeCore = true; + } + coreThemeLink.onload = () => { + if (isBrandOverride) { + setIsBrandThemeCoreLoaded(true); + } else { + setIsParagonThemeCoreLoaded(true); + } + }; + coreThemeLink.onerror = () => { + logError(`Failed to load core theme CSS from ${url}`); + if (isFallbackThemeUrl) { + logError(`Could not load core theme CSS from ${url} or fallback URL. Aborting.`); + if (isBrandOverride) { + setIsBrandThemeCoreLoaded(true); + } else { + setIsParagonThemeCoreLoaded(true); + } + const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); + removeExistingLinks(otherExistingLinks); + return; + } + const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; + const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; + if (themeUrls.core) { + const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.core.fileName}`; + logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); + coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true, isBrandOverride }); + const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); + removeExistingLinks(otherExistingLinks); + const foundParagonThemCoreLink = getParagonThemeCoreLink(); + if (foundParagonThemCoreLink) { + foundParagonThemCoreLink.insertAdjacentElement( + 'afterend', + coreThemeLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + coreThemeLink, + ); + } + } else { + logError(`Failed to load core theme CSS from ${url} or fallback URL. Aborting.`); + } + }; + return coreThemeLink; + }; + + const paragonCoreThemeLink = createCoreThemeLink(themeCore.urls.default); + document.head.insertAdjacentElement( + 'afterbegin', + paragonCoreThemeLink, + ); + + if (themeCore.urls.brandOverride) { + const brandCoreThemeLink = createCoreThemeLink(themeCore.urls.brandOverride, { isBrandOverride: true }); + const foundParagonThemeCoreLink = getParagonThemeCoreLink(); + if (foundParagonThemeCoreLink) { + foundParagonThemeCoreLink.insertAdjacentElement( + 'afterend', + brandCoreThemeLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + brandCoreThemeLink, + ); + } + } else { + setIsBrandThemeCoreLoaded(true); + } + } + }, [themeCore?.urls, onLoad]); +}; + +export default useParagonThemeCore; diff --git a/src/react/hooks/paragon/useParagonThemeCore.test.js b/src/react/hooks/paragon/useParagonThemeCore.test.js new file mode 100644 index 000000000..1eecf876c --- /dev/null +++ b/src/react/hooks/paragon/useParagonThemeCore.test.js @@ -0,0 +1,101 @@ +import { renderHook, act } from '@testing-library/react-hooks'; +import { getConfig } from '../../../config'; +import { logError } from '../../../logging'; +import useParagonThemeCore from './useParagonThemeCore'; + +jest.mock('../../../logging'); + +describe('useParagonThemeCore', () => { + const themeOnLoad = jest.fn(); + + afterEach(() => { + document.head.innerHTML = ''; + jest.clearAllMocks(); + }); + + it('should load the core url and change the loading state to true', () => { + const coreConfig = { + themeCore: { + urls: { default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css' }, + }, + onLoad: themeOnLoad, + }; + + renderHook(() => useParagonThemeCore(coreConfig)); + const createdLinkTag = document.head.querySelector('link'); + act(() => createdLinkTag.onload()); + expect(createdLinkTag.href).toBe(coreConfig.themeCore.urls.default); + expect(themeOnLoad).toHaveBeenCalledTimes(1); + }); + + it('should load the core default and brand url and change the loading state to true', () => { + const coreConfig = { + themeCore: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0Version/dist/core.min.css', + }, + }, + onLoad: themeOnLoad, + }; + + renderHook(() => useParagonThemeCore(coreConfig)); + const createdLinkTag = document.head.querySelector('link[data-paragon-theme-core="true"]'); + const createdBrandLinkTag = document.head.querySelector('link[data-brand-theme-core="true"]'); + + act(() => { createdLinkTag.onload(); createdBrandLinkTag.onload(); }); + expect(createdLinkTag.href).toBe(coreConfig.themeCore.urls.default); + expect(createdBrandLinkTag.href).toBe(coreConfig.themeCore.urls.brandOverride); + expect(themeOnLoad).toHaveBeenCalledTimes(1); + }); + + it('should dispatch a log error and fallback to PARAGON_THEME if can not load the core theme link', () => { + global.PARAGON_THEME = { + paragon: { + version: '1.0.0', + themeUrls: { + core: { + fileName: 'core.min.css', + }, + defaults: { + light: 'light', + }, + variants: { + light: { + fileName: 'light.min.css', + }, + }, + }, + }, + }; + const coreConfig = { + themeCore: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', + }, + }, + onLoad: themeOnLoad, + }; + + renderHook(() => useParagonThemeCore(coreConfig)); + const createdLinkTag = document.head.querySelector('link[data-paragon-theme-core="true"]'); + + act(() => { createdLinkTag.onerror(); }); + expect(logError).toHaveBeenCalledTimes(1); + expect(logError).toHaveBeenCalledWith(`Failed to load core theme CSS from ${coreConfig.themeCore.urls.default}`); + expect(document.querySelector('link').href).toBe(`${getConfig().BASE_URL}/${PARAGON_THEME.paragon.themeUrls.core.fileName}`); + }); + + it('should not create any core link if can not find themeCore urls definition', () => { + const coreConfig = { + themeCore: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', + }, + onLoad: themeOnLoad, + }; + + renderHook(() => useParagonThemeCore(coreConfig)); + expect(document.head.querySelectorAll('link').length).toBe(0); + expect(themeOnLoad).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/react/hooks/paragon/useParagonThemeUrls.js b/src/react/hooks/paragon/useParagonThemeUrls.js new file mode 100644 index 000000000..b1721e74a --- /dev/null +++ b/src/react/hooks/paragon/useParagonThemeUrls.js @@ -0,0 +1,85 @@ +import { useMemo } from 'react'; +import { handleVersionSubstitution } from './utils'; + +/** + * Returns an object containing the URLs for the theme's core CSS and any theme variants. + * + * @param {*} config + * @returns {ParagonThemeUrls|undefined} An object containing the URLs for the theme's core CSS and any theme variants. + */ +const useParagonThemeUrls = (config) => useMemo(() => { + if (!config?.PARAGON_THEME_URLS) { + return undefined; + } + const paragonThemeUrls = config.PARAGON_THEME_URLS; + const paragonCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.default : paragonThemeUrls.core.url; + const brandCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.brandOverride : undefined; + const defaultThemeVariants = paragonThemeUrls.defaults; + + // Local versions of @edx/paragon and @edx/brand + const localParagonVersion = PARAGON_THEME?.paragon?.version; + const localBrandVersion = PARAGON_THEME?.brand?.version; + + const coreCss = { + default: handleVersionSubstitution({ url: paragonCoreCssUrl, wildcardKeyword: '$paragonVersion', localVersion: localParagonVersion }), + brandOverride: handleVersionSubstitution({ url: brandCoreCssUrl, wildcardKeyword: '$brandVersion', localVersion: localBrandVersion }), + }; + + const themeVariantsCss = {}; + const themeVariantsEntries = Object.entries(paragonThemeUrls.variants || {}); + themeVariantsEntries.forEach(([themeVariant, { url, urls }]) => { + const themeVariantMetadata = { urls: null }; + if (url) { + themeVariantMetadata.urls = { + default: handleVersionSubstitution({ + url, + wildcardKeyword: '$paragonVersion', + localVersion: localParagonVersion, + }), + }; + } else { + themeVariantMetadata.urls = { + default: handleVersionSubstitution({ + url: urls.default, + wildcardKeyword: '$paragonVersion', + localVersion: localParagonVersion, + }), + brandOverride: handleVersionSubstitution({ + url: urls.brandOverride, + wildcardKeyword: '$brandVersion', + localVersion: localBrandVersion, + }), + }; + } + themeVariantsCss[themeVariant] = themeVariantMetadata; + }); + + const hasMissingCssUrls = !coreCss.default || Object.keys(themeVariantsCss).length === 0; + if (hasMissingCssUrls) { + if (!PARAGON_THEME) { + return undefined; + } + const themeVariants = {}; + const baseUrl = config.BASE_URL || window.location?.origin; + const prependBaseUrl = (url) => `${baseUrl}/${url}`; + themeVariantsEntries.forEach(([themeVariant, { fileName, ...rest }]) => { + themeVariants[themeVariant] = { + url: prependBaseUrl(fileName), + ...rest, + }; + }); + return { + core: { urls: coreCss }, + defaults: defaultThemeVariants, + variants: themeVariants, + }; + } + + return { + core: { urls: coreCss }, + defaults: defaultThemeVariants, + variants: themeVariantsCss, + }; +}, [config?.BASE_URL, config?.PARAGON_THEME_URLS]); + +export default useParagonThemeUrls; diff --git a/src/react/hooks/paragon/useParagonThemeUrls.test.js b/src/react/hooks/paragon/useParagonThemeUrls.test.js new file mode 100644 index 000000000..ff87c9a03 --- /dev/null +++ b/src/react/hooks/paragon/useParagonThemeUrls.test.js @@ -0,0 +1,101 @@ +import { renderHook } from '@testing-library/react-hooks'; + +import useParagonThemeUrls from './useParagonThemeUrls'; + +describe('useParagonThemeUrls', () => { + it.each([ + undefined, + {}, + ])('handles when `config.PARAGON_THEME_URLS` is not present', (config) => { + const { result } = renderHook(() => useParagonThemeUrls(config)); + expect(result.current).toEqual(undefined); + }); + + describe('when `config.PARAGON_THEME_URLS` is present', () => { + it('returns expected object when configuration is valid (only Paragon)', () => { + const config = { + PARAGON_THEME_URLS: { + core: { + url: 'core.css', + }, + defaults: { + light: 'light', + }, + variants: { + light: { + url: 'light.css', + }, + }, + }, + }; + const { result } = renderHook(() => useParagonThemeUrls(config)); + expect(result.current).toEqual( + expect.objectContaining({ + core: { + urls: { + default: 'core.css', + brandOverride: undefined, + }, + }, + defaults: { + light: 'light', + }, + variants: { + light: { + urls: { + default: 'light.css', + brandOverride: undefined, + }, + }, + }, + }), + ); + }); + + it('returns expected object when configuration is valid (both Paragon + brand)', () => { + const config = { + PARAGON_THEME_URLS: { + core: { + urls: { + default: 'core.css', + brandOverride: 'brand-core.css', + }, + }, + defaults: { + light: 'light', + }, + variants: { + light: { + urls: { + default: 'light.css', + brandOverride: 'brand-light.css', + }, + }, + }, + }, + }; + const { result } = renderHook(() => useParagonThemeUrls(config)); + expect(result.current).toEqual( + expect.objectContaining({ + core: { + urls: { + default: 'core.css', + brandOverride: 'brand-core.css', + }, + }, + defaults: { + light: 'light', + }, + variants: { + light: { + urls: { + default: 'light.css', + brandOverride: 'brand-light.css', + }, + }, + }, + }), + ); + }); + }); +}); diff --git a/src/react/hooks/paragon/useParagonThemeVariants.js b/src/react/hooks/paragon/useParagonThemeVariants.js new file mode 100644 index 000000000..efb8ef4c5 --- /dev/null +++ b/src/react/hooks/paragon/useParagonThemeVariants.js @@ -0,0 +1,196 @@ +import { useEffect, useState } from 'react'; +import { logError, logInfo } from '../../../logging'; +import { removeExistingLinks } from './utils'; +import { getConfig } from '../../../config'; + +/** + * Adds/updates a `` element in the HTML document to load each theme variant's CSS, setting the + * non-current theme variants as "alternate" stylesheets. That is, the browser will still download + * the CSS for the non-current theme variants, but at a lower priority than the current theme + * variant's CSS. This ensures that if the theme variant is changed at runtime, the CSS for the new + * theme variant will already be loaded. + * + * @memberof module:React + * @param {object} args + * @param {object} [args.themeVariants] An object containing the URLs for each supported theme variant, e.g.: `{ light: { url: 'https://path/to/light.css' } }`. + * @param {string} [args.currentThemeVariant] The currently applied theme variant, e.g.: `light`. + * @param {string} args.onLoad A callback function called when the theme variant(s) CSS is loaded. + */ +const useParagonThemeVariants = ({ + themeVariants, + currentThemeVariant, + onLoad, + onDarkModeSystemPreferenceChange, +}) => { + const [isParagonThemeVariantLoaded, setIsParagonThemeVariantLoaded] = useState(false); + const [isBrandThemeVariantLoaded, setIsBrandThemeVariantLoaded] = useState(false); + + useEffect(() => { + const someFn = (colorSchemeQuery) => { + onDarkModeSystemPreferenceChange(colorSchemeQuery.matches); + }; + const colorSchemeQuery = window.matchMedia?.('(prefers-color-scheme: dark)'); + if (colorSchemeQuery) { + colorSchemeQuery.addEventListener('change', someFn); + } + return () => { + if (colorSchemeQuery) { + colorSchemeQuery.removeEventListener('change', someFn); + } + }; + }, [onDarkModeSystemPreferenceChange]); + + useEffect(() => { + if (currentThemeVariant && themeVariants?.[currentThemeVariant]) { + const htmlDataThemeVariantAttr = 'data-paragon-theme-variant'; + document.querySelector('html').setAttribute(htmlDataThemeVariantAttr, currentThemeVariant); + return () => { + document.querySelector('html').removeAttribute(htmlDataThemeVariantAttr); + }; + } + return () => {}; // no-op + }, [themeVariants, currentThemeVariant]); + + useEffect(() => { + // Call `onLoad` once both the paragon and brand theme variant are loaded. + if (isParagonThemeVariantLoaded && isBrandThemeVariantLoaded) { + onLoad(); + } + }, [isParagonThemeVariantLoaded, isBrandThemeVariantLoaded, onLoad]); + + useEffect(() => { + if (!themeVariants) { + return; + } + + /** + * Determines the value for the `rel` attribute for a given theme variant based + * on if its the currently applied variant. + */ + const generateStylesheetRelAttr = (themeVariant) => (currentThemeVariant === themeVariant ? 'stylesheet' : 'alternate stylesheet'); + + // Iterate over each theme variant URL and inject it into the HTML document, if it doesn't already exist. + Object.entries(themeVariants).forEach(([themeVariant, value]) => { + // If there is no config for the theme variant URL, set the theme variant to loaded and continue. + if (!value.urls) { + setIsParagonThemeVariantLoaded(true); + setIsBrandThemeVariantLoaded(true); + return; + } + const getParagonThemeVariantLink = () => document.head.querySelector(`link[data-paragon-theme-variant='${themeVariant}']`); + const existingThemeVariantLink = document.head.querySelector(`link[href='${value.urls.default}']`); + const existingThemeVariantBrandLink = document.head.querySelector(`link[href='${value.urls.brandOverride}']`); + + const getExistingThemeVariantLinks = (isBrandOverride) => { + const themeVariantLinkSelector = `link[data-${isBrandOverride ? 'brand' : 'paragon'}-theme-variant='${themeVariant}']`; + return document.head.querySelectorAll(themeVariantLinkSelector); + }; + + const createThemeVariantLink = ( + url, + { + isFallbackThemeUrl = false, + isBrandOverride = false, + } = {}, + ) => { + let themeVariantLink = document.createElement('link'); + themeVariantLink.href = url; + themeVariantLink.rel = generateStylesheetRelAttr(themeVariant); + if (isBrandOverride) { + themeVariantLink.dataset.brandThemeVariant = themeVariant; + } else { + themeVariantLink.dataset.paragonThemeVariant = themeVariant; + } + + themeVariantLink.onload = () => { + if (themeVariant === currentThemeVariant) { + if (isBrandOverride) { + setIsBrandThemeVariantLoaded(true); + } else { + setIsParagonThemeVariantLoaded(true); + } + } + }; + + themeVariantLink.onerror = () => { + logError(`Failed to load theme variant (${themeVariant}) CSS from ${value.urls.default}`); + if (isFallbackThemeUrl) { + logError(`Could not load theme variant (${themeVariant}) CSS from fallback URL. Aborting.`); + if (isBrandOverride) { + setIsBrandThemeVariantLoaded(true); + } else { + setIsParagonThemeVariantLoaded(true); + } + const otherExistingLinks = getExistingThemeVariantLinks(isBrandOverride); + removeExistingLinks(otherExistingLinks); + return; + } + const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; + const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; + if (themeUrls.variants && themeUrls.variants[themeVariant]) { + const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.variants[themeVariant].fileName}`; + logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); + themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl, { + isFallbackThemeUrl: true, + isBrandOverride, + }); + const otherExistingLinks = getExistingThemeVariantLinks(isBrandOverride); + removeExistingLinks(otherExistingLinks); + const foundParagonThemeVariantLink = getParagonThemeVariantLink(); + if (foundParagonThemeVariantLink) { + foundParagonThemeVariantLink.insertAdjacentElement( + 'afterend', + themeVariantLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + themeVariantLink, + ); + } + } else { + logError(`Failed to load theme variant (${themeVariant}) CSS from ${url} and locally installed fallback URL is not available. Aborting.`); + if (isBrandOverride) { + setIsBrandThemeVariantLoaded(true); + } else { + setIsParagonThemeVariantLoaded(true); + } + } + }; + return themeVariantLink; + }; + + if (!existingThemeVariantLink) { + const paragonThemeVariantLink = createThemeVariantLink(value.urls.default); + document.head.insertAdjacentElement( + 'afterbegin', + paragonThemeVariantLink, + ); + + if (value.urls.brandOverride) { + const brandThemeVariantLink = createThemeVariantLink(value.urls.brandOverride, { isBrandOverride: true }); + const foundParagonThemeVariantLink = getParagonThemeVariantLink(); + if (foundParagonThemeVariantLink) { + foundParagonThemeVariantLink.insertAdjacentElement( + 'afterend', + brandThemeVariantLink, + ); + } else { + document.head.insertAdjacentElement( + 'afterbegin', + brandThemeVariantLink, + ); + } + } else { + setIsBrandThemeVariantLoaded(true); + } + } else { + const updatedStylesheetRel = generateStylesheetRelAttr(themeVariant); + existingThemeVariantLink.rel = updatedStylesheetRel; + existingThemeVariantBrandLink.rel = updatedStylesheetRel; + } + }); + }, [themeVariants, currentThemeVariant, onLoad]); +}; + +export default useParagonThemeVariants; diff --git a/src/react/hooks/paragon/useParagonThemeVariants.test.js b/src/react/hooks/paragon/useParagonThemeVariants.test.js new file mode 100644 index 000000000..d43dd5588 --- /dev/null +++ b/src/react/hooks/paragon/useParagonThemeVariants.test.js @@ -0,0 +1,140 @@ +import { act, renderHook } from '@testing-library/react-hooks'; +import { getConfig } from '../../../config'; +import { logError } from '../../../logging'; +import useParagonThemeVariants from './useParagonThemeVariants'; + +jest.mock('../../../logging'); + +const mockAddEventListener = jest.fn(); +const mockRemoveEventListener = jest.fn(); +const mockOnChange = jest.fn(); + +Object.defineProperty(window, 'matchMedia', { + value: jest.fn(() => ({ + addEventListener: mockAddEventListener, + removeEventListener: mockRemoveEventListener, + onchange: mockOnChange, + })), +}); + +describe('useParagonThemeVariants', () => { + const themeOnLoad = jest.fn(); + + afterEach(() => { + document.head.innerHTML = ''; + jest.clearAllMocks(); + }); + + it('should create the links tags for each theme variant and change the state to true when all variants are loaded', () => { + const themeVariants = { + light: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/light.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0/dist/light.min.css', + }, + }, + dark: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/dark.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0/dist/dark.min.css', + }, + }, + }; + const currentThemeVariant = 'light'; + + renderHook(() => useParagonThemeVariants({ themeVariants, currentThemeVariant, onLoad: themeOnLoad })); + const themeLinks = document.head.querySelectorAll('link'); + act(() => { themeLinks.forEach((link) => link.onload()); }); + + expect(themeLinks.length).toBe(4); + }); + + it('should dispatch a log error and fallback to PARAGON_THEME if can not load the variant theme link', () => { + global.PARAGON_THEME = { + paragon: { + version: '1.0.0', + themeUrls: { + core: { + fileName: 'core.min.css', + }, + defaults: { + light: 'light', + }, + variants: { + light: { + fileName: 'light.min.css', + }, + }, + }, + }, + }; + const themeVariants = { + light: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/light.min.css', + }, + }, + }; + const currentThemeVariant = 'light'; + + renderHook(() => useParagonThemeVariants({ themeVariants, currentThemeVariant, onLoad: themeOnLoad })); + const createdLinkTag = document.head.querySelector('link'); + act(() => { createdLinkTag.onerror(); }); + expect(logError).toHaveBeenCalledTimes(1); + expect(logError).toHaveBeenCalledWith(`Failed to load theme variant (${currentThemeVariant}) CSS from ${themeVariants.light.urls.default}`); + expect(document.querySelector('link').href).toBe(`${getConfig().BASE_URL}/${PARAGON_THEME.paragon.themeUrls.variants.light.fileName}`); + }); + + it('should configure theme variants according with system preference and add the change event listener', () => { + window.matchMedia['prefers-color-scheme'] = 'dark'; + + const themeVariants = { + light: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/light.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0/dist/light.min.css', + }, + }, + dark: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/dark.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0/dist/dark.min.css', + }, + }, + }; + + const currentThemeVariant = 'light'; + + renderHook(() => useParagonThemeVariants({ themeVariants, currentThemeVariant, onLoad: themeOnLoad })); + + const themeLinks = document.head.querySelectorAll('link'); + act(() => { themeLinks.forEach((link) => link.onload()); }); + + expect(mockAddEventListener).toHaveBeenCalledTimes(1); + }); + + it('should do nothing if themeVariants is not configured', () => { + const themeVariants = null; + const currentTheme = 'light'; + + renderHook(() => useParagonThemeVariants({ themeVariants, currentTheme, onLoad: themeOnLoad })); + expect(document.head.querySelectorAll('link').length).toBe(0); + }); + + it('should not create any core link if can not find themeVariant urls definition', () => { + const themeVariants = { + light: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/light.min.css', + }, + dark: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/dark.min.css', + }, + }; + + const currentTheme = 'light'; + + renderHook(() => useParagonThemeVariants({ themeVariants, currentTheme, onLoad: themeOnLoad })); + + expect(document.head.querySelectorAll('link').length).toBe(0); + }); +}); diff --git a/src/react/hooks/paragon/useTrackColorSchemeChoice.js b/src/react/hooks/paragon/useTrackColorSchemeChoice.js new file mode 100644 index 000000000..6f3abfecd --- /dev/null +++ b/src/react/hooks/paragon/useTrackColorSchemeChoice.js @@ -0,0 +1,31 @@ +import { useEffect } from 'react'; + +import { sendTrackEvent } from '../../../analytics'; + +/** + * A React hook that tracks user's preferred color scheme (light or dark) and sends respective + * event to the tracking service. + * + * @memberof module:React + */ +const useTrackColorSchemeChoice = () => { + useEffect(() => { + const trackColorSchemeChoice = ({ matches }) => { + const preferredColorScheme = matches ? 'dark' : 'light'; + sendTrackEvent('openedx.ui.frontend-platform.prefers-color-scheme.selected', { preferredColorScheme }); + }; + const colorSchemeQuery = window.matchMedia?.('(prefers-color-scheme: dark)'); + if (colorSchemeQuery) { + // send user's initial choice + trackColorSchemeChoice(colorSchemeQuery); + colorSchemeQuery.addEventListener('change', trackColorSchemeChoice); + } + return () => { + if (colorSchemeQuery) { + colorSchemeQuery.removeEventListener('change', trackColorSchemeChoice); + } + }; + }, []); +}; + +export default useTrackColorSchemeChoice; diff --git a/src/react/hooks.test.jsx b/src/react/hooks/paragon/useTrackColorSchemeChoice.test.js similarity index 84% rename from src/react/hooks.test.jsx rename to src/react/hooks/paragon/useTrackColorSchemeChoice.test.js index 48623a3b3..1c8bf5e4f 100644 --- a/src/react/hooks.test.jsx +++ b/src/react/hooks/paragon/useTrackColorSchemeChoice.test.js @@ -1,8 +1,13 @@ import { renderHook } from '@testing-library/react-hooks'; -import { useTrackColorSchemeChoice } from './hooks'; -import { sendTrackEvent } from '../analytics'; -jest.mock('../analytics'); +import { sendTrackEvent } from '../../../analytics'; + +import useTrackColorSchemeChoice from './useTrackColorSchemeChoice'; + +jest.mock('../../../analytics', () => ({ + ...jest.requireActual('../../../analytics'), + sendTrackEvent: jest.fn(), +})); const mockAddEventListener = jest.fn(); const mockRemoveEventListener = jest.fn(); @@ -16,7 +21,7 @@ Object.defineProperty(window, 'matchMedia', { })), }); -describe('useTrackColorSchemeChoice hook', () => { +describe('useTrackColorSchemeChoice', () => { afterEach(() => { mockAddEventListener.mockClear(); mockRemoveEventListener.mockClear(); diff --git a/src/react/hooks/paragon/utils.js b/src/react/hooks/paragon/utils.js new file mode 100644 index 000000000..8dee00646 --- /dev/null +++ b/src/react/hooks/paragon/utils.js @@ -0,0 +1,87 @@ +import { SELECTED_THEME_VARIANT_KEY } from '../../constants'; + +/** + * Iterates through each given `` element and removes it from the DOM. + * @param {HTMLLinkElement[]} existingLinks + */ +export const removeExistingLinks = (existingLinks) => { + existingLinks.forEach((link) => { + link.remove(); + }); +}; + +/** +* Finds the default theme variant from the given theme variants object. If no default theme exists, the first theme +* variant is returned as a fallback. +* @param {Object.|undefined} themeVariants +* +* @returns {ParagonThemeVariant|undefined} The default theme variant. +*/ +export const getDefaultThemeVariant = ({ themeVariants, themeVariantDefaults = {} }) => { + if (!themeVariants) { + return undefined; + } + + const themeVariantKeys = Object.keys(themeVariants); + + // Return early if there are no theme variants configured. + if (themeVariantKeys.length === 0) { + return undefined; + } + // If there is only one theme variant, return it since it's the only one that may be used. + if (themeVariantKeys.length === 1) { + const themeVariantKey = themeVariantKeys[0]; + return { + name: themeVariantKey, + metadata: themeVariants[themeVariantKey], + }; + } + // There's more than one theme variant configured; figured out which one to display based on + // the following preference rules: + // 1. Get theme preference from localStorage. + // 2. Detect user system settings. + // 3. Use the default theme variant as configured. + + // Prioritize persisted localStorage theme variant preference. + const persistedSelectedParagonThemeVariant = localStorage.getItem(SELECTED_THEME_VARIANT_KEY); + if (persistedSelectedParagonThemeVariant && themeVariants[persistedSelectedParagonThemeVariant]) { + return { + name: persistedSelectedParagonThemeVariant, + metadata: themeVariants[persistedSelectedParagonThemeVariant], + }; + } + + // Then, detect system preference via `prefers-color-scheme` media query and use + // the default dark theme variant, if one exists. + const hasDarkSystemPreference = !!window.matchMedia?.('(prefers-color-scheme: dark)')?.matches; + const defaultDarkThemeVariant = themeVariantDefaults.dark; + const darkThemeVariantMetadata = themeVariants[defaultDarkThemeVariant]; + + if (hasDarkSystemPreference && defaultDarkThemeVariant && darkThemeVariantMetadata) { + return { + name: defaultDarkThemeVariant, + metadata: darkThemeVariantMetadata, + }; + } + + const defaultLightThemeVariant = themeVariantDefaults.light; + const lightThemeVariantMetadata = themeVariants[defaultLightThemeVariant]; + + // Handle edge case where the default light theme variant is not configured or provided. + if (!defaultLightThemeVariant || !lightThemeVariantMetadata) { + return undefined; + } + + // Otherwise, fallback to using the default light theme variant as configured. + return { + name: defaultLightThemeVariant, + metadata: lightThemeVariantMetadata, + }; +}; + +export const handleVersionSubstitution = ({ url, wildcardKeyword, localVersion }) => { + if (!url || !url.includes(wildcardKeyword) || !localVersion) { + return url; + } + return url.replace(wildcardKeyword, localVersion); +}; diff --git a/src/react/hooks/useAppEvent.js b/src/react/hooks/useAppEvent.js new file mode 100644 index 000000000..ed06c3b7e --- /dev/null +++ b/src/react/hooks/useAppEvent.js @@ -0,0 +1,26 @@ +import { useEffect } from 'react'; + +import { subscribe, unsubscribe } from '../../pubSub'; + +/** + * A React hook that allows functional components to subscribe to application events. This should + * be used sparingly - for the most part, Context should be used higher-up in the application to + * provide necessary data to a given component, rather than utilizing a non-React-like Pub/Sub + * mechanism. + * + * @memberof module:React + * + * @param {string} type + * @param {function} callback + */ +const useAppEvent = (type, callback) => { + useEffect(() => { + const subscriptionToken = subscribe(type, callback); + + return function cleanup() { + unsubscribe(subscriptionToken); + }; + }, [callback, type]); +}; + +export default useAppEvent; From 20a9a1e60f488cc29f99bceb611e083c0e6b8074 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Wed, 8 May 2024 17:31:11 +1000 Subject: [PATCH 07/26] fix: update dependenices and AppProvider test --- package-lock.json | 28 ++++++++++++++++++- package.json | 4 ++- src/react/AppProvider.test.jsx | 3 +- .../hooks/paragon/useParagonThemeCore.js | 12 +++++++- .../hooks/paragon/useParagonThemeVariants.js | 8 +++++- src/setupTest.js | 1 + 6 files changed, 51 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b751f52bf..2c38b7e2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,9 +41,11 @@ "@testing-library/jest-dom": "6.5.0", "@testing-library/react": "12.1.5", "@testing-library/react-hooks": "^8.0.1", + "@testing-library/user-event": "14.4.3", "axios-mock-adapter": "^1.22.0", "husky": "8.0.3", "jest-environment-jsdom": "29.7.0", + "jest-localstorage-mock": "^2.4.26", "jsdoc": "^4.0.0", "nodemon": "3.1.7", "prop-types": "15.8.1", @@ -55,7 +57,7 @@ }, "peerDependencies": { "@openedx/frontend-build": ">= 14.0.0", - "@openedx/paragon": ">= 21.5.7 < 23.0.0", + "@openedx/paragon": ">= 21.5.7 < 23.0.0 || 23.0.0-alpha.4", "prop-types": ">=15.7.2 <16.0.0", "react": "^16.9.0 || ^17.0.0", "react-dom": "^16.9.0 || ^17.0.0", @@ -3948,6 +3950,20 @@ } } }, + "node_modules/@testing-library/user-event": { + "version": "14.4.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz", + "integrity": "sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -11681,6 +11697,16 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/jest-localstorage-mock": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.26.tgz", + "integrity": "sha512-owAJrYnjulVlMIXOYQIPRCCn3MmqI3GzgfZCXdD3/pmwrIvFMXcKVWZ+aMc44IzaASapg0Z4SEFxR+v5qxDA2w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.16.0" + } + }, "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", diff --git a/package.json b/package.json index a3142a37c..408c01820 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,11 @@ "@testing-library/jest-dom": "6.5.0", "@testing-library/react": "12.1.5", "@testing-library/react-hooks": "^8.0.1", + "@testing-library/user-event": "14.4.3", "axios-mock-adapter": "^1.22.0", "husky": "8.0.3", "jest-environment-jsdom": "29.7.0", + "jest-localstorage-mock": "^2.4.26", "jsdoc": "^4.0.0", "nodemon": "3.1.7", "prop-types": "15.8.1", @@ -75,7 +77,7 @@ }, "peerDependencies": { "@openedx/frontend-build": ">= 14.0.0", - "@openedx/paragon": ">= 21.5.7 < 23.0.0", + "@openedx/paragon": ">= 21.5.7 < 23.0.0 || 23.0.0-alpha.4", "prop-types": ">=15.7.2 <16.0.0", "react": "^16.9.0 || ^17.0.0", "react-dom": "^16.9.0 || ^17.0.0", diff --git a/src/react/AppProvider.test.jsx b/src/react/AppProvider.test.jsx index 71f076392..f82cceafa 100644 --- a/src/react/AppProvider.test.jsx +++ b/src/react/AppProvider.test.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { createStore } from 'redux'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import '@testing-library/jest-dom/extend-expect'; +import '@testing-library/jest-dom'; import AppProvider from './AppProvider'; import { initialize } from '../initialize'; @@ -32,6 +32,7 @@ jest.mock('../config', () => ({ REFRESH_ACCESS_TOKEN_ENDPOINT: 'localhost:18000/oauth2/access_token', ACCESS_TOKEN_COOKIE_NAME: 'access_token', CSRF_TOKEN_API_PATH: 'localhost:18000/csrf', + PUBLIC_PATH: '/', }), })); diff --git a/src/react/hooks/paragon/useParagonThemeCore.js b/src/react/hooks/paragon/useParagonThemeCore.js index f1090d52e..d3b5983bb 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.js +++ b/src/react/hooks/paragon/useParagonThemeCore.js @@ -34,8 +34,9 @@ const useParagonThemeCore = ({ setIsBrandThemeCoreLoaded(true); return; } - const getParagonThemeCoreLink = () => document.head.querySelector('link[data-paragon-theme-core="true"'); + const getParagonThemeCoreLink = () => document.head.querySelector('link[data-paragon-theme-core="true"]'); const existingCoreThemeLink = document.head.querySelector(`link[href='${themeCore.urls.default}']`); + const brandCoreLink = document.head.querySelector(`link[href='${themeCore.urls.brandOverride}']`); if (!existingCoreThemeLink) { const getExistingCoreThemeLinks = (isBrandOverride) => { const coreThemeLinkSelector = `link[data-${isBrandOverride ? 'brand' : 'paragon'}-theme-core="true"]`; @@ -126,6 +127,15 @@ const useParagonThemeCore = ({ } else { setIsBrandThemeCoreLoaded(true); } + } else { + existingCoreThemeLink.rel = 'stylesheet'; + existingCoreThemeLink.removeAttribute('as'); + if (brandCoreLink) { + brandCoreLink.rel = 'stylesheet'; + brandCoreLink.removeAttribute('as'); + } + setIsParagonThemeCoreLoaded(true); + setIsBrandThemeCoreLoaded(true); } }, [themeCore?.urls, onLoad]); }; diff --git a/src/react/hooks/paragon/useParagonThemeVariants.js b/src/react/hooks/paragon/useParagonThemeVariants.js index efb8ef4c5..737129ef9 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.js @@ -187,7 +187,13 @@ const useParagonThemeVariants = ({ } else { const updatedStylesheetRel = generateStylesheetRelAttr(themeVariant); existingThemeVariantLink.rel = updatedStylesheetRel; - existingThemeVariantBrandLink.rel = updatedStylesheetRel; + existingThemeVariantLink.removeAttribute('as'); + if (existingThemeVariantBrandLink) { + existingThemeVariantBrandLink.rel = updatedStylesheetRel; + existingThemeVariantBrandLink.removeAttribute('as'); + } + setIsParagonThemeVariantLoaded(true); + setIsBrandThemeVariantLoaded(true); } }); }, [themeVariants, currentThemeVariant, onLoad]); diff --git a/src/setupTest.js b/src/setupTest.js index f2513825c..2e8b273d8 100644 --- a/src/setupTest.js +++ b/src/setupTest.js @@ -1,5 +1,6 @@ /* eslint-disable import/no-extraneous-dependencies */ import '@testing-library/jest-dom'; +import 'jest-localstorage-mock'; // These configuration values are usually set in webpack's EnvironmentPlugin however // Jest does not use webpack so we need to set these so for testing From 4bb5ea0d38eb3dd509eb7857379f3b207c329ea3 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Fri, 10 May 2024 15:38:03 +1000 Subject: [PATCH 08/26] style: fix variable name and funtion --- src/react/hooks/paragon/useParagonThemeCore.js | 6 +++--- src/react/hooks/useAppEvent.js | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/react/hooks/paragon/useParagonThemeCore.js b/src/react/hooks/paragon/useParagonThemeCore.js index d3b5983bb..5dc3e902c 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.js +++ b/src/react/hooks/paragon/useParagonThemeCore.js @@ -85,9 +85,9 @@ const useParagonThemeCore = ({ coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true, isBrandOverride }); const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); removeExistingLinks(otherExistingLinks); - const foundParagonThemCoreLink = getParagonThemeCoreLink(); - if (foundParagonThemCoreLink) { - foundParagonThemCoreLink.insertAdjacentElement( + const foundParagonThemeCoreLink = getParagonThemeCoreLink(); + if (foundParagonThemeCoreLink) { + foundParagonThemeCoreLink.insertAdjacentElement( 'afterend', coreThemeLink, ); diff --git a/src/react/hooks/useAppEvent.js b/src/react/hooks/useAppEvent.js index ed06c3b7e..6bb08c54b 100644 --- a/src/react/hooks/useAppEvent.js +++ b/src/react/hooks/useAppEvent.js @@ -17,9 +17,7 @@ const useAppEvent = (type, callback) => { useEffect(() => { const subscriptionToken = subscribe(type, callback); - return function cleanup() { - unsubscribe(subscriptionToken); - }; + return () => unsubscribe(subscriptionToken); }, [callback, type]); }; From d4c817b863af992adc2ac1fc8f0c530f61fb3eff Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Sat, 11 May 2024 10:22:45 +1000 Subject: [PATCH 09/26] test: add useParagonTheme test --- .../hooks/paragon/useParagonTheme.test.js | 91 +++++++++++++++++++ .../paragon/useParagonThemeVariants.test.js | 40 -------- 2 files changed, 91 insertions(+), 40 deletions(-) create mode 100644 src/react/hooks/paragon/useParagonTheme.test.js diff --git a/src/react/hooks/paragon/useParagonTheme.test.js b/src/react/hooks/paragon/useParagonTheme.test.js new file mode 100644 index 000000000..93027f62c --- /dev/null +++ b/src/react/hooks/paragon/useParagonTheme.test.js @@ -0,0 +1,91 @@ +import { act, renderHook } from '@testing-library/react-hooks'; +import useParagonTheme from './useParagonTheme'; +import { getConfig } from '../../../config'; + +jest.mock('../../../config', () => ({ + ...jest.requireActual('.../../../config'), + getConfig: jest.fn().mockReturnValue({ + PARAGON_THEME_URLS: { + core: { + urls: { + default: 'core.css', + }, + }, + defaults: { + light: 'light', + dark: 'dark', + }, + variants: { + light: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/light.min.css', + }, + }, + dark: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/dark.min.css', + }, + }, + }, + }, + }), +})); + +let mockMediaQueryListEvent; +const mockAddEventListener = jest.fn((dispatch, fn) => fn(mockMediaQueryListEvent)); +const mockRemoveEventListener = jest.fn(); + +Object.defineProperty(window, 'matchMedia', { + value: jest.fn(() => ({ + addEventListener: mockAddEventListener, + removeEventListener: mockRemoveEventListener, + })), +}); + +Object.defineProperty(window, 'localStorage', { + value: { + getItem: jest.fn(), + }, +}); + +describe('useParagonTheme', () => { + beforeEach(() => { + document.head.innerHTML = ''; + mockMediaQueryListEvent = { matches: true }; + mockAddEventListener.mockClear(); + mockRemoveEventListener.mockClear(); + window.localStorage.getItem.mockClear(); + }); + + it('should configure theme variants according with system preference and add the change event listener', () => { + const { unmount } = renderHook(() => useParagonTheme(getConfig())); + const themeLinks = document.head.querySelectorAll('link'); + const darkLink = document.head.querySelector('link[data-paragon-theme-variant="dark"]'); + const lightLink = document.head.querySelector('link[data-paragon-theme-variant="light"]'); + act(() => { themeLinks.forEach((link) => link.onload()); }); + + expect(window.matchMedia).toHaveBeenCalledWith('(prefers-color-scheme: dark)'); + expect(mockAddEventListener).toHaveBeenCalled(); + expect(darkLink.rel).toBe('stylesheet'); + expect(lightLink.rel).toBe('alternate stylesheet'); + unmount(); + expect(mockRemoveEventListener).toHaveBeenCalled(); + }); + + it('should configure theme variants according with user preference if is defined (localStorage)', () => { + window.localStorage.getItem.mockReturnValue('light'); + const { unmount } = renderHook(() => useParagonTheme(getConfig())); + const themeLinks = document.head.querySelectorAll('link'); + const darkLink = document.head.querySelector('link[data-paragon-theme-variant="dark"]'); + const lightLink = document.head.querySelector('link[data-paragon-theme-variant="light"]'); + act(() => { themeLinks.forEach((link) => link.onload()); }); + + expect(window.matchMedia).toHaveBeenCalledWith('(prefers-color-scheme: dark)'); + expect(mockAddEventListener).toHaveBeenCalled(); + + expect(darkLink.rel).toBe('alternate stylesheet'); + expect(lightLink.rel).toBe('stylesheet'); + unmount(); + expect(mockRemoveEventListener).toHaveBeenCalled(); + }); +}); diff --git a/src/react/hooks/paragon/useParagonThemeVariants.test.js b/src/react/hooks/paragon/useParagonThemeVariants.test.js index d43dd5588..505b863b4 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.test.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.test.js @@ -5,18 +5,6 @@ import useParagonThemeVariants from './useParagonThemeVariants'; jest.mock('../../../logging'); -const mockAddEventListener = jest.fn(); -const mockRemoveEventListener = jest.fn(); -const mockOnChange = jest.fn(); - -Object.defineProperty(window, 'matchMedia', { - value: jest.fn(() => ({ - addEventListener: mockAddEventListener, - removeEventListener: mockRemoveEventListener, - onchange: mockOnChange, - })), -}); - describe('useParagonThemeVariants', () => { const themeOnLoad = jest.fn(); @@ -85,34 +73,6 @@ describe('useParagonThemeVariants', () => { expect(document.querySelector('link').href).toBe(`${getConfig().BASE_URL}/${PARAGON_THEME.paragon.themeUrls.variants.light.fileName}`); }); - it('should configure theme variants according with system preference and add the change event listener', () => { - window.matchMedia['prefers-color-scheme'] = 'dark'; - - const themeVariants = { - light: { - urls: { - default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/light.min.css', - brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0/dist/light.min.css', - }, - }, - dark: { - urls: { - default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/dark.min.css', - brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0/dist/dark.min.css', - }, - }, - }; - - const currentThemeVariant = 'light'; - - renderHook(() => useParagonThemeVariants({ themeVariants, currentThemeVariant, onLoad: themeOnLoad })); - - const themeLinks = document.head.querySelectorAll('link'); - act(() => { themeLinks.forEach((link) => link.onload()); }); - - expect(mockAddEventListener).toHaveBeenCalledTimes(1); - }); - it('should do nothing if themeVariants is not configured', () => { const themeVariants = null; const currentTheme = 'light'; From 7f5f66940350643fa073b893950724f6ab6440c2 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Tue, 14 May 2024 10:31:21 +1000 Subject: [PATCH 10/26] docs: update scope of paragon and brand for openedx --- docs/how_tos/theming.md | 86 ++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md index c7ff08084..c0ddda10a 100644 --- a/docs/how_tos/theming.md +++ b/docs/how_tos/theming.md @@ -1,10 +1,10 @@ -# Theming support with `@edx/paragon` and `@edx/brand` +# Theming support with `@openedx/paragon` and `@openedx/brand-openedx` ## Overview This document serves as a guide to using `@edx/frontend-platform` to support MFE theming with Paragon using theme CSS loaded externally (e.g., from a CDN). -To do this, configured URLs pointing to relevant CSS files from `@edx/paragon` and (optionally) `@edx/brand` are loaded and injected to the HTML document at runtime. This differs than the consuming application importing the styles from `@edx/paragon` and `@edx/brand` directly, which includes these styles in the application's production assets. +To do this, configured URLs pointing to relevant CSS files from `@openedx/paragon` and (optionally) `@openedx/brand-openedx` are loaded and injected to the HTML document at runtime. This differs than the consuming application importing the styles from `@openedx/paragon` and `@openedx/brand-openedx` directly, which includes these styles in the application's production assets. By serving CSS loaded externally, consuming applications of Paragon no longer need to be responsible for compiling the theme SCSS to CSS themselves and instead use a pre-compiled CSS file. In doing so, this allows making changes to the Paragon theme without needing to necessarily re-build and re-deploy all consuming applications. @@ -26,11 +26,11 @@ If your use case necessitates additional variants beyond the default supported ` There is also a meaningful improvement in performance as loading the compiled theme CSS from an external CDN means micro-frontends (MFEs) can include cached styles instead of needing to load essentially duplicate theme styles included in each individual MFE as users navigate across the platform. -However, as the styles from `@edx/paragon` and `@edx/brand` get loaded at runtime by `@edx/frontend-platform`, the associated CSS files do not get processed through the consuming application's Webpack build process (e.g., if the MFE used PurgeCSS or any custom PostCSS plugins specifically for Paragon). +However, as the styles from `@openedx/paragon` and `@openedx/brand-openedx` get loaded at runtime by `@edx/frontend-platform`, the associated CSS files do not get processed through the consuming application's Webpack build process (e.g., if the MFE used PurgeCSS or any custom PostCSS plugins specifically for Paragon). ### Falling back to styles installed in consuming application -If any of the configured external `PARAGON_THEME_URLS` fail to load for whatever reason (e.g., CDN is down, URL is incorrectly configured), `@edx/paragon` will attempt to fallback to the relevant files installed in `node_modules` from the consuming application. +If any of the configured external `PARAGON_THEME_URLS` fail to load for whatever reason (e.g., CDN is down, URL is incorrectly configured), `@openedx/paragon` will attempt to fallback to the relevant files installed in `node_modules` from the consuming application. ## Technical architecture @@ -49,14 +49,14 @@ Using either configuration mechanism, a `PARAGON_THEME_URLS` configuration setti ```json { "core": { - "url": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css" + "url": "https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/core.min.css" }, "defaults": { "light": "light", }, "variants": { "light": { - "url": "https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css", + "url": "https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/light.min.css", } } } @@ -64,31 +64,31 @@ Using either configuration mechanism, a `PARAGON_THEME_URLS` configuration setti ### Configuration options -The `PARAGON_THEME_URLS` configuration object supports using only the default styles from `@edx/paragon` or, optionally, extended/overridden styles via `@edx/brand`. To utilize `@edx/brand` overrides, see the `core.urls` and `variants.*.urls` options below. +The `PARAGON_THEME_URLS` configuration object supports using only the default styles from `@openedx/paragon` or, optionally, extended/overridden styles via `@openedx/brand-openedx`. To utilize `@openedx/brand-openedx` overrides, see the `core.urls` and `variants.*.urls` options below. The `dark` theme variant options are optional. | Property | Data Type | Description | | -------- | ----------- | ----------- | -| `core` | Object | Metadata about the core styles from `@edx/paragon` and `@edx/brand`. | -| `core.url` | String | URL for the `core.css` file from `@edx/paragon`. | -| `core.urls` | Object | URL(s) for the `core.css` files from `@edx/paragon` CSS and (optionally) `@edx/brand`. | -| `core.urls.default` | String | URL for the `core.css` file from `@edx/paragon`. | -| `core.urls.brandOverride` | Object | URL for the `core.css` file from `@edx/brand`. | +| `core` | Object | Metadata about the core styles from `@openedx/paragon` and `@openedx/brand-openedx`. | +| `core.url` | String | URL for the `core.css` file from `@openedx/paragon`. | +| `core.urls` | Object | URL(s) for the `core.css` files from `@openedx/paragon` CSS and (optionally) `@openedx/brand-openedx`. | +| `core.urls.default` | String | URL for the `core.css` file from `@openedx/paragon`. | +| `core.urls.brandOverride` | Object | URL for the `core.css` file from `@openedx/brand-openedx`. | | `defaults` | Object | Mapping of theme variants to Paragon's default supported light and dark theme variants. | | `defaults.light` | String | Default `light` theme variant from the theme variants in the `variants` object. | | `defaults.dark` | String | Default `dark` theme variant from the theme variants in the `variants` object. | | `variants` | Object | Metadata about each supported theme variant. | -| `variants.light` | Object | Metadata about the light theme variant styles from `@edx/paragon` and (optionally)`@edx/brand`. | -| `variants.light.url` | String | URL for the `light.css` file from `@edx/paragon`. | -| `variants.light.urls` | Object | URL(s) for the `light.css` files from `@edx/paragon` CSS and (optionally) `@edx/brand`. | -| `variants.light.urls.default` | String | URL for the `light.css` file from `@edx/paragon`. | -| `variants.light.urls.brandOverride` | String | URL for the `light.css` file from `@edx/brand`. | -| `variants.dark` | Object | Metadata about the dark theme variant styles from `@edx/paragon` and (optionally)`@edx/brand`. | -| `variants.dark.url` | String | URL for the `dark.css` file from `@edx/paragon`. | -| `variants.dark.urls` | Object | URL(s) for the `dark.css` files from `@edx/paragon` CSS and (optionally) `@edx/brand`. | -| `variants.dark.urls.default` | String | URL for the `dark.css` file from `@edx/paragon`. | -| `variants.dark.urls.brandOverride` | String | URL for the `dark.css` file from `@edx/brand`. | +| `variants.light` | Object | Metadata about the light theme variant styles from `@openedx/paragon` and (optionally)`@openedx/brand-openedx`. | +| `variants.light.url` | String | URL for the `light.css` file from `@openedx/paragon`. | +| `variants.light.urls` | Object | URL(s) for the `light.css` files from `@openedx/paragon` CSS and (optionally) `@openedx/brand-openedx`. | +| `variants.light.urls.default` | String | URL for the `light.css` file from `@openedx/paragon`. | +| `variants.light.urls.brandOverride` | String | URL for the `light.css` file from `@openedx/brand-openedx`. | +| `variants.dark` | Object | Metadata about the dark theme variant styles from `@openedx/paragon` and (optionally)`@openedx/brand-openedx`. | +| `variants.dark.url` | String | URL for the `dark.css` file from `@openedx/paragon`. | +| `variants.dark.urls` | Object | URL(s) for the `dark.css` files from `@openedx/paragon` CSS and (optionally) `@openedx/brand-openedx`. | +| `variants.dark.urls.default` | String | URL for the `dark.css` file from `@openedx/paragon`. | +| `variants.dark.urls.brandOverride` | String | URL for the `dark.css` file from `@openedx/brand-openedx`. | ### JavaScript-based configuration @@ -100,14 +100,14 @@ To use this JavaScript-based configuration approach, you may set a `PARAGON_THEM const config = { PARAGON_THEME_URLS: { core: { - url: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', + url: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/core.min.css', }, defaults: { light: 'light', }, variants: { light: { - url: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', + url: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/light.min.css', }, }, }, @@ -130,14 +130,14 @@ MFE_CONFIG_OVERRIDES = { 'profile': { 'PARAGON_THEME_URLS': { 'core': { - 'url': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', + 'url': 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/core.min.css', }, 'defaults': { 'light': 'light', }, 'variants': { 'light': { - 'url': 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', + 'url': 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/light.min.css', }, }, }, @@ -145,34 +145,34 @@ MFE_CONFIG_OVERRIDES = { } ``` -### Locally installed `@edx/paragon` +### Locally installed `@openedx/paragon` -If you would like to use the same version of the Paragon CSS urls as the locally installed `@edx/paragon`, the configuration for the Paragon CSS urls may contain a wildcard `$paragonVersion` which gets replaced with the locally installed version of `@edx/paragon` in the consuming application, e.g.: +If you would like to use the same version of the Paragon CSS urls as the locally installed `@openedx/paragon`, the configuration for the Paragon CSS urls may contain a wildcard `$paragonVersion` which gets replaced with the locally installed version of `@openedx/paragon` in the consuming application, e.g.: ```shell -https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css -https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css +https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/core.min.css +https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/light.min.css ``` In the event the other Paragon CSS urls are configured via one of the other documented mechanisms, but they fail to load (e.g., the CDN url throws a 404), `@edx/frontend-platform` will attempt to fallback to injecting the locally installed Paragon CSS from the consuming application into the HTML document. -## Usage with `@edx/brand` +## Usage with `@openedx/brand-openedx` -The core Paragon design tokens and styles may be optionally overriden by utilizing `@edx/brand`, which allows theme authors to customize the default Paragon theme to match the look and feel of their custom brand. +The core Paragon design tokens and styles may be optionally overriden by utilizing `@openedx/brand-openedx`, which allows theme authors to customize the default Paragon theme to match the look and feel of their custom brand. -This override mechanism works by compiling the design tokens defined in `@edx/brand` with the the core Paragon tokens to generate overrides to Paragon's default CSS variables, and then compiling the output CSS with any SCSS theme customizations not possible through a design token override. +This override mechanism works by compiling the design tokens defined in `@openedx/brand-openedx` with the the core Paragon tokens to generate overrides to Paragon's default CSS variables, and then compiling the output CSS with any SCSS theme customizations not possible through a design token override. -The CSS urls for `@edx/brand` overrides will be applied after the core Paragon theme urls load, thus overriding any previously set CSS variables and/or styles. +The CSS urls for `@openedx/brand-openedx` overrides will be applied after the core Paragon theme urls load, thus overriding any previously set CSS variables and/or styles. -To enable `@edx/brand` overrides, the `PARAGON_THEME_URLS` setting may be configured as following: +To enable `@openedx/brand-openedx` overrides, the `PARAGON_THEME_URLS` setting may be configured as following: ```js const config = { PARAGON_THEME_URLS: { core: { urls: { - default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/core.min.css', - brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand-edx.org@#brandVersion/dist/core.min.css', + default: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/core.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@openedx/brand-openedx-edx.org@#brandVersion/dist/core.min.css', }, }, defaults: { @@ -181,8 +181,8 @@ const config = { variants: { light: { urls: { - default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$paragonVersion/dist/light.min.css', - brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand-edx.org@$brandVersion/dist/light.min.css', + default: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/light.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@openedx/brand-openedx-edx.org@$brandVersion/dist/light.min.css', }, }, }, @@ -192,13 +192,13 @@ const config = { export default config; ``` -### Locally installed `@edx/brand` +### Locally installed `@openedx/brand-openedx` -If you would like to use the same version of the brand override CSS urls as the locally installed `@edx/brand`, the configuration for the brand override CSS urls may contain a wildcard `$brandVersion` which gets replaced with the locally installed version of `@edx/brand` in the consuming application, e.g.: +If you would like to use the same version of the brand override CSS urls as the locally installed `@openedx/brand-openedx`, the configuration for the brand override CSS urls may contain a wildcard `$brandVersion` which gets replaced with the locally installed version of `@openedx/brand-openedx` in the consuming application, e.g.: ```shell -https://cdn.jsdelivr.net/npm/@edx/brand@$brandVersion/dist/core.min.css -https://cdn.jsdelivr.net/npm/@edx/brand@$brandVersion/dist/light.min.css +https://cdn.jsdelivr.net/npm/@openedx/brand-openedx@$brandVersion/dist/core.min.css +https://cdn.jsdelivr.net/npm/@openedx/brand-openedx@$brandVersion/dist/light.min.css ``` In the event the other brand override CSS urls are configured via one of the other documented mechanisms, but they fail to load (e.g., the CDN is down), `@edx/frontend-platform` will attempt to fallback to injecting the locally installed brand override CSS urls from the consuming application into the HTML document. From dc026c0da6631a2ce1e61679c77cdfd4c113ad25 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Fri, 17 May 2024 18:49:03 +1000 Subject: [PATCH 11/26] refactor: allow multiple replacement in version replacement --- src/react/hooks/paragon/useParagonThemeUrls.js | 2 +- src/react/hooks/paragon/utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/react/hooks/paragon/useParagonThemeUrls.js b/src/react/hooks/paragon/useParagonThemeUrls.js index b1721e74a..387143ce4 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.js @@ -16,7 +16,7 @@ const useParagonThemeUrls = (config) => useMemo(() => { const brandCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.brandOverride : undefined; const defaultThemeVariants = paragonThemeUrls.defaults; - // Local versions of @edx/paragon and @edx/brand + // Local versions of @openedx/paragon and @edx/brand const localParagonVersion = PARAGON_THEME?.paragon?.version; const localBrandVersion = PARAGON_THEME?.brand?.version; diff --git a/src/react/hooks/paragon/utils.js b/src/react/hooks/paragon/utils.js index 8dee00646..634c3b5cc 100644 --- a/src/react/hooks/paragon/utils.js +++ b/src/react/hooks/paragon/utils.js @@ -83,5 +83,5 @@ export const handleVersionSubstitution = ({ url, wildcardKeyword, localVersion } if (!url || !url.includes(wildcardKeyword) || !localVersion) { return url; } - return url.replace(wildcardKeyword, localVersion); + return url.replaceAll(wildcardKeyword, localVersion); }; From 7ed517bbd5d9716e2c30588b9b42a794417cae81 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Wed, 22 May 2024 13:00:01 +1000 Subject: [PATCH 12/26] refactor: update webpack dev config --- webpack.dev.config.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/webpack.dev.config.js b/webpack.dev.config.js index 1bc77c6f5..a8df06d8c 100644 --- a/webpack.dev.config.js +++ b/webpack.dev.config.js @@ -14,4 +14,9 @@ module.exports = createConfig('webpack-dev', { '@edx/frontend-platform': path.resolve(__dirname, 'src'), }, }, + devServer: { + static: { + directory: path.resolve(__dirname, 'example/dist'), + }, + }, }); From 5bb7dbfefd1cb46c225fadc4658ef064d359578b Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Thu, 23 May 2024 14:11:52 +1000 Subject: [PATCH 13/26] refactor: avoid duplicated links if the theme varian is preloaded --- .../hooks/paragon/useParagonThemeVariants.js | 39 ++++++++++++------- .../paragon/useParagonThemeVariants.test.js | 24 ++++++++++++ 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/react/hooks/paragon/useParagonThemeVariants.js b/src/react/hooks/paragon/useParagonThemeVariants.js index 737129ef9..a83eabba7 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.js @@ -48,7 +48,7 @@ const useParagonThemeVariants = ({ document.querySelector('html').removeAttribute(htmlDataThemeVariantAttr); }; } - return () => {}; // no-op + return () => { }; // no-op }, [themeVariants, currentThemeVariant]); useEffect(() => { @@ -160,12 +160,15 @@ const useParagonThemeVariants = ({ return themeVariantLink; }; - if (!existingThemeVariantLink) { - const paragonThemeVariantLink = createThemeVariantLink(value.urls.default); - document.head.insertAdjacentElement( - 'afterbegin', - paragonThemeVariantLink, - ); + const insertBrandThemeVariantLink = () => { + const updatedStylesheetRel = generateStylesheetRelAttr(themeVariant); + + if (existingThemeVariantBrandLink) { + existingThemeVariantBrandLink.rel = updatedStylesheetRel; + existingThemeVariantBrandLink.removeAttribute('as'); + existingThemeVariantBrandLink.dataset.brandThemeVariant = themeVariant; + return; + } if (value.urls.brandOverride) { const brandThemeVariantLink = createThemeVariantLink(value.urls.brandOverride, { isBrandOverride: true }); @@ -181,20 +184,26 @@ const useParagonThemeVariants = ({ brandThemeVariantLink, ); } - } else { - setIsBrandThemeVariantLoaded(true); } + setIsBrandThemeVariantLoaded(true); + }; + + if (!existingThemeVariantLink) { + const paragonThemeVariantLink = createThemeVariantLink(value.urls.default); + document.head.insertAdjacentElement( + 'afterbegin', + paragonThemeVariantLink, + ); + insertBrandThemeVariantLink(existingThemeVariantBrandLink); } else { const updatedStylesheetRel = generateStylesheetRelAttr(themeVariant); existingThemeVariantLink.rel = updatedStylesheetRel; existingThemeVariantLink.removeAttribute('as'); - if (existingThemeVariantBrandLink) { - existingThemeVariantBrandLink.rel = updatedStylesheetRel; - existingThemeVariantBrandLink.removeAttribute('as'); - } - setIsParagonThemeVariantLoaded(true); - setIsBrandThemeVariantLoaded(true); + existingThemeVariantLink.dataset.paragonThemeVariant = themeVariant; + insertBrandThemeVariantLink(existingThemeVariantBrandLink); } + setIsParagonThemeVariantLoaded(true); + setIsBrandThemeVariantLoaded(true); }); }, [themeVariants, currentThemeVariant, onLoad]); }; diff --git a/src/react/hooks/paragon/useParagonThemeVariants.test.js b/src/react/hooks/paragon/useParagonThemeVariants.test.js index 505b863b4..85567231b 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.test.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.test.js @@ -97,4 +97,28 @@ describe('useParagonThemeVariants', () => { expect(document.head.querySelectorAll('link').length).toBe(0); }); + it('shoud not create a new link if it already exists', () => { + document.head.innerHTML = ''; + + const themeVariants = { + light: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/light.min.css', + }, + }, + dark: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/dark.min.css', + }, + }, + }; + + const currentTheme = 'light'; + renderHook(() => useParagonThemeVariants({ themeVariants, currentTheme, onLoad: themeOnLoad })); + const themeLinks = document.head.querySelectorAll('link'); + const lightThemeLink = document.head.querySelector('link[data-paragon-theme-variant="light"]'); + expect(themeLinks.length).toBe(2); + expect(lightThemeLink.rel).toContain('stylesheet'); + expect(lightThemeLink).not.toHaveAttribute('as', 'style'); + }); }); From 9beaa1a4353ea1c5d36a726e5ea572ce3b10bd8e Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Thu, 23 May 2024 14:33:14 +1000 Subject: [PATCH 14/26] refactor: update useParagonTheme when some variables are missing --- .../hooks/paragon/useParagonThemeUrls.js | 36 ++++++++++++------- .../hooks/paragon/useParagonThemeUrls.test.js | 34 ++++++++++++++++++ 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/react/hooks/paragon/useParagonThemeUrls.js b/src/react/hooks/paragon/useParagonThemeUrls.js index 387143ce4..220ab5830 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.js @@ -54,24 +54,34 @@ const useParagonThemeUrls = (config) => useMemo(() => { themeVariantsCss[themeVariant] = themeVariantMetadata; }); - const hasMissingCssUrls = !coreCss.default || Object.keys(themeVariantsCss).length === 0; - if (hasMissingCssUrls) { - if (!PARAGON_THEME) { + // If we don't have the core default or any theme variants, use the PARAGON_THEME + if (!coreCss.default || Object.keys(themeVariantsCss).length === 0) { + const localCoreUrl = PARAGON_THEME.paragon?.themeUrls?.core; + const localThemeVariants = PARAGON_THEME.paragon?.themeUrls?.variants; + + if (!localCoreUrl || Object.keys(localCoreUrl).length === 0 + || !localThemeVariants || Object.keys(localThemeVariants).length === 0) { return undefined; } - const themeVariants = {}; - const baseUrl = config.BASE_URL || window.location?.origin; - const prependBaseUrl = (url) => `${baseUrl}/${url}`; - themeVariantsEntries.forEach(([themeVariant, { fileName, ...rest }]) => { - themeVariants[themeVariant] = { - url: prependBaseUrl(fileName), - ...rest, - }; - }); + + if (!coreCss.default) { + coreCss.default = PARAGON_THEME?.paragon?.themeUrls?.core?.fileName; + } + + if (Object.keys(themeVariantsCss).length === 0) { + const baseUrl = config.BASE_URL || window.location?.origin; + const prependBaseUrl = (url) => `${baseUrl}/${url}`; + Object.entries(localThemeVariants).forEach(([themeVariant, { fileName, ...rest }]) => { + themeVariantsCss[themeVariant] = { + url: prependBaseUrl(fileName), + ...rest, + }; + }); + } return { core: { urls: coreCss }, defaults: defaultThemeVariants, - variants: themeVariants, + variants: themeVariantsCss, }; } diff --git a/src/react/hooks/paragon/useParagonThemeUrls.test.js b/src/react/hooks/paragon/useParagonThemeUrls.test.js index ff87c9a03..801c09c1c 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.test.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.test.js @@ -97,5 +97,39 @@ describe('useParagonThemeUrls', () => { }), ); }); + it('returns expected object when core default and variants are not present, fallback to PARAGON_THEME', () => { + const config = { + PARAGON_THEME_URLS: { + core: { + urls: { + brandOverride: 'brand-core.css', + }, + }, + defaults: { + light: 'light', + }, + variants: {}, + }, + }; + const { result } = renderHook(() => useParagonThemeUrls(config)); + expect(result.current).toEqual( + expect.objectContaining({ + core: { + urls: { + default: 'core.min.css', + brandOverride: 'brand-core.css', + }, + }, + defaults: { + light: 'light', + }, + variants: { + light: { + url: 'http://localhost/light.min.css', + }, + }, + }), + ); + }); }); }); From 5a5ce8640e951a806d059e48db0728f66cfa9368 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Thu, 23 May 2024 15:49:11 +1000 Subject: [PATCH 15/26] test: add new test csse for useParagonThemeCore --- src/react/hooks/paragon/useParagonThemeCore.js | 2 ++ .../hooks/paragon/useParagonThemeCore.test.js | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/react/hooks/paragon/useParagonThemeCore.js b/src/react/hooks/paragon/useParagonThemeCore.js index 5dc3e902c..1dced0ad5 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.js +++ b/src/react/hooks/paragon/useParagonThemeCore.js @@ -130,9 +130,11 @@ const useParagonThemeCore = ({ } else { existingCoreThemeLink.rel = 'stylesheet'; existingCoreThemeLink.removeAttribute('as'); + existingCoreThemeLink.dataset.paragonThemeCore = true; if (brandCoreLink) { brandCoreLink.rel = 'stylesheet'; brandCoreLink.removeAttribute('as'); + brandCoreLink.dataset.brandThemeCore = true; } setIsParagonThemeCoreLoaded(true); setIsBrandThemeCoreLoaded(true); diff --git a/src/react/hooks/paragon/useParagonThemeCore.test.js b/src/react/hooks/paragon/useParagonThemeCore.test.js index 1eecf876c..4de881aca 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.test.js +++ b/src/react/hooks/paragon/useParagonThemeCore.test.js @@ -86,6 +86,24 @@ describe('useParagonThemeCore', () => { expect(document.querySelector('link').href).toBe(`${getConfig().BASE_URL}/${PARAGON_THEME.paragon.themeUrls.core.fileName}`); }); + it('should not create a new link if the core theme is already loaded', () => { + document.head.innerHTML = ''; + const coreConfig = { + themeCore: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', + }, + }, + onLoad: themeOnLoad, + }; + + renderHook(() => useParagonThemeCore(coreConfig)); + const themeCoreLinks = document.head.querySelectorAll('link'); + expect(themeCoreLinks.length).toBe(1); + expect(themeCoreLinks[0].rel).toContain('stylesheet'); + expect(themeCoreLinks[0]).not.toHaveAttribute('as', 'style'); + }); + it('should not create any core link if can not find themeCore urls definition', () => { const coreConfig = { themeCore: { From 73fae22860b8849f4f7b85244ae0d99fa61cfa84 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Fri, 24 May 2024 09:20:46 +1000 Subject: [PATCH 16/26] refactor: use modules for config file --- env.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.config.js b/env.config.js index f4585f66d..f5a1b6c6b 100644 --- a/env.config.js +++ b/env.config.js @@ -5,4 +5,4 @@ const config = { JS_FILE_VAR: 'JS_FILE_VAR_VALUE_FOR_EXAMPLE_APP', }; -export default config; +module.config = config; From 01ff88be03b391eca1c17bbc3cbbee80a994b909 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Tue, 28 May 2024 11:04:32 +1000 Subject: [PATCH 17/26] fix: fallback url --- src/react/hooks/paragon/useParagonTheme.js | 4 ++-- src/react/hooks/paragon/useParagonThemeCore.js | 3 ++- src/react/hooks/paragon/useParagonThemeUrls.js | 16 +++++++--------- .../hooks/paragon/useParagonThemeUrls.test.js | 6 ++++-- .../hooks/paragon/useParagonThemeVariants.js | 3 ++- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/react/hooks/paragon/useParagonTheme.js b/src/react/hooks/paragon/useParagonTheme.js index 5fd8c49cd..fcebc22bb 100644 --- a/src/react/hooks/paragon/useParagonTheme.js +++ b/src/react/hooks/paragon/useParagonTheme.js @@ -59,9 +59,9 @@ const useParagonTheme = (config) => { return; } - if (prefersDarkMode && themeVariantDefaults.dark) { + if (prefersDarkMode && themeVariantDefaults?.dark) { dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.dark)); - } else if (!prefersDarkMode && themeVariantDefaults.light) { + } else if (!prefersDarkMode && themeVariantDefaults?.light) { dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.light)); } else { logError(`Could not set theme variant based on system preference (prefers dark mode: ${prefersDarkMode})`, themeVariantDefaults, themeVariants); diff --git a/src/react/hooks/paragon/useParagonThemeCore.js b/src/react/hooks/paragon/useParagonThemeCore.js index 1dced0ad5..ad065bfed 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.js +++ b/src/react/hooks/paragon/useParagonThemeCore.js @@ -3,6 +3,7 @@ import { useEffect, useState } from 'react'; import { logError, logInfo } from '../../../logging'; import { removeExistingLinks } from './utils'; import { getConfig } from '../../../config'; +import { basename } from '../../../initialize'; /** * Adds/updates a `` element in the HTML document to load the core application theme CSS. @@ -80,7 +81,7 @@ const useParagonThemeCore = ({ const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; if (themeUrls.core) { - const coreThemeFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.core.fileName}`; + const coreThemeFallbackUrl = `${getConfig().BASE_URL}${basename}${themeUrls.core.fileName}`; logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true, isBrandOverride }); const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); diff --git a/src/react/hooks/paragon/useParagonThemeUrls.js b/src/react/hooks/paragon/useParagonThemeUrls.js index 220ab5830..acccfe6bf 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.js @@ -1,5 +1,6 @@ import { useMemo } from 'react'; import { handleVersionSubstitution } from './utils'; +import { basename } from '../../../initialize'; /** * Returns an object containing the URLs for the theme's core CSS and any theme variants. @@ -12,8 +13,8 @@ const useParagonThemeUrls = (config) => useMemo(() => { return undefined; } const paragonThemeUrls = config.PARAGON_THEME_URLS; - const paragonCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.default : paragonThemeUrls.core.url; - const brandCoreCssUrl = typeof paragonThemeUrls.core.urls === 'object' ? paragonThemeUrls.core.urls.brandOverride : undefined; + const paragonCoreCssUrl = typeof paragonThemeUrls?.core?.urls === 'object' ? paragonThemeUrls.core.urls.default : paragonThemeUrls?.core?.url; + const brandCoreCssUrl = typeof paragonThemeUrls?.core?.urls === 'object' ? paragonThemeUrls.core.urls.brandOverride : undefined; const defaultThemeVariants = paragonThemeUrls.defaults; // Local versions of @openedx/paragon and @edx/brand @@ -24,7 +25,6 @@ const useParagonThemeUrls = (config) => useMemo(() => { default: handleVersionSubstitution({ url: paragonCoreCssUrl, wildcardKeyword: '$paragonVersion', localVersion: localParagonVersion }), brandOverride: handleVersionSubstitution({ url: brandCoreCssUrl, wildcardKeyword: '$brandVersion', localVersion: localBrandVersion }), }; - const themeVariantsCss = {}; const themeVariantsEntries = Object.entries(paragonThemeUrls.variants || {}); themeVariantsEntries.forEach(([themeVariant, { url, urls }]) => { @@ -58,23 +58,21 @@ const useParagonThemeUrls = (config) => useMemo(() => { if (!coreCss.default || Object.keys(themeVariantsCss).length === 0) { const localCoreUrl = PARAGON_THEME.paragon?.themeUrls?.core; const localThemeVariants = PARAGON_THEME.paragon?.themeUrls?.variants; - if (!localCoreUrl || Object.keys(localCoreUrl).length === 0 || !localThemeVariants || Object.keys(localThemeVariants).length === 0) { return undefined; } + const baseUrl = config?.BASE_URL || window.location?.origin; + const prependBaseUrl = (url) => `${baseUrl}${basename}${url}`; if (!coreCss.default) { - coreCss.default = PARAGON_THEME?.paragon?.themeUrls?.core?.fileName; + coreCss.default = prependBaseUrl(localCoreUrl?.fileName); } if (Object.keys(themeVariantsCss).length === 0) { - const baseUrl = config.BASE_URL || window.location?.origin; - const prependBaseUrl = (url) => `${baseUrl}/${url}`; Object.entries(localThemeVariants).forEach(([themeVariant, { fileName, ...rest }]) => { themeVariantsCss[themeVariant] = { - url: prependBaseUrl(fileName), - ...rest, + urls: { default: prependBaseUrl(fileName), ...rest.urls }, }; }); } diff --git a/src/react/hooks/paragon/useParagonThemeUrls.test.js b/src/react/hooks/paragon/useParagonThemeUrls.test.js index 801c09c1c..cb2a4e70e 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.test.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.test.js @@ -116,7 +116,7 @@ describe('useParagonThemeUrls', () => { expect.objectContaining({ core: { urls: { - default: 'core.min.css', + default: 'http://localhost/core.min.css', brandOverride: 'brand-core.css', }, }, @@ -125,7 +125,9 @@ describe('useParagonThemeUrls', () => { }, variants: { light: { - url: 'http://localhost/light.min.css', + urls: { + default: 'http://localhost/light.min.css', + }, }, }, }), diff --git a/src/react/hooks/paragon/useParagonThemeVariants.js b/src/react/hooks/paragon/useParagonThemeVariants.js index a83eabba7..c33bb160a 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.js @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import { logError, logInfo } from '../../../logging'; import { removeExistingLinks } from './utils'; import { getConfig } from '../../../config'; +import { basename } from '../../../initialize'; /** * Adds/updates a `` element in the HTML document to load each theme variant's CSS, setting the @@ -128,7 +129,7 @@ const useParagonThemeVariants = ({ const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; if (themeUrls.variants && themeUrls.variants[themeVariant]) { - const themeVariantFallbackUrl = `${getConfig().BASE_URL}/${themeUrls.variants[themeVariant].fileName}`; + const themeVariantFallbackUrl = `${getConfig().BASE_URL}${basename}${themeUrls.variants[themeVariant].fileName}`; logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl, { isFallbackThemeUrl: true, From 38cc0526663ff65ee8870bdfac7001e53d7338d9 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Tue, 28 May 2024 12:10:47 +1000 Subject: [PATCH 18/26] style: fix imports order --- src/react/AppProvider.test.jsx | 2 +- src/react/hooks/paragon/useParagonTheme.js | 10 ++++++---- src/react/hooks/paragon/useParagonTheme.test.js | 4 +++- src/react/hooks/paragon/useParagonThemeCore.js | 4 ++-- src/react/hooks/paragon/useParagonThemeCore.test.js | 2 ++ src/react/hooks/paragon/useParagonThemeUrls.js | 4 +++- src/react/hooks/paragon/useParagonThemeVariants.js | 6 ++++-- .../hooks/paragon/useParagonThemeVariants.test.js | 2 ++ 8 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/react/AppProvider.test.jsx b/src/react/AppProvider.test.jsx index f82cceafa..0a0400e88 100644 --- a/src/react/AppProvider.test.jsx +++ b/src/react/AppProvider.test.jsx @@ -42,7 +42,7 @@ jest.mock('../i18n', () => ({ })); jest.mock('../analytics', () => ({ - configure: () => { }, + configure: () => {}, identifyAnonymousUser: jest.fn(), identifyAuthenticatedUser: jest.fn(), })); diff --git a/src/react/hooks/paragon/useParagonTheme.js b/src/react/hooks/paragon/useParagonTheme.js index fcebc22bb..f7d380169 100644 --- a/src/react/hooks/paragon/useParagonTheme.js +++ b/src/react/hooks/paragon/useParagonTheme.js @@ -1,12 +1,14 @@ import { useCallback, useEffect, useReducer, useState, } from 'react'; -import useParagonThemeUrls from './useParagonThemeUrls'; -import { getDefaultThemeVariant } from './utils'; -import { paragonThemeActions, paragonThemeReducer } from '../../reducers'; -import useParagonThemeCore from './useParagonThemeCore'; + import { SELECTED_THEME_VARIANT_KEY } from '../../constants'; import { logError } from '../../../logging'; +import { paragonThemeActions, paragonThemeReducer } from '../../reducers'; +import { getDefaultThemeVariant } from './utils'; + +import useParagonThemeCore from './useParagonThemeCore'; +import useParagonThemeUrls from './useParagonThemeUrls'; import useParagonThemeVariants from './useParagonThemeVariants'; /** diff --git a/src/react/hooks/paragon/useParagonTheme.test.js b/src/react/hooks/paragon/useParagonTheme.test.js index 93027f62c..1528b69f0 100644 --- a/src/react/hooks/paragon/useParagonTheme.test.js +++ b/src/react/hooks/paragon/useParagonTheme.test.js @@ -1,7 +1,9 @@ import { act, renderHook } from '@testing-library/react-hooks'; -import useParagonTheme from './useParagonTheme'; + import { getConfig } from '../../../config'; +import useParagonTheme from './useParagonTheme'; + jest.mock('../../../config', () => ({ ...jest.requireActual('.../../../config'), getConfig: jest.fn().mockReturnValue({ diff --git a/src/react/hooks/paragon/useParagonThemeCore.js b/src/react/hooks/paragon/useParagonThemeCore.js index ad065bfed..cb2cadb68 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.js +++ b/src/react/hooks/paragon/useParagonThemeCore.js @@ -1,9 +1,9 @@ import { useEffect, useState } from 'react'; -import { logError, logInfo } from '../../../logging'; -import { removeExistingLinks } from './utils'; import { getConfig } from '../../../config'; import { basename } from '../../../initialize'; +import { logError, logInfo } from '../../../logging'; +import { removeExistingLinks } from './utils'; /** * Adds/updates a `` element in the HTML document to load the core application theme CSS. diff --git a/src/react/hooks/paragon/useParagonThemeCore.test.js b/src/react/hooks/paragon/useParagonThemeCore.test.js index 4de881aca..f5ff1a687 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.test.js +++ b/src/react/hooks/paragon/useParagonThemeCore.test.js @@ -1,6 +1,8 @@ import { renderHook, act } from '@testing-library/react-hooks'; + import { getConfig } from '../../../config'; import { logError } from '../../../logging'; + import useParagonThemeCore from './useParagonThemeCore'; jest.mock('../../../logging'); diff --git a/src/react/hooks/paragon/useParagonThemeUrls.js b/src/react/hooks/paragon/useParagonThemeUrls.js index acccfe6bf..95caa89cb 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.js @@ -1,7 +1,9 @@ import { useMemo } from 'react'; -import { handleVersionSubstitution } from './utils'; + import { basename } from '../../../initialize'; +import { handleVersionSubstitution } from './utils'; + /** * Returns an object containing the URLs for the theme's core CSS and any theme variants. * diff --git a/src/react/hooks/paragon/useParagonThemeVariants.js b/src/react/hooks/paragon/useParagonThemeVariants.js index c33bb160a..0d88dfdaa 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.js @@ -1,8 +1,10 @@ import { useEffect, useState } from 'react'; -import { logError, logInfo } from '../../../logging'; -import { removeExistingLinks } from './utils'; + import { getConfig } from '../../../config'; import { basename } from '../../../initialize'; +import { logError, logInfo } from '../../../logging'; + +import { removeExistingLinks } from './utils'; /** * Adds/updates a `` element in the HTML document to load each theme variant's CSS, setting the diff --git a/src/react/hooks/paragon/useParagonThemeVariants.test.js b/src/react/hooks/paragon/useParagonThemeVariants.test.js index 85567231b..50fad4d74 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.test.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.test.js @@ -1,6 +1,8 @@ import { act, renderHook } from '@testing-library/react-hooks'; + import { getConfig } from '../../../config'; import { logError } from '../../../logging'; + import useParagonThemeVariants from './useParagonThemeVariants'; jest.mock('../../../logging'); From c15a7f1257f7d176f7f4876f1bcf3d2d1d2edf43 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Tue, 28 May 2024 13:30:52 +1000 Subject: [PATCH 19/26] refactor: create isEmptyObject and fallbackThemeUrl utils --- src/react/hooks/paragon/useParagonTheme.js | 4 ++-- .../hooks/paragon/useParagonThemeCore.js | 6 ++---- .../hooks/paragon/useParagonThemeUrls.js | 21 +++++++------------ .../hooks/paragon/useParagonThemeUrls.test.js | 4 ++-- .../hooks/paragon/useParagonThemeVariants.js | 8 +++---- src/react/hooks/paragon/utils.js | 14 +++++++++++++ 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/react/hooks/paragon/useParagonTheme.js b/src/react/hooks/paragon/useParagonTheme.js index f7d380169..467b6a6d8 100644 --- a/src/react/hooks/paragon/useParagonTheme.js +++ b/src/react/hooks/paragon/useParagonTheme.js @@ -5,7 +5,7 @@ import { import { SELECTED_THEME_VARIANT_KEY } from '../../constants'; import { logError } from '../../../logging'; import { paragonThemeActions, paragonThemeReducer } from '../../reducers'; -import { getDefaultThemeVariant } from './utils'; +import { getDefaultThemeVariant, isEmptyObject } from './utils'; import useParagonThemeCore from './useParagonThemeCore'; import useParagonThemeUrls from './useParagonThemeUrls'; @@ -84,7 +84,7 @@ const useParagonTheme = (config) => { return; } - const hasThemeConfig = (themeCore?.urls && Object.keys(themeVariants).length > 0); + const hasThemeConfig = (themeCore?.urls && !isEmptyObject(themeVariants)); if (!hasThemeConfig) { // no theme URLs to load, set loading to false. dispatch(paragonThemeActions.setParagonThemeLoaded(true)); diff --git a/src/react/hooks/paragon/useParagonThemeCore.js b/src/react/hooks/paragon/useParagonThemeCore.js index cb2cadb68..5f48dabeb 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.js +++ b/src/react/hooks/paragon/useParagonThemeCore.js @@ -1,9 +1,7 @@ import { useEffect, useState } from 'react'; -import { getConfig } from '../../../config'; -import { basename } from '../../../initialize'; import { logError, logInfo } from '../../../logging'; -import { removeExistingLinks } from './utils'; +import { fallbackThemeUrl, removeExistingLinks } from './utils'; /** * Adds/updates a `` element in the HTML document to load the core application theme CSS. @@ -81,7 +79,7 @@ const useParagonThemeCore = ({ const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; if (themeUrls.core) { - const coreThemeFallbackUrl = `${getConfig().BASE_URL}${basename}${themeUrls.core.fileName}`; + const coreThemeFallbackUrl = fallbackThemeUrl(themeUrls.core.fileName); logInfo(`Falling back to locally installed core theme CSS: ${coreThemeFallbackUrl}`); coreThemeLink = createCoreThemeLink(coreThemeFallbackUrl, { isFallbackThemeUrl: true, isBrandOverride }); const otherExistingLinks = getExistingCoreThemeLinks(isBrandOverride); diff --git a/src/react/hooks/paragon/useParagonThemeUrls.js b/src/react/hooks/paragon/useParagonThemeUrls.js index 95caa89cb..930f9e20b 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.js @@ -1,8 +1,6 @@ import { useMemo } from 'react'; -import { basename } from '../../../initialize'; - -import { handleVersionSubstitution } from './utils'; +import { fallbackThemeUrl, handleVersionSubstitution, isEmptyObject } from './utils'; /** * Returns an object containing the URLs for the theme's core CSS and any theme variants. @@ -57,24 +55,21 @@ const useParagonThemeUrls = (config) => useMemo(() => { }); // If we don't have the core default or any theme variants, use the PARAGON_THEME - if (!coreCss.default || Object.keys(themeVariantsCss).length === 0) { + if (!coreCss.default || isEmptyObject(themeVariantsCss)) { const localCoreUrl = PARAGON_THEME.paragon?.themeUrls?.core; const localThemeVariants = PARAGON_THEME.paragon?.themeUrls?.variants; - if (!localCoreUrl || Object.keys(localCoreUrl).length === 0 - || !localThemeVariants || Object.keys(localThemeVariants).length === 0) { + + if (isEmptyObject(localCoreUrl) || isEmptyObject(localThemeVariants)) { return undefined; } - - const baseUrl = config?.BASE_URL || window.location?.origin; - const prependBaseUrl = (url) => `${baseUrl}${basename}${url}`; if (!coreCss.default) { - coreCss.default = prependBaseUrl(localCoreUrl?.fileName); + coreCss.default = fallbackThemeUrl(localCoreUrl?.fileName); } - if (Object.keys(themeVariantsCss).length === 0) { + if (isEmptyObject(themeVariantsCss)) { Object.entries(localThemeVariants).forEach(([themeVariant, { fileName, ...rest }]) => { themeVariantsCss[themeVariant] = { - urls: { default: prependBaseUrl(fileName), ...rest.urls }, + urls: { default: fallbackThemeUrl(fileName), ...rest.urls }, }; }); } @@ -90,6 +85,6 @@ const useParagonThemeUrls = (config) => useMemo(() => { defaults: defaultThemeVariants, variants: themeVariantsCss, }; -}, [config?.BASE_URL, config?.PARAGON_THEME_URLS]); +}, [config?.PARAGON_THEME_URLS]); export default useParagonThemeUrls; diff --git a/src/react/hooks/paragon/useParagonThemeUrls.test.js b/src/react/hooks/paragon/useParagonThemeUrls.test.js index cb2a4e70e..52135a9ae 100644 --- a/src/react/hooks/paragon/useParagonThemeUrls.test.js +++ b/src/react/hooks/paragon/useParagonThemeUrls.test.js @@ -116,7 +116,7 @@ describe('useParagonThemeUrls', () => { expect.objectContaining({ core: { urls: { - default: 'http://localhost/core.min.css', + default: 'localhost:8080/core.min.css', brandOverride: 'brand-core.css', }, }, @@ -126,7 +126,7 @@ describe('useParagonThemeUrls', () => { variants: { light: { urls: { - default: 'http://localhost/light.min.css', + default: 'localhost:8080/light.min.css', }, }, }, diff --git a/src/react/hooks/paragon/useParagonThemeVariants.js b/src/react/hooks/paragon/useParagonThemeVariants.js index 0d88dfdaa..240a9493e 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.js @@ -1,10 +1,8 @@ import { useEffect, useState } from 'react'; -import { getConfig } from '../../../config'; -import { basename } from '../../../initialize'; import { logError, logInfo } from '../../../logging'; -import { removeExistingLinks } from './utils'; +import { fallbackThemeUrl, removeExistingLinks } from './utils'; /** * Adds/updates a `` element in the HTML document to load each theme variant's CSS, setting the @@ -51,7 +49,7 @@ const useParagonThemeVariants = ({ document.querySelector('html').removeAttribute(htmlDataThemeVariantAttr); }; } - return () => { }; // no-op + return () => {}; // no-op }, [themeVariants, currentThemeVariant]); useEffect(() => { @@ -131,7 +129,7 @@ const useParagonThemeVariants = ({ const paragonThemeAccessor = isBrandOverride ? 'brand' : 'paragon'; const themeUrls = PARAGON_THEME?.[paragonThemeAccessor]?.themeUrls ?? {}; if (themeUrls.variants && themeUrls.variants[themeVariant]) { - const themeVariantFallbackUrl = `${getConfig().BASE_URL}${basename}${themeUrls.variants[themeVariant].fileName}`; + const themeVariantFallbackUrl = fallbackThemeUrl(themeUrls.variants[themeVariant].fileName); logInfo(`Falling back to locally installed theme variant (${themeVariant}) CSS: ${themeVariantFallbackUrl}`); themeVariantLink = createThemeVariantLink(themeVariantFallbackUrl, { isFallbackThemeUrl: true, diff --git a/src/react/hooks/paragon/utils.js b/src/react/hooks/paragon/utils.js index 634c3b5cc..4ec6f4df4 100644 --- a/src/react/hooks/paragon/utils.js +++ b/src/react/hooks/paragon/utils.js @@ -1,3 +1,5 @@ +import { getConfig } from '../../../config'; +import { basename } from '../../../initialize'; import { SELECTED_THEME_VARIANT_KEY } from '../../constants'; /** @@ -79,9 +81,21 @@ export const getDefaultThemeVariant = ({ themeVariants, themeVariantDefaults = { }; }; +/** +* Creates the fallback URL for the given theme file. +* @param {string} url The theme file path. +* @returns {string} The default theme url. +*/ +export const fallbackThemeUrl = (url) => { + const baseUrl = getConfig().BASE_URL || window.location?.origin; + return `${baseUrl}${basename}${url}`; +}; + export const handleVersionSubstitution = ({ url, wildcardKeyword, localVersion }) => { if (!url || !url.includes(wildcardKeyword) || !localVersion) { return url; } return url.replaceAll(wildcardKeyword, localVersion); }; + +export const isEmptyObject = (obj) => !obj || Object.keys(obj).length === 0; From e8af8b6dac6798c81a83c3ad645305210a60c53e Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Tue, 28 May 2024 18:38:16 +1000 Subject: [PATCH 20/26] test: refactor testing fot app provider, theme core hook, theme variants hook --- src/react/AppProvider.test.jsx | 47 ++++---------- .../hooks/paragon/useParagonTheme.test.js | 8 ++- .../hooks/paragon/useParagonThemeCore.test.js | 63 ++++--------------- .../paragon/useParagonThemeVariants.test.js | 18 ------ 4 files changed, 30 insertions(+), 106 deletions(-) diff --git a/src/react/AppProvider.test.jsx b/src/react/AppProvider.test.jsx index 0a0400e88..a8f61aa0b 100644 --- a/src/react/AppProvider.test.jsx +++ b/src/react/AppProvider.test.jsx @@ -142,24 +142,19 @@ describe('AppProvider', () => { }); describe('paragon theme and brand', () => { + let Component = ( + +
Child One
+
Child Two
+
+ ); + it('calls trackColorSchemeChoice', () => { - const Component = ( - -
Child One
-
Child Two
-
- ); render(Component); expect(useTrackColorSchemeChoice).toHaveBeenCalled(); }); it('calls useParagonTheme', () => { - const Component = ( - -
Child One
-
Child Two
-
- ); render(Component); expect(useParagonTheme).toHaveBeenCalled(); expect(useParagonTheme).toHaveBeenCalledWith( @@ -180,12 +175,6 @@ describe('AppProvider', () => { { isThemeLoaded: false }, jest.fn(), ]); - const Component = ( - -
Child One
-
Child Two
-
- ); const { container } = render(Component); expect(container).toBeEmptyDOMElement(); }); @@ -196,7 +185,7 @@ describe('AppProvider', () => { { isThemeLoaded: true, themeVariant: 'light' }, mockUseParagonThemeDispatch, ]); - const Component = ( + Component = ( {({ paragonTheme }) => ( @@ -235,12 +224,12 @@ describe('AppProvider', () => { }); describe('useAppEvent', () => { + const Component = ( + +
Child
+
+ ); it('subscribes to `AUTHENTICATED_USER_CHANGED`', async () => { - const Component = ( - -
Child
-
- ); render(Component); expect(useAppEvent).toHaveBeenCalledWith(AUTHENTICATED_USER_CHANGED, expect.any(Function)); const useAppEventMockCalls = useAppEvent.mock.calls; @@ -252,11 +241,6 @@ describe('AppProvider', () => { }); it('subscribes to `CONFIG_CHANGED`', async () => { - const Component = ( - -
Child
-
- ); render(Component); expect(useAppEvent).toHaveBeenCalledWith(CONFIG_CHANGED, expect.any(Function)); const useAppEventMockCalls = useAppEvent.mock.calls; @@ -268,11 +252,6 @@ describe('AppProvider', () => { }); it('subscribes to `LOCALE_CHANGED`', async () => { - const Component = ( - -
Child
-
- ); render(Component); expect(useAppEvent).toHaveBeenCalledWith(LOCALE_CHANGED, expect.any(Function)); const useAppEventMockCalls = useAppEvent.mock.calls; diff --git a/src/react/hooks/paragon/useParagonTheme.test.js b/src/react/hooks/paragon/useParagonTheme.test.js index 1528b69f0..fcc352ffa 100644 --- a/src/react/hooks/paragon/useParagonTheme.test.js +++ b/src/react/hooks/paragon/useParagonTheme.test.js @@ -60,7 +60,7 @@ describe('useParagonTheme', () => { }); it('should configure theme variants according with system preference and add the change event listener', () => { - const { unmount } = renderHook(() => useParagonTheme(getConfig())); + const { result, unmount } = renderHook(() => useParagonTheme(getConfig())); const themeLinks = document.head.querySelectorAll('link'); const darkLink = document.head.querySelector('link[data-paragon-theme-variant="dark"]'); const lightLink = document.head.querySelector('link[data-paragon-theme-variant="light"]'); @@ -70,13 +70,15 @@ describe('useParagonTheme', () => { expect(mockAddEventListener).toHaveBeenCalled(); expect(darkLink.rel).toBe('stylesheet'); expect(lightLink.rel).toBe('alternate stylesheet'); + expect(result.current[0]).toEqual({ isThemeLoaded: true, themeVariant: 'dark' }); + unmount(); expect(mockRemoveEventListener).toHaveBeenCalled(); }); it('should configure theme variants according with user preference if is defined (localStorage)', () => { window.localStorage.getItem.mockReturnValue('light'); - const { unmount } = renderHook(() => useParagonTheme(getConfig())); + const { result, unmount } = renderHook(() => useParagonTheme(getConfig())); const themeLinks = document.head.querySelectorAll('link'); const darkLink = document.head.querySelector('link[data-paragon-theme-variant="dark"]'); const lightLink = document.head.querySelector('link[data-paragon-theme-variant="light"]'); @@ -87,6 +89,8 @@ describe('useParagonTheme', () => { expect(darkLink.rel).toBe('alternate stylesheet'); expect(lightLink.rel).toBe('stylesheet'); + expect(result.current[0]).toEqual({ isThemeLoaded: true, themeVariant: 'light' }); + unmount(); expect(mockRemoveEventListener).toHaveBeenCalled(); }); diff --git a/src/react/hooks/paragon/useParagonThemeCore.test.js b/src/react/hooks/paragon/useParagonThemeCore.test.js index f5ff1a687..c1fd4933b 100644 --- a/src/react/hooks/paragon/useParagonThemeCore.test.js +++ b/src/react/hooks/paragon/useParagonThemeCore.test.js @@ -9,20 +9,22 @@ jest.mock('../../../logging'); describe('useParagonThemeCore', () => { const themeOnLoad = jest.fn(); + let coreConfig; - afterEach(() => { + beforeEach(() => { document.head.innerHTML = ''; - jest.clearAllMocks(); - }); - - it('should load the core url and change the loading state to true', () => { - const coreConfig = { + coreConfig = { themeCore: { - urls: { default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css' }, + urls: { + default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', + }, }, onLoad: themeOnLoad, }; + jest.clearAllMocks(); + }); + it('should load the core url and change the loading state to true', () => { renderHook(() => useParagonThemeCore(coreConfig)); const createdLinkTag = document.head.querySelector('link'); act(() => createdLinkTag.onload()); @@ -31,15 +33,7 @@ describe('useParagonThemeCore', () => { }); it('should load the core default and brand url and change the loading state to true', () => { - const coreConfig = { - themeCore: { - urls: { - default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', - brandOverride: 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0Version/dist/core.min.css', - }, - }, - onLoad: themeOnLoad, - }; + coreConfig.themeCore.urls.brandOverride = 'https://cdn.jsdelivr.net/npm/@edx/brand@$2.0.0Version/dist/core.min.css'; renderHook(() => useParagonThemeCore(coreConfig)); const createdLinkTag = document.head.querySelector('link[data-paragon-theme-core="true"]'); @@ -52,33 +46,6 @@ describe('useParagonThemeCore', () => { }); it('should dispatch a log error and fallback to PARAGON_THEME if can not load the core theme link', () => { - global.PARAGON_THEME = { - paragon: { - version: '1.0.0', - themeUrls: { - core: { - fileName: 'core.min.css', - }, - defaults: { - light: 'light', - }, - variants: { - light: { - fileName: 'light.min.css', - }, - }, - }, - }, - }; - const coreConfig = { - themeCore: { - urls: { - default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', - }, - }, - onLoad: themeOnLoad, - }; - renderHook(() => useParagonThemeCore(coreConfig)); const createdLinkTag = document.head.querySelector('link[data-paragon-theme-core="true"]'); @@ -90,14 +57,6 @@ describe('useParagonThemeCore', () => { it('should not create a new link if the core theme is already loaded', () => { document.head.innerHTML = ''; - const coreConfig = { - themeCore: { - urls: { - default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', - }, - }, - onLoad: themeOnLoad, - }; renderHook(() => useParagonThemeCore(coreConfig)); const themeCoreLinks = document.head.querySelectorAll('link'); @@ -107,7 +66,7 @@ describe('useParagonThemeCore', () => { }); it('should not create any core link if can not find themeCore urls definition', () => { - const coreConfig = { + coreConfig = { themeCore: { default: 'https://cdn.jsdelivr.net/npm/@edx/paragon@$21.0.0/dist/core.min.css', }, diff --git a/src/react/hooks/paragon/useParagonThemeVariants.test.js b/src/react/hooks/paragon/useParagonThemeVariants.test.js index 50fad4d74..1836a9d66 100644 --- a/src/react/hooks/paragon/useParagonThemeVariants.test.js +++ b/src/react/hooks/paragon/useParagonThemeVariants.test.js @@ -40,24 +40,6 @@ describe('useParagonThemeVariants', () => { }); it('should dispatch a log error and fallback to PARAGON_THEME if can not load the variant theme link', () => { - global.PARAGON_THEME = { - paragon: { - version: '1.0.0', - themeUrls: { - core: { - fileName: 'core.min.css', - }, - defaults: { - light: 'light', - }, - variants: { - light: { - fileName: 'light.min.css', - }, - }, - }, - }, - }; const themeVariants = { light: { urls: { From e43db9c28febe92c0f02b840fc69b29534610406 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Mon, 3 Jun 2024 13:24:08 +1000 Subject: [PATCH 21/26] docs: improve themening documentation --- docs/how_tos/theming.md | 70 ++++++++++++++++++++++++++++++++------- src/react/AppProvider.jsx | 1 + 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/docs/how_tos/theming.md b/docs/how_tos/theming.md index c0ddda10a..a5de73b20 100644 --- a/docs/how_tos/theming.md +++ b/docs/how_tos/theming.md @@ -2,9 +2,9 @@ ## Overview -This document serves as a guide to using `@edx/frontend-platform` to support MFE theming with Paragon using theme CSS loaded externally (e.g., from a CDN). +This document is a guide for using `@edx/frontend-platform` to support MFE theming with Paragon loading the theme CSS externally (e.g., from a CDN). -To do this, configured URLs pointing to relevant CSS files from `@openedx/paragon` and (optionally) `@openedx/brand-openedx` are loaded and injected to the HTML document at runtime. This differs than the consuming application importing the styles from `@openedx/paragon` and `@openedx/brand-openedx` directly, which includes these styles in the application's production assets. +To do this, configured URLs pointing to relevant CSS files from `@openedx/paragon` and (optionally) `@openedx/brand-openedx` are loaded and injected to the HTML document at runtime. This differs from importing the styles from `@openedx/paragon` and `@openedx/brand-openedx` directly, which includes these styles in the application's production assets. By serving CSS loaded externally, consuming applications of Paragon no longer need to be responsible for compiling the theme SCSS to CSS themselves and instead use a pre-compiled CSS file. In doing so, this allows making changes to the Paragon theme without needing to necessarily re-build and re-deploy all consuming applications. @@ -14,13 +14,13 @@ By serving CSS loaded externally, consuming applications of Paragon no longer ne 1. **Get theme preference from localStorage.** Supports persisting and loading the user's preference for their selected theme variant, until cleared. 1. **Detect user system settings.** Rely on the `prefers-color-scheme` media query to detect if the user's system indicates a preference for dark mode. If so, use the default dark theme variant, if one is configured. -1. **Use default theme variant as configured (see below).** Otherwise, load the default theme variant as configured by the `defaults` option described below. +1. **Use the default theme variant as configured (see below).** Otherwise, load the default theme variant as configured by the `defaults` option described below. -Whenever the current theme variant changes, an attrivbute `data-paragon-theme-variant="*"` is updated on the `` element. This attribute enables applications' both JS and CSS to have knowledge of the currently applied theme variant. +Whenever the current theme variant changes, an attribute `data-paragon-theme-variant="*"` is updated on the `` element. This attribute enables applications both JS and CSS to have knowledge of the currently applied theme variant. ### Supporting custom theme variants beyond `light` and `dark` -If your use case necessitates additional variants beyond the default supported `light` and `dark` theme variants, you may pass any number of custom theme variants. Custom theme variants will work the user's persisted localStorage setting (i.e., if a user switches to a custom theme variant, the MFE will continue to load the custom theme variant by default). By supporting custom theme variants, it also supports having multiple or alternative `light` and/or `dark` theme variants. +If your use case requires additional variants beyond the default `light` and `dark` theme variants, you may pass any number of custom theme variants. Custom theme variants will work the user's persisted localStorage setting (i.e., if a user switches to a custom theme variant, the MFE will continue to load the custom theme variant by default). By supporting custom theme variants, it also supports having multiple or alternative `light` and/or `dark` theme variants. You can see the [Configuration options](#configuration-options) example for better understanding. ### Performance implications @@ -90,6 +90,52 @@ The `dark` theme variant options are optional. | `variants.dark.urls.default` | String | URL for the `dark.css` file from `@openedx/paragon`. | | `variants.dark.urls.brandOverride` | String | URL for the `dark.css` file from `@openedx/brand-openedx`. | +Understanding the different configuration options, a complex use case: + +```js +const config = { + PARAGON_THEME_URLS: { + { + core: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/core.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@my-brand/brand-package@#brandVersion/dist/core.min.css', + }, + }, + defaults: { + light: 'light', + dark: 'dark', + }, + variants: { + light: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/light.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@my-brand/brand-package@$brandVersion/dist/light.min.css', + }, + }, + // Configure optional dark mode + dark: { + urls: { + default: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dark/dark.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@my-brand/brand-package@$brandVersion/dist/dark.min.css', + }, + }, + // Configure any extra theme using a custom @openedx/brand-openedx package + green: { + url: 'https://cdn.jsdelivr.net/npm/@my-brand/brand-package@$brandVersion/dist/green.min.css', + }, + red: { + url: 'https://cdn.jsdelivr.net/npm/@my-brand/brand-package@$brandVersion/dist/red.min.css', + }, + 'high-contrast-dark': { + url: 'https://cdn.jsdelivr.net/npm/@my-brand/brand-package@$brandVersion/dist/high-contrast-dark.min.css', + }, + }, + } + } +} +``` + ### JavaScript-based configuration One approach to configuring the `PARAGON_THEME_URLS` is to create a `env.config.js` file in the root of the repository. The configuration is defined as a JavaScript file, which affords consumers to use more complex data types, amongst other benefits. @@ -145,7 +191,7 @@ MFE_CONFIG_OVERRIDES = { } ``` -### Locally installed `@openedx/paragon` +### Reference the locally installed `@openedx/paragon` version If you would like to use the same version of the Paragon CSS urls as the locally installed `@openedx/paragon`, the configuration for the Paragon CSS urls may contain a wildcard `$paragonVersion` which gets replaced with the locally installed version of `@openedx/paragon` in the consuming application, e.g.: @@ -158,9 +204,9 @@ In the event the other Paragon CSS urls are configured via one of the other docu ## Usage with `@openedx/brand-openedx` -The core Paragon design tokens and styles may be optionally overriden by utilizing `@openedx/brand-openedx`, which allows theme authors to customize the default Paragon theme to match the look and feel of their custom brand. +The core Paragon design tokens and styles may be optionally overridden by utilizing `@openedx/brand-openedx`, which allows theme authors to customize the default Paragon theme to match the look and feel of their custom brand. -This override mechanism works by compiling the design tokens defined in `@openedx/brand-openedx` with the the core Paragon tokens to generate overrides to Paragon's default CSS variables, and then compiling the output CSS with any SCSS theme customizations not possible through a design token override. +This override mechanism works by compiling the design tokens defined in `@openedx/brand-openedx` with the core Paragon tokens to generate overrides to Paragon's default CSS variables and then compiling the output CSS with any SCSS theme customizations not possible through a design token override. The CSS urls for `@openedx/brand-openedx` overrides will be applied after the core Paragon theme urls load, thus overriding any previously set CSS variables and/or styles. @@ -172,7 +218,7 @@ const config = { core: { urls: { default: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/core.min.css', - brandOverride: 'https://cdn.jsdelivr.net/npm/@openedx/brand-openedx-edx.org@#brandVersion/dist/core.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@openedx/brand-openedx@#brandVersion/dist/core.min.css', }, }, defaults: { @@ -182,7 +228,7 @@ const config = { light: { urls: { default: 'https://cdn.jsdelivr.net/npm/@openedx/paragon@$paragonVersion/dist/light.min.css', - brandOverride: 'https://cdn.jsdelivr.net/npm/@openedx/brand-openedx-edx.org@$brandVersion/dist/light.min.css', + brandOverride: 'https://cdn.jsdelivr.net/npm/@openedx/brand-openedx@$brandVersion/dist/light.min.css', }, }, }, @@ -192,9 +238,9 @@ const config = { export default config; ``` -### Locally installed `@openedx/brand-openedx` +### Reference the locally installed `@openedx/brand-openedx` version -If you would like to use the same version of the brand override CSS urls as the locally installed `@openedx/brand-openedx`, the configuration for the brand override CSS urls may contain a wildcard `$brandVersion` which gets replaced with the locally installed version of `@openedx/brand-openedx` in the consuming application, e.g.: +If you would like to use the same version of the brand overrides CSS urls as the locally installed `@openedx/brand-openedx`, the configuration for the brand override CSS urls may contain a wildcard `$brandVersion` which gets replaced with the locally installed version of `@openedx/brand-openedx` in the consuming application, e.g.: ```shell https://cdn.jsdelivr.net/npm/@openedx/brand-openedx@$brandVersion/dist/core.min.css diff --git a/src/react/AppProvider.jsx b/src/react/AppProvider.jsx index 646d661c4..f2b38c15e 100644 --- a/src/react/AppProvider.jsx +++ b/src/react/AppProvider.jsx @@ -45,6 +45,7 @@ import { SELECTED_THEME_VARIANT_KEY } from './constants'; * - Optionally a redux `Provider`. Will only be included if a `store` property is passed to * `AppProvider`. * - A `Router` for react-router. + * - A theme manager for Paragon. * * @param {Object} props * @param {Object} [props.store] A redux store. From 9f6f44511a3c25006f4ab259c32efde4af66e891 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Wed, 26 Jun 2024 12:24:39 +1000 Subject: [PATCH 22/26] chore: update dependencies and regenerate package-lock --- package-lock.json | 16 +--------------- package.json | 2 +- src/react/AppProvider.test.jsx | 6 ++++++ src/setupTest.js | 1 - 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c38b7e2c..0c068a813 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ }, "peerDependencies": { "@openedx/frontend-build": ">= 14.0.0", - "@openedx/paragon": ">= 21.5.7 < 23.0.0 || 23.0.0-alpha.4", + "@openedx/paragon": " 23.0.0-alpha.4 || >= 21.5.7 < 23.0.0", "prop-types": ">=15.7.2 <16.0.0", "react": "^16.9.0 || ^17.0.0", "react-dom": "^16.9.0 || ^17.0.0", @@ -9404,20 +9404,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", diff --git a/package.json b/package.json index 408c01820..4ec55ac0a 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ }, "peerDependencies": { "@openedx/frontend-build": ">= 14.0.0", - "@openedx/paragon": ">= 21.5.7 < 23.0.0 || 23.0.0-alpha.4", + "@openedx/paragon": " 23.0.0-alpha.4 || >= 21.5.7 < 23.0.0", "prop-types": ">=15.7.2 <16.0.0", "react": "^16.9.0 || ^17.0.0", "react-dom": "^16.9.0 || ^17.0.0", diff --git a/src/react/AppProvider.test.jsx b/src/react/AppProvider.test.jsx index a8f61aa0b..8eaab4868 100644 --- a/src/react/AppProvider.test.jsx +++ b/src/react/AppProvider.test.jsx @@ -57,6 +57,12 @@ jest.mock('./hooks', () => ({ ]), })); +Object.defineProperty(window, 'localStorage', { + value: { + setItem: jest.fn(), + }, +}); + describe('AppProvider', () => { beforeEach(async () => { jest.clearAllMocks(); diff --git a/src/setupTest.js b/src/setupTest.js index 2e8b273d8..f2513825c 100644 --- a/src/setupTest.js +++ b/src/setupTest.js @@ -1,6 +1,5 @@ /* eslint-disable import/no-extraneous-dependencies */ import '@testing-library/jest-dom'; -import 'jest-localstorage-mock'; // These configuration values are usually set in webpack's EnvironmentPlugin however // Jest does not use webpack so we need to set these so for testing From 0542b458bb37ea9a498f2306d0a31aa651377279 Mon Sep 17 00:00:00 2001 From: Diana Catalina Olarte Date: Mon, 22 Jul 2024 17:13:40 +1000 Subject: [PATCH 23/26] temp: add dist folder for testing purposes --- .gitignore | 1 - dist/LICENSE | 661 ++++++++++++++++++ dist/README.md | 155 ++++ dist/analytics/MockAnalyticsService.js | 75 ++ dist/analytics/MockAnalyticsService.js.map | 1 + dist/analytics/SegmentAnalyticsService.js | 259 +++++++ dist/analytics/SegmentAnalyticsService.js.map | 1 + dist/analytics/index.js | 4 + dist/analytics/index.js.map | 1 + dist/analytics/interface.js | 139 ++++ dist/analytics/interface.js.map | 1 + dist/auth/AxiosCsrfTokenService.js | 85 +++ dist/auth/AxiosCsrfTokenService.js.map | 1 + dist/auth/AxiosJwtAuthService.js | 465 ++++++++++++ dist/auth/AxiosJwtAuthService.js.map | 1 + dist/auth/AxiosJwtTokenService.js | 201 ++++++ dist/auth/AxiosJwtTokenService.js.map | 1 + dist/auth/LocalForageCache.js | 116 +++ dist/auth/LocalForageCache.js.map | 1 + dist/auth/MockAuthService.js | 295 ++++++++ dist/auth/MockAuthService.js.map | 1 + dist/auth/index.js | 4 + dist/auth/index.js.map | 1 + .../createCsrfTokenProviderInterceptor.js | 57 ++ .../createCsrfTokenProviderInterceptor.js.map | 1 + .../createJwtTokenProviderInterceptor.js | 55 ++ .../createJwtTokenProviderInterceptor.js.map | 1 + ...eateProcessAxiosRequestErrorInterceptor.js | 36 + ...ProcessAxiosRequestErrorInterceptor.js.map | 1 + .../interceptors/createRetryInterceptor.js | 108 +++ .../createRetryInterceptor.js.map | 1 + dist/auth/interface.js | 359 ++++++++++ dist/auth/interface.js.map | 1 + dist/auth/utils.js | 101 +++ dist/auth/utils.js.map | 1 + dist/config.js | 327 +++++++++ dist/config.js.map | 1 + dist/constants.js | 65 ++ dist/constants.js.map | 1 + dist/i18n/countries.js | 70 ++ dist/i18n/countries.js.map | 1 + dist/i18n/index.js | 91 +++ dist/i18n/index.js.map | 1 + dist/i18n/injectIntlWithShim.js | 70 ++ dist/i18n/injectIntlWithShim.js.map | 1 + dist/i18n/languages.js | 73 ++ dist/i18n/languages.js.map | 1 + dist/i18n/lib.js | 307 ++++++++ dist/i18n/lib.js.map | 1 + dist/i18n/scripts/README.md | 29 + dist/i18n/scripts/intl-imports.js | 177 +++++ dist/i18n/scripts/intl-imports.js.map | 1 + dist/i18n/scripts/transifex-utils.js | 72 ++ dist/i18n/scripts/transifex-utils.js.map | 1 + dist/index.js | 7 + dist/index.js.map | 1 + dist/initialize.js | 494 +++++++++++++ dist/initialize.js.map | 1 + dist/logging/MockLoggingService.js | 37 + dist/logging/MockLoggingService.js.map | 1 + dist/logging/NewRelicLoggingService.js | 192 +++++ dist/logging/NewRelicLoggingService.js.map | 1 + dist/logging/index.js | 4 + dist/logging/index.js.map | 1 + dist/logging/interface.js | 108 +++ dist/logging/interface.js.map | 1 + dist/package.json | 89 +++ dist/pubSub.js | 48 ++ dist/pubSub.js.map | 1 + dist/react/AppContext.js | 24 + dist/react/AppContext.js.map | 1 + dist/react/AppProvider.js | 119 ++++ dist/react/AppProvider.js.map | 1 + dist/react/AuthenticatedPageRoute.js | 43 ++ dist/react/AuthenticatedPageRoute.js.map | 1 + dist/react/ErrorBoundary.js | 71 ++ dist/react/ErrorBoundary.js.map | 1 + dist/react/ErrorPage.js | 65 ++ dist/react/ErrorPage.js.map | 1 + dist/react/LoginRedirect.js | 17 + dist/react/LoginRedirect.js.map | 1 + dist/react/OptionalReduxProvider.js | 29 + dist/react/OptionalReduxProvider.js.map | 1 + dist/react/PageWrap.js | 23 + dist/react/PageWrap.js.map | 1 + dist/react/constants.js | 4 + dist/react/constants.js.map | 1 + dist/react/hooks/index.js | 3 + dist/react/hooks/index.js.map | 1 + dist/react/hooks/paragon/index.js | 3 + dist/react/hooks/paragon/index.js.map | 1 + dist/react/hooks/paragon/useParagonTheme.js | 113 +++ .../hooks/paragon/useParagonTheme.js.map | 1 + .../hooks/paragon/useParagonThemeCore.js | 141 ++++ .../hooks/paragon/useParagonThemeCore.js.map | 1 + .../hooks/paragon/useParagonThemeUrls.js | 125 ++++ .../hooks/paragon/useParagonThemeUrls.js.map | 1 + .../hooks/paragon/useParagonThemeVariants.js | 198 ++++++ .../paragon/useParagonThemeVariants.js.map | 1 + .../paragon/useTrackColorSchemeChoice.js | 34 + .../paragon/useTrackColorSchemeChoice.js.map | 1 + dist/react/hooks/paragon/utils.js | 91 +++ dist/react/hooks/paragon/utils.js.map | 1 + dist/react/hooks/useAppEvent.js | 24 + dist/react/hooks/useAppEvent.js.map | 1 + dist/react/index.js | 18 + dist/react/index.js.map | 1 + dist/react/reducers.js | 44 ++ dist/react/reducers.js.map | 1 + dist/scripts/GoogleAnalyticsLoader.js | 57 ++ dist/scripts/GoogleAnalyticsLoader.js.map | 1 + dist/scripts/index.js | 3 + dist/scripts/index.js.map | 1 + dist/testing/index.js | 10 + dist/testing/index.js.map | 1 + dist/testing/initializeMockApp.js | 85 +++ dist/testing/initializeMockApp.js.map | 1 + dist/testing/mockMessages.js | 23 + dist/testing/mockMessages.js.map | 1 + dist/utils.js | 214 ++++++ dist/utils.js.map | 1 + 121 files changed, 7074 insertions(+), 1 deletion(-) create mode 100644 dist/LICENSE create mode 100644 dist/README.md create mode 100644 dist/analytics/MockAnalyticsService.js create mode 100644 dist/analytics/MockAnalyticsService.js.map create mode 100644 dist/analytics/SegmentAnalyticsService.js create mode 100644 dist/analytics/SegmentAnalyticsService.js.map create mode 100644 dist/analytics/index.js create mode 100644 dist/analytics/index.js.map create mode 100755 dist/analytics/interface.js create mode 100644 dist/analytics/interface.js.map create mode 100644 dist/auth/AxiosCsrfTokenService.js create mode 100644 dist/auth/AxiosCsrfTokenService.js.map create mode 100644 dist/auth/AxiosJwtAuthService.js create mode 100644 dist/auth/AxiosJwtAuthService.js.map create mode 100644 dist/auth/AxiosJwtTokenService.js create mode 100644 dist/auth/AxiosJwtTokenService.js.map create mode 100644 dist/auth/LocalForageCache.js create mode 100644 dist/auth/LocalForageCache.js.map create mode 100644 dist/auth/MockAuthService.js create mode 100644 dist/auth/MockAuthService.js.map create mode 100644 dist/auth/index.js create mode 100644 dist/auth/index.js.map create mode 100644 dist/auth/interceptors/createCsrfTokenProviderInterceptor.js create mode 100644 dist/auth/interceptors/createCsrfTokenProviderInterceptor.js.map create mode 100644 dist/auth/interceptors/createJwtTokenProviderInterceptor.js create mode 100644 dist/auth/interceptors/createJwtTokenProviderInterceptor.js.map create mode 100644 dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js create mode 100644 dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js.map create mode 100644 dist/auth/interceptors/createRetryInterceptor.js create mode 100644 dist/auth/interceptors/createRetryInterceptor.js.map create mode 100644 dist/auth/interface.js create mode 100644 dist/auth/interface.js.map create mode 100644 dist/auth/utils.js create mode 100644 dist/auth/utils.js.map create mode 100644 dist/config.js create mode 100644 dist/config.js.map create mode 100644 dist/constants.js create mode 100644 dist/constants.js.map create mode 100644 dist/i18n/countries.js create mode 100644 dist/i18n/countries.js.map create mode 100644 dist/i18n/index.js create mode 100644 dist/i18n/index.js.map create mode 100644 dist/i18n/injectIntlWithShim.js create mode 100644 dist/i18n/injectIntlWithShim.js.map create mode 100644 dist/i18n/languages.js create mode 100644 dist/i18n/languages.js.map create mode 100644 dist/i18n/lib.js create mode 100644 dist/i18n/lib.js.map create mode 100644 dist/i18n/scripts/README.md create mode 100755 dist/i18n/scripts/intl-imports.js create mode 100644 dist/i18n/scripts/intl-imports.js.map create mode 100755 dist/i18n/scripts/transifex-utils.js create mode 100644 dist/i18n/scripts/transifex-utils.js.map create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 dist/initialize.js create mode 100644 dist/initialize.js.map create mode 100644 dist/logging/MockLoggingService.js create mode 100644 dist/logging/MockLoggingService.js.map create mode 100644 dist/logging/NewRelicLoggingService.js create mode 100644 dist/logging/NewRelicLoggingService.js.map create mode 100644 dist/logging/index.js create mode 100644 dist/logging/index.js.map create mode 100644 dist/logging/interface.js create mode 100644 dist/logging/interface.js.map create mode 100644 dist/package.json create mode 100644 dist/pubSub.js create mode 100644 dist/pubSub.js.map create mode 100644 dist/react/AppContext.js create mode 100644 dist/react/AppContext.js.map create mode 100644 dist/react/AppProvider.js create mode 100644 dist/react/AppProvider.js.map create mode 100644 dist/react/AuthenticatedPageRoute.js create mode 100644 dist/react/AuthenticatedPageRoute.js.map create mode 100644 dist/react/ErrorBoundary.js create mode 100644 dist/react/ErrorBoundary.js.map create mode 100644 dist/react/ErrorPage.js create mode 100644 dist/react/ErrorPage.js.map create mode 100644 dist/react/LoginRedirect.js create mode 100644 dist/react/LoginRedirect.js.map create mode 100644 dist/react/OptionalReduxProvider.js create mode 100644 dist/react/OptionalReduxProvider.js.map create mode 100644 dist/react/PageWrap.js create mode 100644 dist/react/PageWrap.js.map create mode 100644 dist/react/constants.js create mode 100644 dist/react/constants.js.map create mode 100644 dist/react/hooks/index.js create mode 100644 dist/react/hooks/index.js.map create mode 100644 dist/react/hooks/paragon/index.js create mode 100644 dist/react/hooks/paragon/index.js.map create mode 100644 dist/react/hooks/paragon/useParagonTheme.js create mode 100644 dist/react/hooks/paragon/useParagonTheme.js.map create mode 100644 dist/react/hooks/paragon/useParagonThemeCore.js create mode 100644 dist/react/hooks/paragon/useParagonThemeCore.js.map create mode 100644 dist/react/hooks/paragon/useParagonThemeUrls.js create mode 100644 dist/react/hooks/paragon/useParagonThemeUrls.js.map create mode 100644 dist/react/hooks/paragon/useParagonThemeVariants.js create mode 100644 dist/react/hooks/paragon/useParagonThemeVariants.js.map create mode 100644 dist/react/hooks/paragon/useTrackColorSchemeChoice.js create mode 100644 dist/react/hooks/paragon/useTrackColorSchemeChoice.js.map create mode 100644 dist/react/hooks/paragon/utils.js create mode 100644 dist/react/hooks/paragon/utils.js.map create mode 100644 dist/react/hooks/useAppEvent.js create mode 100644 dist/react/hooks/useAppEvent.js.map create mode 100644 dist/react/index.js create mode 100644 dist/react/index.js.map create mode 100644 dist/react/reducers.js create mode 100644 dist/react/reducers.js.map create mode 100644 dist/scripts/GoogleAnalyticsLoader.js create mode 100644 dist/scripts/GoogleAnalyticsLoader.js.map create mode 100644 dist/scripts/index.js create mode 100644 dist/scripts/index.js.map create mode 100644 dist/testing/index.js create mode 100644 dist/testing/index.js.map create mode 100644 dist/testing/initializeMockApp.js create mode 100644 dist/testing/initializeMockApp.js.map create mode 100644 dist/testing/mockMessages.js create mode 100644 dist/testing/mockMessages.js.map create mode 100644 dist/utils.js create mode 100644 dist/utils.js.map diff --git a/.gitignore b/.gitignore index 00b0d34c5..505b4cc39 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ .idea .vscode coverage -dist src/i18n/transifex_input.json node_modules /docs/api diff --git a/dist/LICENSE b/dist/LICENSE new file mode 100644 index 000000000..dbbe35581 --- /dev/null +++ b/dist/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/dist/README.md b/dist/README.md new file mode 100644 index 000000000..9c42ab660 --- /dev/null +++ b/dist/README.md @@ -0,0 +1,155 @@ +[![Build Status](https://github.com/openedx/frontend-platform/actions/workflows/ci.yml/badge.svg)](https://github.com/openedx/frontend-platform/actions/workflows/ci.yml) +[![Codecov](https://img.shields.io/codecov/c/github/edx/frontend-platform)](https://codecov.io/gh/edx/frontend-platform) +[![NPM Version](https://img.shields.io/npm/v/@edx/frontend-platform.svg)](https://www.npmjs.com/package/@edx/frontend-platform) +[![npm_downloads](https://img.shields.io/npm/dt/@edx/frontend-platform.svg)](https://www.npmjs.com/package/@edx/frontend-platform) +[![license](https://img.shields.io/npm/l/@edx/frontend-platform.svg)](https://github.com/openedx/frontend-platform/blob/master/LICENSE) +[![semantic release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) + +# Overview + +See the [GitHub Pages site for the complete documentation](https://openedx.github.io/frontend-platform/). + +frontend-platform is a modest application framework for Open edX micro-frontend applications and their supporting libraries. It provides several foundational services that all Open edX micro-frontends should have: + +| Service | Module location | +|------------------------------------|----------------------------------| +| Analytics | @edx/frontend-platform/analytics | +| Logging | @edx/frontend-platform/logging | +| Authenticated API client (auth) | @edx/frontend-platform/auth | +| Internationalization (i18n) | @edx/frontend-platform/i18n | +| Misc (init, config, pubSub, utils) | @edx/frontend-platform | + +------------------------------------------------------------------------- + +In addition, frontend-platform provides an extensible application initialization lifecycle to help manage the configuration of the above services, freeing application developers to focus on feature development. + +## Getting started + +### One-time setup if you have not upgraded node/npm +IMPORTANT: There is now a new node/npm version being used by frontend-platform as of +https://github.com/openedx/frontend-platform/pull/259 + +#### Install nvm +This is highly recommended to be able to leverage different node/npm versions. +For a some time, different repositories may be using different versions of node/npm. + +Alternatively, please install node16 and npm8 for use with this repository. + +#### Switch to node/npm version for this repo +```nvm use``` +if you don't have the right node/npm versions, nvm will instruct you to install those + +#### Clean out old node modules and reinstall +This step is needed because node now uses a different package lock format, and it's important to reinstall +dependencies based on this new package file. Delete node_modules, and issue an `npm ci` + + +### Standard getting started steps + +1. `npm install` +2. `npm start` +3. Open http://localhost:8080 to view the example app. + +## Architecture + +The four foundational services listed above (analytics, auth, i18n, and logging) are provided as imports to applications via frontend-platform's API layer. The initialization sequence creates an instance of each service and exposes its methods as functional exports, creating a layer of abstraction between service implementations and their usage in application code. + +Each type of service has a documented API contract which service implementations must fulfill. This allows different service implementations to be used as necessary without updates to consuming applications. + +### Service architecture + +Internally, service implementations are strictly isolated from the rest of the platform. They are classes that take their dependencies as arguments to their constructor. This means, for instance, if analytics depends on logging, it takes a reference to an instance fulfilling the `LoggingService` interface as an option when it's instantiated. It cannot import from the logging module directly. Put another way, the default service implementations may be co-located with the service interfaces for convenience, but they can theoretically live in their own repository and it wouldn't require any refactoring. + +Likewise, platform code should not make use of service methods that are not part of the documented interface for the same reasons. + +### Application initialization + +frontend-platform provides an `initialize()` function which bootstraps and configures an application. The `initialize()` function uses a set of [sensible defaults](https://en.wikipedia.org/wiki/Convention_over_configuration) unless otherwise specified, bootstrapping the application with services reflecting Open edX's best practices around analytics, authentication, internationalization, and logging. + +The initialization process proceeds in a series of phases, giving the initializing application code opportunities to hook into the process and do custom setup as desired: + +- Before initialization +- Pub/Sub initialized +- Environment config document loaded +- Logging service initialized +- Authentication service initialized +- Analytics service initialized +- Internationalization service initialized +- Application ready + +Most applications won't need to do anything special at all. + +### Application configuration + +When the application loads, a list of known environment variables is loaded from `process.env` into an object which it exposes via `getConfig` - the point here is primarily to isolate our code from usages of `process.env` which may not always be the way we choose to configure our apps. The application initialization lifecycle supports runtime configuration as well via the `config` handler, documented in the [initialize function](https://edx.github.io/frontend-platform/module-Initialization.html#~initialize). If you want to get a variable into the config that it’s not expecting, you can use [`mergeConfig`](https://edx.github.io/frontend-platform/module-Config.html#~mergeConfig) during initialization to add it in from `process.env`. + +Such an example might look like this: + +``` +initialize({ + // ... other initialization options + handlers: { + config: () => { + mergeConfig({ + CUSTOM_VARIABLE: process.env.CUSTOM_VARIABLE || null, + }, 'Custom app config'); + }, + }, +}); +``` + +When using runtime configuration via `mergeConfig` noted above, `getConfig` must be called within a component's render lifecycle for the added keys and values to be returned in the configuration object. If `getConfig` is called outside of a component's render lifecycle, the custom configuration key/value pairs will not initially be part of the object returned by `getConfig`. For example: + +```jsx +import { getConfig } from '@edx/frontend-platform/config'; + +// The runtime configuration `CUSTOM_VARIABLE` added in the above code snippet will not appear here. This is +// because `getConfig` is called before `mergeConfig` is executed to add the custom runtime configuration. +console.log(getConfig().CUSTOM_VARIABLE); // returns undefined + +const ExampleComponent = () => { + // This returns the value as expected since it is called after `mergeConfig` has already been executed. + console.log(getConfig().CUSTOM_VARIABLE) +}; +``` + +### Service interfaces + +Each service (analytics, auth, i18n, logging) provided by frontend-platform has an API contract which all implementations of that service are guaranteed to fulfill. Applications that use frontend-platform can use its configured services via a convenient set of exported functions. An application that wants to use the service interfaces need only initialize them via the initialize() function, optionally providing custom service interfaces as desired (you probably won't need to). + +![Service interface](service-interface.png) + +### Service implementations + +This repository contains default service implementations for convenience. These implementations are co-located with their consuming service interfaces for ease of development, though the two should remain _strictly_ modular and separate. + +The included service implementations are: + +- New Relic (logging) +- Segment (analytics) +- Axios/JWT (auth) +- React Intl (i18n) + +NOTE: As of this writing, i18n is _not_ configurable. The `initialize()` function does not allow applications to supply an alternate i18n implementation; this is because the interface and implementation for i18n has not yet been separated and modularized. + +# Local Development & Testing Locally + +When making changes to frontend-platform, be sure to manually run the included example app located in `./example`. The example app includes 2 routes to test for both unauthenticated and authenticated users. To start the example app, run `npm start` from the root directory. + +If you want to test changes to frontend-platform against a micro-frontend locally, follow the directions here: https://github.com/openedx/frontend-build#local-module-configuration-for-webpack + +# Production Deployment Strategy + +For any MFE built on top of the frontend-platform, the deployment strategy will be something like the following: + +1. Run the build script with environment variables on the command line to pass in any relevant config. Example: + + ```bash + NODE_ENV=development BASE_URL=open.edx.org ETC=etc npm run build + ``` + + This will create a dist/ directory that contains the deployable artifacts. + +2. Copy the contents of dist/ to a web server. + +3. Configure the platform to point at your MFE. (details on this coming soon) diff --git a/dist/analytics/MockAnalyticsService.js b/dist/analytics/MockAnalyticsService.js new file mode 100644 index 000000000..2f92cd57d --- /dev/null +++ b/dist/analytics/MockAnalyticsService.js @@ -0,0 +1,75 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +/** + * The MockAnalyticsService implements all functions of AnalyticsService as Jest mocks (jest.fn())). + * It emulates the behavior of a real analytics service but witohut making any requests. It has no + * other functionality. + * + * @implements {AnalyticsService} + * @memberof module:Analytics + */ +var MockAnalyticsService = /*#__PURE__*/_createClass(function MockAnalyticsService(_ref) { + var _this = this; + var httpClient = _ref.httpClient, + loggingService = _ref.loggingService; + _classCallCheck(this, MockAnalyticsService); + _defineProperty(this, "checkIdentifyCalled", jest.fn(function () { + if (!_this.hasIdentifyBeenCalled) { + _this.loggingService.logError('Identify must be called before other tracking events.'); + } + })); + /** + * Returns a resolved promise. + * + * @returns {Promise} The promise returned by HttpClient.post. + */ + _defineProperty(this, "sendTrackingLogEvent", jest.fn(function () { + return Promise.resolve(); + })); + /** + * No-op, but records that identify has been called. + * + * @param {string} userId + * @throws {Error} If userId argument is not supplied. + */ + _defineProperty(this, "identifyAuthenticatedUser", jest.fn(function (userId) { + if (!userId) { + throw new Error('UserId is required for identifyAuthenticatedUser.'); + } + _this.hasIdentifyBeenCalled = true; + })); + /** + * No-op, but records that it has been called to prevent double-identification. + * @returns {Promise} A resolved promise. + */ + _defineProperty(this, "identifyAnonymousUser", jest.fn(function () { + _this.hasIdentifyBeenCalled = true; + return Promise.resolve(); + })); + /** + * Logs the event to the console. + * + * Checks whether identify has been called, logging an error to the logging service if not. + */ + _defineProperty(this, "sendTrackEvent", jest.fn(function () { + _this.checkIdentifyCalled(); + })); + /** + * Logs the event to the console. + * + * Checks whether identify has been called, logging an error to the logging service if not. + */ + _defineProperty(this, "sendPageEvent", jest.fn(function () { + _this.checkIdentifyCalled(); + })); + this.loggingService = loggingService; + this.httpClient = httpClient; +}); +_defineProperty(MockAnalyticsService, "hasIdentifyBeenCalled", false); +export default MockAnalyticsService; +//# sourceMappingURL=MockAnalyticsService.js.map \ No newline at end of file diff --git a/dist/analytics/MockAnalyticsService.js.map b/dist/analytics/MockAnalyticsService.js.map new file mode 100644 index 000000000..7af4b6695 --- /dev/null +++ b/dist/analytics/MockAnalyticsService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MockAnalyticsService.js","names":["MockAnalyticsService","_createClass","_ref","_this","httpClient","loggingService","_classCallCheck","_defineProperty","jest","fn","hasIdentifyBeenCalled","logError","Promise","resolve","userId","Error","checkIdentifyCalled"],"sources":["../../src/analytics/MockAnalyticsService.js"],"sourcesContent":["/**\n * The MockAnalyticsService implements all functions of AnalyticsService as Jest mocks (jest.fn())).\n * It emulates the behavior of a real analytics service but witohut making any requests. It has no\n * other functionality.\n *\n * @implements {AnalyticsService}\n * @memberof module:Analytics\n */\nclass MockAnalyticsService {\n static hasIdentifyBeenCalled = false;\n\n constructor({ httpClient, loggingService }) {\n this.loggingService = loggingService;\n this.httpClient = httpClient;\n }\n\n checkIdentifyCalled = jest.fn(() => {\n if (!this.hasIdentifyBeenCalled) {\n this.loggingService.logError('Identify must be called before other tracking events.');\n }\n });\n\n /**\n * Returns a resolved promise.\n *\n * @returns {Promise} The promise returned by HttpClient.post.\n */\n sendTrackingLogEvent = jest.fn(() => Promise.resolve());\n\n /**\n * No-op, but records that identify has been called.\n *\n * @param {string} userId\n * @throws {Error} If userId argument is not supplied.\n */\n identifyAuthenticatedUser = jest.fn((userId) => {\n if (!userId) {\n throw new Error('UserId is required for identifyAuthenticatedUser.');\n }\n this.hasIdentifyBeenCalled = true;\n });\n\n /**\n * No-op, but records that it has been called to prevent double-identification.\n * @returns {Promise} A resolved promise.\n */\n identifyAnonymousUser = jest.fn(() => {\n this.hasIdentifyBeenCalled = true;\n return Promise.resolve();\n });\n\n /**\n * Logs the event to the console.\n *\n * Checks whether identify has been called, logging an error to the logging service if not.\n */\n sendTrackEvent = jest.fn(() => {\n this.checkIdentifyCalled();\n });\n\n /**\n * Logs the event to the console.\n *\n * Checks whether identify has been called, logging an error to the logging service if not.\n */\n sendPageEvent = jest.fn(() => {\n this.checkIdentifyCalled();\n });\n}\n\nexport default MockAnalyticsService;\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAPA,IAQMA,oBAAoB,gBAAAC,YAAA,CAGxB,SAAAD,qBAAAE,IAAA,EAA4C;EAAA,IAAAC,KAAA;EAAA,IAA9BC,UAAU,GAAAF,IAAA,CAAVE,UAAU;IAAEC,cAAc,GAAAH,IAAA,CAAdG,cAAc;EAAAC,eAAA,OAAAN,oBAAA;EAAAO,eAAA,8BAKlBC,IAAI,CAACC,EAAE,CAAC,YAAM;IAClC,IAAI,CAACN,KAAI,CAACO,qBAAqB,EAAE;MAC/BP,KAAI,CAACE,cAAc,CAACM,QAAQ,CAAC,uDAAuD,CAAC;IACvF;EACF,CAAC,CAAC;EAEF;AACF;AACA;AACA;AACA;EAJEJ,eAAA,+BAKuBC,IAAI,CAACC,EAAE,CAAC;IAAA,OAAMG,OAAO,CAACC,OAAO,CAAC,CAAC;EAAA,EAAC;EAEvD;AACF;AACA;AACA;AACA;AACA;EALEN,eAAA,oCAM4BC,IAAI,CAACC,EAAE,CAAC,UAACK,MAAM,EAAK;IAC9C,IAAI,CAACA,MAAM,EAAE;MACX,MAAM,IAAIC,KAAK,CAAC,mDAAmD,CAAC;IACtE;IACAZ,KAAI,CAACO,qBAAqB,GAAG,IAAI;EACnC,CAAC,CAAC;EAEF;AACF;AACA;AACA;EAHEH,eAAA,gCAIwBC,IAAI,CAACC,EAAE,CAAC,YAAM;IACpCN,KAAI,CAACO,qBAAqB,GAAG,IAAI;IACjC,OAAOE,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B,CAAC,CAAC;EAEF;AACF;AACA;AACA;AACA;EAJEN,eAAA,yBAKiBC,IAAI,CAACC,EAAE,CAAC,YAAM;IAC7BN,KAAI,CAACa,mBAAmB,CAAC,CAAC;EAC5B,CAAC,CAAC;EAEF;AACF;AACA;AACA;AACA;EAJET,eAAA,wBAKgBC,IAAI,CAACC,EAAE,CAAC,YAAM;IAC5BN,KAAI,CAACa,mBAAmB,CAAC,CAAC;EAC5B,CAAC,CAAC;EAvDA,IAAI,CAACX,cAAc,GAAGA,cAAc;EACpC,IAAI,CAACD,UAAU,GAAGA,UAAU;AAC9B,CAAC;AAAAG,eAAA,CANGP,oBAAoB,2BACO,KAAK;AA6DtC,eAAeA,oBAAoB","ignoreList":[]} \ No newline at end of file diff --git a/dist/analytics/SegmentAnalyticsService.js b/dist/analytics/SegmentAnalyticsService.js new file mode 100644 index 000000000..9b29212ba --- /dev/null +++ b/dist/analytics/SegmentAnalyticsService.js @@ -0,0 +1,259 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import formurlencoded from 'form-urlencoded'; +import { snakeCaseObject } from '../utils'; + +/** + * @implements {AnalyticsService} + * @memberof module:Analytics + */ +var SegmentAnalyticsService = /*#__PURE__*/function () { + function SegmentAnalyticsService(_ref) { + var httpClient = _ref.httpClient, + loggingService = _ref.loggingService, + config = _ref.config; + _classCallCheck(this, SegmentAnalyticsService); + this.loggingService = loggingService; + this.httpClient = httpClient; + this.trackingLogApiUrl = "".concat(config.LMS_BASE_URL, "/event"); + this.segmentKey = config.SEGMENT_KEY; + this.hasIdentifyBeenCalled = false; + this.segmentInitialized = false; + if (this.segmentKey) { + this.initializeSegment(); + } + } + + // The code in this function is from Segment's website, with a few updates: + // - It uses the segmentKey from the SegmentAnalyticsService instance. + // - It also saves a "segmentInitialized" variable on the SegmentAnalyticsService instance so + // that the service can keep track of its own initialization state. + // Reference: + // https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/quickstart/ + _createClass(SegmentAnalyticsService, [{ + key: "initializeSegment", + value: function initializeSegment() { + var _this = this; + // Create a queue, but don't obliterate an existing one! + global.analytics = global.analytics || []; + var _global = global, + analytics = _global.analytics; + + // If the real analytics.js is already on the page return. + if (analytics.initialize) { + this.segmentInitialized = true; + return; + } + + // If the snippet was invoked do nothing. + if (analytics.invoked) { + this.segmentInitialized = true; + return; + } + + // Invoked flag, to make sure the snippet + // is never invoked twice. + analytics.invoked = true; + + // A list of the methods in Analytics.js to stub. + analytics.methods = ['trackSubmit', 'trackClick', 'trackLink', 'trackForm', 'pageview', 'identify', 'reset', 'group', 'track', 'ready', 'alias', 'debug', 'page', 'once', 'off', 'on']; + + // Define a factory to create stubs. These are placeholders + // for methods in Analytics.js so that you never have to wait + // for it to load to actually record data. The `method` is + // stored as the first argument, so we can replay the data. + analytics.factory = function (method) { + return function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + args.unshift(method); + analytics.push(args); + return analytics; + }; + }; + + // For each of our methods, generate a queueing stub. + analytics.methods.forEach(function (key) { + analytics[key] = analytics.factory(key); + }); + + // Define a method to load Analytics.js from our CDN, + // and that will be sure to only ever load it once. + analytics.load = function (key, options) { + // Create an async script element based on your key. + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.onerror = function () { + _this.segmentInitialized = false; + var event = new Event('segmentFailed'); + document.dispatchEvent(event); + }; + script.async = true; + script.src = "https://cdn.segment.com/analytics.js/v1/".concat(key, "/analytics.min.js"); + + // Insert our script next to the first script element. + var first = document.getElementsByTagName('script')[0]; + first.parentNode.insertBefore(script, first); + analytics._loadOptions = options; // eslint-disable-line no-underscore-dangle + + _this.segmentInitialized = true; + }; + + // Add a version to keep track of what's in the wild. + analytics.SNIPPET_VERSION = '4.1.0'; + + // Load Analytics.js with your key, which will automatically + // load the tools you've enabled for your account. Boosh! + analytics.load(this.segmentKey); + } + + /** + * Checks that identify was first called. Otherwise, logs error. + * + */ + }, { + key: "checkIdentifyCalled", + value: function checkIdentifyCalled() { + if (!this.hasIdentifyBeenCalled) { + this.loggingService.logError('Identify must be called before other tracking events.'); + } + } + + /** + * Logs events to tracking log and downstream. + * For tracking log event documentation, see + * https://openedx.atlassian.net/wiki/spaces/AN/pages/13205895/Event+Design+and+Review+Process + * + * @param {string} eventName (event_type on backend, but named to match Segment api) + * @param {Object} properties (event on backend, but named properties to match Segment api) + * @returns {Promise} The promise returned by HttpClient.post. + */ + }, { + key: "sendTrackingLogEvent", + value: function sendTrackingLogEvent(eventName, properties) { + var _this2 = this; + var snakeEventData = snakeCaseObject(properties, { + deep: true + }); + var serverData = { + event_type: eventName, + event: JSON.stringify(snakeEventData), + page: global.location.href + }; + return this.httpClient.post(this.trackingLogApiUrl, formurlencoded(serverData), { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + })["catch"](function (error) { + _this2.loggingService.logError(error); + }); + } + + /** + * * Send identify call to Segment. + * + * @param {string} userId + * @param {*} [traits] + */ + }, { + key: "identifyAuthenticatedUser", + value: function identifyAuthenticatedUser(userId, traits) { + if (!userId) { + throw new Error('UserId is required for identifyAuthenticatedUser.'); + } + if (!this.segmentInitialized) { + return; + } + global.analytics.identify(userId, traits); + this.hasIdentifyBeenCalled = true; + } + + /** + * Send anonymous identify call to Segment's identify. + * + * @param {*} [traits] + * @returns {Promise} Promise that will resolve once the document readyState is complete + */ + }, { + key: "identifyAnonymousUser", + value: function identifyAnonymousUser(traits) { + var _this3 = this; + // eslint-disable-line no-unused-vars + if (!this.segmentInitialized) { + return Promise.resolve(); + } + // if we do not have an authenticated user (indicated by being in this method), + // but we still have a user id associated in segment, reset the local segment state + // This has to be wrapped in the analytics.ready() callback because the analytics.user() + // function isn't available until the analytics.js package has finished initializing. + return new Promise(function (resolve, reject) { + // eslint-disable-line no-unused-vars + global.analytics.ready(function () { + if (global.analytics.user().id()) { + global.analytics.reset(); + } + // We don’t need to call `identify` for anonymous users and can just make the value of + // hasIdentifyBeenCalled true. Segment automatically assigns them an anonymousId, so + // just calling `page` and `track` works fine without identify. + _this3.hasIdentifyBeenCalled = true; + resolve(); + }); + + // this is added to handle a specific use-case where if a user has blocked the analytics + // tools in their browser, this promise does not get resolved and user sees a blank + // page. Dispatching this event in script.onerror callback in analytics.load. + document.addEventListener('segmentFailed', resolve); + // This is added to handle the google analytics blocked case which is injected into + // the DOM by segment.min.js. + setTimeout(function () { + if (!global.ga || !global.ga.create || !global.google_tag_manager) { + _this3.segmentInitialized = false; + resolve(); + } + }, 2000); + }); + } + + /** + * Sends a track event to Segment and downstream. + * Note: For links and forms, you should use trackLink and trackForm instead. + * + * @param {*} eventName + * @param {*} [properties] + */ + }, { + key: "sendTrackEvent", + value: function sendTrackEvent(eventName, properties) { + if (!this.segmentInitialized) { + return; + } + this.checkIdentifyCalled(); + global.analytics.track(eventName, properties); + } + + /** + * Sends a page event to Segment and downstream. + * + * @param {*} [name] If only one string arg provided, assumed to be name. + * @param {*} [category] Name is required to pass a category. + * @param {*} [properties] + */ + }, { + key: "sendPageEvent", + value: function sendPageEvent(category, name, properties) { + if (!this.segmentInitialized) { + return; + } + this.checkIdentifyCalled(); + global.analytics.page(category, name, properties); + } + }]); + return SegmentAnalyticsService; +}(); +export default SegmentAnalyticsService; +//# sourceMappingURL=SegmentAnalyticsService.js.map \ No newline at end of file diff --git a/dist/analytics/SegmentAnalyticsService.js.map b/dist/analytics/SegmentAnalyticsService.js.map new file mode 100644 index 000000000..10da9640b --- /dev/null +++ b/dist/analytics/SegmentAnalyticsService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SegmentAnalyticsService.js","names":["formurlencoded","snakeCaseObject","SegmentAnalyticsService","_ref","httpClient","loggingService","config","_classCallCheck","trackingLogApiUrl","concat","LMS_BASE_URL","segmentKey","SEGMENT_KEY","hasIdentifyBeenCalled","segmentInitialized","initializeSegment","_createClass","key","value","_this","global","analytics","_global","initialize","invoked","methods","factory","method","_len","arguments","length","args","Array","_key","unshift","push","forEach","load","options","script","document","createElement","type","onerror","event","Event","dispatchEvent","async","src","first","getElementsByTagName","parentNode","insertBefore","_loadOptions","SNIPPET_VERSION","checkIdentifyCalled","logError","sendTrackingLogEvent","eventName","properties","_this2","snakeEventData","deep","serverData","event_type","JSON","stringify","page","location","href","post","headers","error","identifyAuthenticatedUser","userId","traits","Error","identify","identifyAnonymousUser","_this3","Promise","resolve","reject","ready","user","id","reset","addEventListener","setTimeout","ga","create","google_tag_manager","sendTrackEvent","track","sendPageEvent","category","name"],"sources":["../../src/analytics/SegmentAnalyticsService.js"],"sourcesContent":["import formurlencoded from 'form-urlencoded';\nimport { snakeCaseObject } from '../utils';\n\n/**\n * @implements {AnalyticsService}\n * @memberof module:Analytics\n */\nclass SegmentAnalyticsService {\n constructor({ httpClient, loggingService, config }) {\n this.loggingService = loggingService;\n this.httpClient = httpClient;\n this.trackingLogApiUrl = `${config.LMS_BASE_URL}/event`;\n this.segmentKey = config.SEGMENT_KEY;\n this.hasIdentifyBeenCalled = false;\n this.segmentInitialized = false;\n\n if (this.segmentKey) {\n this.initializeSegment();\n }\n }\n\n // The code in this function is from Segment's website, with a few updates:\n // - It uses the segmentKey from the SegmentAnalyticsService instance.\n // - It also saves a \"segmentInitialized\" variable on the SegmentAnalyticsService instance so\n // that the service can keep track of its own initialization state.\n // Reference:\n // https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/quickstart/\n initializeSegment() {\n // Create a queue, but don't obliterate an existing one!\n global.analytics = global.analytics || [];\n const { analytics } = global;\n\n // If the real analytics.js is already on the page return.\n if (analytics.initialize) {\n this.segmentInitialized = true;\n return;\n }\n\n // If the snippet was invoked do nothing.\n if (analytics.invoked) {\n this.segmentInitialized = true;\n return;\n }\n\n // Invoked flag, to make sure the snippet\n // is never invoked twice.\n analytics.invoked = true;\n\n // A list of the methods in Analytics.js to stub.\n analytics.methods = [\n 'trackSubmit',\n 'trackClick',\n 'trackLink',\n 'trackForm',\n 'pageview',\n 'identify',\n 'reset',\n 'group',\n 'track',\n 'ready',\n 'alias',\n 'debug',\n 'page',\n 'once',\n 'off',\n 'on',\n ];\n\n // Define a factory to create stubs. These are placeholders\n // for methods in Analytics.js so that you never have to wait\n // for it to load to actually record data. The `method` is\n // stored as the first argument, so we can replay the data.\n analytics.factory = method => ((...args) => {\n args.unshift(method);\n analytics.push(args);\n return analytics;\n });\n\n // For each of our methods, generate a queueing stub.\n analytics.methods.forEach((key) => {\n analytics[key] = analytics.factory(key);\n });\n\n // Define a method to load Analytics.js from our CDN,\n // and that will be sure to only ever load it once.\n analytics.load = (key, options) => {\n // Create an async script element based on your key.\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.onerror = () => {\n this.segmentInitialized = false;\n const event = new Event('segmentFailed');\n document.dispatchEvent(event);\n };\n script.async = true;\n script.src = `https://cdn.segment.com/analytics.js/v1/${key}/analytics.min.js`;\n\n // Insert our script next to the first script element.\n const first = document.getElementsByTagName('script')[0];\n first.parentNode.insertBefore(script, first);\n analytics._loadOptions = options; // eslint-disable-line no-underscore-dangle\n\n this.segmentInitialized = true;\n };\n\n // Add a version to keep track of what's in the wild.\n analytics.SNIPPET_VERSION = '4.1.0';\n\n // Load Analytics.js with your key, which will automatically\n // load the tools you've enabled for your account. Boosh!\n analytics.load(this.segmentKey);\n }\n\n /**\n * Checks that identify was first called. Otherwise, logs error.\n *\n */\n checkIdentifyCalled() {\n if (!this.hasIdentifyBeenCalled) {\n this.loggingService.logError('Identify must be called before other tracking events.');\n }\n }\n\n /**\n * Logs events to tracking log and downstream.\n * For tracking log event documentation, see\n * https://openedx.atlassian.net/wiki/spaces/AN/pages/13205895/Event+Design+and+Review+Process\n *\n * @param {string} eventName (event_type on backend, but named to match Segment api)\n * @param {Object} properties (event on backend, but named properties to match Segment api)\n * @returns {Promise} The promise returned by HttpClient.post.\n */\n sendTrackingLogEvent(eventName, properties) {\n const snakeEventData = snakeCaseObject(properties, { deep: true });\n const serverData = {\n event_type: eventName,\n event: JSON.stringify(snakeEventData),\n page: global.location.href,\n };\n return this.httpClient.post(\n this.trackingLogApiUrl,\n formurlencoded(serverData),\n {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n },\n ).catch((error) => {\n this.loggingService.logError(error);\n });\n }\n\n /**\n * * Send identify call to Segment.\n *\n * @param {string} userId\n * @param {*} [traits]\n */\n identifyAuthenticatedUser(userId, traits) {\n if (!userId) {\n throw new Error('UserId is required for identifyAuthenticatedUser.');\n }\n\n if (!this.segmentInitialized) {\n return;\n }\n global.analytics.identify(userId, traits);\n this.hasIdentifyBeenCalled = true;\n }\n\n /**\n * Send anonymous identify call to Segment's identify.\n *\n * @param {*} [traits]\n * @returns {Promise} Promise that will resolve once the document readyState is complete\n */\n identifyAnonymousUser(traits) { // eslint-disable-line no-unused-vars\n if (!this.segmentInitialized) {\n return Promise.resolve();\n }\n // if we do not have an authenticated user (indicated by being in this method),\n // but we still have a user id associated in segment, reset the local segment state\n // This has to be wrapped in the analytics.ready() callback because the analytics.user()\n // function isn't available until the analytics.js package has finished initializing.\n return new Promise((resolve, reject) => { // eslint-disable-line no-unused-vars\n global.analytics.ready(() => {\n if (global.analytics.user().id()) {\n global.analytics.reset();\n }\n // We don’t need to call `identify` for anonymous users and can just make the value of\n // hasIdentifyBeenCalled true. Segment automatically assigns them an anonymousId, so\n // just calling `page` and `track` works fine without identify.\n this.hasIdentifyBeenCalled = true;\n resolve();\n });\n\n // this is added to handle a specific use-case where if a user has blocked the analytics\n // tools in their browser, this promise does not get resolved and user sees a blank\n // page. Dispatching this event in script.onerror callback in analytics.load.\n document.addEventListener('segmentFailed', resolve);\n // This is added to handle the google analytics blocked case which is injected into\n // the DOM by segment.min.js.\n setTimeout(() => {\n if (!global.ga || !global.ga.create || !global.google_tag_manager) {\n this.segmentInitialized = false;\n resolve();\n }\n }, 2000);\n });\n }\n\n /**\n * Sends a track event to Segment and downstream.\n * Note: For links and forms, you should use trackLink and trackForm instead.\n *\n * @param {*} eventName\n * @param {*} [properties]\n */\n sendTrackEvent(eventName, properties) {\n if (!this.segmentInitialized) {\n return;\n }\n this.checkIdentifyCalled();\n global.analytics.track(eventName, properties);\n }\n\n /**\n * Sends a page event to Segment and downstream.\n *\n * @param {*} [name] If only one string arg provided, assumed to be name.\n * @param {*} [category] Name is required to pass a category.\n * @param {*} [properties]\n */\n sendPageEvent(category, name, properties) {\n if (!this.segmentInitialized) {\n return;\n }\n this.checkIdentifyCalled();\n global.analytics.page(category, name, properties);\n }\n}\n\nexport default SegmentAnalyticsService;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/analytics/index.js b/dist/analytics/index.js new file mode 100644 index 000000000..d3fff0e04 --- /dev/null +++ b/dist/analytics/index.js @@ -0,0 +1,4 @@ +export { configure, identifyAnonymousUser, identifyAuthenticatedUser, sendPageEvent, sendTrackEvent, sendTrackingLogEvent, getAnalyticsService, resetAnalyticsService } from './interface'; +export { default as SegmentAnalyticsService } from './SegmentAnalyticsService'; +export { default as MockAnalyticsService } from './MockAnalyticsService'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/analytics/index.js.map b/dist/analytics/index.js.map new file mode 100644 index 000000000..271c71d03 --- /dev/null +++ b/dist/analytics/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","names":["configure","identifyAnonymousUser","identifyAuthenticatedUser","sendPageEvent","sendTrackEvent","sendTrackingLogEvent","getAnalyticsService","resetAnalyticsService","default","SegmentAnalyticsService","MockAnalyticsService"],"sources":["../../src/analytics/index.js"],"sourcesContent":["export {\n configure,\n identifyAnonymousUser,\n identifyAuthenticatedUser,\n sendPageEvent,\n sendTrackEvent,\n sendTrackingLogEvent,\n getAnalyticsService,\n resetAnalyticsService,\n} from './interface';\nexport { default as SegmentAnalyticsService } from './SegmentAnalyticsService';\nexport { default as MockAnalyticsService } from './MockAnalyticsService';\n"],"mappings":"AAAA,SACEA,SAAS,EACTC,qBAAqB,EACrBC,yBAAyB,EACzBC,aAAa,EACbC,cAAc,EACdC,oBAAoB,EACpBC,mBAAmB,EACnBC,qBAAqB,QAChB,aAAa;AACpB,SAASC,OAAO,IAAIC,uBAAuB,QAAQ,2BAA2B;AAC9E,SAASD,OAAO,IAAIE,oBAAoB,QAAQ,wBAAwB","ignoreList":[]} \ No newline at end of file diff --git a/dist/analytics/interface.js b/dist/analytics/interface.js new file mode 100755 index 000000000..e590bf0dc --- /dev/null +++ b/dist/analytics/interface.js @@ -0,0 +1,139 @@ +/** + * #### Import members from **@edx/frontend-platform/analytics** + * + * Contains a shared interface for tracking events. Has a default implementation of + * SegmentAnalyticsService, which supports Segment and the Tracking Log API (hosted in LMS). + * + * The `initialize` function performs much of the analytics configuration for you. If, however, + * you're not using the `initialize` function, analytics can be configured via: + * + * ``` + * import { configure, SegmentAnalyticsService } from '@edx/frontend-platform/analytics'; + * import { getConfig } from '@edx/frontend-platform'; + * import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; + * import { getLoggingService } from '@edx/frontend-platform/logging'; + * + * configure(SegmentAnalyticsService, { + * config: getConfig(), + * loggingService: getLoggingService(), + * httpClient: getAuthenticatedHttpClient(), + * }); + * ``` + * + * As shown in this example, analytics depends on the configuration document, logging, and having + * an authenticated HTTP client. + * + * @module Analytics + */ +import PropTypes from 'prop-types'; +var optionsShape = { + config: PropTypes.object.isRequired, + httpClient: PropTypes.oneOfType([PropTypes.func, PropTypes.object]).isRequired, + loggingService: PropTypes.shape({ + logError: PropTypes.func.isRequired, + logInfo: PropTypes.func.isRequired + }).isRequired +}; +var serviceShape = { + sendTrackingLogEvent: PropTypes.func.isRequired, + identifyAuthenticatedUser: PropTypes.func.isRequired, + identifyAnonymousUser: PropTypes.func.isRequired, + sendTrackEvent: PropTypes.func.isRequired, + sendPageEvent: PropTypes.func.isRequired +}; +var service; + +/** + * + * @param {class} AnalyticsService + * @param {*} options + * @returns {AnalyticsService} + */ +export function configure(AnalyticsService, options) { + PropTypes.checkPropTypes(optionsShape, options, 'property', 'Analytics'); + service = new AnalyticsService(options); + PropTypes.checkPropTypes(serviceShape, service, 'property', 'AnalyticsService'); + return service; +} + +/** + * + * @param {*} eventName + * @param {*} properties + * @returns {Promise} + */ +export function sendTrackingLogEvent(eventName, properties) { + return service.sendTrackingLogEvent(eventName, properties); +} + +/** + * + * + * @param {*} userId + * @param {*} traits + */ +export function identifyAuthenticatedUser(userId, traits) { + service.identifyAuthenticatedUser(userId, traits); +} + +/** + * + * + * @param {*} traits + * @returns {Promise} + */ +export function identifyAnonymousUser(traits) { + return service.identifyAnonymousUser(traits); +} + +/** + * + * + * @param {*} eventName + * @param {*} properties + */ +export function sendTrackEvent(eventName, properties) { + service.sendTrackEvent(eventName, properties); +} + +/** + * + * + * @param {*} category + * @param {*} name + * @param {*} properties + */ +export function sendPageEvent(category, name, properties) { + service.sendPageEvent(category, name, properties); +} + +/** + * + * + * @returns {AnalyticsService} + */ +export function getAnalyticsService() { + if (!service) { + throw Error('You must first configure the analytics service.'); + } + return service; +} + +/** + * + */ +export function resetAnalyticsService() { + service = null; +} + +/** + * @name AnalyticsService + * @interface + * @memberof module:Analytics + * @property {function} identifyAnonymousUser + * @property {function} identifyAuthenticatedUser + * @property {function} sendPageEvent + * @property {function} sendTrackEvent + * @property {function} sendTrackingLogEvent + */ +//# sourceMappingURL=interface.js.map \ No newline at end of file diff --git a/dist/analytics/interface.js.map b/dist/analytics/interface.js.map new file mode 100644 index 000000000..31e4febd7 --- /dev/null +++ b/dist/analytics/interface.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interface.js","names":["PropTypes","optionsShape","config","object","isRequired","httpClient","oneOfType","func","loggingService","shape","logError","logInfo","serviceShape","sendTrackingLogEvent","identifyAuthenticatedUser","identifyAnonymousUser","sendTrackEvent","sendPageEvent","service","configure","AnalyticsService","options","checkPropTypes","eventName","properties","userId","traits","category","name","getAnalyticsService","Error","resetAnalyticsService"],"sources":["../../src/analytics/interface.js"],"sourcesContent":["/**\n * #### Import members from **@edx/frontend-platform/analytics**\n *\n * Contains a shared interface for tracking events. Has a default implementation of\n * SegmentAnalyticsService, which supports Segment and the Tracking Log API (hosted in LMS).\n *\n * The `initialize` function performs much of the analytics configuration for you. If, however,\n * you're not using the `initialize` function, analytics can be configured via:\n *\n * ```\n * import { configure, SegmentAnalyticsService } from '@edx/frontend-platform/analytics';\n * import { getConfig } from '@edx/frontend-platform';\n * import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n * import { getLoggingService } from '@edx/frontend-platform/logging';\n *\n * configure(SegmentAnalyticsService, {\n * config: getConfig(),\n * loggingService: getLoggingService(),\n * httpClient: getAuthenticatedHttpClient(),\n * });\n * ```\n *\n * As shown in this example, analytics depends on the configuration document, logging, and having\n * an authenticated HTTP client.\n *\n * @module Analytics\n */\nimport PropTypes from 'prop-types';\n\nconst optionsShape = {\n config: PropTypes.object.isRequired,\n httpClient: PropTypes.oneOfType([PropTypes.func, PropTypes.object]).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n};\n\nconst serviceShape = {\n sendTrackingLogEvent: PropTypes.func.isRequired,\n identifyAuthenticatedUser: PropTypes.func.isRequired,\n identifyAnonymousUser: PropTypes.func.isRequired,\n sendTrackEvent: PropTypes.func.isRequired,\n sendPageEvent: PropTypes.func.isRequired,\n};\n\nlet service;\n\n/**\n *\n * @param {class} AnalyticsService\n * @param {*} options\n * @returns {AnalyticsService}\n */\nexport function configure(AnalyticsService, options) {\n PropTypes.checkPropTypes(optionsShape, options, 'property', 'Analytics');\n service = new AnalyticsService(options);\n PropTypes.checkPropTypes(serviceShape, service, 'property', 'AnalyticsService');\n return service;\n}\n\n/**\n *\n * @param {*} eventName\n * @param {*} properties\n * @returns {Promise}\n */\nexport function sendTrackingLogEvent(eventName, properties) {\n return service.sendTrackingLogEvent(eventName, properties);\n}\n\n/**\n *\n *\n * @param {*} userId\n * @param {*} traits\n */\nexport function identifyAuthenticatedUser(userId, traits) {\n service.identifyAuthenticatedUser(userId, traits);\n}\n\n/**\n *\n *\n * @param {*} traits\n * @returns {Promise}\n */\nexport function identifyAnonymousUser(traits) {\n return service.identifyAnonymousUser(traits);\n}\n\n/**\n *\n *\n * @param {*} eventName\n * @param {*} properties\n */\nexport function sendTrackEvent(eventName, properties) {\n service.sendTrackEvent(eventName, properties);\n}\n\n/**\n *\n *\n * @param {*} category\n * @param {*} name\n * @param {*} properties\n */\nexport function sendPageEvent(category, name, properties) {\n service.sendPageEvent(category, name, properties);\n}\n\n/**\n *\n *\n * @returns {AnalyticsService}\n */\nexport function getAnalyticsService() {\n if (!service) {\n throw Error('You must first configure the analytics service.');\n }\n\n return service;\n}\n\n/**\n *\n */\nexport function resetAnalyticsService() {\n service = null;\n}\n\n/**\n * @name AnalyticsService\n * @interface\n * @memberof module:Analytics\n * @property {function} identifyAnonymousUser\n * @property {function} identifyAuthenticatedUser\n * @property {function} sendPageEvent\n * @property {function} sendTrackEvent\n * @property {function} sendTrackingLogEvent\n */\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/AxiosCsrfTokenService.js b/dist/auth/AxiosCsrfTokenService.js new file mode 100644 index 000000000..9815fdb09 --- /dev/null +++ b/dist/auth/AxiosCsrfTokenService.js @@ -0,0 +1,85 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import axios from 'axios'; +import { getUrlParts, processAxiosErrorAndThrow } from './utils'; +var AxiosCsrfTokenService = /*#__PURE__*/function () { + function AxiosCsrfTokenService(csrfTokenApiPath) { + _classCallCheck(this, AxiosCsrfTokenService); + this.csrfTokenApiPath = csrfTokenApiPath; + this.httpClient = axios.create(); + // Set withCredentials to true. Enables cross-site Access-Control requests + // to be made using cookies, authorization headers or TLS client + // certificates. More on MDN: + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials + this.httpClient.defaults.withCredentials = true; + this.httpClient.defaults.headers.common['USE-JWT-COOKIE'] = true; + this.csrfTokenCache = {}; + this.csrfTokenRequestPromises = {}; + } + _createClass(AxiosCsrfTokenService, [{ + key: "getCsrfToken", + value: function () { + var _getCsrfToken = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(url) { + var _this = this; + var urlParts, _urlParts, protocol, domain, csrfToken; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + try { + urlParts = getUrlParts(url); + } catch (e) { + // If the url is not parsable it's likely because a relative + // path was supplied as the url. This is acceptable and in + // this case we should use the current origin of the page. + urlParts = getUrlParts(global.location.origin); + } + _urlParts = urlParts, protocol = _urlParts.protocol, domain = _urlParts.domain; + csrfToken = this.csrfTokenCache[domain]; + if (!csrfToken) { + _context.next = 5; + break; + } + return _context.abrupt("return", csrfToken); + case 5: + if (!this.csrfTokenRequestPromises[domain]) { + this.csrfTokenRequestPromises[domain] = this.httpClient.get("".concat(protocol, "://").concat(domain).concat(this.csrfTokenApiPath)).then(function (response) { + _this.csrfTokenCache[domain] = response.data.csrfToken; + return _this.csrfTokenCache[domain]; + })["catch"](processAxiosErrorAndThrow)["finally"](function () { + delete _this.csrfTokenRequestPromises[domain]; + }); + } + return _context.abrupt("return", this.csrfTokenRequestPromises[domain]); + case 7: + case "end": + return _context.stop(); + } + }, _callee, this); + })); + function getCsrfToken(_x) { + return _getCsrfToken.apply(this, arguments); + } + return getCsrfToken; + }() + }, { + key: "clearCsrfTokenCache", + value: function clearCsrfTokenCache() { + this.csrfTokenCache = {}; + } + }, { + key: "getHttpClient", + value: function getHttpClient() { + return this.httpClient; + } + }]); + return AxiosCsrfTokenService; +}(); +export { AxiosCsrfTokenService as default }; +//# sourceMappingURL=AxiosCsrfTokenService.js.map \ No newline at end of file diff --git a/dist/auth/AxiosCsrfTokenService.js.map b/dist/auth/AxiosCsrfTokenService.js.map new file mode 100644 index 000000000..71bacd3e2 --- /dev/null +++ b/dist/auth/AxiosCsrfTokenService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AxiosCsrfTokenService.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","_classCallCheck","instance","Constructor","_defineProperties","target","props","descriptor","_toPropertyKey","_createClass","protoProps","staticProps","_toPrimitive","String","toPrimitive","Number","axios","getUrlParts","processAxiosErrorAndThrow","AxiosCsrfTokenService","csrfTokenApiPath","httpClient","defaults","withCredentials","headers","common","csrfTokenCache","csrfTokenRequestPromises","_getCsrfToken","_callee","url","_this","urlParts","_urlParts","protocol","domain","csrfToken","_callee$","_context","global","location","origin","get","concat","response","data","getCsrfToken","_x","clearCsrfTokenCache","getHttpClient","default"],"sources":["../../src/auth/AxiosCsrfTokenService.js"],"sourcesContent":["import axios from 'axios';\nimport { getUrlParts, processAxiosErrorAndThrow } from './utils';\n\nexport default class AxiosCsrfTokenService {\n constructor(csrfTokenApiPath) {\n this.csrfTokenApiPath = csrfTokenApiPath;\n this.httpClient = axios.create();\n // Set withCredentials to true. Enables cross-site Access-Control requests\n // to be made using cookies, authorization headers or TLS client\n // certificates. More on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials\n this.httpClient.defaults.withCredentials = true;\n this.httpClient.defaults.headers.common['USE-JWT-COOKIE'] = true;\n\n this.csrfTokenCache = {};\n this.csrfTokenRequestPromises = {};\n }\n\n async getCsrfToken(url) {\n let urlParts;\n try {\n urlParts = getUrlParts(url);\n } catch (e) {\n // If the url is not parsable it's likely because a relative\n // path was supplied as the url. This is acceptable and in\n // this case we should use the current origin of the page.\n urlParts = getUrlParts(global.location.origin);\n }\n\n const { protocol, domain } = urlParts;\n const csrfToken = this.csrfTokenCache[domain];\n\n if (csrfToken) {\n return csrfToken;\n }\n\n if (!this.csrfTokenRequestPromises[domain]) {\n this.csrfTokenRequestPromises[domain] = this.httpClient\n .get(`${protocol}://${domain}${this.csrfTokenApiPath}`)\n .then((response) => {\n this.csrfTokenCache[domain] = response.data.csrfToken;\n return this.csrfTokenCache[domain];\n })\n .catch(processAxiosErrorAndThrow)\n .finally(() => {\n delete this.csrfTokenRequestPromises[domain];\n });\n }\n\n return this.csrfTokenRequestPromises[domain];\n }\n\n clearCsrfTokenCache() {\n this.csrfTokenCache = {};\n }\n\n getHttpClient() {\n return this.httpClient;\n }\n}\n"],"mappings":";+CACA,qJAAAA,mBAAA,YAAAA,oBAAA,WAAAC,CAAA,SAAAC,CAAA,EAAAD,CAAA,OAAAE,CAAA,GAAAC,MAAA,CAAAC,SAAA,EAAAC,CAAA,GAAAH,CAAA,CAAAI,cAAA,EAAAC,CAAA,GAAAJ,MAAA,CAAAK,cAAA,cAAAP,CAAA,EAAAD,CAAA,EAAAE,CAAA,IAAAD,CAAA,CAAAD,CAAA,IAAAE,CAAA,CAAAO,KAAA,KAAAC,CAAA,wBAAAC,MAAA,GAAAA,MAAA,OAAAC,CAAA,GAAAF,CAAA,CAAAG,QAAA,kBAAAC,CAAA,GAAAJ,CAAA,CAAAK,aAAA,uBAAAC,CAAA,GAAAN,CAAA,CAAAO,WAAA,8BAAAC,OAAAjB,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAC,MAAA,CAAAK,cAAA,CAAAP,CAAA,EAAAD,CAAA,IAAAS,KAAA,EAAAP,CAAA,EAAAiB,UAAA,MAAAC,YAAA,MAAAC,QAAA,SAAApB,CAAA,CAAAD,CAAA,WAAAkB,MAAA,mBAAAjB,CAAA,IAAAiB,MAAA,YAAAA,OAAAjB,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAD,CAAA,CAAAD,CAAA,IAAAE,CAAA,gBAAAoB,KAAArB,CAAA,EAAAD,CAAA,EAAAE,CAAA,EAAAG,CAAA,QAAAK,CAAA,GAAAV,CAAA,IAAAA,CAAA,CAAAI,SAAA,YAAAmB,SAAA,GAAAvB,CAAA,GAAAuB,SAAA,EAAAX,CAAA,GAAAT,MAAA,CAAAqB,MAAA,CAAAd,CAAA,CAAAN,SAAA,GAAAU,CAAA,OAAAW,OAAA,CAAApB,CAAA,gBAAAE,CAAA,CAAAK,CAAA,eAAAH,KAAA,EAAAiB,gBAAA,CAAAzB,CAAA,EAAAC,CAAA,EAAAY,CAAA,MAAAF,CAAA,aAAAe,SAAA1B,CAAA,EAAAD,CAAA,EAAAE,CAAA,mBAAA0B,IAAA,YAAAC,GAAA,EAAA5B,CAAA,CAAA6B,IAAA,CAAA9B,CAAA,EAAAE,CAAA,cAAAD,CAAA,aAAA2B,IAAA,WAAAC,GAAA,EAAA5B,CAAA,QAAAD,CAAA,CAAAsB,IAAA,GAAAA,IAAA,MAAAS,CAAA,qBAAAC,CAAA,qBAAAC,CAAA,gBAAAC,CAAA,gBAAAC,CAAA,gBAAAZ,UAAA,cAAAa,kBAAA,cAAAC,2BAAA,SAAAC,CAAA,OAAApB,MAAA,CAAAoB,CAAA,EAAA1B,CAAA,qCAAA2B,CAAA,GAAApC,MAAA,CAAAqC,cAAA,EAAAC,CAAA,GAAAF,CAAA,IAAAA,CAAA,CAAAA,CAAA,CAAAG,MAAA,QAAAD,CAAA,IAAAA,CAAA,KAAAvC,CAAA,IAAAG,CAAA,CAAAyB,IAAA,CAAAW,CAAA,EAAA7B,CAAA,MAAA0B,CAAA,GAAAG,CAAA,OAAAE,CAAA,GAAAN,0BAAA,CAAAjC,SAAA,GAAAmB,SAAA,CAAAnB,SAAA,GAAAD,MAAA,CAAAqB,MAAA,CAAAc,CAAA,YAAAM,sBAAA3C,CAAA,gCAAA4C,OAAA,WAAA7C,CAAA,IAAAkB,MAAA,CAAAjB,CAAA,EAAAD,CAAA,YAAAC,CAAA,gBAAA6C,OAAA,CAAA9C,CAAA,EAAAC,CAAA,sBAAA8C,cAAA9C,CAAA,EAAAD,CAAA,aAAAgD,OAAA9C,CAAA,EAAAK,CAAA,EAAAG,CAAA,EAAAE,CAAA,QAAAE,CAAA,GAAAa,QAAA,CAAA1B,CAAA,CAAAC,CAAA,GAAAD,CAAA,EAAAM,CAAA,mBAAAO,CAAA,CAAAc,IAAA,QAAAZ,CAAA,GAAAF,CAAA,CAAAe,GAAA,EAAAE,CAAA,GAAAf,CAAA,CAAAP,KAAA,SAAAsB,CAAA,gBAAAkB,OAAA,CAAAlB,CAAA,KAAA1B,CAAA,CAAAyB,IAAA,CAAAC,CAAA,eAAA/B,CAAA,CAAAkD,OAAA,CAAAnB,CAAA,CAAAoB,OAAA,EAAAC,IAAA,WAAAnD,CAAA,IAAA+C,MAAA,SAAA/C,CAAA,EAAAS,CAAA,EAAAE,CAAA,gBAAAX,CAAA,IAAA+C,MAAA,UAAA/C,CAAA,EAAAS,CAAA,EAAAE,CAAA,QAAAZ,CAAA,CAAAkD,OAAA,CAAAnB,CAAA,EAAAqB,IAAA,WAAAnD,CAAA,IAAAe,CAAA,CAAAP,KAAA,GAAAR,CAAA,EAAAS,CAAA,CAAAM,CAAA,gBAAAf,CAAA,WAAA+C,MAAA,UAAA/C,CAAA,EAAAS,CAAA,EAAAE,CAAA,SAAAA,CAAA,CAAAE,CAAA,CAAAe,GAAA,SAAA3B,CAAA,EAAAK,CAAA,oBAAAE,KAAA,WAAAA,MAAAR,CAAA,EAAAI,CAAA,aAAAgD,2BAAA,eAAArD,CAAA,WAAAA,CAAA,EAAAE,CAAA,IAAA8C,MAAA,CAAA/C,CAAA,EAAAI,CAAA,EAAAL,CAAA,EAAAE,CAAA,gBAAAA,CAAA,GAAAA,CAAA,GAAAA,CAAA,CAAAkD,IAAA,CAAAC,0BAAA,EAAAA,0BAAA,IAAAA,0BAAA,qBAAA3B,iBAAA1B,CAAA,EAAAE,CAAA,EAAAG,CAAA,QAAAE,CAAA,GAAAwB,CAAA,mBAAArB,CAAA,EAAAE,CAAA,QAAAL,CAAA,KAAA0B,CAAA,YAAAqB,KAAA,sCAAA/C,CAAA,KAAA2B,CAAA,oBAAAxB,CAAA,QAAAE,CAAA,WAAAH,KAAA,EAAAR,CAAA,EAAAsD,IAAA,eAAAlD,CAAA,CAAAmD,MAAA,GAAA9C,CAAA,EAAAL,CAAA,CAAAwB,GAAA,GAAAjB,CAAA,UAAAE,CAAA,GAAAT,CAAA,CAAAoD,QAAA,MAAA3C,CAAA,QAAAE,CAAA,GAAA0C,mBAAA,CAAA5C,CAAA,EAAAT,CAAA,OAAAW,CAAA,QAAAA,CAAA,KAAAmB,CAAA,mBAAAnB,CAAA,qBAAAX,CAAA,CAAAmD,MAAA,EAAAnD,CAAA,CAAAsD,IAAA,GAAAtD,CAAA,CAAAuD,KAAA,GAAAvD,CAAA,CAAAwB,GAAA,sBAAAxB,CAAA,CAAAmD,MAAA,QAAAjD,CAAA,KAAAwB,CAAA,QAAAxB,CAAA,GAAA2B,CAAA,EAAA7B,CAAA,CAAAwB,GAAA,EAAAxB,CAAA,CAAAwD,iBAAA,CAAAxD,CAAA,CAAAwB,GAAA,uBAAAxB,CAAA,CAAAmD,MAAA,IAAAnD,CAAA,CAAAyD,MAAA,WAAAzD,CAAA,CAAAwB,GAAA,GAAAtB,CAAA,GAAA0B,CAAA,MAAAK,CAAA,GAAAX,QAAA,CAAA3B,CAAA,EAAAE,CAAA,EAAAG,CAAA,oBAAAiC,CAAA,CAAAV,IAAA,QAAArB,CAAA,GAAAF,CAAA,CAAAkD,IAAA,GAAArB,CAAA,GAAAF,CAAA,EAAAM,CAAA,CAAAT,GAAA,KAAAM,CAAA,qBAAA1B,KAAA,EAAA6B,CAAA,CAAAT,GAAA,EAAA0B,IAAA,EAAAlD,CAAA,CAAAkD,IAAA,kBAAAjB,CAAA,CAAAV,IAAA,KAAArB,CAAA,GAAA2B,CAAA,EAAA7B,CAAA,CAAAmD,MAAA,YAAAnD,CAAA,CAAAwB,GAAA,GAAAS,CAAA,CAAAT,GAAA,mBAAA6B,oBAAA1D,CAAA,EAAAE,CAAA,QAAAG,CAAA,GAAAH,CAAA,CAAAsD,MAAA,EAAAjD,CAAA,GAAAP,CAAA,CAAAa,QAAA,CAAAR,CAAA,OAAAE,CAAA,KAAAN,CAAA,SAAAC,CAAA,CAAAuD,QAAA,qBAAApD,CAAA,IAAAL,CAAA,CAAAa,QAAA,eAAAX,CAAA,CAAAsD,MAAA,aAAAtD,CAAA,CAAA2B,GAAA,GAAA5B,CAAA,EAAAyD,mBAAA,CAAA1D,CAAA,EAAAE,CAAA,eAAAA,CAAA,CAAAsD,MAAA,kBAAAnD,CAAA,KAAAH,CAAA,CAAAsD,MAAA,YAAAtD,CAAA,CAAA2B,GAAA,OAAAkC,SAAA,uCAAA1D,CAAA,iBAAA8B,CAAA,MAAAzB,CAAA,GAAAiB,QAAA,CAAApB,CAAA,EAAAP,CAAA,CAAAa,QAAA,EAAAX,CAAA,CAAA2B,GAAA,mBAAAnB,CAAA,CAAAkB,IAAA,SAAA1B,CAAA,CAAAsD,MAAA,YAAAtD,CAAA,CAAA2B,GAAA,GAAAnB,CAAA,CAAAmB,GAAA,EAAA3B,CAAA,CAAAuD,QAAA,SAAAtB,CAAA,MAAAvB,CAAA,GAAAF,CAAA,CAAAmB,GAAA,SAAAjB,CAAA,GAAAA,CAAA,CAAA2C,IAAA,IAAArD,CAAA,CAAAF,CAAA,CAAAgE,UAAA,IAAApD,CAAA,CAAAH,KAAA,EAAAP,CAAA,CAAA+D,IAAA,GAAAjE,CAAA,CAAAkE,OAAA,eAAAhE,CAAA,CAAAsD,MAAA,KAAAtD,CAAA,CAAAsD,MAAA,WAAAtD,CAAA,CAAA2B,GAAA,GAAA5B,CAAA,GAAAC,CAAA,CAAAuD,QAAA,SAAAtB,CAAA,IAAAvB,CAAA,IAAAV,CAAA,CAAAsD,MAAA,YAAAtD,CAAA,CAAA2B,GAAA,OAAAkC,SAAA,sCAAA7D,CAAA,CAAAuD,QAAA,SAAAtB,CAAA,cAAAgC,aAAAlE,CAAA,QAAAD,CAAA,KAAAoE,MAAA,EAAAnE,CAAA,YAAAA,CAAA,KAAAD,CAAA,CAAAqE,QAAA,GAAApE,CAAA,WAAAA,CAAA,KAAAD,CAAA,CAAAsE,UAAA,GAAArE,CAAA,KAAAD,CAAA,CAAAuE,QAAA,GAAAtE,CAAA,WAAAuE,UAAA,CAAAC,IAAA,CAAAzE,CAAA,cAAA0E,cAAAzE,CAAA,QAAAD,CAAA,GAAAC,CAAA,CAAA0E,UAAA,QAAA3E,CAAA,CAAA4B,IAAA,oBAAA5B,CAAA,CAAA6B,GAAA,EAAA5B,CAAA,CAAA0E,UAAA,GAAA3E,CAAA,aAAAyB,QAAAxB,CAAA,SAAAuE,UAAA,MAAAJ,MAAA,aAAAnE,CAAA,CAAA4C,OAAA,CAAAsB,YAAA,cAAAS,KAAA,iBAAAlC,OAAA1C,CAAA,QAAAA,CAAA,WAAAA,CAAA,QAAAE,CAAA,GAAAF,CAAA,CAAAY,CAAA,OAAAV,CAAA,SAAAA,CAAA,CAAA4B,IAAA,CAAA9B,CAAA,4BAAAA,CAAA,CAAAiE,IAAA,SAAAjE,CAAA,OAAA6E,KAAA,CAAA7E,CAAA,CAAA8E,MAAA,SAAAvE,CAAA,OAAAG,CAAA,YAAAuD,KAAA,aAAA1D,CAAA,GAAAP,CAAA,CAAA8E,MAAA,OAAAzE,CAAA,CAAAyB,IAAA,CAAA9B,CAAA,EAAAO,CAAA,UAAA0D,IAAA,CAAAxD,KAAA,GAAAT,CAAA,CAAAO,CAAA,GAAA0D,IAAA,CAAAV,IAAA,OAAAU,IAAA,SAAAA,IAAA,CAAAxD,KAAA,GAAAR,CAAA,EAAAgE,IAAA,CAAAV,IAAA,OAAAU,IAAA,YAAAvD,CAAA,CAAAuD,IAAA,GAAAvD,CAAA,gBAAAqD,SAAA,CAAAd,OAAA,CAAAjD,CAAA,kCAAAoC,iBAAA,CAAAhC,SAAA,GAAAiC,0BAAA,EAAA9B,CAAA,CAAAoC,CAAA,mBAAAlC,KAAA,EAAA4B,0BAAA,EAAAjB,YAAA,SAAAb,CAAA,CAAA8B,0BAAA,mBAAA5B,KAAA,EAAA2B,iBAAA,EAAAhB,YAAA,SAAAgB,iBAAA,CAAA2C,WAAA,GAAA7D,MAAA,CAAAmB,0BAAA,EAAArB,CAAA,wBAAAhB,CAAA,CAAAgF,mBAAA,aAAA/E,CAAA,QAAAD,CAAA,wBAAAC,CAAA,IAAAA,CAAA,CAAAgF,WAAA,WAAAjF,CAAA,KAAAA,CAAA,KAAAoC,iBAAA,6BAAApC,CAAA,CAAA+E,WAAA,IAAA/E,CAAA,CAAAkF,IAAA,OAAAlF,CAAA,CAAAmF,IAAA,aAAAlF,CAAA,WAAAE,MAAA,CAAAiF,cAAA,GAAAjF,MAAA,CAAAiF,cAAA,CAAAnF,CAAA,EAAAoC,0BAAA,KAAApC,CAAA,CAAAoF,SAAA,GAAAhD,0BAAA,EAAAnB,MAAA,CAAAjB,CAAA,EAAAe,CAAA,yBAAAf,CAAA,CAAAG,SAAA,GAAAD,MAAA,CAAAqB,MAAA,CAAAmB,CAAA,GAAA1C,CAAA,KAAAD,CAAA,CAAAsF,KAAA,aAAArF,CAAA,aAAAkD,OAAA,EAAAlD,CAAA,OAAA2C,qBAAA,CAAAG,aAAA,CAAA3C,SAAA,GAAAc,MAAA,CAAA6B,aAAA,CAAA3C,SAAA,EAAAU,CAAA,iCAAAd,CAAA,CAAA+C,aAAA,GAAAA,aAAA,EAAA/C,CAAA,CAAAuF,KAAA,aAAAtF,CAAA,EAAAC,CAAA,EAAAG,CAAA,EAAAE,CAAA,EAAAG,CAAA,eAAAA,CAAA,KAAAA,CAAA,GAAA8E,OAAA,OAAA5E,CAAA,OAAAmC,aAAA,CAAAzB,IAAA,CAAArB,CAAA,EAAAC,CAAA,EAAAG,CAAA,EAAAE,CAAA,GAAAG,CAAA,UAAAV,CAAA,CAAAgF,mBAAA,CAAA9E,CAAA,IAAAU,CAAA,GAAAA,CAAA,CAAAqD,IAAA,GAAAb,IAAA,WAAAnD,CAAA,WAAAA,CAAA,CAAAsD,IAAA,GAAAtD,CAAA,CAAAQ,KAAA,GAAAG,CAAA,CAAAqD,IAAA,WAAArB,qBAAA,CAAAD,CAAA,GAAAzB,MAAA,CAAAyB,CAAA,EAAA3B,CAAA,gBAAAE,MAAA,CAAAyB,CAAA,EAAA/B,CAAA,iCAAAM,MAAA,CAAAyB,CAAA,6DAAA3C,CAAA,CAAAyF,IAAA,aAAAxF,CAAA,QAAAD,CAAA,GAAAG,MAAA,CAAAF,CAAA,GAAAC,CAAA,gBAAAG,CAAA,IAAAL,CAAA,EAAAE,CAAA,CAAAuE,IAAA,CAAApE,CAAA,UAAAH,CAAA,CAAAwF,OAAA,aAAAzB,KAAA,WAAA/D,CAAA,CAAA4E,MAAA,SAAA7E,CAAA,GAAAC,CAAA,CAAAyF,GAAA,QAAA1F,CAAA,IAAAD,CAAA,SAAAiE,IAAA,CAAAxD,KAAA,GAAAR,CAAA,EAAAgE,IAAA,CAAAV,IAAA,OAAAU,IAAA,WAAAA,IAAA,CAAAV,IAAA,OAAAU,IAAA,QAAAjE,CAAA,CAAA0C,MAAA,GAAAA,MAAA,EAAAjB,OAAA,CAAArB,SAAA,KAAA6E,WAAA,EAAAxD,OAAA,EAAAmD,KAAA,WAAAA,MAAA5E,CAAA,aAAA4F,IAAA,WAAA3B,IAAA,WAAAN,IAAA,QAAAC,KAAA,GAAA3D,CAAA,OAAAsD,IAAA,YAAAE,QAAA,cAAAD,MAAA,gBAAA3B,GAAA,GAAA5B,CAAA,OAAAuE,UAAA,CAAA3B,OAAA,CAAA6B,aAAA,IAAA1E,CAAA,WAAAE,CAAA,kBAAAA,CAAA,CAAA2F,MAAA,OAAAxF,CAAA,CAAAyB,IAAA,OAAA5B,CAAA,MAAA2E,KAAA,EAAA3E,CAAA,CAAA4F,KAAA,cAAA5F,CAAA,IAAAD,CAAA,MAAA8F,IAAA,WAAAA,KAAA,SAAAxC,IAAA,WAAAtD,CAAA,QAAAuE,UAAA,IAAAG,UAAA,kBAAA1E,CAAA,CAAA2B,IAAA,QAAA3B,CAAA,CAAA4B,GAAA,cAAAmE,IAAA,KAAAnC,iBAAA,WAAAA,kBAAA7D,CAAA,aAAAuD,IAAA,QAAAvD,CAAA,MAAAE,CAAA,kBAAA+F,OAAA5F,CAAA,EAAAE,CAAA,WAAAK,CAAA,CAAAgB,IAAA,YAAAhB,CAAA,CAAAiB,GAAA,GAAA7B,CAAA,EAAAE,CAAA,CAAA+D,IAAA,GAAA5D,CAAA,EAAAE,CAAA,KAAAL,CAAA,CAAAsD,MAAA,WAAAtD,CAAA,CAAA2B,GAAA,GAAA5B,CAAA,KAAAM,CAAA,aAAAA,CAAA,QAAAiE,UAAA,CAAAM,MAAA,MAAAvE,CAAA,SAAAA,CAAA,QAAAG,CAAA,QAAA8D,UAAA,CAAAjE,CAAA,GAAAK,CAAA,GAAAF,CAAA,CAAAiE,UAAA,iBAAAjE,CAAA,CAAA0D,MAAA,SAAA6B,MAAA,aAAAvF,CAAA,CAAA0D,MAAA,SAAAwB,IAAA,QAAA9E,CAAA,GAAAT,CAAA,CAAAyB,IAAA,CAAApB,CAAA,eAAAM,CAAA,GAAAX,CAAA,CAAAyB,IAAA,CAAApB,CAAA,qBAAAI,CAAA,IAAAE,CAAA,aAAA4E,IAAA,GAAAlF,CAAA,CAAA2D,QAAA,SAAA4B,MAAA,CAAAvF,CAAA,CAAA2D,QAAA,gBAAAuB,IAAA,GAAAlF,CAAA,CAAA4D,UAAA,SAAA2B,MAAA,CAAAvF,CAAA,CAAA4D,UAAA,cAAAxD,CAAA,aAAA8E,IAAA,GAAAlF,CAAA,CAAA2D,QAAA,SAAA4B,MAAA,CAAAvF,CAAA,CAAA2D,QAAA,qBAAArD,CAAA,YAAAsC,KAAA,qDAAAsC,IAAA,GAAAlF,CAAA,CAAA4D,UAAA,SAAA2B,MAAA,CAAAvF,CAAA,CAAA4D,UAAA,YAAAR,MAAA,WAAAA,OAAA7D,CAAA,EAAAD,CAAA,aAAAE,CAAA,QAAAsE,UAAA,CAAAM,MAAA,MAAA5E,CAAA,SAAAA,CAAA,QAAAK,CAAA,QAAAiE,UAAA,CAAAtE,CAAA,OAAAK,CAAA,CAAA6D,MAAA,SAAAwB,IAAA,IAAAvF,CAAA,CAAAyB,IAAA,CAAAvB,CAAA,wBAAAqF,IAAA,GAAArF,CAAA,CAAA+D,UAAA,QAAA5D,CAAA,GAAAH,CAAA,aAAAG,CAAA,iBAAAT,CAAA,mBAAAA,CAAA,KAAAS,CAAA,CAAA0D,MAAA,IAAApE,CAAA,IAAAA,CAAA,IAAAU,CAAA,CAAA4D,UAAA,KAAA5D,CAAA,cAAAE,CAAA,GAAAF,CAAA,GAAAA,CAAA,CAAAiE,UAAA,cAAA/D,CAAA,CAAAgB,IAAA,GAAA3B,CAAA,EAAAW,CAAA,CAAAiB,GAAA,GAAA7B,CAAA,EAAAU,CAAA,SAAA8C,MAAA,gBAAAS,IAAA,GAAAvD,CAAA,CAAA4D,UAAA,EAAAnC,CAAA,SAAA+D,QAAA,CAAAtF,CAAA,MAAAsF,QAAA,WAAAA,SAAAjG,CAAA,EAAAD,CAAA,oBAAAC,CAAA,CAAA2B,IAAA,QAAA3B,CAAA,CAAA4B,GAAA,qBAAA5B,CAAA,CAAA2B,IAAA,mBAAA3B,CAAA,CAAA2B,IAAA,QAAAqC,IAAA,GAAAhE,CAAA,CAAA4B,GAAA,gBAAA5B,CAAA,CAAA2B,IAAA,SAAAoE,IAAA,QAAAnE,GAAA,GAAA5B,CAAA,CAAA4B,GAAA,OAAA2B,MAAA,kBAAAS,IAAA,yBAAAhE,CAAA,CAAA2B,IAAA,IAAA5B,CAAA,UAAAiE,IAAA,GAAAjE,CAAA,GAAAmC,CAAA,KAAAgE,MAAA,WAAAA,OAAAlG,CAAA,aAAAD,CAAA,QAAAwE,UAAA,CAAAM,MAAA,MAAA9E,CAAA,SAAAA,CAAA,QAAAE,CAAA,QAAAsE,UAAA,CAAAxE,CAAA,OAAAE,CAAA,CAAAoE,UAAA,KAAArE,CAAA,cAAAiG,QAAA,CAAAhG,CAAA,CAAAyE,UAAA,EAAAzE,CAAA,CAAAqE,QAAA,GAAAG,aAAA,CAAAxE,CAAA,GAAAiC,CAAA,yBAAAiE,OAAAnG,CAAA,aAAAD,CAAA,QAAAwE,UAAA,CAAAM,MAAA,MAAA9E,CAAA,SAAAA,CAAA,QAAAE,CAAA,QAAAsE,UAAA,CAAAxE,CAAA,OAAAE,CAAA,CAAAkE,MAAA,KAAAnE,CAAA,QAAAI,CAAA,GAAAH,CAAA,CAAAyE,UAAA,kBAAAtE,CAAA,CAAAuB,IAAA,QAAArB,CAAA,GAAAF,CAAA,CAAAwB,GAAA,EAAA6C,aAAA,CAAAxE,CAAA,YAAAK,CAAA,gBAAA+C,KAAA,8BAAA+C,aAAA,WAAAA,cAAArG,CAAA,EAAAE,CAAA,EAAAG,CAAA,gBAAAoD,QAAA,KAAA5C,QAAA,EAAA6B,MAAA,CAAA1C,CAAA,GAAAgE,UAAA,EAAA9D,CAAA,EAAAgE,OAAA,EAAA7D,CAAA,oBAAAmD,MAAA,UAAA3B,GAAA,GAAA5B,CAAA,GAAAkC,CAAA,OAAAnC,CAAA;AAAA,SAAAsG,mBAAAC,GAAA,EAAArD,OAAA,EAAAsD,MAAA,EAAAC,KAAA,EAAAC,MAAA,EAAAC,GAAA,EAAA9E,GAAA,cAAA+E,IAAA,GAAAL,GAAA,CAAAI,GAAA,EAAA9E,GAAA,OAAApB,KAAA,GAAAmG,IAAA,CAAAnG,KAAA,WAAAoG,KAAA,IAAAL,MAAA,CAAAK,KAAA,iBAAAD,IAAA,CAAArD,IAAA,IAAAL,OAAA,CAAAzC,KAAA,YAAA+E,OAAA,CAAAtC,OAAA,CAAAzC,KAAA,EAAA2C,IAAA,CAAAqD,KAAA,EAAAC,MAAA;AAAA,SAAAI,kBAAAC,EAAA,6BAAAC,IAAA,SAAAC,IAAA,GAAAC,SAAA,aAAA1B,OAAA,WAAAtC,OAAA,EAAAsD,MAAA,QAAAD,GAAA,GAAAQ,EAAA,CAAAI,KAAA,CAAAH,IAAA,EAAAC,IAAA,YAAAR,MAAAhG,KAAA,IAAA6F,kBAAA,CAAAC,GAAA,EAAArD,OAAA,EAAAsD,MAAA,EAAAC,KAAA,EAAAC,MAAA,UAAAjG,KAAA,cAAAiG,OAAAU,GAAA,IAAAd,kBAAA,CAAAC,GAAA,EAAArD,OAAA,EAAAsD,MAAA,EAAAC,KAAA,EAAAC,MAAA,WAAAU,GAAA,KAAAX,KAAA,CAAAY,SAAA;AAAA,SAAAC,gBAAAC,QAAA,EAAAC,WAAA,UAAAD,QAAA,YAAAC,WAAA,eAAAzD,SAAA;AAAA,SAAA0D,kBAAAC,MAAA,EAAAC,KAAA,aAAAjH,CAAA,MAAAA,CAAA,GAAAiH,KAAA,CAAA7C,MAAA,EAAApE,CAAA,UAAAkH,UAAA,GAAAD,KAAA,CAAAjH,CAAA,GAAAkH,UAAA,CAAAzG,UAAA,GAAAyG,UAAA,CAAAzG,UAAA,WAAAyG,UAAA,CAAAxG,YAAA,wBAAAwG,UAAA,EAAAA,UAAA,CAAAvG,QAAA,SAAAlB,MAAA,CAAAK,cAAA,CAAAkH,MAAA,EAAAG,cAAA,CAAAD,UAAA,CAAAjB,GAAA,GAAAiB,UAAA;AAAA,SAAAE,aAAAN,WAAA,EAAAO,UAAA,EAAAC,WAAA,QAAAD,UAAA,EAAAN,iBAAA,CAAAD,WAAA,CAAApH,SAAA,EAAA2H,UAAA,OAAAC,WAAA,EAAAP,iBAAA,CAAAD,WAAA,EAAAQ,WAAA,GAAA7H,MAAA,CAAAK,cAAA,CAAAgH,WAAA,iBAAAnG,QAAA,mBAAAmG,WAAA;AAAA,SAAAK,eAAA5H,CAAA,QAAAS,CAAA,GAAAuH,YAAA,CAAAhI,CAAA,gCAAAgD,OAAA,CAAAvC,CAAA,IAAAA,CAAA,GAAAwH,MAAA,CAAAxH,CAAA;AAAA,SAAAuH,aAAAhI,CAAA,EAAAC,CAAA,oBAAA+C,OAAA,CAAAhD,CAAA,MAAAA,CAAA,SAAAA,CAAA,MAAAD,CAAA,GAAAC,CAAA,CAAAU,MAAA,CAAAwH,WAAA,kBAAAnI,CAAA,QAAAU,CAAA,GAAAV,CAAA,CAAA8B,IAAA,CAAA7B,CAAA,EAAAC,CAAA,gCAAA+C,OAAA,CAAAvC,CAAA,UAAAA,CAAA,YAAAqD,SAAA,yEAAA7D,CAAA,GAAAgI,MAAA,GAAAE,MAAA,EAAAnI,CAAA;AADA,OAAOoI,KAAK,MAAM,OAAO;AACzB,SAASC,WAAW,EAAEC,yBAAyB,QAAQ,SAAS;AAAC,IAE5CC,qBAAqB;EACxC,SAAAA,sBAAYC,gBAAgB,EAAE;IAAAnB,eAAA,OAAAkB,qBAAA;IAC5B,IAAI,CAACC,gBAAgB,GAAGA,gBAAgB;IACxC,IAAI,CAACC,UAAU,GAAGL,KAAK,CAAC7G,MAAM,CAAC,CAAC;IAChC;IACA;IACA;IACA;IACA,IAAI,CAACkH,UAAU,CAACC,QAAQ,CAACC,eAAe,GAAG,IAAI;IAC/C,IAAI,CAACF,UAAU,CAACC,QAAQ,CAACE,OAAO,CAACC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAEhE,IAAI,CAACC,cAAc,GAAG,CAAC,CAAC;IACxB,IAAI,CAACC,wBAAwB,GAAG,CAAC,CAAC;EACpC;EAAClB,YAAA,CAAAU,qBAAA;IAAA7B,GAAA;IAAAlG,KAAA;MAAA,IAAAwI,aAAA,GAAAnC,iBAAA,eAAA/G,mBAAA,GAAAoF,IAAA,CAED,SAAA+D,QAAmBC,GAAG;QAAA,IAAAC,KAAA;QAAA,IAAAC,QAAA,EAAAC,SAAA,EAAAC,QAAA,EAAAC,MAAA,EAAAC,SAAA;QAAA,OAAA1J,mBAAA,GAAAuB,IAAA,UAAAoI,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAA/D,IAAA,GAAA+D,QAAA,CAAA1F,IAAA;YAAA;cAEpB,IAAI;gBACFoF,QAAQ,GAAGf,WAAW,CAACa,GAAG,CAAC;cAC7B,CAAC,CAAC,OAAOnJ,CAAC,EAAE;gBACV;gBACA;gBACA;gBACAqJ,QAAQ,GAAGf,WAAW,CAACsB,MAAM,CAACC,QAAQ,CAACC,MAAM,CAAC;cAChD;cAACR,SAAA,GAE4BD,QAAQ,EAA7BE,QAAQ,GAAAD,SAAA,CAARC,QAAQ,EAAEC,MAAM,GAAAF,SAAA,CAANE,MAAM;cAClBC,SAAS,GAAG,IAAI,CAACV,cAAc,CAACS,MAAM,CAAC;cAAA,KAEzCC,SAAS;gBAAAE,QAAA,CAAA1F,IAAA;gBAAA;cAAA;cAAA,OAAA0F,QAAA,CAAA7F,MAAA,WACJ2F,SAAS;YAAA;cAGlB,IAAI,CAAC,IAAI,CAACT,wBAAwB,CAACQ,MAAM,CAAC,EAAE;gBAC1C,IAAI,CAACR,wBAAwB,CAACQ,MAAM,CAAC,GAAG,IAAI,CAACd,UAAU,CACpDqB,GAAG,IAAAC,MAAA,CAAIT,QAAQ,SAAAS,MAAA,CAAMR,MAAM,EAAAQ,MAAA,CAAG,IAAI,CAACvB,gBAAgB,CAAE,CAAC,CACtDrF,IAAI,CAAC,UAAC6G,QAAQ,EAAK;kBAClBb,KAAI,CAACL,cAAc,CAACS,MAAM,CAAC,GAAGS,QAAQ,CAACC,IAAI,CAACT,SAAS;kBACrD,OAAOL,KAAI,CAACL,cAAc,CAACS,MAAM,CAAC;gBACpC,CAAC,CAAC,SACI,CAACjB,yBAAyB,CAAC,WACzB,CAAC,YAAM;kBACb,OAAOa,KAAI,CAACJ,wBAAwB,CAACQ,MAAM,CAAC;gBAC9C,CAAC,CAAC;cACN;cAAC,OAAAG,QAAA,CAAA7F,MAAA,WAEM,IAAI,CAACkF,wBAAwB,CAACQ,MAAM,CAAC;YAAA;YAAA;cAAA,OAAAG,QAAA,CAAA5D,IAAA;UAAA;QAAA,GAAAmD,OAAA;MAAA,CAC7C;MAAA,SAAAiB,aAAAC,EAAA;QAAA,OAAAnB,aAAA,CAAA9B,KAAA,OAAAD,SAAA;MAAA;MAAA,OAAAiD,YAAA;IAAA;EAAA;IAAAxD,GAAA;IAAAlG,KAAA,EAED,SAAA4J,oBAAA,EAAsB;MACpB,IAAI,CAACtB,cAAc,GAAG,CAAC,CAAC;IAC1B;EAAC;IAAApC,GAAA;IAAAlG,KAAA,EAED,SAAA6J,cAAA,EAAgB;MACd,OAAO,IAAI,CAAC5B,UAAU;IACxB;EAAC;EAAA,OAAAF,qBAAA;AAAA;AAAA,SAvDkBA,qBAAqB,IAAA+B,OAAA","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/AxiosJwtAuthService.js b/dist/auth/AxiosJwtAuthService.js new file mode 100644 index 000000000..f20888414 --- /dev/null +++ b/dist/auth/AxiosJwtAuthService.js @@ -0,0 +1,465 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import axios from 'axios'; +import PropTypes from 'prop-types'; +import { logFrontendAuthError } from './utils'; +import { camelCaseObject, ensureDefinedConfig } from '../utils'; +import createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor'; +import createCsrfTokenProviderInterceptor from './interceptors/createCsrfTokenProviderInterceptor'; +import createProcessAxiosRequestErrorInterceptor from './interceptors/createProcessAxiosRequestErrorInterceptor'; +import AxiosJwtTokenService from './AxiosJwtTokenService'; +import AxiosCsrfTokenService from './AxiosCsrfTokenService'; +import configureCache from './LocalForageCache'; +var optionsPropTypes = { + config: PropTypes.shape({ + BASE_URL: PropTypes.string.isRequired, + LMS_BASE_URL: PropTypes.string.isRequired, + LOGIN_URL: PropTypes.string.isRequired, + LOGOUT_URL: PropTypes.string.isRequired, + REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired, + ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired, + CSRF_TOKEN_API_PATH: PropTypes.string.isRequired + }).isRequired, + loggingService: PropTypes.shape({ + logError: PropTypes.func.isRequired, + logInfo: PropTypes.func.isRequired + }).isRequired +}; + +/** + * @implements {AuthService} + * @memberof module:Auth + */ +var AxiosJwtAuthService = /*#__PURE__*/function () { + /** + * @param {Object} options + * @param {Object} options.config + * @param {string} options.config.BASE_URL + * @param {string} options.config.LMS_BASE_URL + * @param {string} options.config.LOGIN_URL + * @param {string} options.config.LOGOUT_URL + * @param {string} options.config.REFRESH_ACCESS_TOKEN_ENDPOINT + * @param {string} options.config.ACCESS_TOKEN_COOKIE_NAME + * @param {string} options.config.CSRF_TOKEN_API_PATH + * @param {Object} options.loggingService requires logError and logInfo methods + */ + function AxiosJwtAuthService(options) { + var _this = this; + _classCallCheck(this, AxiosJwtAuthService); + this.authenticatedHttpClient = null; + this.httpClient = null; + this.cachedAuthenticatedHttpClient = null; + this.cachedHttpClient = null; + this.authenticatedUser = null; + ensureDefinedConfig(options, 'AuthService'); + PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService'); + this.config = options.config; + this.loggingService = options.loggingService; + this.jwtTokenService = new AxiosJwtTokenService(this.loggingService, this.config.ACCESS_TOKEN_COOKIE_NAME, this.config.REFRESH_ACCESS_TOKEN_ENDPOINT); + this.csrfTokenService = new AxiosCsrfTokenService(this.config.CSRF_TOKEN_API_PATH); + this.authenticatedHttpClient = this.addAuthenticationToHttpClient(axios.create()); + this.httpClient = axios.create(); + configureCache().then(function (cachedAxiosClient) { + _this.cachedAuthenticatedHttpClient = _this.addAuthenticationToHttpClient(cachedAxiosClient); + _this.cachedHttpClient = cachedAxiosClient; + })["catch"](function (e) { + // fallback to non-cached HTTP clients and log error + _this.cachedAuthenticatedHttpClient = _this.authenticatedHttpClient; + _this.cachedHttpClient = _this.httpClient; + logFrontendAuthError(_this.loggingService, "configureCache failed with error: ".concat(e.message)); + })["finally"](function () { + _this.middleware = options.middleware; + _this.applyMiddleware(options.middleware); + }); + } + + /** + * Applies middleware to the axios instances in this service. + * + * @param {Array} middleware Middleware to apply. + */ + _createClass(AxiosJwtAuthService, [{ + key: "applyMiddleware", + value: function applyMiddleware() { + var middleware = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var clients = [this.authenticatedHttpClient, this.httpClient, this.cachedAuthenticatedHttpClient, this.cachedHttpClient]; + try { + middleware.forEach(function (middlewareFn) { + clients.forEach(function (client) { + return client && middlewareFn(client); + }); + }); + } catch (error) { + logFrontendAuthError(this.loggingService, error); + throw error; + } + } + + /** + * Gets the authenticated HTTP client for the service. This is an axios instance. + * + * @param {Object} [options] Optional options for how the HTTP client should be configured. + * @param {boolean} [options.useCache] Whether to use front end caching for all requests made + * with the returned client. + * + * @returns {HttpClient} A configured axios http client which can be used for authenticated + * requests. + */ + }, { + key: "getAuthenticatedHttpClient", + value: function getAuthenticatedHttpClient() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (options.useCache) { + return this.cachedAuthenticatedHttpClient; + } + return this.authenticatedHttpClient; + } + + /** + * Gets the unauthenticated HTTP client for the service. This is an axios instance. + * + * @param {Object} [options] Optional options for how the HTTP client should be configured. + * @param {boolean} [options.useCache] Whether to use front end caching for all requests made + * with the returned client. + * @returns {HttpClient} A configured axios http client. + */ + }, { + key: "getHttpClient", + value: function getHttpClient() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (options.useCache) { + return this.cachedHttpClient; + } + return this.httpClient; + } + + /** + * Used primarily for testing. + * + * @ignore + */ + }, { + key: "getJwtTokenService", + value: function getJwtTokenService() { + return this.jwtTokenService; + } + + /** + * Used primarily for testing. + * + * @ignore + */ + }, { + key: "getCsrfTokenService", + value: function getCsrfTokenService() { + return this.csrfTokenService; + } + + /** + * Builds a URL to the login page with a post-login redirect URL attached as a query parameter. + * + * ``` + * const url = getLoginRedirectUrl('http://localhost/mypage'); + * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage + * ``` + * + * @param {string} redirectUrl The URL the user should be redirected to after logging in. + */ + }, { + key: "getLoginRedirectUrl", + value: function getLoginRedirectUrl() { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.BASE_URL; + return "".concat(this.config.LOGIN_URL, "?next=").concat(encodeURIComponent(redirectUrl)); + } + + /** + * Redirects the user to the login page. + * + * @param {string} redirectUrl The URL the user should be redirected to after logging in. + */ + }, { + key: "redirectToLogin", + value: function redirectToLogin() { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.BASE_URL; + global.location.assign(this.getLoginRedirectUrl(redirectUrl)); + } + + /** + * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter. + * + * ``` + * const url = getLogoutRedirectUrl('http://localhost/mypage'); + * console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage + * ``` + * + * @param {string} redirectUrl The URL the user should be redirected to after logging out. + */ + }, { + key: "getLogoutRedirectUrl", + value: function getLogoutRedirectUrl() { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.BASE_URL; + return "".concat(this.config.LOGOUT_URL, "?redirect_url=").concat(encodeURIComponent(redirectUrl)); + } + + /** + * Redirects the user to the logout page. + * + * @param {string} redirectUrl The URL the user should be redirected to after logging out. + */ + }, { + key: "redirectToLogout", + value: function redirectToLogout() { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.BASE_URL; + global.location.assign(this.getLogoutRedirectUrl(redirectUrl)); + } + + /** + * If it exists, returns the user data representing the currently authenticated user. If the + * user is anonymous, returns null. + * + * @returns {UserData|null} + */ + }, { + key: "getAuthenticatedUser", + value: function getAuthenticatedUser() { + return this.authenticatedUser; + } + + /** + * Sets the authenticated user to the provided value. + * + * @param {UserData} authUser + */ + }, { + key: "setAuthenticatedUser", + value: function setAuthenticatedUser(authUser) { + this.authenticatedUser = authUser; + } + + /** + * Reads the authenticated user's access token. Resolves to null if the user is + * unauthenticated. + * + * @returns {Promise|Promise} Resolves to the user's access token if they are + * logged in. + */ + }, { + key: "fetchAuthenticatedUser", + value: (function () { + var _fetchAuthenticatedUser = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var options, + decodedAccessToken, + _args = arguments; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + options = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}; + _context.next = 3; + return this.jwtTokenService.getJwtToken(options.forceRefresh || false); + case 3: + decodedAccessToken = _context.sent; + if (decodedAccessToken !== null) { + this.setAuthenticatedUser({ + email: decodedAccessToken.email, + userId: decodedAccessToken.user_id, + username: decodedAccessToken.preferred_username, + roles: decodedAccessToken.roles || [], + administrator: decodedAccessToken.administrator, + name: decodedAccessToken.name + }); + // Sets userId as a custom attribute that will be included with all subsequent log messages. + // Very helpful for debugging. + this.loggingService.setCustomAttribute('userId', decodedAccessToken.user_id); + } else { + this.setAuthenticatedUser(null); + // Intentionally not setting `userId` in the logging service here because it would be useful + // to know the previously logged in user for debugging refresh issues. + } + return _context.abrupt("return", this.getAuthenticatedUser()); + case 6: + case "end": + return _context.stop(); + } + }, _callee, this); + })); + function fetchAuthenticatedUser() { + return _fetchAuthenticatedUser.apply(this, arguments); + } + return fetchAuthenticatedUser; + }() + /** + * Ensures a user is authenticated. It will redirect to login when not + * authenticated. + * + * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not + * authenticated. + * @returns {Promise} + */ + ) + }, { + key: "ensureAuthenticatedUser", + value: (function () { + var _ensureAuthenticatedUser = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var redirectUrl, + isRedirectFromLoginPage, + redirectLoopError, + unauthorizedError, + _args2 = arguments; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + redirectUrl = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : this.config.BASE_URL; + _context2.next = 3; + return this.fetchAuthenticatedUser(); + case 3: + if (!(this.getAuthenticatedUser() === null)) { + _context2.next = 13; + break; + } + isRedirectFromLoginPage = global.document.referrer && global.document.referrer.startsWith(this.config.LOGIN_URL); + if (!isRedirectFromLoginPage) { + _context2.next = 9; + break; + } + redirectLoopError = new Error('Redirect from login page. Rejecting to avoid infinite redirect loop.'); + logFrontendAuthError(this.loggingService, redirectLoopError); + throw redirectLoopError; + case 9: + // The user is not authenticated, send them to the login page. + this.redirectToLogin(redirectUrl); + unauthorizedError = new Error('Failed to ensure the user is authenticated'); + unauthorizedError.isRedirecting = true; + throw unauthorizedError; + case 13: + return _context2.abrupt("return", this.getAuthenticatedUser()); + case 14: + case "end": + return _context2.stop(); + } + }, _callee2, this); + })); + function ensureAuthenticatedUser() { + return _ensureAuthenticatedUser.apply(this, arguments); + } + return ensureAuthenticatedUser; + }() + /** + * Fetches additional user account information for the authenticated user and merges it into the + * existing authenticatedUser object, available via getAuthenticatedUser(). + * + * ``` + * console.log(authenticatedUser); // Will be sparse and only contain basic information. + * await hydrateAuthenticatedUser() + * const authenticatedUser = getAuthenticatedUser(); + * console.log(authenticatedUser); // Will contain additional user information + * ``` + * + * @returns {Promise} + */ + ) + }, { + key: "hydrateAuthenticatedUser", + value: (function () { + var _hydrateAuthenticatedUser = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { + var user, response; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + user = this.getAuthenticatedUser(); + if (!(user !== null)) { + _context3.next = 6; + break; + } + _context3.next = 4; + return this.authenticatedHttpClient.get("".concat(this.config.LMS_BASE_URL, "/api/user/v1/accounts/").concat(user.username)); + case 4: + response = _context3.sent; + this.setAuthenticatedUser(_objectSpread(_objectSpread({}, user), camelCaseObject(response.data))); + case 6: + case "end": + return _context3.stop(); + } + }, _callee3, this); + })); + function hydrateAuthenticatedUser() { + return _hydrateAuthenticatedUser.apply(this, arguments); + } + return hydrateAuthenticatedUser; + }() + /** + * Adds authentication defaults and interceptors to an HTTP client instance. + * + * @param {HttpClient} newHttpClient + * @param {Object} config + * @param {string} [config.REFRESH_ACCESS_TOKEN_ENDPOINT] + * @param {string} [config.ACCESS_TOKEN_COOKIE_NAME] + * @param {string} [config.CSRF_TOKEN_API_PATH] + * @returns {HttpClient} A configured Axios HTTP client. + */ + ) + }, { + key: "addAuthenticationToHttpClient", + value: function addAuthenticationToHttpClient(newHttpClient) { + var httpClient = Object.create(newHttpClient); + // Set withCredentials to true. Enables cross-site Access-Control requests + // to be made using cookies, authorization headers or TLS client + // certificates. More on MDN: + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials + httpClient.defaults.withCredentials = true; + + // Axios interceptors + + // The JWT access token interceptor attempts to refresh the user's jwt token + // before any request unless the isPublic flag is set on the request config. + var refreshAccessTokenInterceptor = createJwtTokenProviderInterceptor({ + jwtTokenService: this.jwtTokenService, + shouldSkip: function shouldSkip(axiosRequestConfig) { + return axiosRequestConfig.isPublic; + } + }); + // The CSRF token intercepter fetches and caches a csrf token for any post, + // put, patch, or delete request. That token is then added to the request + // headers. + var attachCsrfTokenInterceptor = createCsrfTokenProviderInterceptor({ + csrfTokenService: this.csrfTokenService, + CSRF_TOKEN_API_PATH: this.config.CSRF_TOKEN_API_PATH, + shouldSkip: function shouldSkip(axiosRequestConfig) { + var method = axiosRequestConfig.method, + isCsrfExempt = axiosRequestConfig.isCsrfExempt; + var CSRF_PROTECTED_METHODS = ['post', 'put', 'patch', 'delete']; + return isCsrfExempt || !CSRF_PROTECTED_METHODS.includes(method); + } + }); + var processAxiosRequestErrorInterceptor = createProcessAxiosRequestErrorInterceptor({ + loggingService: this.loggingService + }); + + // Request interceptors: Axios runs the interceptors in reverse order from + // how they are listed. After fetching csrf tokens no longer require jwt + // authentication, it won't matter which happens first. This change is + // coming soon in edx-platform. Nov. 2019 + httpClient.interceptors.request.use(attachCsrfTokenInterceptor); + httpClient.interceptors.request.use(refreshAccessTokenInterceptor); + + // Response interceptor: moves axios response error data into the error + // object at error.customAttributes + httpClient.interceptors.response.use(function (response) { + return response; + }, processAxiosRequestErrorInterceptor); + return httpClient; + } + }]); + return AxiosJwtAuthService; +}(); +export default AxiosJwtAuthService; +//# sourceMappingURL=AxiosJwtAuthService.js.map \ No newline at end of file diff --git a/dist/auth/AxiosJwtAuthService.js.map b/dist/auth/AxiosJwtAuthService.js.map new file mode 100644 index 000000000..4c063761e --- /dev/null +++ b/dist/auth/AxiosJwtAuthService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AxiosJwtAuthService.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","_classCallCheck","instance","Constructor","_defineProperties","target","props","descriptor","_toPropertyKey","_createClass","protoProps","staticProps","_toPrimitive","String","toPrimitive","Number","axios","PropTypes","logFrontendAuthError","camelCaseObject","ensureDefinedConfig","createJwtTokenProviderInterceptor","createCsrfTokenProviderInterceptor","createProcessAxiosRequestErrorInterceptor","AxiosJwtTokenService","AxiosCsrfTokenService","configureCache","optionsPropTypes","config","shape","BASE_URL","string","isRequired","LMS_BASE_URL","LOGIN_URL","LOGOUT_URL","REFRESH_ACCESS_TOKEN_ENDPOINT","ACCESS_TOKEN_COOKIE_NAME","CSRF_TOKEN_API_PATH","loggingService","logError","func","logInfo","AxiosJwtAuthService","options","_this","authenticatedHttpClient","httpClient","cachedAuthenticatedHttpClient","cachedHttpClient","authenticatedUser","checkPropTypes","jwtTokenService","csrfTokenService","addAuthenticationToHttpClient","cachedAxiosClient","concat","message","middleware","applyMiddleware","clients","middlewareFn","client","getAuthenticatedHttpClient","useCache","getHttpClient","getJwtTokenService","getCsrfTokenService","getLoginRedirectUrl","redirectUrl","encodeURIComponent","redirectToLogin","global","location","assign","getLogoutRedirectUrl","redirectToLogout","getAuthenticatedUser","setAuthenticatedUser","authUser","_fetchAuthenticatedUser","_callee","decodedAccessToken","_args","_callee$","_context","getJwtToken","forceRefresh","email","userId","user_id","username","preferred_username","roles","administrator","setCustomAttribute","fetchAuthenticatedUser","_ensureAuthenticatedUser","_callee2","isRedirectFromLoginPage","redirectLoopError","unauthorizedError","_args2","_callee2$","_context2","document","referrer","startsWith","isRedirecting","ensureAuthenticatedUser","_hydrateAuthenticatedUser","_callee3","user","response","_callee3$","_context3","get","_objectSpread","data","hydrateAuthenticatedUser","newHttpClient","defaults","withCredentials","refreshAccessTokenInterceptor","shouldSkip","axiosRequestConfig","isPublic","attachCsrfTokenInterceptor","isCsrfExempt","CSRF_PROTECTED_METHODS","includes","processAxiosRequestErrorInterceptor","interceptors","request","use"],"sources":["../../src/auth/AxiosJwtAuthService.js"],"sourcesContent":["import axios from 'axios';\nimport PropTypes from 'prop-types';\nimport { logFrontendAuthError } from './utils';\nimport { camelCaseObject, ensureDefinedConfig } from '../utils';\nimport createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor';\nimport createCsrfTokenProviderInterceptor from './interceptors/createCsrfTokenProviderInterceptor';\nimport createProcessAxiosRequestErrorInterceptor from './interceptors/createProcessAxiosRequestErrorInterceptor';\nimport AxiosJwtTokenService from './AxiosJwtTokenService';\nimport AxiosCsrfTokenService from './AxiosCsrfTokenService';\nimport configureCache from './LocalForageCache';\n\nconst optionsPropTypes = {\n config: PropTypes.shape({\n BASE_URL: PropTypes.string.isRequired,\n LMS_BASE_URL: PropTypes.string.isRequired,\n LOGIN_URL: PropTypes.string.isRequired,\n LOGOUT_URL: PropTypes.string.isRequired,\n REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired,\n ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired,\n CSRF_TOKEN_API_PATH: PropTypes.string.isRequired,\n }).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n};\n\n/**\n * @implements {AuthService}\n * @memberof module:Auth\n */\nclass AxiosJwtAuthService {\n /**\n * @param {Object} options\n * @param {Object} options.config\n * @param {string} options.config.BASE_URL\n * @param {string} options.config.LMS_BASE_URL\n * @param {string} options.config.LOGIN_URL\n * @param {string} options.config.LOGOUT_URL\n * @param {string} options.config.REFRESH_ACCESS_TOKEN_ENDPOINT\n * @param {string} options.config.ACCESS_TOKEN_COOKIE_NAME\n * @param {string} options.config.CSRF_TOKEN_API_PATH\n * @param {Object} options.loggingService requires logError and logInfo methods\n */\n constructor(options) {\n this.authenticatedHttpClient = null;\n this.httpClient = null;\n this.cachedAuthenticatedHttpClient = null;\n this.cachedHttpClient = null;\n this.authenticatedUser = null;\n\n ensureDefinedConfig(options, 'AuthService');\n PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService');\n\n this.config = options.config;\n this.loggingService = options.loggingService;\n this.jwtTokenService = new AxiosJwtTokenService(\n this.loggingService,\n this.config.ACCESS_TOKEN_COOKIE_NAME,\n this.config.REFRESH_ACCESS_TOKEN_ENDPOINT,\n );\n this.csrfTokenService = new AxiosCsrfTokenService(this.config.CSRF_TOKEN_API_PATH);\n this.authenticatedHttpClient = this.addAuthenticationToHttpClient(axios.create());\n this.httpClient = axios.create();\n configureCache()\n .then((cachedAxiosClient) => {\n this.cachedAuthenticatedHttpClient = this.addAuthenticationToHttpClient(cachedAxiosClient);\n this.cachedHttpClient = cachedAxiosClient;\n })\n .catch((e) => {\n // fallback to non-cached HTTP clients and log error\n this.cachedAuthenticatedHttpClient = this.authenticatedHttpClient;\n this.cachedHttpClient = this.httpClient;\n logFrontendAuthError(this.loggingService, `configureCache failed with error: ${e.message}`);\n }).finally(() => {\n this.middleware = options.middleware;\n this.applyMiddleware(options.middleware);\n });\n }\n\n /**\n * Applies middleware to the axios instances in this service.\n *\n * @param {Array} middleware Middleware to apply.\n */\n applyMiddleware(middleware = []) {\n const clients = [\n this.authenticatedHttpClient, this.httpClient,\n this.cachedAuthenticatedHttpClient, this.cachedHttpClient,\n ];\n try {\n (middleware).forEach((middlewareFn) => {\n clients.forEach((client) => client && middlewareFn(client));\n });\n } catch (error) {\n logFrontendAuthError(this.loggingService, error);\n throw error;\n }\n }\n\n /**\n * Gets the authenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n *\n * @returns {HttpClient} A configured axios http client which can be used for authenticated\n * requests.\n */\n getAuthenticatedHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedAuthenticatedHttpClient;\n }\n\n return this.authenticatedHttpClient;\n }\n\n /**\n * Gets the unauthenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n * @returns {HttpClient} A configured axios http client.\n */\n getHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedHttpClient;\n }\n\n return this.httpClient;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getJwtTokenService() {\n return this.jwtTokenService;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getCsrfTokenService() {\n return this.csrfTokenService;\n }\n\n /**\n * Builds a URL to the login page with a post-login redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLoginRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n getLoginRedirectUrl(redirectUrl = this.config.BASE_URL) {\n return `${this.config.LOGIN_URL}?next=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the login page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n redirectToLogin(redirectUrl = this.config.BASE_URL) {\n global.location.assign(this.getLoginRedirectUrl(redirectUrl));\n }\n\n /**\n * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLogoutRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n getLogoutRedirectUrl(redirectUrl = this.config.BASE_URL) {\n return `${this.config.LOGOUT_URL}?redirect_url=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the logout page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n redirectToLogout(redirectUrl = this.config.BASE_URL) {\n global.location.assign(this.getLogoutRedirectUrl(redirectUrl));\n }\n\n /**\n * If it exists, returns the user data representing the currently authenticated user. If the\n * user is anonymous, returns null.\n *\n * @returns {UserData|null}\n */\n getAuthenticatedUser() {\n return this.authenticatedUser;\n }\n\n /**\n * Sets the authenticated user to the provided value.\n *\n * @param {UserData} authUser\n */\n setAuthenticatedUser(authUser) {\n this.authenticatedUser = authUser;\n }\n\n /**\n * Reads the authenticated user's access token. Resolves to null if the user is\n * unauthenticated.\n *\n * @returns {Promise|Promise} Resolves to the user's access token if they are\n * logged in.\n */\n async fetchAuthenticatedUser(options = {}) {\n const decodedAccessToken = await this.jwtTokenService.getJwtToken(options.forceRefresh || false);\n\n if (decodedAccessToken !== null) {\n this.setAuthenticatedUser({\n email: decodedAccessToken.email,\n userId: decodedAccessToken.user_id,\n username: decodedAccessToken.preferred_username,\n roles: decodedAccessToken.roles || [],\n administrator: decodedAccessToken.administrator,\n name: decodedAccessToken.name,\n });\n // Sets userId as a custom attribute that will be included with all subsequent log messages.\n // Very helpful for debugging.\n this.loggingService.setCustomAttribute('userId', decodedAccessToken.user_id);\n } else {\n this.setAuthenticatedUser(null);\n // Intentionally not setting `userId` in the logging service here because it would be useful\n // to know the previously logged in user for debugging refresh issues.\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Ensures a user is authenticated. It will redirect to login when not\n * authenticated.\n *\n * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not\n * authenticated.\n * @returns {Promise}\n */\n async ensureAuthenticatedUser(redirectUrl = this.config.BASE_URL) {\n await this.fetchAuthenticatedUser();\n\n if (this.getAuthenticatedUser() === null) {\n const isRedirectFromLoginPage = global.document.referrer\n && global.document.referrer.startsWith(this.config.LOGIN_URL);\n\n if (isRedirectFromLoginPage) {\n const redirectLoopError = new Error('Redirect from login page. Rejecting to avoid infinite redirect loop.');\n logFrontendAuthError(this.loggingService, redirectLoopError);\n throw redirectLoopError;\n }\n\n // The user is not authenticated, send them to the login page.\n this.redirectToLogin(redirectUrl);\n\n const unauthorizedError = new Error('Failed to ensure the user is authenticated');\n unauthorizedError.isRedirecting = true;\n throw unauthorizedError;\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Fetches additional user account information for the authenticated user and merges it into the\n * existing authenticatedUser object, available via getAuthenticatedUser().\n *\n * ```\n * console.log(authenticatedUser); // Will be sparse and only contain basic information.\n * await hydrateAuthenticatedUser()\n * const authenticatedUser = getAuthenticatedUser();\n * console.log(authenticatedUser); // Will contain additional user information\n * ```\n *\n * @returns {Promise}\n */\n async hydrateAuthenticatedUser() {\n const user = this.getAuthenticatedUser();\n if (user !== null) {\n const response = await this.authenticatedHttpClient\n .get(`${this.config.LMS_BASE_URL}/api/user/v1/accounts/${user.username}`);\n this.setAuthenticatedUser({ ...user, ...camelCaseObject(response.data) });\n }\n }\n\n /**\n * Adds authentication defaults and interceptors to an HTTP client instance.\n *\n * @param {HttpClient} newHttpClient\n * @param {Object} config\n * @param {string} [config.REFRESH_ACCESS_TOKEN_ENDPOINT]\n * @param {string} [config.ACCESS_TOKEN_COOKIE_NAME]\n * @param {string} [config.CSRF_TOKEN_API_PATH]\n * @returns {HttpClient} A configured Axios HTTP client.\n */\n addAuthenticationToHttpClient(newHttpClient) {\n const httpClient = Object.create(newHttpClient);\n // Set withCredentials to true. Enables cross-site Access-Control requests\n // to be made using cookies, authorization headers or TLS client\n // certificates. More on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials\n httpClient.defaults.withCredentials = true;\n\n // Axios interceptors\n\n // The JWT access token interceptor attempts to refresh the user's jwt token\n // before any request unless the isPublic flag is set on the request config.\n const refreshAccessTokenInterceptor = createJwtTokenProviderInterceptor({\n jwtTokenService: this.jwtTokenService,\n shouldSkip: axiosRequestConfig => axiosRequestConfig.isPublic,\n });\n // The CSRF token intercepter fetches and caches a csrf token for any post,\n // put, patch, or delete request. That token is then added to the request\n // headers.\n const attachCsrfTokenInterceptor = createCsrfTokenProviderInterceptor({\n csrfTokenService: this.csrfTokenService,\n CSRF_TOKEN_API_PATH: this.config.CSRF_TOKEN_API_PATH,\n shouldSkip: (axiosRequestConfig) => {\n const { method, isCsrfExempt } = axiosRequestConfig;\n const CSRF_PROTECTED_METHODS = ['post', 'put', 'patch', 'delete'];\n return isCsrfExempt || !CSRF_PROTECTED_METHODS.includes(method);\n },\n });\n\n const processAxiosRequestErrorInterceptor = createProcessAxiosRequestErrorInterceptor({\n loggingService: this.loggingService,\n });\n\n // Request interceptors: Axios runs the interceptors in reverse order from\n // how they are listed. After fetching csrf tokens no longer require jwt\n // authentication, it won't matter which happens first. This change is\n // coming soon in edx-platform. Nov. 2019\n httpClient.interceptors.request.use(attachCsrfTokenInterceptor);\n httpClient.interceptors.request.use(refreshAccessTokenInterceptor);\n\n // Response interceptor: moves axios response error data into the error\n // object at error.customAttributes\n httpClient.interceptors.response.use(\n response => response,\n processAxiosRequestErrorInterceptor,\n );\n\n return httpClient;\n }\n}\n\nexport default AxiosJwtAuthService;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/AxiosJwtTokenService.js b/dist/auth/AxiosJwtTokenService.js new file mode 100644 index 000000000..4ce727797 --- /dev/null +++ b/dist/auth/AxiosJwtTokenService.js @@ -0,0 +1,201 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import Cookies from 'universal-cookie'; +import jwtDecode from 'jwt-decode'; +import axios from 'axios'; +import { logFrontendAuthError, processAxiosErrorAndThrow } from './utils'; +import createRetryInterceptor from './interceptors/createRetryInterceptor'; +var AxiosJwtTokenService = /*#__PURE__*/function () { + function AxiosJwtTokenService(loggingService, tokenCookieName, tokenRefreshEndpoint) { + _classCallCheck(this, AxiosJwtTokenService); + this.loggingService = loggingService; + this.tokenCookieName = tokenCookieName; + this.tokenRefreshEndpoint = tokenRefreshEndpoint; + this.httpClient = axios.create(); + // Set withCredentials to true. Enables cross-site Access-Control requests + // to be made using cookies, authorization headers or TLS client + // certificates. More on MDN: + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials + this.httpClient.defaults.withCredentials = true; + // Add retries to this axios instance + this.httpClient.interceptors.response.use(function (response) { + return response; + }, createRetryInterceptor({ + httpClient: this.httpClient + })); + this.cookies = new Cookies(); + this.refreshRequestPromises = {}; + } + _createClass(AxiosJwtTokenService, [{ + key: "getHttpClient", + value: function getHttpClient() { + return this.httpClient; + } + }, { + key: "decodeJwtCookie", + value: function decodeJwtCookie() { + var cookieValue = this.cookies.get(this.tokenCookieName); + if (cookieValue) { + try { + return jwtDecode(cookieValue); + } catch (e) { + var error = Object.create(e); + error.message = 'Error decoding JWT token'; + error.customAttributes = { + cookieValue: cookieValue + }; + throw error; + } + } + return null; + } + }, { + key: "refresh", + value: function refresh() { + var _this = this; + var responseServerEpochSeconds = 0; + if (this.refreshRequestPromises[this.tokenCookieName] === undefined) { + var makeRefreshRequest = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var axiosResponse, userIsUnauthenticated, _decodedJwtToken, browserEpochSeconds, browserDriftSeconds, decodedJwtToken, error; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.prev = 1; + _context.next = 4; + return _this.httpClient.post(_this.tokenRefreshEndpoint); + case 4: + axiosResponse = _context.sent; + // eslint-disable-next-line max-len + if (axiosResponse.data && axiosResponse.data.response_epoch_seconds) { + responseServerEpochSeconds = axiosResponse.data.response_epoch_seconds; + } + _context.next = 11; + break; + case 8: + _context.prev = 8; + _context.t0 = _context["catch"](1); + processAxiosErrorAndThrow(_context.t0); + case 11: + _context.next = 21; + break; + case 13: + _context.prev = 13; + _context.t1 = _context["catch"](0); + userIsUnauthenticated = _context.t1.response && _context.t1.response.status === 401; + if (!userIsUnauthenticated) { + _context.next = 20; + break; + } + // Clean up the cookie if it exists to eliminate any situation + // where the cookie is not expired but the jwt is expired. + _this.cookies.remove(_this.tokenCookieName); + _decodedJwtToken = null; + return _context.abrupt("return", _decodedJwtToken); + case 20: + throw _context.t1; + case 21: + browserEpochSeconds = Date.now() / 1000; + browserDriftSeconds = responseServerEpochSeconds > 0 ? Math.abs(browserEpochSeconds - responseServerEpochSeconds) : null; + decodedJwtToken = _this.decodeJwtCookie(); + if (decodedJwtToken) { + _context.next = 28; + break; + } + // This is an unexpected case. The refresh endpoint should set the + // cookie that is needed. + // For more details, see: + // docs/decisions/0005-token-null-after-successful-refresh.rst + error = new Error('Access token is still null after successful refresh.'); + error.customAttributes = { + axiosResponse: axiosResponse, + browserDriftSeconds: browserDriftSeconds, + browserEpochSeconds: browserEpochSeconds + }; + throw error; + case 28: + return _context.abrupt("return", decodedJwtToken); + case 29: + case "end": + return _context.stop(); + } + }, _callee, null, [[0, 13], [1, 8]]); + })); + return function makeRefreshRequest() { + return _ref.apply(this, arguments); + }; + }(); + this.refreshRequestPromises[this.tokenCookieName] = makeRefreshRequest()["finally"](function () { + delete _this.refreshRequestPromises[_this.tokenCookieName]; + }); + } + return this.refreshRequestPromises[this.tokenCookieName]; + } + }, { + key: "getJwtToken", + value: function () { + var _getJwtToken = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var forceRefresh, + decodedJwtToken, + _args2 = arguments; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + forceRefresh = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : false; + _context2.prev = 1; + decodedJwtToken = this.decodeJwtCookie(this.tokenCookieName); + if (!(!AxiosJwtTokenService.isTokenExpired(decodedJwtToken) && !forceRefresh)) { + _context2.next = 5; + break; + } + return _context2.abrupt("return", decodedJwtToken); + case 5: + _context2.next = 10; + break; + case 7: + _context2.prev = 7; + _context2.t0 = _context2["catch"](1); + // Log unexpected error and continue with attempt to refresh it. + // TODO: Fix these. They're still using loggingService as a singleton. + logFrontendAuthError(this.loggingService, _context2.t0); + case 10: + _context2.prev = 10; + _context2.next = 13; + return this.refresh(); + case 13: + return _context2.abrupt("return", _context2.sent); + case 16: + _context2.prev = 16; + _context2.t1 = _context2["catch"](10); + // TODO: Fix these. They're still using loggingService as a singleton. + logFrontendAuthError(this.loggingService, _context2.t1); + throw _context2.t1; + case 20: + case "end": + return _context2.stop(); + } + }, _callee2, this, [[1, 7], [10, 16]]); + })); + function getJwtToken() { + return _getJwtToken.apply(this, arguments); + } + return getJwtToken; + }() + }], [{ + key: "isTokenExpired", + value: function isTokenExpired(token) { + return !token || token.exp < Date.now() / 1000; + } + }]); + return AxiosJwtTokenService; +}(); +export { AxiosJwtTokenService as default }; +//# sourceMappingURL=AxiosJwtTokenService.js.map \ No newline at end of file diff --git a/dist/auth/AxiosJwtTokenService.js.map b/dist/auth/AxiosJwtTokenService.js.map new file mode 100644 index 000000000..a1afd485e --- /dev/null +++ b/dist/auth/AxiosJwtTokenService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AxiosJwtTokenService.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","_classCallCheck","instance","Constructor","_defineProperties","target","props","descriptor","_toPropertyKey","_createClass","protoProps","staticProps","_toPrimitive","String","toPrimitive","Number","Cookies","jwtDecode","axios","logFrontendAuthError","processAxiosErrorAndThrow","createRetryInterceptor","AxiosJwtTokenService","loggingService","tokenCookieName","tokenRefreshEndpoint","httpClient","defaults","withCredentials","interceptors","response","use","cookies","refreshRequestPromises","getHttpClient","decodeJwtCookie","cookieValue","get","message","customAttributes","refresh","_this","responseServerEpochSeconds","makeRefreshRequest","_ref","_callee","axiosResponse","userIsUnauthenticated","_decodedJwtToken","browserEpochSeconds","browserDriftSeconds","decodedJwtToken","_callee$","_context","post","data","response_epoch_seconds","t0","t1","status","remove","Date","now","Math","abs","_getJwtToken","_callee2","forceRefresh","_args2","_callee2$","_context2","isTokenExpired","getJwtToken","token","exp","default"],"sources":["../../src/auth/AxiosJwtTokenService.js"],"sourcesContent":["import Cookies from 'universal-cookie';\nimport jwtDecode from 'jwt-decode';\nimport axios from 'axios';\nimport { logFrontendAuthError, processAxiosErrorAndThrow } from './utils';\nimport createRetryInterceptor from './interceptors/createRetryInterceptor';\n\nexport default class AxiosJwtTokenService {\n static isTokenExpired(token) {\n return !token || token.exp < Date.now() / 1000;\n }\n\n constructor(loggingService, tokenCookieName, tokenRefreshEndpoint) {\n this.loggingService = loggingService;\n this.tokenCookieName = tokenCookieName;\n this.tokenRefreshEndpoint = tokenRefreshEndpoint;\n\n this.httpClient = axios.create();\n // Set withCredentials to true. Enables cross-site Access-Control requests\n // to be made using cookies, authorization headers or TLS client\n // certificates. More on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials\n this.httpClient.defaults.withCredentials = true;\n // Add retries to this axios instance\n this.httpClient.interceptors.response.use(\n response => response,\n createRetryInterceptor({ httpClient: this.httpClient }),\n );\n\n this.cookies = new Cookies();\n this.refreshRequestPromises = {};\n }\n\n getHttpClient() {\n return this.httpClient;\n }\n\n decodeJwtCookie() {\n const cookieValue = this.cookies.get(this.tokenCookieName);\n\n if (cookieValue) {\n try {\n return jwtDecode(cookieValue);\n } catch (e) {\n const error = Object.create(e);\n error.message = 'Error decoding JWT token';\n error.customAttributes = { cookieValue };\n throw error;\n }\n }\n\n return null;\n }\n\n refresh() {\n let responseServerEpochSeconds = 0;\n\n if (this.refreshRequestPromises[this.tokenCookieName] === undefined) {\n const makeRefreshRequest = async () => {\n let axiosResponse;\n try {\n try {\n axiosResponse = await this.httpClient.post(this.tokenRefreshEndpoint);\n // eslint-disable-next-line max-len\n if (axiosResponse.data && axiosResponse.data.response_epoch_seconds) {\n responseServerEpochSeconds = axiosResponse.data.response_epoch_seconds;\n }\n } catch (error) {\n processAxiosErrorAndThrow(error);\n }\n } catch (error) {\n const userIsUnauthenticated = error.response && error.response.status === 401;\n if (userIsUnauthenticated) {\n // Clean up the cookie if it exists to eliminate any situation\n // where the cookie is not expired but the jwt is expired.\n this.cookies.remove(this.tokenCookieName);\n const decodedJwtToken = null;\n return decodedJwtToken;\n }\n\n // TODO: Network timeouts and other problems will end up in\n // this block of code. We could add logic for retrying token\n // refreshes if we wanted to.\n throw error;\n }\n\n const browserEpochSeconds = Date.now() / 1000;\n const browserDriftSeconds = responseServerEpochSeconds > 0\n ? Math.abs(browserEpochSeconds - responseServerEpochSeconds)\n : null;\n\n const decodedJwtToken = this.decodeJwtCookie();\n\n if (!decodedJwtToken) {\n // This is an unexpected case. The refresh endpoint should set the\n // cookie that is needed.\n // For more details, see:\n // docs/decisions/0005-token-null-after-successful-refresh.rst\n const error = new Error('Access token is still null after successful refresh.');\n error.customAttributes = { axiosResponse, browserDriftSeconds, browserEpochSeconds };\n throw error;\n }\n\n return decodedJwtToken;\n };\n\n this.refreshRequestPromises[this.tokenCookieName] = makeRefreshRequest().finally(() => {\n delete this.refreshRequestPromises[this.tokenCookieName];\n });\n }\n\n return this.refreshRequestPromises[this.tokenCookieName];\n }\n\n async getJwtToken(forceRefresh = false) {\n try {\n const decodedJwtToken = this.decodeJwtCookie(this.tokenCookieName);\n if (!AxiosJwtTokenService.isTokenExpired(decodedJwtToken) && !forceRefresh) {\n return decodedJwtToken;\n }\n } catch (e) {\n // Log unexpected error and continue with attempt to refresh it.\n // TODO: Fix these. They're still using loggingService as a singleton.\n logFrontendAuthError(this.loggingService, e);\n }\n\n try {\n return await this.refresh();\n } catch (e) {\n // TODO: Fix these. They're still using loggingService as a singleton.\n logFrontendAuthError(this.loggingService, e);\n throw e;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/LocalForageCache.js b/dist/auth/LocalForageCache.js new file mode 100644 index 000000000..130a74075 --- /dev/null +++ b/dist/auth/LocalForageCache.js @@ -0,0 +1,116 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +/* eslint-disable no-underscore-dangle */ +import localforage from 'localforage'; +import memoryDriver from 'localforage-memoryStorageDriver'; +import { setupCache, defaultKeyGenerator, defaultHeaderInterpreter, buildStorage } from 'axios-cache-interceptor'; +import axios from 'axios'; + +/** + * Async function to configure localforage and setup the cache + * + * @returns {Promise} A promise that, when resolved, returns an axios instance configured to + * use localforage as a cache. + */ +export default function configureCache() { + return _configureCache.apply(this, arguments); +} +function _configureCache() { + _configureCache = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { + var forageStore, forageStoreAdapter; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return localforage.defineDriver(memoryDriver); + case 2: + // Create `localforage` instance + forageStore = localforage.createInstance({ + // List of drivers used + driver: [localforage.INDEXEDDB, localforage.LOCALSTORAGE, memoryDriver._driver], + name: 'edx-cache' + }); + forageStoreAdapter = buildStorage({ + find: function find(key) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var result; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return forageStore.getItem("axios-cache:".concat(key)); + case 2: + result = _context.sent; + return _context.abrupt("return", JSON.parse(result)); + case 4: + case "end": + return _context.stop(); + } + }, _callee); + }))(); + }, + set: function set(key, value) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return forageStore.setItem("axios-cache:".concat(key), JSON.stringify(value)); + case 2: + case "end": + return _context2.stop(); + } + }, _callee2); + }))(); + }, + remove: function remove(key) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return forageStore.removeItem("axios-cache:".concat(key)); + case 2: + case "end": + return _context3.stop(); + } + }, _callee3); + }))(); + } + }); // only GET methods are cached by default + return _context4.abrupt("return", setupCache( + // axios instance + axios.create(), { + ttl: 5 * 60 * 1000, + // default maxAge of 5 minutes + // The storage to save the cache data. There are more available by default. + // + // https://axios-cache-interceptor.js.org/#/pages/storages + storage: forageStoreAdapter, + // The mechanism to generate a unique key for each request. + // + // https://axios-cache-interceptor.js.org/#/pages/request-id + generateKey: defaultKeyGenerator, + // The mechanism to interpret headers (when cache.interpretHeader is true). + // + // https://axios-cache-interceptor.js.org/#/pages/global-configuration?id=headerinterpreter + headerInterpreter: defaultHeaderInterpreter, + // The function that will receive debug information. + // NOTE: For this to work, you need to enable development mode. + // + // https://axios-cache-interceptor.js.org/#/pages/development-mode + // https://axios-cache-interceptor.js.org/#/pages/global-configuration?id=debug + // eslint-disable-next-line no-console + debug: console.log + })); + case 5: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return _configureCache.apply(this, arguments); +} +//# sourceMappingURL=LocalForageCache.js.map \ No newline at end of file diff --git a/dist/auth/LocalForageCache.js.map b/dist/auth/LocalForageCache.js.map new file mode 100644 index 000000000..703900847 --- /dev/null +++ b/dist/auth/LocalForageCache.js.map @@ -0,0 +1 @@ +{"version":3,"file":"LocalForageCache.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","localforage","memoryDriver","setupCache","defaultKeyGenerator","defaultHeaderInterpreter","buildStorage","axios","configureCache","_configureCache","_callee4","forageStore","forageStoreAdapter","_callee4$","_context4","defineDriver","createInstance","driver","INDEXEDDB","LOCALSTORAGE","_driver","find","_callee","result","_callee$","_context","getItem","concat","JSON","parse","set","_callee2","_callee2$","_context2","setItem","stringify","remove","_callee3","_callee3$","_context3","removeItem","ttl","storage","generateKey","headerInterpreter","debug","console","log"],"sources":["../../src/auth/LocalForageCache.js"],"sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport localforage from 'localforage';\nimport memoryDriver from 'localforage-memoryStorageDriver';\nimport {\n setupCache,\n defaultKeyGenerator,\n defaultHeaderInterpreter,\n buildStorage,\n} from 'axios-cache-interceptor';\nimport axios from 'axios';\n\n/**\n * Async function to configure localforage and setup the cache\n *\n * @returns {Promise} A promise that, when resolved, returns an axios instance configured to\n * use localforage as a cache.\n */\nexport default async function configureCache() {\n // Register the imported `memoryDriver` to `localforage`\n await localforage.defineDriver(memoryDriver);\n\n // Create `localforage` instance\n const forageStore = localforage.createInstance({\n // List of drivers used\n driver: [\n localforage.INDEXEDDB,\n localforage.LOCALSTORAGE,\n memoryDriver._driver,\n ],\n name: 'edx-cache',\n });\n\n const forageStoreAdapter = buildStorage({\n async find(key) {\n const result = await forageStore.getItem(`axios-cache:${key}`);\n return JSON.parse(result);\n },\n\n async set(key, value) {\n await forageStore.setItem(`axios-cache:${key}`, JSON.stringify(value));\n },\n\n async remove(key) {\n await forageStore.removeItem(`axios-cache:${key}`);\n },\n });\n\n // only GET methods are cached by default\n return setupCache(\n // axios instance\n axios.create(),\n {\n ttl: 5 * 60 * 1000, // default maxAge of 5 minutes\n // The storage to save the cache data. There are more available by default.\n //\n // https://axios-cache-interceptor.js.org/#/pages/storages\n storage: forageStoreAdapter,\n\n // The mechanism to generate a unique key for each request.\n //\n // https://axios-cache-interceptor.js.org/#/pages/request-id\n generateKey: defaultKeyGenerator,\n\n // The mechanism to interpret headers (when cache.interpretHeader is true).\n //\n // https://axios-cache-interceptor.js.org/#/pages/global-configuration?id=headerinterpreter\n headerInterpreter: defaultHeaderInterpreter,\n\n // The function that will receive debug information.\n // NOTE: For this to work, you need to enable development mode.\n //\n // https://axios-cache-interceptor.js.org/#/pages/development-mode\n // https://axios-cache-interceptor.js.org/#/pages/global-configuration?id=debug\n // eslint-disable-next-line no-console\n debug: console.log,\n },\n );\n}\n"],"mappings":";+CACA,qJAAAA,mBAAA,YAAAA,oBAAA,WAAAC,CAAA,SAAAC,CAAA,EAAAD,CAAA,OAAAE,CAAA,GAAAC,MAAA,CAAAC,SAAA,EAAAC,CAAA,GAAAH,CAAA,CAAAI,cAAA,EAAAC,CAAA,GAAAJ,MAAA,CAAAK,cAAA,cAAAP,CAAA,EAAAD,CAAA,EAAAE,CAAA,IAAAD,CAAA,CAAAD,CAAA,IAAAE,CAAA,CAAAO,KAAA,KAAAC,CAAA,wBAAAC,MAAA,GAAAA,MAAA,OAAAC,CAAA,GAAAF,CAAA,CAAAG,QAAA,kBAAAC,CAAA,GAAAJ,CAAA,CAAAK,aAAA,uBAAAC,CAAA,GAAAN,CAAA,CAAAO,WAAA,8BAAAC,OAAAjB,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAC,MAAA,CAAAK,cAAA,CAAAP,CAAA,EAAAD,CAAA,IAAAS,KAAA,EAAAP,CAAA,EAAAiB,UAAA,MAAAC,YAAA,MAAAC,QAAA,SAAApB,CAAA,CAAAD,CAAA,WAAAkB,MAAA,mBAAAjB,CAAA,IAAAiB,MAAA,YAAAA,OAAAjB,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAD,CAAA,CAAAD,CAAA,IAAAE,CAAA,gBAAAoB,KAAArB,CAAA,EAAAD,CAAA,EAAAE,CAAA,EAAAG,CAAA,QAAAK,CAAA,GAAAV,CAAA,IAAAA,CAAA,CAAAI,SAAA,YAAAmB,SAAA,GAAAvB,CAAA,GAAAuB,SAAA,EAAAX,CAAA,GAAAT,MAAA,CAAAqB,MAAA,CAAAd,CAAA,CAAAN,SAAA,GAAAU,CAAA,OAAAW,OAAA,CAAApB,CAAA,gBAAAE,CAAA,CAAAK,CAAA,eAAAH,KAAA,EAAAiB,gBAAA,CAAAzB,CAAA,EAAAC,CAAA,EAAAY,CAAA,MAAAF,CAAA,aAAAe,SAAA1B,CAAA,EAAAD,CAAA,EAAAE,CAAA,mBAAA0B,IAAA,YAAAC,GAAA,EAAA5B,CAAA,CAAA6B,IAAA,CAAA9B,CAAA,EAAAE,CAAA,cAAAD,CAAA,aAAA2B,IAAA,WAAAC,GAAA,EAAA5B,CAAA,QAAAD,CAAA,CAAAsB,IAAA,GAAAA,IAAA,MAAAS,CAAA,qBAAAC,CAAA,qBAAAC,CAAA,gBAAAC,CAAA,gBAAAC,CAAA,gBAAAZ,UAAA,cAAAa,kBAAA,cAAAC,2BAAA,SAAAC,CAAA,OAAApB,MAAA,CAAAoB,CAAA,EAAA1B,CAAA,qCAAA2B,CAAA,GAAApC,MAAA,CAAAqC,cAAA,EAAAC,CAAA,GAAAF,CAAA,IAAAA,CAAA,CAAAA,CAAA,CAAAG,MAAA,QAAAD,CAAA,IAAAA,CAAA,KAAAvC,CAAA,IAAAG,CAAA,CAAAyB,IAAA,CAAAW,CAAA,EAAA7B,CAAA,MAAA0B,CAAA,GAAAG,CAAA,OAAAE,CAAA,GAAAN,0BAAA,CAAAjC,SAAA,GAAAmB,SAAA,CAAAnB,SAAA,GAAAD,MAAA,CAAAqB,MAAA,CAAAc,CAAA,YAAAM,sBAAA3C,CAAA,gCAAA4C,OAAA,WAAA7C,CAAA,IAAAkB,MAAA,CAAAjB,CAAA,EAAAD,CAAA,YAAAC,CAAA,gBAAA6C,OAAA,CAAA9C,CAAA,EAAAC,CAAA,sBAAA8C,cAAA9C,CAAA,EAAAD,CAAA,aAAAgD,OAAA9C,CAAA,EAAAK,CAAA,EAAAG,CAAA,EAAAE,CAAA,QAAAE,CAAA,GAAAa,QAAA,CAAA1B,CAAA,CAAAC,CAAA,GAAAD,CAAA,EAAAM,CAAA,mBAAAO,CAAA,CAAAc,IAAA,QAAAZ,CAAA,GAAAF,CAAA,CAAAe,GAAA,EAAAE,CAAA,GAAAf,CAAA,CAAAP,KAAA,SAAAsB,CAAA,gBAAAkB,OAAA,CAAAlB,CAAA,KAAA1B,CAAA,CAAAyB,IAAA,CAAAC,CAAA,eAAA/B,CAAA,CAAAkD,OAAA,CAAAnB,CAAA,CAAAoB,OAAA,EAAAC,IAAA,WAAAnD,CAAA,IAAA+C,MAAA,SAAA/C,CAAA,EAAAS,CAAA,EAAAE,CAAA,gBAAAX,CAAA,IAAA+C,MAAA,UAAA/C,CAAA,EAAAS,CAAA,EAAAE,CAAA,QAAAZ,CAAA,CAAAkD,OAAA,CAAAnB,CAAA,EAAAqB,IAAA,WAAAnD,CAAA,IAAAe,CAAA,CAAAP,KAAA,GAAAR,CAAA,EAAAS,CAAA,CAAAM,CAAA,gBAAAf,CAAA,WAAA+C,MAAA,UAAA/C,CAAA,EAAAS,CAAA,EAAAE,CAAA,SAAAA,CAAA,CAAAE,CAAA,CAAAe,GAAA,SAAA3B,CAAA,EAAAK,CAAA,oBAAAE,KAAA,WAAAA,MAAAR,CAAA,EAAAI,CAAA,aAAAgD,2BAAA,eAAArD,CAAA,WAAAA,CAAA,EAAAE,CAAA,IAAA8C,MAAA,CAAA/C,CAAA,EAAAI,CAAA,EAAAL,CAAA,EAAAE,CAAA,gBAAAA,CAAA,GAAAA,CAAA,GAAAA,CAAA,CAAAkD,IAAA,CAAAC,0BAAA,EAAAA,0BAAA,IAAAA,0BAAA,qBAAA3B,iBAAA1B,CAAA,EAAAE,CAAA,EAAAG,CAAA,QAAAE,CAAA,GAAAwB,CAAA,mBAAArB,CAAA,EAAAE,CAAA,QAAAL,CAAA,KAAA0B,CAAA,YAAAqB,KAAA,sCAAA/C,CAAA,KAAA2B,CAAA,oBAAAxB,CAAA,QAAAE,CAAA,WAAAH,KAAA,EAAAR,CAAA,EAAAsD,IAAA,eAAAlD,CAAA,CAAAmD,MAAA,GAAA9C,CAAA,EAAAL,CAAA,CAAAwB,GAAA,GAAAjB,CAAA,UAAAE,CAAA,GAAAT,CAAA,CAAAoD,QAAA,MAAA3C,CAAA,QAAAE,CAAA,GAAA0C,mBAAA,CAAA5C,CAAA,EAAAT,CAAA,OAAAW,CAAA,QAAAA,CAAA,KAAAmB,CAAA,mBAAAnB,CAAA,qBAAAX,CAAA,CAAAmD,MAAA,EAAAnD,CAAA,CAAAsD,IAAA,GAAAtD,CAAA,CAAAuD,KAAA,GAAAvD,CAAA,CAAAwB,GAAA,sBAAAxB,CAAA,CAAAmD,MAAA,QAAAjD,CAAA,KAAAwB,CAAA,QAAAxB,CAAA,GAAA2B,CAAA,EAAA7B,CAAA,CAAAwB,GAAA,EAAAxB,CAAA,CAAAwD,iBAAA,CAAAxD,CAAA,CAAAwB,GAAA,uBAAAxB,CAAA,CAAAmD,MAAA,IAAAnD,CAAA,CAAAyD,MAAA,WAAAzD,CAAA,CAAAwB,GAAA,GAAAtB,CAAA,GAAA0B,CAAA,MAAAK,CAAA,GAAAX,QAAA,CAAA3B,CAAA,EAAAE,CAAA,EAAAG,CAAA,oBAAAiC,CAAA,CAAAV,IAAA,QAAArB,CAAA,GAAAF,CAAA,CAAAkD,IAAA,GAAArB,CAAA,GAAAF,CAAA,EAAAM,CAAA,CAAAT,GAAA,KAAAM,CAAA,qBAAA1B,KAAA,EAAA6B,CAAA,CAAAT,GAAA,EAAA0B,IAAA,EAAAlD,CAAA,CAAAkD,IAAA,kBAAAjB,CAAA,CAAAV,IAAA,KAAArB,CAAA,GAAA2B,CAAA,EAAA7B,CAAA,CAAAmD,MAAA,YAAAnD,CAAA,CAAAwB,GAAA,GAAAS,CAAA,CAAAT,GAAA,mBAAA6B,oBAAA1D,CAAA,EAAAE,CAAA,QAAAG,CAAA,GAAAH,CAAA,CAAAsD,MAAA,EAAAjD,CAAA,GAAAP,CAAA,CAAAa,QAAA,CAAAR,CAAA,OAAAE,CAAA,KAAAN,CAAA,SAAAC,CAAA,CAAAuD,QAAA,qBAAApD,CAAA,IAAAL,CAAA,CAAAa,QAAA,eAAAX,CAAA,CAAAsD,MAAA,aAAAtD,CAAA,CAAA2B,GAAA,GAAA5B,CAAA,EAAAyD,mBAAA,CAAA1D,CAAA,EAAAE,CAAA,eAAAA,CAAA,CAAAsD,MAAA,kBAAAnD,CAAA,KAAAH,CAAA,CAAAsD,MAAA,YAAAtD,CAAA,CAAA2B,GAAA,OAAAkC,SAAA,uCAAA1D,CAAA,iBAAA8B,CAAA,MAAAzB,CAAA,GAAAiB,QAAA,CAAApB,CAAA,EAAAP,CAAA,CAAAa,QAAA,EAAAX,CAAA,CAAA2B,GAAA,mBAAAnB,CAAA,CAAAkB,IAAA,SAAA1B,CAAA,CAAAsD,MAAA,YAAAtD,CAAA,CAAA2B,GAAA,GAAAnB,CAAA,CAAAmB,GAAA,EAAA3B,CAAA,CAAAuD,QAAA,SAAAtB,CAAA,MAAAvB,CAAA,GAAAF,CAAA,CAAAmB,GAAA,SAAAjB,CAAA,GAAAA,CAAA,CAAA2C,IAAA,IAAArD,CAAA,CAAAF,CAAA,CAAAgE,UAAA,IAAApD,CAAA,CAAAH,KAAA,EAAAP,CAAA,CAAA+D,IAAA,GAAAjE,CAAA,CAAAkE,OAAA,eAAAhE,CAAA,CAAAsD,MAAA,KAAAtD,CAAA,CAAAsD,MAAA,WAAAtD,CAAA,CAAA2B,GAAA,GAAA5B,CAAA,GAAAC,CAAA,CAAAuD,QAAA,SAAAtB,CAAA,IAAAvB,CAAA,IAAAV,CAAA,CAAAsD,MAAA,YAAAtD,CAAA,CAAA2B,GAAA,OAAAkC,SAAA,sCAAA7D,CAAA,CAAAuD,QAAA,SAAAtB,CAAA,cAAAgC,aAAAlE,CAAA,QAAAD,CAAA,KAAAoE,MAAA,EAAAnE,CAAA,YAAAA,CAAA,KAAAD,CAAA,CAAAqE,QAAA,GAAApE,CAAA,WAAAA,CAAA,KAAAD,CAAA,CAAAsE,UAAA,GAAArE,CAAA,KAAAD,CAAA,CAAAuE,QAAA,GAAAtE,CAAA,WAAAuE,UAAA,CAAAC,IAAA,CAAAzE,CAAA,cAAA0E,cAAAzE,CAAA,QAAAD,CAAA,GAAAC,CAAA,CAAA0E,UAAA,QAAA3E,CAAA,CAAA4B,IAAA,oBAAA5B,CAAA,CAAA6B,GAAA,EAAA5B,CAAA,CAAA0E,UAAA,GAAA3E,CAAA,aAAAyB,QAAAxB,CAAA,SAAAuE,UAAA,MAAAJ,MAAA,aAAAnE,CAAA,CAAA4C,OAAA,CAAAsB,YAAA,cAAAS,KAAA,iBAAAlC,OAAA1C,CAAA,QAAAA,CAAA,WAAAA,CAAA,QAAAE,CAAA,GAAAF,CAAA,CAAAY,CAAA,OAAAV,CAAA,SAAAA,CAAA,CAAA4B,IAAA,CAAA9B,CAAA,4BAAAA,CAAA,CAAAiE,IAAA,SAAAjE,CAAA,OAAA6E,KAAA,CAAA7E,CAAA,CAAA8E,MAAA,SAAAvE,CAAA,OAAAG,CAAA,YAAAuD,KAAA,aAAA1D,CAAA,GAAAP,CAAA,CAAA8E,MAAA,OAAAzE,CAAA,CAAAyB,IAAA,CAAA9B,CAAA,EAAAO,CAAA,UAAA0D,IAAA,CAAAxD,KAAA,GAAAT,CAAA,CAAAO,CAAA,GAAA0D,IAAA,CAAAV,IAAA,OAAAU,IAAA,SAAAA,IAAA,CAAAxD,KAAA,GAAAR,CAAA,EAAAgE,IAAA,CAAAV,IAAA,OAAAU,IAAA,YAAAvD,CAAA,CAAAuD,IAAA,GAAAvD,CAAA,gBAAAqD,SAAA,CAAAd,OAAA,CAAAjD,CAAA,kCAAAoC,iBAAA,CAAAhC,SAAA,GAAAiC,0BAAA,EAAA9B,CAAA,CAAAoC,CAAA,mBAAAlC,KAAA,EAAA4B,0BAAA,EAAAjB,YAAA,SAAAb,CAAA,CAAA8B,0BAAA,mBAAA5B,KAAA,EAAA2B,iBAAA,EAAAhB,YAAA,SAAAgB,iBAAA,CAAA2C,WAAA,GAAA7D,MAAA,CAAAmB,0BAAA,EAAArB,CAAA,wBAAAhB,CAAA,CAAAgF,mBAAA,aAAA/E,CAAA,QAAAD,CAAA,wBAAAC,CAAA,IAAAA,CAAA,CAAAgF,WAAA,WAAAjF,CAAA,KAAAA,CAAA,KAAAoC,iBAAA,6BAAApC,CAAA,CAAA+E,WAAA,IAAA/E,CAAA,CAAAkF,IAAA,OAAAlF,CAAA,CAAAmF,IAAA,aAAAlF,CAAA,WAAAE,MAAA,CAAAiF,cAAA,GAAAjF,MAAA,CAAAiF,cAAA,CAAAnF,CAAA,EAAAoC,0BAAA,KAAApC,CAAA,CAAAoF,SAAA,GAAAhD,0BAAA,EAAAnB,MAAA,CAAAjB,CAAA,EAAAe,CAAA,yBAAAf,CAAA,CAAAG,SAAA,GAAAD,MAAA,CAAAqB,MAAA,CAAAmB,CAAA,GAAA1C,CAAA,KAAAD,CAAA,CAAAsF,KAAA,aAAArF,CAAA,aAAAkD,OAAA,EAAAlD,CAAA,OAAA2C,qBAAA,CAAAG,aAAA,CAAA3C,SAAA,GAAAc,MAAA,CAAA6B,aAAA,CAAA3C,SAAA,EAAAU,CAAA,iCAAAd,CAAA,CAAA+C,aAAA,GAAAA,aAAA,EAAA/C,CAAA,CAAAuF,KAAA,aAAAtF,CAAA,EAAAC,CAAA,EAAAG,CAAA,EAAAE,CAAA,EAAAG,CAAA,eAAAA,CAAA,KAAAA,CAAA,GAAA8E,OAAA,OAAA5E,CAAA,OAAAmC,aAAA,CAAAzB,IAAA,CAAArB,CAAA,EAAAC,CAAA,EAAAG,CAAA,EAAAE,CAAA,GAAAG,CAAA,UAAAV,CAAA,CAAAgF,mBAAA,CAAA9E,CAAA,IAAAU,CAAA,GAAAA,CAAA,CAAAqD,IAAA,GAAAb,IAAA,WAAAnD,CAAA,WAAAA,CAAA,CAAAsD,IAAA,GAAAtD,CAAA,CAAAQ,KAAA,GAAAG,CAAA,CAAAqD,IAAA,WAAArB,qBAAA,CAAAD,CAAA,GAAAzB,MAAA,CAAAyB,CAAA,EAAA3B,CAAA,gBAAAE,MAAA,CAAAyB,CAAA,EAAA/B,CAAA,iCAAAM,MAAA,CAAAyB,CAAA,6DAAA3C,CAAA,CAAAyF,IAAA,aAAAxF,CAAA,QAAAD,CAAA,GAAAG,MAAA,CAAAF,CAAA,GAAAC,CAAA,gBAAAG,CAAA,IAAAL,CAAA,EAAAE,CAAA,CAAAuE,IAAA,CAAApE,CAAA,UAAAH,CAAA,CAAAwF,OAAA,aAAAzB,KAAA,WAAA/D,CAAA,CAAA4E,MAAA,SAAA7E,CAAA,GAAAC,CAAA,CAAAyF,GAAA,QAAA1F,CAAA,IAAAD,CAAA,SAAAiE,IAAA,CAAAxD,KAAA,GAAAR,CAAA,EAAAgE,IAAA,CAAAV,IAAA,OAAAU,IAAA,WAAAA,IAAA,CAAAV,IAAA,OAAAU,IAAA,QAAAjE,CAAA,CAAA0C,MAAA,GAAAA,MAAA,EAAAjB,OAAA,CAAArB,SAAA,KAAA6E,WAAA,EAAAxD,OAAA,EAAAmD,KAAA,WAAAA,MAAA5E,CAAA,aAAA4F,IAAA,WAAA3B,IAAA,WAAAN,IAAA,QAAAC,KAAA,GAAA3D,CAAA,OAAAsD,IAAA,YAAAE,QAAA,cAAAD,MAAA,gBAAA3B,GAAA,GAAA5B,CAAA,OAAAuE,UAAA,CAAA3B,OAAA,CAAA6B,aAAA,IAAA1E,CAAA,WAAAE,CAAA,kBAAAA,CAAA,CAAA2F,MAAA,OAAAxF,CAAA,CAAAyB,IAAA,OAAA5B,CAAA,MAAA2E,KAAA,EAAA3E,CAAA,CAAA4F,KAAA,cAAA5F,CAAA,IAAAD,CAAA,MAAA8F,IAAA,WAAAA,KAAA,SAAAxC,IAAA,WAAAtD,CAAA,QAAAuE,UAAA,IAAAG,UAAA,kBAAA1E,CAAA,CAAA2B,IAAA,QAAA3B,CAAA,CAAA4B,GAAA,cAAAmE,IAAA,KAAAnC,iBAAA,WAAAA,kBAAA7D,CAAA,aAAAuD,IAAA,QAAAvD,CAAA,MAAAE,CAAA,kBAAA+F,OAAA5F,CAAA,EAAAE,CAAA,WAAAK,CAAA,CAAAgB,IAAA,YAAAhB,CAAA,CAAAiB,GAAA,GAAA7B,CAAA,EAAAE,CAAA,CAAA+D,IAAA,GAAA5D,CAAA,EAAAE,CAAA,KAAAL,CAAA,CAAAsD,MAAA,WAAAtD,CAAA,CAAA2B,GAAA,GAAA5B,CAAA,KAAAM,CAAA,aAAAA,CAAA,QAAAiE,UAAA,CAAAM,MAAA,MAAAvE,CAAA,SAAAA,CAAA,QAAAG,CAAA,QAAA8D,UAAA,CAAAjE,CAAA,GAAAK,CAAA,GAAAF,CAAA,CAAAiE,UAAA,iBAAAjE,CAAA,CAAA0D,MAAA,SAAA6B,MAAA,aAAAvF,CAAA,CAAA0D,MAAA,SAAAwB,IAAA,QAAA9E,CAAA,GAAAT,CAAA,CAAAyB,IAAA,CAAApB,CAAA,eAAAM,CAAA,GAAAX,CAAA,CAAAyB,IAAA,CAAApB,CAAA,qBAAAI,CAAA,IAAAE,CAAA,aAAA4E,IAAA,GAAAlF,CAAA,CAAA2D,QAAA,SAAA4B,MAAA,CAAAvF,CAAA,CAAA2D,QAAA,gBAAAuB,IAAA,GAAAlF,CAAA,CAAA4D,UAAA,SAAA2B,MAAA,CAAAvF,CAAA,CAAA4D,UAAA,cAAAxD,CAAA,aAAA8E,IAAA,GAAAlF,CAAA,CAAA2D,QAAA,SAAA4B,MAAA,CAAAvF,CAAA,CAAA2D,QAAA,qBAAArD,CAAA,YAAAsC,KAAA,qDAAAsC,IAAA,GAAAlF,CAAA,CAAA4D,UAAA,SAAA2B,MAAA,CAAAvF,CAAA,CAAA4D,UAAA,YAAAR,MAAA,WAAAA,OAAA7D,CAAA,EAAAD,CAAA,aAAAE,CAAA,QAAAsE,UAAA,CAAAM,MAAA,MAAA5E,CAAA,SAAAA,CAAA,QAAAK,CAAA,QAAAiE,UAAA,CAAAtE,CAAA,OAAAK,CAAA,CAAA6D,MAAA,SAAAwB,IAAA,IAAAvF,CAAA,CAAAyB,IAAA,CAAAvB,CAAA,wBAAAqF,IAAA,GAAArF,CAAA,CAAA+D,UAAA,QAAA5D,CAAA,GAAAH,CAAA,aAAAG,CAAA,iBAAAT,CAAA,mBAAAA,CAAA,KAAAS,CAAA,CAAA0D,MAAA,IAAApE,CAAA,IAAAA,CAAA,IAAAU,CAAA,CAAA4D,UAAA,KAAA5D,CAAA,cAAAE,CAAA,GAAAF,CAAA,GAAAA,CAAA,CAAAiE,UAAA,cAAA/D,CAAA,CAAAgB,IAAA,GAAA3B,CAAA,EAAAW,CAAA,CAAAiB,GAAA,GAAA7B,CAAA,EAAAU,CAAA,SAAA8C,MAAA,gBAAAS,IAAA,GAAAvD,CAAA,CAAA4D,UAAA,EAAAnC,CAAA,SAAA+D,QAAA,CAAAtF,CAAA,MAAAsF,QAAA,WAAAA,SAAAjG,CAAA,EAAAD,CAAA,oBAAAC,CAAA,CAAA2B,IAAA,QAAA3B,CAAA,CAAA4B,GAAA,qBAAA5B,CAAA,CAAA2B,IAAA,mBAAA3B,CAAA,CAAA2B,IAAA,QAAAqC,IAAA,GAAAhE,CAAA,CAAA4B,GAAA,gBAAA5B,CAAA,CAAA2B,IAAA,SAAAoE,IAAA,QAAAnE,GAAA,GAAA5B,CAAA,CAAA4B,GAAA,OAAA2B,MAAA,kBAAAS,IAAA,yBAAAhE,CAAA,CAAA2B,IAAA,IAAA5B,CAAA,UAAAiE,IAAA,GAAAjE,CAAA,GAAAmC,CAAA,KAAAgE,MAAA,WAAAA,OAAAlG,CAAA,aAAAD,CAAA,QAAAwE,UAAA,CAAAM,MAAA,MAAA9E,CAAA,SAAAA,CAAA,QAAAE,CAAA,QAAAsE,UAAA,CAAAxE,CAAA,OAAAE,CAAA,CAAAoE,UAAA,KAAArE,CAAA,cAAAiG,QAAA,CAAAhG,CAAA,CAAAyE,UAAA,EAAAzE,CAAA,CAAAqE,QAAA,GAAAG,aAAA,CAAAxE,CAAA,GAAAiC,CAAA,yBAAAiE,OAAAnG,CAAA,aAAAD,CAAA,QAAAwE,UAAA,CAAAM,MAAA,MAAA9E,CAAA,SAAAA,CAAA,QAAAE,CAAA,QAAAsE,UAAA,CAAAxE,CAAA,OAAAE,CAAA,CAAAkE,MAAA,KAAAnE,CAAA,QAAAI,CAAA,GAAAH,CAAA,CAAAyE,UAAA,kBAAAtE,CAAA,CAAAuB,IAAA,QAAArB,CAAA,GAAAF,CAAA,CAAAwB,GAAA,EAAA6C,aAAA,CAAAxE,CAAA,YAAAK,CAAA,gBAAA+C,KAAA,8BAAA+C,aAAA,WAAAA,cAAArG,CAAA,EAAAE,CAAA,EAAAG,CAAA,gBAAAoD,QAAA,KAAA5C,QAAA,EAAA6B,MAAA,CAAA1C,CAAA,GAAAgE,UAAA,EAAA9D,CAAA,EAAAgE,OAAA,EAAA7D,CAAA,oBAAAmD,MAAA,UAAA3B,GAAA,GAAA5B,CAAA,GAAAkC,CAAA,OAAAnC,CAAA;AAAA,SAAAsG,mBAAAC,GAAA,EAAArD,OAAA,EAAAsD,MAAA,EAAAC,KAAA,EAAAC,MAAA,EAAAC,GAAA,EAAA9E,GAAA,cAAA+E,IAAA,GAAAL,GAAA,CAAAI,GAAA,EAAA9E,GAAA,OAAApB,KAAA,GAAAmG,IAAA,CAAAnG,KAAA,WAAAoG,KAAA,IAAAL,MAAA,CAAAK,KAAA,iBAAAD,IAAA,CAAArD,IAAA,IAAAL,OAAA,CAAAzC,KAAA,YAAA+E,OAAA,CAAAtC,OAAA,CAAAzC,KAAA,EAAA2C,IAAA,CAAAqD,KAAA,EAAAC,MAAA;AAAA,SAAAI,kBAAAC,EAAA,6BAAAC,IAAA,SAAAC,IAAA,GAAAC,SAAA,aAAA1B,OAAA,WAAAtC,OAAA,EAAAsD,MAAA,QAAAD,GAAA,GAAAQ,EAAA,CAAAI,KAAA,CAAAH,IAAA,EAAAC,IAAA,YAAAR,MAAAhG,KAAA,IAAA6F,kBAAA,CAAAC,GAAA,EAAArD,OAAA,EAAAsD,MAAA,EAAAC,KAAA,EAAAC,MAAA,UAAAjG,KAAA,cAAAiG,OAAAU,GAAA,IAAAd,kBAAA,CAAAC,GAAA,EAAArD,OAAA,EAAAsD,MAAA,EAAAC,KAAA,EAAAC,MAAA,WAAAU,GAAA,KAAAX,KAAA,CAAAY,SAAA;AADA;AACA,OAAOC,WAAW,MAAM,aAAa;AACrC,OAAOC,YAAY,MAAM,iCAAiC;AAC1D,SACEC,UAAU,EACVC,mBAAmB,EACnBC,wBAAwB,EACxBC,YAAY,QACP,yBAAyB;AAChC,OAAOC,KAAK,MAAM,OAAO;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA,wBAA8BC,cAAcA,CAAA;EAAA,OAAAC,eAAA,CAAAX,KAAA,OAAAD,SAAA;AAAA;AA4D3C,SAAAY,gBAAA;EAAAA,eAAA,GAAAhB,iBAAA,eAAA/G,mBAAA,GAAAoF,IAAA,CA5Dc,SAAA4C,SAAA;IAAA,IAAAC,WAAA,EAAAC,kBAAA;IAAA,OAAAlI,mBAAA,GAAAuB,IAAA,UAAA4G,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAAvC,IAAA,GAAAuC,SAAA,CAAAlE,IAAA;QAAA;UAAAkE,SAAA,CAAAlE,IAAA;UAAA,OAEPqD,WAAW,CAACc,YAAY,CAACb,YAAY,CAAC;QAAA;UAE5C;UACMS,WAAW,GAAGV,WAAW,CAACe,cAAc,CAAC;YAC7C;YACAC,MAAM,EAAE,CACNhB,WAAW,CAACiB,SAAS,EACrBjB,WAAW,CAACkB,YAAY,EACxBjB,YAAY,CAACkB,OAAO,CACrB;YACDvD,IAAI,EAAE;UACR,CAAC,CAAC;UAEI+C,kBAAkB,GAAGN,YAAY,CAAC;YAChCe,IAAI,WAAAA,KAAC/B,GAAG,EAAE;cAAA,OAAAG,iBAAA,eAAA/G,mBAAA,GAAAoF,IAAA,UAAAwD,QAAA;gBAAA,IAAAC,MAAA;gBAAA,OAAA7I,mBAAA,GAAAuB,IAAA,UAAAuH,SAAAC,QAAA;kBAAA,kBAAAA,QAAA,CAAAlD,IAAA,GAAAkD,QAAA,CAAA7E,IAAA;oBAAA;sBAAA6E,QAAA,CAAA7E,IAAA;sBAAA,OACO+D,WAAW,CAACe,OAAO,gBAAAC,MAAA,CAAgBrC,GAAG,CAAE,CAAC;oBAAA;sBAAxDiC,MAAM,GAAAE,QAAA,CAAAnF,IAAA;sBAAA,OAAAmF,QAAA,CAAAhF,MAAA,WACLmF,IAAI,CAACC,KAAK,CAACN,MAAM,CAAC;oBAAA;oBAAA;sBAAA,OAAAE,QAAA,CAAA/C,IAAA;kBAAA;gBAAA,GAAA4C,OAAA;cAAA;YAC3B,CAAC;YAEKQ,GAAG,WAAAA,IAACxC,GAAG,EAAElG,KAAK,EAAE;cAAA,OAAAqG,iBAAA,eAAA/G,mBAAA,GAAAoF,IAAA,UAAAiE,SAAA;gBAAA,OAAArJ,mBAAA,GAAAuB,IAAA,UAAA+H,UAAAC,SAAA;kBAAA,kBAAAA,SAAA,CAAA1D,IAAA,GAAA0D,SAAA,CAAArF,IAAA;oBAAA;sBAAAqF,SAAA,CAAArF,IAAA;sBAAA,OACd+D,WAAW,CAACuB,OAAO,gBAAAP,MAAA,CAAgBrC,GAAG,GAAIsC,IAAI,CAACO,SAAS,CAAC/I,KAAK,CAAC,CAAC;oBAAA;oBAAA;sBAAA,OAAA6I,SAAA,CAAAvD,IAAA;kBAAA;gBAAA,GAAAqD,QAAA;cAAA;YACxE,CAAC;YAEKK,MAAM,WAAAA,OAAC9C,GAAG,EAAE;cAAA,OAAAG,iBAAA,eAAA/G,mBAAA,GAAAoF,IAAA,UAAAuE,SAAA;gBAAA,OAAA3J,mBAAA,GAAAuB,IAAA,UAAAqI,UAAAC,SAAA;kBAAA,kBAAAA,SAAA,CAAAhE,IAAA,GAAAgE,SAAA,CAAA3F,IAAA;oBAAA;sBAAA2F,SAAA,CAAA3F,IAAA;sBAAA,OACV+D,WAAW,CAAC6B,UAAU,gBAAAb,MAAA,CAAgBrC,GAAG,CAAE,CAAC;oBAAA;oBAAA;sBAAA,OAAAiD,SAAA,CAAA7D,IAAA;kBAAA;gBAAA,GAAA2D,QAAA;cAAA;YACpD;UACF,CAAC,CAAC,EAEF;UAAA,OAAAvB,SAAA,CAAArE,MAAA,WACO0D,UAAU;UACf;UACAI,KAAK,CAACpG,MAAM,CAAC,CAAC,EACd;YACEsI,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;YAAE;YACpB;YACA;YACA;YACAC,OAAO,EAAE9B,kBAAkB;YAE3B;YACA;YACA;YACA+B,WAAW,EAAEvC,mBAAmB;YAEhC;YACA;YACA;YACAwC,iBAAiB,EAAEvC,wBAAwB;YAE3C;YACA;YACA;YACA;YACA;YACA;YACAwC,KAAK,EAAEC,OAAO,CAACC;UACjB,CACF,CAAC;QAAA;QAAA;UAAA,OAAAjC,SAAA,CAAApC,IAAA;MAAA;IAAA,GAAAgC,QAAA;EAAA,CACF;EAAA,OAAAD,eAAA,CAAAX,KAAA,OAAAD,SAAA;AAAA","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/MockAuthService.js b/dist/auth/MockAuthService.js new file mode 100644 index 000000000..bc02d0355 --- /dev/null +++ b/dist/auth/MockAuthService.js @@ -0,0 +1,295 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import axios from 'axios'; +import PropTypes from 'prop-types'; +import { ensureDefinedConfig } from '../utils'; +var userPropTypes = PropTypes.shape({ + userId: PropTypes.string.isRequired, + username: PropTypes.string.isRequired, + roles: PropTypes.arrayOf(PropTypes.string), + administrator: PropTypes["boolean"] +}); +var optionsPropTypes = { + config: PropTypes.shape({ + BASE_URL: PropTypes.string.isRequired, + LMS_BASE_URL: PropTypes.string.isRequired, + LOGIN_URL: PropTypes.string.isRequired, + LOGOUT_URL: PropTypes.string.isRequired, + REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired, + ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired, + CSRF_TOKEN_API_PATH: PropTypes.string.isRequired + }).isRequired, + loggingService: PropTypes.shape({ + logError: PropTypes.func.isRequired, + logInfo: PropTypes.func.isRequired + }).isRequired, + // The absence of authenticatedUser means the user is anonymous. + authenticatedUser: userPropTypes, + // Must be at least a valid user, but may have other fields. + hydratedAuthenticatedUser: userPropTypes +}; + +/** + * The MockAuthService class mocks authenticated user-fetching logic and allows for manually + * setting user data. It is compatible with axios-mock-adapter to wrap its HttpClients so that + * they can be mocked for testing. + * + * It wraps all methods of the service with Jest mock functions (jest.fn()). This allows test code + * to assert expectations on all functions of the service while preserving sensible behaviors. For + * instance, the login/logout methods related to redirecting maintain their real behavior. + * + * This service is NOT suitable for use in an application itself - only tests. It depends on Jest, + * which should only be a dev dependency of your project. You don't want to pull the entire suite + * of test dependencies into your application at runtime, probably even in your dev server. + * + * In a test where you would like to mock out API requests - perhaps from a redux-thunk function - + * you could do the following to set up a MockAuthService for your test: + * + * ``` + * import { getConfig, mergeConfig } from '@edx/frontend-platform'; + * import { configure, MockAuthService } from '@edx/frontend-platform/auth'; + * import MockAdapter from 'axios-mock-adapter'; + * + * const mockLoggingService = { + * logInfo: jest.fn(), + * logError: jest.fn(), + * }; + * mergeConfig({ + * authenticatedUser: { + * userId: 'abc123', + * username: 'Mock User', + * roles: [], + * administrator: false, + * }, + * }); + * configure(MockAuthService, { config: getConfig(), loggingService: mockLoggingService }); + * const mockAdapter = new MockAdapter(getAuthenticatedHttpClient()); + * // Mock calls for your tests. This configuration can be done in any sort of test setup. + * mockAdapter.onGet(...); + * ``` + * + * Also see the `initializeMockApp` function which also automatically uses mock services for + * Logging and Analytics. + * + * @implements {AuthService} + * @memberof module:Auth + */ +var MockAuthService = /*#__PURE__*/function () { + /** + * @param {Object} options + * @param {Object} options.config + * @param {string} options.config.BASE_URL + * @param {string} options.config.LMS_BASE_URL + * @param {string} options.config.LOGIN_URL + * @param {string} options.config.LOGOUT_URL + * @param {string} options.config.REFRESH_ACCESS_TOKEN_ENDPOINT + * @param {string} options.config.ACCESS_TOKEN_COOKIE_NAME + * @param {string} options.config.CSRF_TOKEN_API_PATH + * @param {Object} options.config.hydratedAuthenticatedUser + * @param {Object} options.config.authenticatedUser + * @param {Object} options.loggingService requires logError and logInfo methods + */ + function MockAuthService(options) { + var _this = this; + _classCallCheck(this, MockAuthService); + /** + * A Jest mock function (jest.fn()) + * + * Gets the authenticated HTTP client instance, which is an axios client wrapped in + * MockAdapter from axios-mock-adapter. + * + * @returns {HttpClient} An HttpClient wrapped in MockAdapter. + */ + _defineProperty(this, "getAuthenticatedHttpClient", jest.fn(function () { + return _this.authenticatedHttpClient; + })); + /** + * A Jest mock function (jest.fn()) + * + * Gets the unauthenticated HTTP client instance, which is an axios client wrapped in + * MockAdapter from axios-mock-adapter. + * + * @returns {HttpClient} An HttpClient wrapped in MockAdapter. + */ + _defineProperty(this, "getHttpClient", jest.fn(function () { + return _this.httpClient; + })); + /** + * A Jest mock function (jest.fn()) + * + * Builds a URL to the login page with a post-login redirect URL attached as a query parameter. + * + * ``` + * const url = getLoginRedirectUrl('http://localhost/mypage'); + * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage + * ``` + * + * @param {string} redirectUrl The URL the user should be redirected to after logging in. + */ + _defineProperty(this, "getLoginRedirectUrl", jest.fn(function () { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.config.BASE_URL; + return "".concat(_this.config.LOGIN_URL, "?next=").concat(encodeURIComponent(redirectUrl)); + })); + /** + * A Jest mock function (jest.fn()) + * + * Redirects the user to the logout page in the real implementation. Is a no-op here. + * + * @param {string} redirectUrl The URL the user should be redirected to after logging in. + */ + _defineProperty(this, "redirectToLogin", jest.fn(function () { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.config.BASE_URL; + // Do nothing after getting the URL - this preserves the calls properly, but doesn't redirect. + _this.getLoginRedirectUrl(redirectUrl); + })); + /** + * A Jest mock function (jest.fn()) + * + * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter. + * + * ``` + * const url = getLogoutRedirectUrl('http://localhost/mypage'); + * console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage + * ``` + * + * @param {string} redirectUrl The URL the user should be redirected to after logging out. + */ + _defineProperty(this, "getLogoutRedirectUrl", jest.fn(function () { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.config.BASE_URL; + return "".concat(_this.config.LOGOUT_URL, "?redirect_url=").concat(encodeURIComponent(redirectUrl)); + })); + /** + * A Jest mock function (jest.fn()) + * + * Redirects the user to the logout page in the real implementation. Is a no-op here. + * + * @param {string} redirectUrl The URL the user should be redirected to after logging out. + */ + _defineProperty(this, "redirectToLogout", jest.fn(function () { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.config.BASE_URL; + // Do nothing after getting the URL - this preserves the calls properly, but doesn't redirect. + _this.getLogoutRedirectUrl(redirectUrl); + })); + /** + * A Jest mock function (jest.fn()) + * + * If it exists, returns the user data representing the currently authenticated user. If the + * user is anonymous, returns null. + * + * @returns {UserData|null} + */ + _defineProperty(this, "getAuthenticatedUser", jest.fn(function () { + return _this.authenticatedUser; + })); + /** + * A Jest mock function (jest.fn()) + * + * Sets the authenticated user to the provided value. + * + * @param {UserData} authUser + */ + _defineProperty(this, "setAuthenticatedUser", jest.fn(function (authUser) { + _this.authenticatedUser = authUser; + })); + /** + * A Jest mock function (jest.fn()) + * + * Returns the current authenticated user details, as supplied in the `authenticatedUser` field + * of the config options. Resolves to null if the user is unauthenticated / the config option + * has not been set. + * + * @returns {UserData|null} Resolves to the user's access token if they are + * logged in. + */ + _defineProperty(this, "fetchAuthenticatedUser", jest.fn(function () { + return _this.getAuthenticatedUser(); + })); + /** + * A Jest mock function (jest.fn()) + * + * Ensures a user is authenticated. It will redirect to login when not authenticated. + * + * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not + * authenticated. + * @returns {UserData|null} Resolves to the user's access token if they are + * logged in. + */ + _defineProperty(this, "ensureAuthenticatedUser", jest.fn(function () { + var redirectUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.config.BASE_URL; + _this.fetchAuthenticatedUser(); + if (_this.getAuthenticatedUser() === null) { + // The user is not authenticated, send them to the login page. + _this.redirectToLogin(redirectUrl); + } + return _this.getAuthenticatedUser(); + })); + /** + * A Jest mock function (jest.fn()) + * + * Adds the user data supplied in the `hydratedAuthenticatedUser` config option into the object + * returned by `getAuthenticatedUser`. This emulates the behavior of a real auth service which + * would make a request to fetch this data prior to merging it in. + * + * ``` + * console.log(authenticatedUser); // Will be sparse and only contain basic information. + * await hydrateAuthenticatedUser() + * const authenticatedUser = getAuthenticatedUser(); + * console.log(authenticatedUser); // Will contain additional user information + * ``` + * + * @returns {Promise} + */ + _defineProperty(this, "hydrateAuthenticatedUser", jest.fn(function () { + var user = _this.getAuthenticatedUser(); + if (user !== null) { + _this.setAuthenticatedUser(_objectSpread(_objectSpread({}, user), _this.hydratedAuthenticatedUser)); + } + })); + this.authenticatedHttpClient = null; + this.httpClient = null; + ensureDefinedConfig(options, 'AuthService'); + PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService'); + this.config = options.config; + this.loggingService = options.loggingService; + + // Mock user + this.authenticatedUser = this.config.authenticatedUser ? this.config.authenticatedUser : null; + this.hydratedAuthenticatedUser = this.config.hydratedAuthenticatedUser ? this.config.hydratedAuthenticatedUser : {}; + this.authenticatedHttpClient = axios.create(); + this.httpClient = axios.create(); + } + + /** + * A Jest mock function (jest.fn()) + * + * Applies middleware to the axios instances in this service. + * + * @param {Array} middleware Middleware to apply. + */ + _createClass(MockAuthService, [{ + key: "applyMiddleware", + value: function applyMiddleware() { + var middleware = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var clients = [this.authenticatedHttpClient, this.httpClient, this.cachedAuthenticatedHttpClient, this.cachedHttpClient]; + try { + middleware.forEach(function (middlewareFn) { + clients.forEach(function (client) { + return client && middlewareFn(client); + }); + }); + } catch (error) { + throw new Error("Failed to apply middleware: ".concat(error.message, ".")); + } + } + }]); + return MockAuthService; +}(); +export default MockAuthService; +//# sourceMappingURL=MockAuthService.js.map \ No newline at end of file diff --git a/dist/auth/MockAuthService.js.map b/dist/auth/MockAuthService.js.map new file mode 100644 index 000000000..2e9419cf3 --- /dev/null +++ b/dist/auth/MockAuthService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MockAuthService.js","names":["axios","PropTypes","ensureDefinedConfig","userPropTypes","shape","userId","string","isRequired","username","roles","arrayOf","administrator","optionsPropTypes","config","BASE_URL","LMS_BASE_URL","LOGIN_URL","LOGOUT_URL","REFRESH_ACCESS_TOKEN_ENDPOINT","ACCESS_TOKEN_COOKIE_NAME","CSRF_TOKEN_API_PATH","loggingService","logError","func","logInfo","authenticatedUser","hydratedAuthenticatedUser","MockAuthService","options","_this","_classCallCheck","_defineProperty","jest","fn","authenticatedHttpClient","httpClient","redirectUrl","arguments","length","undefined","concat","encodeURIComponent","getLoginRedirectUrl","getLogoutRedirectUrl","authUser","getAuthenticatedUser","fetchAuthenticatedUser","redirectToLogin","user","setAuthenticatedUser","_objectSpread","checkPropTypes","create","_createClass","key","value","applyMiddleware","middleware","clients","cachedAuthenticatedHttpClient","cachedHttpClient","forEach","middlewareFn","client","error","Error","message"],"sources":["../../src/auth/MockAuthService.js"],"sourcesContent":["import axios from 'axios';\nimport PropTypes from 'prop-types';\nimport { ensureDefinedConfig } from '../utils';\n\nconst userPropTypes = PropTypes.shape({\n userId: PropTypes.string.isRequired,\n username: PropTypes.string.isRequired,\n roles: PropTypes.arrayOf(PropTypes.string),\n administrator: PropTypes.boolean,\n});\n\nconst optionsPropTypes = {\n config: PropTypes.shape({\n BASE_URL: PropTypes.string.isRequired,\n LMS_BASE_URL: PropTypes.string.isRequired,\n LOGIN_URL: PropTypes.string.isRequired,\n LOGOUT_URL: PropTypes.string.isRequired,\n REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired,\n ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired,\n CSRF_TOKEN_API_PATH: PropTypes.string.isRequired,\n }).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n // The absence of authenticatedUser means the user is anonymous.\n authenticatedUser: userPropTypes,\n // Must be at least a valid user, but may have other fields.\n hydratedAuthenticatedUser: userPropTypes,\n};\n\n/**\n * The MockAuthService class mocks authenticated user-fetching logic and allows for manually\n * setting user data. It is compatible with axios-mock-adapter to wrap its HttpClients so that\n * they can be mocked for testing.\n *\n * It wraps all methods of the service with Jest mock functions (jest.fn()). This allows test code\n * to assert expectations on all functions of the service while preserving sensible behaviors. For\n * instance, the login/logout methods related to redirecting maintain their real behavior.\n *\n * This service is NOT suitable for use in an application itself - only tests. It depends on Jest,\n * which should only be a dev dependency of your project. You don't want to pull the entire suite\n * of test dependencies into your application at runtime, probably even in your dev server.\n *\n * In a test where you would like to mock out API requests - perhaps from a redux-thunk function -\n * you could do the following to set up a MockAuthService for your test:\n *\n * ```\n * import { getConfig, mergeConfig } from '@edx/frontend-platform';\n * import { configure, MockAuthService } from '@edx/frontend-platform/auth';\n * import MockAdapter from 'axios-mock-adapter';\n *\n * const mockLoggingService = {\n * logInfo: jest.fn(),\n * logError: jest.fn(),\n * };\n * mergeConfig({\n * authenticatedUser: {\n * userId: 'abc123',\n * username: 'Mock User',\n * roles: [],\n * administrator: false,\n * },\n * });\n * configure(MockAuthService, { config: getConfig(), loggingService: mockLoggingService });\n * const mockAdapter = new MockAdapter(getAuthenticatedHttpClient());\n * // Mock calls for your tests. This configuration can be done in any sort of test setup.\n * mockAdapter.onGet(...);\n * ```\n *\n * Also see the `initializeMockApp` function which also automatically uses mock services for\n * Logging and Analytics.\n *\n * @implements {AuthService}\n * @memberof module:Auth\n */\nclass MockAuthService {\n /**\n * @param {Object} options\n * @param {Object} options.config\n * @param {string} options.config.BASE_URL\n * @param {string} options.config.LMS_BASE_URL\n * @param {string} options.config.LOGIN_URL\n * @param {string} options.config.LOGOUT_URL\n * @param {string} options.config.REFRESH_ACCESS_TOKEN_ENDPOINT\n * @param {string} options.config.ACCESS_TOKEN_COOKIE_NAME\n * @param {string} options.config.CSRF_TOKEN_API_PATH\n * @param {Object} options.config.hydratedAuthenticatedUser\n * @param {Object} options.config.authenticatedUser\n * @param {Object} options.loggingService requires logError and logInfo methods\n */\n constructor(options) {\n this.authenticatedHttpClient = null;\n this.httpClient = null;\n\n ensureDefinedConfig(options, 'AuthService');\n PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService');\n\n this.config = options.config;\n this.loggingService = options.loggingService;\n\n // Mock user\n this.authenticatedUser = this.config.authenticatedUser ? this.config.authenticatedUser : null;\n this.hydratedAuthenticatedUser = this.config.hydratedAuthenticatedUser\n ? this.config.hydratedAuthenticatedUser\n : {};\n\n this.authenticatedHttpClient = axios.create();\n this.httpClient = axios.create();\n }\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Applies middleware to the axios instances in this service.\n *\n * @param {Array} middleware Middleware to apply.\n */\n applyMiddleware(middleware = []) {\n const clients = [\n this.authenticatedHttpClient, this.httpClient,\n this.cachedAuthenticatedHttpClient, this.cachedHttpClient,\n ];\n try {\n (middleware).forEach((middlewareFn) => {\n clients.forEach((client) => client && middlewareFn(client));\n });\n } catch (error) {\n throw new Error(`Failed to apply middleware: ${error.message}.`);\n }\n }\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Gets the authenticated HTTP client instance, which is an axios client wrapped in\n * MockAdapter from axios-mock-adapter.\n *\n * @returns {HttpClient} An HttpClient wrapped in MockAdapter.\n */\n getAuthenticatedHttpClient = jest.fn(() => this.authenticatedHttpClient);\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Gets the unauthenticated HTTP client instance, which is an axios client wrapped in\n * MockAdapter from axios-mock-adapter.\n *\n * @returns {HttpClient} An HttpClient wrapped in MockAdapter.\n */\n getHttpClient = jest.fn(() => this.httpClient);\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Builds a URL to the login page with a post-login redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLoginRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n getLoginRedirectUrl = jest.fn(\n (redirectUrl = this.config.BASE_URL) => `${this.config.LOGIN_URL}?next=${encodeURIComponent(redirectUrl)}`,\n );\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Redirects the user to the logout page in the real implementation. Is a no-op here.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n redirectToLogin = jest.fn((redirectUrl = this.config.BASE_URL) => {\n // Do nothing after getting the URL - this preserves the calls properly, but doesn't redirect.\n this.getLoginRedirectUrl(redirectUrl);\n });\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLogoutRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n getLogoutRedirectUrl = jest.fn((redirectUrl = this.config.BASE_URL) => `${this.config.LOGOUT_URL}?redirect_url=${encodeURIComponent(redirectUrl)}`);\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Redirects the user to the logout page in the real implementation. Is a no-op here.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n redirectToLogout = jest.fn((redirectUrl = this.config.BASE_URL) => {\n // Do nothing after getting the URL - this preserves the calls properly, but doesn't redirect.\n this.getLogoutRedirectUrl(redirectUrl);\n });\n\n /**\n * A Jest mock function (jest.fn())\n *\n * If it exists, returns the user data representing the currently authenticated user. If the\n * user is anonymous, returns null.\n *\n * @returns {UserData|null}\n */\n getAuthenticatedUser = jest.fn(() => this.authenticatedUser);\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Sets the authenticated user to the provided value.\n *\n * @param {UserData} authUser\n */\n setAuthenticatedUser = jest.fn((authUser) => {\n this.authenticatedUser = authUser;\n });\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Returns the current authenticated user details, as supplied in the `authenticatedUser` field\n * of the config options. Resolves to null if the user is unauthenticated / the config option\n * has not been set.\n *\n * @returns {UserData|null} Resolves to the user's access token if they are\n * logged in.\n */\n fetchAuthenticatedUser = jest.fn(() => this.getAuthenticatedUser());\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Ensures a user is authenticated. It will redirect to login when not authenticated.\n *\n * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not\n * authenticated.\n * @returns {UserData|null} Resolves to the user's access token if they are\n * logged in.\n */\n ensureAuthenticatedUser = jest.fn((redirectUrl = this.config.BASE_URL) => {\n this.fetchAuthenticatedUser();\n\n if (this.getAuthenticatedUser() === null) {\n // The user is not authenticated, send them to the login page.\n this.redirectToLogin(redirectUrl);\n }\n\n return this.getAuthenticatedUser();\n });\n\n /**\n * A Jest mock function (jest.fn())\n *\n * Adds the user data supplied in the `hydratedAuthenticatedUser` config option into the object\n * returned by `getAuthenticatedUser`. This emulates the behavior of a real auth service which\n * would make a request to fetch this data prior to merging it in.\n *\n * ```\n * console.log(authenticatedUser); // Will be sparse and only contain basic information.\n * await hydrateAuthenticatedUser()\n * const authenticatedUser = getAuthenticatedUser();\n * console.log(authenticatedUser); // Will contain additional user information\n * ```\n *\n * @returns {Promise}\n */\n hydrateAuthenticatedUser = jest.fn(() => {\n const user = this.getAuthenticatedUser();\n if (user !== null) {\n this.setAuthenticatedUser({ ...user, ...this.hydratedAuthenticatedUser });\n }\n });\n}\n\nexport default MockAuthService;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/index.js b/dist/auth/index.js new file mode 100644 index 000000000..72571b207 --- /dev/null +++ b/dist/auth/index.js @@ -0,0 +1,4 @@ +export { AUTHENTICATED_USER_TOPIC, AUTHENTICATED_USER_CHANGED, configure, getAuthenticatedHttpClient, getAuthService, getHttpClient, getLoginRedirectUrl, redirectToLogin, getLogoutRedirectUrl, redirectToLogout, getAuthenticatedUser, setAuthenticatedUser, fetchAuthenticatedUser, ensureAuthenticatedUser, hydrateAuthenticatedUser } from './interface'; +export { default as AxiosJwtAuthService } from './AxiosJwtAuthService'; +export { default as MockAuthService } from './MockAuthService'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/auth/index.js.map b/dist/auth/index.js.map new file mode 100644 index 000000000..d8d49410b --- /dev/null +++ b/dist/auth/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","names":["AUTHENTICATED_USER_TOPIC","AUTHENTICATED_USER_CHANGED","configure","getAuthenticatedHttpClient","getAuthService","getHttpClient","getLoginRedirectUrl","redirectToLogin","getLogoutRedirectUrl","redirectToLogout","getAuthenticatedUser","setAuthenticatedUser","fetchAuthenticatedUser","ensureAuthenticatedUser","hydrateAuthenticatedUser","default","AxiosJwtAuthService","MockAuthService"],"sources":["../../src/auth/index.js"],"sourcesContent":["export {\n AUTHENTICATED_USER_TOPIC,\n AUTHENTICATED_USER_CHANGED,\n configure,\n getAuthenticatedHttpClient,\n getAuthService,\n getHttpClient,\n getLoginRedirectUrl,\n redirectToLogin,\n getLogoutRedirectUrl,\n redirectToLogout,\n getAuthenticatedUser,\n setAuthenticatedUser,\n fetchAuthenticatedUser,\n ensureAuthenticatedUser,\n hydrateAuthenticatedUser,\n} from './interface';\nexport { default as AxiosJwtAuthService } from './AxiosJwtAuthService';\nexport { default as MockAuthService } from './MockAuthService';\n"],"mappings":"AAAA,SACEA,wBAAwB,EACxBC,0BAA0B,EAC1BC,SAAS,EACTC,0BAA0B,EAC1BC,cAAc,EACdC,aAAa,EACbC,mBAAmB,EACnBC,eAAe,EACfC,oBAAoB,EACpBC,gBAAgB,EAChBC,oBAAoB,EACpBC,oBAAoB,EACpBC,sBAAsB,EACtBC,uBAAuB,EACvBC,wBAAwB,QACnB,aAAa;AACpB,SAASC,OAAO,IAAIC,mBAAmB,QAAQ,uBAAuB;AACtE,SAASD,OAAO,IAAIE,eAAe,QAAQ,mBAAmB","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/interceptors/createCsrfTokenProviderInterceptor.js b/dist/auth/interceptors/createCsrfTokenProviderInterceptor.js new file mode 100644 index 000000000..1f799cdb0 --- /dev/null +++ b/dist/auth/interceptors/createCsrfTokenProviderInterceptor.js @@ -0,0 +1,57 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +var createCsrfTokenProviderInterceptor = function createCsrfTokenProviderInterceptor(options) { + var csrfTokenService = options.csrfTokenService, + CSRF_TOKEN_API_PATH = options.CSRF_TOKEN_API_PATH, + shouldSkip = options.shouldSkip; + + // Creating the interceptor inside this closure to + // maintain reference to the options supplied. + var interceptor = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(axiosRequestConfig) { + var url, csrfToken, requestError, CSRF_HEADER_NAME; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!shouldSkip(axiosRequestConfig)) { + _context.next = 2; + break; + } + return _context.abrupt("return", axiosRequestConfig); + case 2: + url = axiosRequestConfig.url; + _context.prev = 3; + _context.next = 6; + return csrfTokenService.getCsrfToken(url, CSRF_TOKEN_API_PATH); + case 6: + csrfToken = _context.sent; + _context.next = 15; + break; + case 9: + _context.prev = 9; + _context.t0 = _context["catch"](3); + requestError = Object.create(_context.t0); + requestError.message = "[getCsrfToken] ".concat(requestError.message); + // Important: return the original axios request config + requestError.config = axiosRequestConfig; + return _context.abrupt("return", Promise.reject(requestError)); + case 15: + CSRF_HEADER_NAME = 'X-CSRFToken'; // eslint-disable-next-line no-param-reassign + axiosRequestConfig.headers[CSRF_HEADER_NAME] = csrfToken; + return _context.abrupt("return", axiosRequestConfig); + case 18: + case "end": + return _context.stop(); + } + }, _callee, null, [[3, 9]]); + })); + return function interceptor(_x) { + return _ref.apply(this, arguments); + }; + }(); + return interceptor; +}; +export default createCsrfTokenProviderInterceptor; +//# sourceMappingURL=createCsrfTokenProviderInterceptor.js.map \ No newline at end of file diff --git a/dist/auth/interceptors/createCsrfTokenProviderInterceptor.js.map b/dist/auth/interceptors/createCsrfTokenProviderInterceptor.js.map new file mode 100644 index 000000000..dcb268f47 --- /dev/null +++ b/dist/auth/interceptors/createCsrfTokenProviderInterceptor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createCsrfTokenProviderInterceptor.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","createCsrfTokenProviderInterceptor","options","csrfTokenService","CSRF_TOKEN_API_PATH","shouldSkip","interceptor","_ref","_callee","axiosRequestConfig","url","csrfToken","requestError","CSRF_HEADER_NAME","_callee$","_context","getCsrfToken","t0","message","concat","config","headers","_x"],"sources":["../../../src/auth/interceptors/createCsrfTokenProviderInterceptor.js"],"sourcesContent":["const createCsrfTokenProviderInterceptor = (options) => {\n const { csrfTokenService, CSRF_TOKEN_API_PATH, shouldSkip } = options;\n\n // Creating the interceptor inside this closure to\n // maintain reference to the options supplied.\n const interceptor = async (axiosRequestConfig) => {\n if (shouldSkip(axiosRequestConfig)) {\n return axiosRequestConfig;\n }\n const { url } = axiosRequestConfig;\n let csrfToken;\n\n // Important: the job of this interceptor is to get a csrf token and update\n // the original request configuration. Errors thrown getting the csrf token\n // should contain the original request config. This allows other interceptors\n // (namely our retry request interceptor below) to access the original request\n // and handle it appropriately\n try {\n csrfToken = await csrfTokenService.getCsrfToken(url, CSRF_TOKEN_API_PATH);\n } catch (error) {\n const requestError = Object.create(error);\n requestError.message = `[getCsrfToken] ${requestError.message}`;\n // Important: return the original axios request config\n requestError.config = axiosRequestConfig;\n return Promise.reject(requestError);\n }\n\n const CSRF_HEADER_NAME = 'X-CSRFToken';\n // eslint-disable-next-line no-param-reassign\n axiosRequestConfig.headers[CSRF_HEADER_NAME] = csrfToken;\n return axiosRequestConfig;\n };\n\n return interceptor;\n};\n\nexport default createCsrfTokenProviderInterceptor;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/interceptors/createJwtTokenProviderInterceptor.js b/dist/auth/interceptors/createJwtTokenProviderInterceptor.js new file mode 100644 index 000000000..247151c3f --- /dev/null +++ b/dist/auth/interceptors/createJwtTokenProviderInterceptor.js @@ -0,0 +1,55 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +var createJwtTokenProviderInterceptor = function createJwtTokenProviderInterceptor(options) { + var jwtTokenService = options.jwtTokenService, + shouldSkip = options.shouldSkip; + + // Creating the interceptor inside this closure to + // maintain reference to the options supplied. + var interceptor = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(axiosRequestConfig) { + var requestError; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!shouldSkip(axiosRequestConfig)) { + _context.next = 2; + break; + } + return _context.abrupt("return", axiosRequestConfig); + case 2: + _context.prev = 2; + _context.next = 5; + return jwtTokenService.getJwtToken(); + case 5: + _context.next = 13; + break; + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](2); + requestError = Object.create(_context.t0); + requestError.message = "[getJwtToken] ".concat(requestError.message); + // Important: return the original axios request config + requestError.config = axiosRequestConfig; + return _context.abrupt("return", Promise.reject(requestError)); + case 13: + // Add the proper headers to tell the server to look for the jwt cookie + // eslint-disable-next-line no-param-reassign + axiosRequestConfig.headers.common['USE-JWT-COOKIE'] = true; + return _context.abrupt("return", axiosRequestConfig); + case 15: + case "end": + return _context.stop(); + } + }, _callee, null, [[2, 7]]); + })); + return function interceptor(_x) { + return _ref.apply(this, arguments); + }; + }(); + return interceptor; +}; +export default createJwtTokenProviderInterceptor; +//# sourceMappingURL=createJwtTokenProviderInterceptor.js.map \ No newline at end of file diff --git a/dist/auth/interceptors/createJwtTokenProviderInterceptor.js.map b/dist/auth/interceptors/createJwtTokenProviderInterceptor.js.map new file mode 100644 index 000000000..c65e8d6a0 --- /dev/null +++ b/dist/auth/interceptors/createJwtTokenProviderInterceptor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createJwtTokenProviderInterceptor.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","createJwtTokenProviderInterceptor","options","jwtTokenService","shouldSkip","interceptor","_ref","_callee","axiosRequestConfig","requestError","_callee$","_context","getJwtToken","t0","message","concat","config","headers","common","_x"],"sources":["../../../src/auth/interceptors/createJwtTokenProviderInterceptor.js"],"sourcesContent":["const createJwtTokenProviderInterceptor = (options) => {\n const {\n jwtTokenService,\n shouldSkip,\n } = options;\n\n // Creating the interceptor inside this closure to\n // maintain reference to the options supplied.\n const interceptor = async (axiosRequestConfig) => {\n if (shouldSkip(axiosRequestConfig)) {\n return axiosRequestConfig;\n }\n\n // Important: the job of this interceptor is to refresh a jwt token and update\n // the original request configuration. Errors thrown from fetching the jwt\n // should contain the original request config. This allows other interceptors\n // (namely our retry request interceptor below) to access the original request\n // and handle it appropriately\n try {\n await jwtTokenService.getJwtToken();\n } catch (error) {\n const requestError = Object.create(error);\n requestError.message = `[getJwtToken] ${requestError.message}`;\n // Important: return the original axios request config\n requestError.config = axiosRequestConfig;\n return Promise.reject(requestError);\n }\n\n // Add the proper headers to tell the server to look for the jwt cookie\n // eslint-disable-next-line no-param-reassign\n axiosRequestConfig.headers.common['USE-JWT-COOKIE'] = true;\n return axiosRequestConfig;\n };\n\n return interceptor;\n};\n\nexport default createJwtTokenProviderInterceptor;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js b/dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js new file mode 100644 index 000000000..a492f4aa4 --- /dev/null +++ b/dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js @@ -0,0 +1,36 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +import { processAxiosError } from '../utils'; +var createProcessAxiosRequestErrorInterceptor = function createProcessAxiosRequestErrorInterceptor(options) { + var loggingService = options.loggingService; + + // Creating the interceptor inside this closure to + // maintain reference to the options supplied. + var interceptor = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(error) { + var processedError, httpErrorStatus; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + processedError = processAxiosError(error); + httpErrorStatus = processedError.customAttributes.httpErrorStatus; + if (httpErrorStatus === 401 || httpErrorStatus === 403) { + loggingService.logInfo(processedError.message, processedError.customAttributes); + } + return _context.abrupt("return", Promise.reject(processedError)); + case 4: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function interceptor(_x) { + return _ref.apply(this, arguments); + }; + }(); + return interceptor; +}; +export default createProcessAxiosRequestErrorInterceptor; +//# sourceMappingURL=createProcessAxiosRequestErrorInterceptor.js.map \ No newline at end of file diff --git a/dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js.map b/dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js.map new file mode 100644 index 000000000..d7b418d8b --- /dev/null +++ b/dist/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createProcessAxiosRequestErrorInterceptor.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","processAxiosError","createProcessAxiosRequestErrorInterceptor","options","loggingService","interceptor","_ref","_callee","processedError","httpErrorStatus","_callee$","_context","customAttributes","logInfo","message","_x"],"sources":["../../../src/auth/interceptors/createProcessAxiosRequestErrorInterceptor.js"],"sourcesContent":["import { processAxiosError } from '../utils';\n\nconst createProcessAxiosRequestErrorInterceptor = (options) => {\n const { loggingService } = options;\n\n // Creating the interceptor inside this closure to\n // maintain reference to the options supplied.\n const interceptor = async (error) => {\n const processedError = processAxiosError(error);\n const { httpErrorStatus } = processedError.customAttributes;\n if (httpErrorStatus === 401 || httpErrorStatus === 403) {\n loggingService.logInfo(processedError.message, processedError.customAttributes);\n }\n return Promise.reject(processedError);\n };\n\n return interceptor;\n};\n\nexport default createProcessAxiosRequestErrorInterceptor;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/interceptors/createRetryInterceptor.js b/dist/auth/interceptors/createRetryInterceptor.js new file mode 100644 index 000000000..ade6d5748 --- /dev/null +++ b/dist/auth/interceptors/createRetryInterceptor.js @@ -0,0 +1,108 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +import axios from 'axios'; + +// This default algorithm is a recreation of what is documented here +// https://cloud.google.com/storage/docs/exponential-backoff +var defaultGetBackoffMilliseconds = function defaultGetBackoffMilliseconds(nthRetry) { + var maximumBackoffMilliseconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 16000; + // Retry at exponential intervals (2, 4, 8, 16...) + var exponentialBackoffSeconds = Math.pow(2, nthRetry); + // Add some randomness to avoid sending retries from separate requests all at once + var randomFractionOfASecond = Math.random(); + var backoffSeconds = exponentialBackoffSeconds + randomFractionOfASecond; + var backoffMilliseconds = Math.round(backoffSeconds * 1000); + return Math.min(backoffMilliseconds, maximumBackoffMilliseconds); +}; +var createRetryInterceptor = function createRetryInterceptor() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var _options$httpClient = options.httpClient, + httpClient = _options$httpClient === void 0 ? axios.create() : _options$httpClient, + _options$getBackoffMi = options.getBackoffMilliseconds, + getBackoffMilliseconds = _options$getBackoffMi === void 0 ? defaultGetBackoffMilliseconds : _options$getBackoffMi, + _options$shouldRetry = options.shouldRetry, + shouldRetry = _options$shouldRetry === void 0 ? function (error) { + var isRequestError = !error.response && error.config; + return isRequestError; + } : _options$shouldRetry, + _options$defaultMaxRe = options.defaultMaxRetries, + defaultMaxRetries = _options$defaultMaxRe === void 0 ? 2 : _options$defaultMaxRe; + var interceptor = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(error) { + var config, _config$maxRetries, maxRetries, retryRequest; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + config = error.config; // If no config exists there was some other error setting up the request + if (config) { + _context2.next = 3; + break; + } + return _context2.abrupt("return", Promise.reject(error)); + case 3: + if (shouldRetry(error)) { + _context2.next = 5; + break; + } + return _context2.abrupt("return", Promise.reject(error)); + case 5: + _config$maxRetries = config.maxRetries, maxRetries = _config$maxRetries === void 0 ? defaultMaxRetries : _config$maxRetries; + retryRequest = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(nthRetry) { + var retryResponse, backoffDelay; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!(nthRetry > maxRetries)) { + _context.next = 2; + break; + } + return _context.abrupt("return", Promise.reject(error)); + case 2: + _context.prev = 2; + backoffDelay = getBackoffMilliseconds(nthRetry); // Delay (wrapped in a promise so we can await the setTimeout) + _context.next = 6; + return new Promise(function (resolve) { + setTimeout(resolve, backoffDelay); + }); + case 6: + _context.next = 8; + return httpClient.request(config); + case 8: + retryResponse = _context.sent; + _context.next = 14; + break; + case 11: + _context.prev = 11; + _context.t0 = _context["catch"](2); + return _context.abrupt("return", retryRequest(nthRetry + 1)); + case 14: + return _context.abrupt("return", retryResponse); + case 15: + case "end": + return _context.stop(); + } + }, _callee, null, [[2, 11]]); + })); + return function retryRequest(_x2) { + return _ref2.apply(this, arguments); + }; + }(); + return _context2.abrupt("return", retryRequest(1)); + case 8: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function interceptor(_x) { + return _ref.apply(this, arguments); + }; + }(); + return interceptor; +}; +export default createRetryInterceptor; +export { defaultGetBackoffMilliseconds }; +//# sourceMappingURL=createRetryInterceptor.js.map \ No newline at end of file diff --git a/dist/auth/interceptors/createRetryInterceptor.js.map b/dist/auth/interceptors/createRetryInterceptor.js.map new file mode 100644 index 000000000..3c2364c4a --- /dev/null +++ b/dist/auth/interceptors/createRetryInterceptor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createRetryInterceptor.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","axios","defaultGetBackoffMilliseconds","nthRetry","maximumBackoffMilliseconds","exponentialBackoffSeconds","Math","pow","randomFractionOfASecond","random","backoffSeconds","backoffMilliseconds","round","min","createRetryInterceptor","options","_options$httpClient","httpClient","_options$getBackoffMi","getBackoffMilliseconds","_options$shouldRetry","shouldRetry","isRequestError","response","config","_options$defaultMaxRe","defaultMaxRetries","interceptor","_ref","_callee2","_config$maxRetries","maxRetries","retryRequest","_callee2$","_context2","_ref2","_callee","retryResponse","backoffDelay","_callee$","_context","setTimeout","request","t0","_x2","_x"],"sources":["../../../src/auth/interceptors/createRetryInterceptor.js"],"sourcesContent":["import axios from 'axios';\n\n// This default algorithm is a recreation of what is documented here\n// https://cloud.google.com/storage/docs/exponential-backoff\nconst defaultGetBackoffMilliseconds = (nthRetry, maximumBackoffMilliseconds = 16000) => {\n // Retry at exponential intervals (2, 4, 8, 16...)\n const exponentialBackoffSeconds = 2 ** nthRetry;\n // Add some randomness to avoid sending retries from separate requests all at once\n const randomFractionOfASecond = Math.random();\n const backoffSeconds = exponentialBackoffSeconds + randomFractionOfASecond;\n const backoffMilliseconds = Math.round(backoffSeconds * 1000);\n return Math.min(backoffMilliseconds, maximumBackoffMilliseconds);\n};\n\nconst createRetryInterceptor = (options = {}) => {\n const {\n httpClient = axios.create(),\n getBackoffMilliseconds = defaultGetBackoffMilliseconds,\n // By default only retry outbound request failures (not responses)\n shouldRetry = (error) => {\n const isRequestError = !error.response && error.config;\n return isRequestError;\n },\n // A per-request maxRetries can be specified in request config.\n defaultMaxRetries = 2,\n } = options;\n\n const interceptor = async (error) => {\n const { config } = error;\n\n // If no config exists there was some other error setting up the request\n if (!config) {\n return Promise.reject(error);\n }\n\n if (!shouldRetry(error)) {\n return Promise.reject(error);\n }\n\n const {\n maxRetries = defaultMaxRetries,\n } = config;\n\n const retryRequest = async (nthRetry) => {\n if (nthRetry > maxRetries) {\n // Reject with the original error\n return Promise.reject(error);\n }\n\n let retryResponse;\n\n try {\n const backoffDelay = getBackoffMilliseconds(nthRetry);\n // Delay (wrapped in a promise so we can await the setTimeout)\n await new Promise(resolve => { setTimeout(resolve, backoffDelay); });\n // Make retry request\n retryResponse = await httpClient.request(config);\n } catch (e) {\n return retryRequest(nthRetry + 1);\n }\n\n return retryResponse;\n };\n\n return retryRequest(1);\n };\n\n return interceptor;\n};\n\nexport default createRetryInterceptor;\nexport { defaultGetBackoffMilliseconds };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/interface.js b/dist/auth/interface.js new file mode 100644 index 000000000..e158ded96 --- /dev/null +++ b/dist/auth/interface.js @@ -0,0 +1,359 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +/** + * #### Import members from **@edx/frontend-platform/auth** + * + * Simplifies the process of making authenticated API requests to backend edX services by providing + * common authN/authZ client code that enables the login/logout flow and handles ensuring the + * presence of a valid [JWT cookie](https://github.com/openedx/edx-platform/blob/master/openedx/core/djangoapps/oauth_dispatch/docs/decisions/0009-jwt-in-session-cookie.rst). + * + * The `initialize` function performs much of the auth configuration for you. If, however, you're + * not using the `initialize` function, an authenticated API client can be created via: + * + * ``` + * import { + * configure, + * fetchAuthenticatedUser, + * getAuthenticatedHttpClient + * } from '@edx/frontend-platform/auth'; + * import { getConfig } from '@edx/frontend-platform'; + * import { getLoggingService } from '@edx/frontend-platform/logging'; + * + * configure({ + * loggingService: getLoggingService(), + * config: getConfig(), + * }); + * + * const authenticatedUser = await fetchAuthenticatedUser(); // validates and decodes JWT token + * const authenticatedHttpClient = getAuthenticatedHttpClient(); + * const response = await getAuthenticatedHttpClient().get(`https://example.com/api/user/data/${authenticatedUser.username}`); // fetching from an authenticated API using user data + * ``` + * + * As shown in this example, auth depends on the configuration document and logging. + * + * NOTE: The documentation for AxiosJwtAuthService is nearly the same as that for the top-level + * auth interface, except that it contains some Axios-specific details. + * + * @module Auth + */ +import PropTypes from 'prop-types'; +import { publish } from '../pubSub'; + +/** + * @constant + * @private + */ +export var AUTHENTICATED_USER_TOPIC = 'AUTHENTICATED_USER'; + +/** + * Published when the authenticated user data changes. This can happen when the authentication + * service determines that the user is authenticated or anonymous, as well as when we fetch + * additional user account data if the `hydrateAuthenticatedUser` flag has been set in the + * `initialize` function. + * + * @event + * @see {@link module:Initialization~initialize} + */ +export var AUTHENTICATED_USER_CHANGED = "".concat(AUTHENTICATED_USER_TOPIC, ".CHANGED"); +var optionsShape = { + config: PropTypes.shape({ + BASE_URL: PropTypes.string.isRequired, + LMS_BASE_URL: PropTypes.string.isRequired, + LOGIN_URL: PropTypes.string.isRequired, + LOGOUT_URL: PropTypes.string.isRequired, + REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired, + ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired, + CSRF_TOKEN_API_PATH: PropTypes.string.isRequired + }).isRequired, + loggingService: PropTypes.shape({ + logError: PropTypes.func.isRequired, + logInfo: PropTypes.func.isRequired + }).isRequired +}; +var serviceShape = { + getAuthenticatedHttpClient: PropTypes.func.isRequired, + getHttpClient: PropTypes.func.isRequired, + getLoginRedirectUrl: PropTypes.func.isRequired, + redirectToLogin: PropTypes.func.isRequired, + getLogoutRedirectUrl: PropTypes.func.isRequired, + redirectToLogout: PropTypes.func.isRequired, + getAuthenticatedUser: PropTypes.func.isRequired, + setAuthenticatedUser: PropTypes.func.isRequired, + fetchAuthenticatedUser: PropTypes.func.isRequired, + ensureAuthenticatedUser: PropTypes.func.isRequired, + hydrateAuthenticatedUser: PropTypes.func.isRequired +}; +var service; + +/** + * + * @param {class} AuthService + * @param {*} options + * @returns {AuthService} + */ +export function configure(AuthService, options) { + PropTypes.checkPropTypes(optionsShape, options, 'property', 'Auth'); + service = new AuthService(options); + PropTypes.checkPropTypes(serviceShape, service, 'property', 'AuthService'); + return service; +} + +/** + * + * + * @returns {AuthService} + */ +export function getAuthService() { + if (!service) { + throw Error('You must first configure the auth service.'); + } + return service; +} + +/** + * + */ +export function resetAuthService() { + service = null; +} + +/** + * Gets the authenticated HTTP client for the service. + * + * @param {Object} [options] Optional options for how to configure the authenticated HTTP client + * @param {boolean} [options.useCache] Whether to use front end caching for all requests made with the returned client + * + * @returns {HttpClient} + */ +export function getAuthenticatedHttpClient() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return service.getAuthenticatedHttpClient(options); +} + +/** + * Gets the unauthenticated HTTP client for the service. + * + * @param {Object} [options] Optional options for how to configure the authenticated HTTP client + * @param {boolean} [options.useCache] Whether to use front end caching for all requests made with the returned client + * + * @returns {HttpClient} + */ +export function getHttpClient() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return service.getHttpClient(options); +} + +/** + * Builds a URL to the login page with a post-login redirect URL attached as a query parameter. + * + * ``` + * const url = getLoginRedirectUrl('http://localhost/mypage'); + * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage + * ``` + * + * @param {string} redirectUrl The URL the user should be redirected to after logging in. + */ +export function getLoginRedirectUrl(redirectUrl) { + return service.getLoginRedirectUrl(redirectUrl); +} + +/** + * Redirects the user to the login page. + * + * @param {string} redirectUrl The URL the user should be redirected to after logging in. + */ +export function redirectToLogin(redirectUrl) { + return service.redirectToLogin(redirectUrl); +} + +/** + * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter. + * + * ``` + * const url = getLogoutRedirectUrl('http://localhost/mypage'); + * console.log(url); // http://localhost/logout?redirect_url=http%3A%2F%2Flocalhost%2Fmypage + * ``` + * + * @param {string} redirectUrl The URL the user should be redirected to after logging out. + */ +export function getLogoutRedirectUrl(redirectUrl) { + return service.getLogoutRedirectUrl(redirectUrl); +} + +/** + * Redirects the user to the logout page. + * + * @param {string} redirectUrl The URL the user should be redirected to after logging out. + */ +export function redirectToLogout(redirectUrl) { + return service.redirectToLogout(redirectUrl); +} + +/** + * If it exists, returns the user data representing the currently authenticated user. If the + * user is anonymous, returns null. + * + * @returns {UserData|null} + */ +export function getAuthenticatedUser() { + return service.getAuthenticatedUser(); +} + +/** + * Sets the authenticated user to the provided value. + * + * @param {UserData} authUser + * @emits AUTHENTICATED_USER_CHANGED + */ +export function setAuthenticatedUser(authUser) { + service.setAuthenticatedUser(authUser); + publish(AUTHENTICATED_USER_CHANGED); +} + +/** + * Reads the authenticated user's access token. Resolves to null if the user is + * unauthenticated. + * + * @returns {Promise|Promise} Resolves to the user's access token if they are + * logged in. + */ +export function fetchAuthenticatedUser() { + return _fetchAuthenticatedUser.apply(this, arguments); +} + +/** + * Ensures a user is authenticated. It will redirect to login when not + * authenticated. + * + * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not + * authenticated. + * @returns {Promise} + */ +function _fetchAuthenticatedUser() { + _fetchAuthenticatedUser = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var options, + _args = arguments; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + options = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}; + return _context.abrupt("return", service.fetchAuthenticatedUser(options)); + case 2: + case "end": + return _context.stop(); + } + }, _callee); + })); + return _fetchAuthenticatedUser.apply(this, arguments); +} +export function ensureAuthenticatedUser(_x) { + return _ensureAuthenticatedUser.apply(this, arguments); +} + +/** + * Fetches additional user account information for the authenticated user and merges it into the + * existing authenticatedUser object, available via getAuthenticatedUser(). + * + * ``` + * console.log(authenticatedUser); // Will be sparse and only contain basic information. + * await hydrateAuthenticatedUser() + * const authenticatedUser = getAuthenticatedUser(); + * console.log(authenticatedUser); // Will contain additional user information + * ``` + * + * @emits AUTHENTICATED_USER_CHANGED + */ +function _ensureAuthenticatedUser() { + _ensureAuthenticatedUser = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(redirectUrl) { + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + return _context2.abrupt("return", service.ensureAuthenticatedUser(redirectUrl)); + case 1: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return _ensureAuthenticatedUser.apply(this, arguments); +} +export function hydrateAuthenticatedUser() { + return _hydrateAuthenticatedUser.apply(this, arguments); +} + +/** + * @name AuthService + * @interface + * @memberof module:Auth + * @property {function} getAuthenticatedHttpClient + * @property {function} getHttpClient + * @property {function} getLoginRedirectUrl + * @property {function} redirectToLogin + * @property {function} getLogoutRedirectUrl + * @property {function} redirectToLogout + * @property {function} getAuthenticatedUser + * @property {function} setAuthenticatedUser + * @property {function} fetchAuthenticatedUser + * @property {function} ensureAuthenticatedUser + * @property {function} hydrateAuthenticatedUser + */ + +/** + * A configured axios client. See axios docs for more + * info https://github.com/axios/axios. All the functions + * below accept isPublic and isCsrfExempt in the request + * config options. Setting these to true will prevent this + * client from attempting to refresh the jwt access token + * or a csrf token respectively. + * + * ``` + * // A public endpoint (no jwt token refresh) + * apiClient.get('/path/to/endpoint', { isPublic: true }); + * ``` + * + * ``` + * // A csrf exempt endpoint + * apiClient.post('/path/to/endpoint', { data }, { isCsrfExempt: true }); + * ``` + * + * @name HttpClient + * @interface + * @memberof module:Auth + * @property {function} get + * @property {function} head + * @property {function} options + * @property {function} delete (csrf protected) + * @property {function} post (csrf protected) + * @property {function} put (csrf protected) + * @property {function} patch (csrf protected) + */ + +/** + * @name UserData + * @interface + * @memberof module:Auth + * @property {string} userId + * @property {string} username + * @property {Array} roles + * @property {boolean} administrator + */ +function _hydrateAuthenticatedUser() { + _hydrateAuthenticatedUser = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return service.hydrateAuthenticatedUser(); + case 2: + publish(AUTHENTICATED_USER_CHANGED); + case 3: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return _hydrateAuthenticatedUser.apply(this, arguments); +} +//# sourceMappingURL=interface.js.map \ No newline at end of file diff --git a/dist/auth/interface.js.map b/dist/auth/interface.js.map new file mode 100644 index 000000000..641c4dbd4 --- /dev/null +++ b/dist/auth/interface.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interface.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","PropTypes","publish","AUTHENTICATED_USER_TOPIC","AUTHENTICATED_USER_CHANGED","concat","optionsShape","config","shape","BASE_URL","string","isRequired","LMS_BASE_URL","LOGIN_URL","LOGOUT_URL","REFRESH_ACCESS_TOKEN_ENDPOINT","ACCESS_TOKEN_COOKIE_NAME","CSRF_TOKEN_API_PATH","loggingService","logError","func","logInfo","serviceShape","getAuthenticatedHttpClient","getHttpClient","getLoginRedirectUrl","redirectToLogin","getLogoutRedirectUrl","redirectToLogout","getAuthenticatedUser","setAuthenticatedUser","fetchAuthenticatedUser","ensureAuthenticatedUser","hydrateAuthenticatedUser","service","configure","AuthService","options","checkPropTypes","getAuthService","resetAuthService","redirectUrl","authUser","_fetchAuthenticatedUser","_callee","_args","_callee$","_context","_x","_ensureAuthenticatedUser","_callee2","_callee2$","_context2","_hydrateAuthenticatedUser","_callee3","_callee3$","_context3"],"sources":["../../src/auth/interface.js"],"sourcesContent":["/**\n * #### Import members from **@edx/frontend-platform/auth**\n *\n * Simplifies the process of making authenticated API requests to backend edX services by providing\n * common authN/authZ client code that enables the login/logout flow and handles ensuring the\n * presence of a valid [JWT cookie](https://github.com/openedx/edx-platform/blob/master/openedx/core/djangoapps/oauth_dispatch/docs/decisions/0009-jwt-in-session-cookie.rst).\n *\n * The `initialize` function performs much of the auth configuration for you. If, however, you're\n * not using the `initialize` function, an authenticated API client can be created via:\n *\n * ```\n * import {\n * configure,\n * fetchAuthenticatedUser,\n * getAuthenticatedHttpClient\n * } from '@edx/frontend-platform/auth';\n * import { getConfig } from '@edx/frontend-platform';\n * import { getLoggingService } from '@edx/frontend-platform/logging';\n *\n * configure({\n * loggingService: getLoggingService(),\n * config: getConfig(),\n * });\n *\n * const authenticatedUser = await fetchAuthenticatedUser(); // validates and decodes JWT token\n * const authenticatedHttpClient = getAuthenticatedHttpClient();\n * const response = await getAuthenticatedHttpClient().get(`https://example.com/api/user/data/${authenticatedUser.username}`); // fetching from an authenticated API using user data\n * ```\n *\n * As shown in this example, auth depends on the configuration document and logging.\n *\n * NOTE: The documentation for AxiosJwtAuthService is nearly the same as that for the top-level\n * auth interface, except that it contains some Axios-specific details.\n *\n * @module Auth\n */\nimport PropTypes from 'prop-types';\nimport { publish } from '../pubSub';\n\n/**\n * @constant\n * @private\n */\nexport const AUTHENTICATED_USER_TOPIC = 'AUTHENTICATED_USER';\n\n/**\n * Published when the authenticated user data changes. This can happen when the authentication\n * service determines that the user is authenticated or anonymous, as well as when we fetch\n * additional user account data if the `hydrateAuthenticatedUser` flag has been set in the\n * `initialize` function.\n *\n * @event\n * @see {@link module:Initialization~initialize}\n */\nexport const AUTHENTICATED_USER_CHANGED = `${AUTHENTICATED_USER_TOPIC}.CHANGED`;\n\nconst optionsShape = {\n config: PropTypes.shape({\n BASE_URL: PropTypes.string.isRequired,\n LMS_BASE_URL: PropTypes.string.isRequired,\n LOGIN_URL: PropTypes.string.isRequired,\n LOGOUT_URL: PropTypes.string.isRequired,\n REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired,\n ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired,\n CSRF_TOKEN_API_PATH: PropTypes.string.isRequired,\n }).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n};\n\nconst serviceShape = {\n getAuthenticatedHttpClient: PropTypes.func.isRequired,\n getHttpClient: PropTypes.func.isRequired,\n getLoginRedirectUrl: PropTypes.func.isRequired,\n redirectToLogin: PropTypes.func.isRequired,\n getLogoutRedirectUrl: PropTypes.func.isRequired,\n redirectToLogout: PropTypes.func.isRequired,\n getAuthenticatedUser: PropTypes.func.isRequired,\n setAuthenticatedUser: PropTypes.func.isRequired,\n fetchAuthenticatedUser: PropTypes.func.isRequired,\n ensureAuthenticatedUser: PropTypes.func.isRequired,\n hydrateAuthenticatedUser: PropTypes.func.isRequired,\n};\n\nlet service;\n\n/**\n *\n * @param {class} AuthService\n * @param {*} options\n * @returns {AuthService}\n */\nexport function configure(AuthService, options) {\n PropTypes.checkPropTypes(optionsShape, options, 'property', 'Auth');\n service = new AuthService(options);\n PropTypes.checkPropTypes(serviceShape, service, 'property', 'AuthService');\n return service;\n}\n\n/**\n *\n *\n * @returns {AuthService}\n */\nexport function getAuthService() {\n if (!service) {\n throw Error('You must first configure the auth service.');\n }\n\n return service;\n}\n\n/**\n *\n */\nexport function resetAuthService() {\n service = null;\n}\n\n/**\n * Gets the authenticated HTTP client for the service.\n *\n * @param {Object} [options] Optional options for how to configure the authenticated HTTP client\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made with the returned client\n *\n * @returns {HttpClient}\n */\nexport function getAuthenticatedHttpClient(options = {}) {\n return service.getAuthenticatedHttpClient(options);\n}\n\n/**\n * Gets the unauthenticated HTTP client for the service.\n *\n * @param {Object} [options] Optional options for how to configure the authenticated HTTP client\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made with the returned client\n *\n * @returns {HttpClient}\n */\nexport function getHttpClient(options = {}) {\n return service.getHttpClient(options);\n}\n\n/**\n * Builds a URL to the login page with a post-login redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLoginRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\nexport function getLoginRedirectUrl(redirectUrl) {\n return service.getLoginRedirectUrl(redirectUrl);\n}\n\n/**\n * Redirects the user to the login page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\nexport function redirectToLogin(redirectUrl) {\n return service.redirectToLogin(redirectUrl);\n}\n\n/**\n * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLogoutRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/logout?redirect_url=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\nexport function getLogoutRedirectUrl(redirectUrl) {\n return service.getLogoutRedirectUrl(redirectUrl);\n}\n\n/**\n * Redirects the user to the logout page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\nexport function redirectToLogout(redirectUrl) {\n return service.redirectToLogout(redirectUrl);\n}\n\n/**\n * If it exists, returns the user data representing the currently authenticated user. If the\n * user is anonymous, returns null.\n *\n * @returns {UserData|null}\n */\nexport function getAuthenticatedUser() {\n return service.getAuthenticatedUser();\n}\n\n/**\n * Sets the authenticated user to the provided value.\n *\n * @param {UserData} authUser\n * @emits AUTHENTICATED_USER_CHANGED\n */\nexport function setAuthenticatedUser(authUser) {\n service.setAuthenticatedUser(authUser);\n publish(AUTHENTICATED_USER_CHANGED);\n}\n\n/**\n * Reads the authenticated user's access token. Resolves to null if the user is\n * unauthenticated.\n *\n * @returns {Promise|Promise} Resolves to the user's access token if they are\n * logged in.\n */\nexport async function fetchAuthenticatedUser(options = {}) {\n return service.fetchAuthenticatedUser(options);\n}\n\n/**\n * Ensures a user is authenticated. It will redirect to login when not\n * authenticated.\n *\n * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not\n * authenticated.\n * @returns {Promise}\n */\nexport async function ensureAuthenticatedUser(redirectUrl) {\n return service.ensureAuthenticatedUser(redirectUrl);\n}\n\n/**\n * Fetches additional user account information for the authenticated user and merges it into the\n * existing authenticatedUser object, available via getAuthenticatedUser().\n *\n * ```\n * console.log(authenticatedUser); // Will be sparse and only contain basic information.\n * await hydrateAuthenticatedUser()\n * const authenticatedUser = getAuthenticatedUser();\n * console.log(authenticatedUser); // Will contain additional user information\n * ```\n *\n * @emits AUTHENTICATED_USER_CHANGED\n */\nexport async function hydrateAuthenticatedUser() {\n await service.hydrateAuthenticatedUser();\n publish(AUTHENTICATED_USER_CHANGED);\n}\n\n/**\n * @name AuthService\n * @interface\n * @memberof module:Auth\n * @property {function} getAuthenticatedHttpClient\n * @property {function} getHttpClient\n * @property {function} getLoginRedirectUrl\n * @property {function} redirectToLogin\n * @property {function} getLogoutRedirectUrl\n * @property {function} redirectToLogout\n * @property {function} getAuthenticatedUser\n * @property {function} setAuthenticatedUser\n * @property {function} fetchAuthenticatedUser\n * @property {function} ensureAuthenticatedUser\n * @property {function} hydrateAuthenticatedUser\n */\n\n/**\n * A configured axios client. See axios docs for more\n * info https://github.com/axios/axios. All the functions\n * below accept isPublic and isCsrfExempt in the request\n * config options. Setting these to true will prevent this\n * client from attempting to refresh the jwt access token\n * or a csrf token respectively.\n *\n * ```\n * // A public endpoint (no jwt token refresh)\n * apiClient.get('/path/to/endpoint', { isPublic: true });\n * ```\n *\n * ```\n * // A csrf exempt endpoint\n * apiClient.post('/path/to/endpoint', { data }, { isCsrfExempt: true });\n * ```\n *\n * @name HttpClient\n * @interface\n * @memberof module:Auth\n * @property {function} get\n * @property {function} head\n * @property {function} options\n * @property {function} delete (csrf protected)\n * @property {function} post (csrf protected)\n * @property {function} put (csrf protected)\n * @property {function} patch (csrf protected)\n */\n\n/**\n * @name UserData\n * @interface\n * @memberof module:Auth\n * @property {string} userId\n * @property {string} username\n * @property {Array} roles\n * @property {boolean} administrator\n */\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/auth/utils.js b/dist/auth/utils.js new file mode 100644 index 000000000..81a4140d7 --- /dev/null +++ b/dist/auth/utils.js @@ -0,0 +1,101 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +// Lifted from here: https://regexr.com/3ok5o +var urlRegex = /([a-z]{1,2}tps?):\/\/((?:(?!(?:\/|#|\?|&)).)+)(?:(\/(?:(?:(?:(?!(?:#|\?|&)).)+\/))?))?(?:((?:(?!(?:\.|$|\?|#)).)+))?(?:(\.(?:(?!(?:\?|$|#)).)+))?(?:(\?(?:(?!(?:$|#)).)+))?(?:(#.+))?/; +var getUrlParts = function getUrlParts(url) { + var found = url.match(urlRegex); + try { + var _found = _slicedToArray(found, 8), + fullUrl = _found[0], + protocol = _found[1], + domain = _found[2], + path = _found[3], + endFilename = _found[4], + endFileExtension = _found[5], + query = _found[6], + hash = _found[7]; + return { + fullUrl: fullUrl, + protocol: protocol, + domain: domain, + path: path, + endFilename: endFilename, + endFileExtension: endFileExtension, + query: query, + hash: hash + }; + } catch (e) { + throw new Error("Could not find url parts from ".concat(url, ".")); + } +}; +var logFrontendAuthError = function logFrontendAuthError(loggingService, error) { + var prefixedMessageError = Object.create(error); + prefixedMessageError.message = "[frontend-auth] ".concat(error.message); + loggingService.logError(prefixedMessageError, prefixedMessageError.customAttributes); +}; +var processAxiosError = function processAxiosError(axiosErrorObject) { + var error = Object.create(axiosErrorObject); + var request = error.request, + response = error.response, + config = error.config; + if (!config) { + error.customAttributes = _objectSpread(_objectSpread({}, error.customAttributes), {}, { + httpErrorType: 'unknown-api-request-error' + }); + return error; + } + var httpErrorRequestUrl = config.url, + httpErrorRequestMethod = config.method; + /* istanbul ignore else: difficult to enter the request-only error case in a unit test */ + if (response) { + var status = response.status, + data = response.data; + var stringifiedData = JSON.stringify(data) || '(empty response)'; + var responseIsHTML = stringifiedData.includes(''); + // Don't include data if it is just an HTML document, like a 500 error page. + /* istanbul ignore next */ + var httpErrorResponseData = responseIsHTML ? '' : stringifiedData; + error.customAttributes = _objectSpread(_objectSpread({}, error.customAttributes), {}, { + httpErrorType: 'api-response-error', + httpErrorStatus: status, + httpErrorResponseData: httpErrorResponseData, + httpErrorRequestUrl: httpErrorRequestUrl, + httpErrorRequestMethod: httpErrorRequestMethod + }); + error.message = "Axios Error (Response): ".concat(status, " - See custom attributes for details."); + } else if (request) { + error.customAttributes = _objectSpread(_objectSpread({}, error.customAttributes), {}, { + httpErrorType: 'api-request-error', + httpErrorMessage: error.message, + httpErrorRequestUrl: httpErrorRequestUrl, + httpErrorRequestMethod: httpErrorRequestMethod + }); + // This case occurs most likely because of intermittent internet connection issues + // but it also, though less often, catches CORS or server configuration problems. + error.message = 'Axios Error (Request): (Possible local connectivity issue.) See custom attributes for details.'; + } else { + error.customAttributes = _objectSpread(_objectSpread({}, error.customAttributes), {}, { + httpErrorType: 'api-request-config-error', + httpErrorMessage: error.message, + httpErrorRequestUrl: httpErrorRequestUrl, + httpErrorRequestMethod: httpErrorRequestMethod + }); + error.message = 'Axios Error (Config): See custom attributes for details.'; + } + return error; +}; +var processAxiosErrorAndThrow = function processAxiosErrorAndThrow(axiosErrorObject) { + throw processAxiosError(axiosErrorObject); +}; +export { getUrlParts, logFrontendAuthError, processAxiosError, processAxiosErrorAndThrow }; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/dist/auth/utils.js.map b/dist/auth/utils.js.map new file mode 100644 index 000000000..7dbdeb147 --- /dev/null +++ b/dist/auth/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","names":["urlRegex","getUrlParts","url","found","match","_found","_slicedToArray","fullUrl","protocol","domain","path","endFilename","endFileExtension","query","hash","e","Error","concat","logFrontendAuthError","loggingService","error","prefixedMessageError","Object","create","message","logError","customAttributes","processAxiosError","axiosErrorObject","request","response","config","_objectSpread","httpErrorType","httpErrorRequestUrl","httpErrorRequestMethod","method","status","data","stringifiedData","JSON","stringify","responseIsHTML","includes","httpErrorResponseData","httpErrorStatus","httpErrorMessage","processAxiosErrorAndThrow"],"sources":["../../src/auth/utils.js"],"sourcesContent":["// Lifted from here: https://regexr.com/3ok5o\nconst urlRegex = /([a-z]{1,2}tps?):\\/\\/((?:(?!(?:\\/|#|\\?|&)).)+)(?:(\\/(?:(?:(?:(?!(?:#|\\?|&)).)+\\/))?))?(?:((?:(?!(?:\\.|$|\\?|#)).)+))?(?:(\\.(?:(?!(?:\\?|$|#)).)+))?(?:(\\?(?:(?!(?:$|#)).)+))?(?:(#.+))?/;\nconst getUrlParts = (url) => {\n const found = url.match(urlRegex);\n try {\n const [\n fullUrl,\n protocol,\n domain,\n path,\n endFilename,\n endFileExtension,\n query,\n hash,\n ] = found;\n\n return {\n fullUrl,\n protocol,\n domain,\n path,\n endFilename,\n endFileExtension,\n query,\n hash,\n };\n } catch (e) {\n throw new Error(`Could not find url parts from ${url}.`);\n }\n};\n\nconst logFrontendAuthError = (loggingService, error) => {\n const prefixedMessageError = Object.create(error);\n prefixedMessageError.message = `[frontend-auth] ${error.message}`;\n loggingService.logError(prefixedMessageError, prefixedMessageError.customAttributes);\n};\n\nconst processAxiosError = (axiosErrorObject) => {\n const error = Object.create(axiosErrorObject);\n const { request, response, config } = error;\n\n if (!config) {\n error.customAttributes = {\n ...error.customAttributes,\n httpErrorType: 'unknown-api-request-error',\n };\n return error;\n }\n\n const {\n url: httpErrorRequestUrl,\n method: httpErrorRequestMethod,\n } = config;\n /* istanbul ignore else: difficult to enter the request-only error case in a unit test */\n if (response) {\n const { status, data } = response;\n const stringifiedData = JSON.stringify(data) || '(empty response)';\n const responseIsHTML = stringifiedData.includes('');\n // Don't include data if it is just an HTML document, like a 500 error page.\n /* istanbul ignore next */\n const httpErrorResponseData = responseIsHTML ? '' : stringifiedData;\n error.customAttributes = {\n ...error.customAttributes,\n httpErrorType: 'api-response-error',\n httpErrorStatus: status,\n httpErrorResponseData,\n httpErrorRequestUrl,\n httpErrorRequestMethod,\n };\n error.message = `Axios Error (Response): ${status} - See custom attributes for details.`;\n } else if (request) {\n error.customAttributes = {\n ...error.customAttributes,\n httpErrorType: 'api-request-error',\n httpErrorMessage: error.message,\n httpErrorRequestUrl,\n httpErrorRequestMethod,\n };\n // This case occurs most likely because of intermittent internet connection issues\n // but it also, though less often, catches CORS or server configuration problems.\n error.message = 'Axios Error (Request): (Possible local connectivity issue.) See custom attributes for details.';\n } else {\n error.customAttributes = {\n ...error.customAttributes,\n httpErrorType: 'api-request-config-error',\n httpErrorMessage: error.message,\n httpErrorRequestUrl,\n httpErrorRequestMethod,\n };\n error.message = 'Axios Error (Config): See custom attributes for details.';\n }\n\n return error;\n};\n\nconst processAxiosErrorAndThrow = (axiosErrorObject) => {\n throw processAxiosError(axiosErrorObject);\n};\n\nexport {\n getUrlParts,\n logFrontendAuthError,\n processAxiosError,\n processAxiosErrorAndThrow,\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/config.js b/dist/config.js new file mode 100644 index 000000000..d28d6f93c --- /dev/null +++ b/dist/config.js @@ -0,0 +1,327 @@ +/** + * #### Import members from **@edx/frontend-platform** + * + * The configuration module provides utilities for working with an application's configuration + * document (ConfigDocument). Configuration variables can be supplied to the + * application in four different ways. They are applied in the following order: + * + * - Build-time Configuration + * - Environment Variables + * - JavaScript File + * - Runtime Configuration + * + * Last one in wins. Variables with the same name defined via the later methods will override any + * defined using an earlier method. i.e., if a variable is defined in Runtime Configuration, that + * will override the same variable defined in either Build-time Configuration method (environment + * variables or JS file). Configuration defined in a JS file will override environment variables. + * + * ##### Build-time Configuration + * + * Build-time configuration methods add config variables into the app when it is built by webpack. + * This saves the app an API call and means it has all the information it needs to initialize right + * away. There are two methods of supplying build-time configuration: environment variables and a + * JavaScript file. + * + * ###### Environment Variables + * + * A set list of required config variables can be supplied as + * command-line environment variables during the build process. + * + * As a simple example, these are supplied on the command-line before invoking `npm run build`: + * + * ``` + * LMS_BASE_URL=http://localhost:18000 npm run build + * ``` + * + * Note that additional variables _cannot_ be supplied via this method without using the `config` + * initialization handler. The app won't pick them up and they'll appear `undefined`. + * + * This configuration method is being deprecated in favor of JavaScript File Configuration. + * + * ###### JavaScript File Configuration + * + * Configuration variables can be supplied in an optional file named env.config.js. This file must + * export either an Object containing configuration variables or a function. The function must + * return an Object containing configuration variables or, alternately, a promise which resolves to + * an Object. + * + * Using a function or async function allows the configuration to be resolved at runtime (because + * the function will be executed at runtime). This is not common, and the capability is included + * for the sake of flexibility. + * + * JavaScript File Configuration is well-suited to extensibility use cases or component overrides, + * in that the configuration file can depend on any installed JavaScript module. It is also the + * preferred way of doing build-time configuration if runtime configuration isn't used by your + * deployment of the platform. + * + * Exporting a config object: + * ``` + * const config = { + * LMS_BASE_URL: 'http://localhost:18000' + * }; + * + * export default config; + * ``` + * + * Exporting a function that returns an object: + * ``` + * function getConfig() { + * return { + * LMS_BASE_URL: 'http://localhost:18000' + * }; + * } + * ``` + * + * Exporting a function that returns a promise that resolves to an object: + * ``` + * function getAsyncConfig() { + * return new Promise((resolve, reject) => { + * resolve({ + * LMS_BASE_URL: 'http://localhost:18000' + * }); + * }); + * } + * + * export default getAsyncConfig; + * ``` + * + * ##### Runtime Configuration + * + * Configuration variables can also be supplied using the "runtime configuration" method, taking + * advantage of the Micro-frontend Config API in edx-platform. More information on this API can be + * found in the ADR which introduced it: + * + * https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst + * + * The runtime configuration method can be enabled by supplying a MFE_CONFIG_API_URL via one of the other + * two configuration methods above. + * + * Runtime configuration is particularly useful if you need to supply different configurations to + * a single deployment of a micro-frontend, for instance. It is also a perfectly valid alternative + * to build-time configuration, though it introduces an additional API call to edx-platform on MFE + * initialization. + * + * ##### Initialization Config Handler + * + * The configuration document can be extended by + * applications at run-time using a `config` initialization handler. Please see the Initialization + * documentation for more information on handlers and initialization phases. + * + * ``` + * initialize({ + * handlers: { + * config: () => { + * mergeConfig({ + * CUSTOM_VARIABLE: 'custom value', + * LMS_BASE_URL: 'http://localhost:18001' // You can override variables, but this is uncommon. + * }, 'App config override handler'); + * }, + * }, + * }); + * ``` + * + * @module Config + */ + +import { APP_CONFIG_INITIALIZED, CONFIG_CHANGED } from './constants'; +import { publish, subscribe } from './pubSub'; +import { ensureDefinedConfig } from './utils'; +function extractRegex(envVar) { + // Convert the environment variable string to a regex, while guarding + // against a non-string and an empty/whitespace-only string. + if (typeof envVar === 'string' && envVar.trim() !== '') { + return new RegExp(envVar); + } + return undefined; +} +var ENVIRONMENT = process.env.NODE_ENV; +var config = { + ACCESS_TOKEN_COOKIE_NAME: process.env.ACCESS_TOKEN_COOKIE_NAME, + ACCOUNT_PROFILE_URL: process.env.ACCOUNT_PROFILE_URL, + ACCOUNT_SETTINGS_URL: process.env.ACCOUNT_SETTINGS_URL, + BASE_URL: process.env.BASE_URL, + PUBLIC_PATH: process.env.PUBLIC_PATH || '/', + CREDENTIALS_BASE_URL: process.env.CREDENTIALS_BASE_URL, + CSRF_TOKEN_API_PATH: process.env.CSRF_TOKEN_API_PATH, + DISCOVERY_API_BASE_URL: process.env.DISCOVERY_API_BASE_URL, + PUBLISHER_BASE_URL: process.env.PUBLISHER_BASE_URL, + ECOMMERCE_BASE_URL: process.env.ECOMMERCE_BASE_URL, + ENVIRONMENT: ENVIRONMENT, + IGNORED_ERROR_REGEX: extractRegex(process.env.IGNORED_ERROR_REGEX), + LANGUAGE_PREFERENCE_COOKIE_NAME: process.env.LANGUAGE_PREFERENCE_COOKIE_NAME, + LEARNING_BASE_URL: process.env.LEARNING_BASE_URL, + LMS_BASE_URL: process.env.LMS_BASE_URL, + LOGIN_URL: process.env.LOGIN_URL, + LOGOUT_URL: process.env.LOGOUT_URL, + STUDIO_BASE_URL: process.env.STUDIO_BASE_URL, + MARKETING_SITE_BASE_URL: process.env.MARKETING_SITE_BASE_URL, + ORDER_HISTORY_URL: process.env.ORDER_HISTORY_URL, + REFRESH_ACCESS_TOKEN_ENDPOINT: process.env.REFRESH_ACCESS_TOKEN_ENDPOINT, + SECURE_COOKIES: ENVIRONMENT !== 'development', + SEGMENT_KEY: process.env.SEGMENT_KEY, + SITE_NAME: process.env.SITE_NAME, + USER_INFO_COOKIE_NAME: process.env.USER_INFO_COOKIE_NAME, + LOGO_URL: process.env.LOGO_URL, + LOGO_TRADEMARK_URL: process.env.LOGO_TRADEMARK_URL, + LOGO_WHITE_URL: process.env.LOGO_WHITE_URL, + FAVICON_URL: process.env.FAVICON_URL, + MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL, + APP_ID: process.env.APP_ID, + SUPPORT_URL: process.env.SUPPORT_URL +}; + +/** + * Getter for the application configuration document. This is synchronous and merely returns a + * reference to an existing object, and is thus safe to call as often as desired. + * + * Example: + * + * ``` + * import { getConfig } from '@edx/frontend-platform'; + * + * const { + * LMS_BASE_URL, + * } = getConfig(); + * ``` + * + * @returns {ConfigDocument} + */ +export function getConfig() { + return config; +} + +/** + * Replaces the existing ConfigDocument. This is not commonly used, but can be helpful for tests. + * + * The supplied config document will be tested with `ensureDefinedConfig` to ensure it does not + * have any `undefined` keys. + * + * Example: + * + * ``` + * import { setConfig } from '@edx/frontend-platform'; + * + * setConfig({ + * LMS_BASE_URL, // This is overriding the ENTIRE document - this is not merged in! + * }); + * ``` + * + * @param {ConfigDocument} newConfig + */ +export function setConfig(newConfig) { + ensureDefinedConfig(config, 'config'); + config = newConfig; + publish(CONFIG_CHANGED); +} + +/** + * Merges additional configuration values into the ConfigDocument returned by `getConfig`. Will + * override any values that exist with the same keys. + * + * ``` + * mergeConfig({ + * NEW_KEY: 'new value', + * OTHER_NEW_KEY: 'other new value', + * }); + * + * If any of the key values are `undefined`, an error will be logged to 'warn'. + * + * @param {Object} newConfig + */ +export function mergeConfig(newConfig) { + ensureDefinedConfig(newConfig, 'ProcessEnvConfigService'); + config = Object.assign(config, newConfig); + publish(CONFIG_CHANGED); +} + +/** + * A method allowing application code to indicate that particular ConfigDocument keys are required + * for them to function. This is useful for diagnosing development/deployment issues, primarily, + * by surfacing misconfigurations early. For instance, if the build process fails to supply an + * environment variable on the command-line, it's possible that one of the `process.env` variables + * will be undefined. Should be used in conjunction with `mergeConfig` for custom `ConfigDocument` + * properties. Requester is for informational/error reporting purposes only. + * + * ``` + * ensureConfig(['LMS_BASE_URL', 'LOGIN_URL'], 'MySpecialComponent'); + * + * // Will log a warning with: + * // "App configuration error: LOGIN_URL is required by MySpecialComponent." + * // if LOGIN_URL is undefined, for example. + * ``` + * + * *NOTE*: `ensureConfig` waits until `APP_CONFIG_INITIALIZED` is published to verify the existence + * of the specified properties. This means that this function is compatible with custom `config` + * phase handlers responsible for loading additional configuration data in the initialization + * sequence. + * + * @param {Array} keys + * @param {string} [requester='unspecified application code'] + */ +export function ensureConfig(keys) { + var requester = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'unspecified application code'; + subscribe(APP_CONFIG_INITIALIZED, function () { + keys.forEach(function (key) { + if (config[key] === undefined) { + // eslint-disable-next-line no-console + console.warn("App configuration error: ".concat(key, " is required by ").concat(requester, ".")); + } + }); + }); +} + +/** + * An object describing the current application configuration. + * + * In its most basic form, the initialization process loads this document via `process.env` + * variables. There are other ways to add configuration variables to the ConfigDocument as + * documented above (JavaScript File Configuration, Runtime Configuration, and the Initialization + * Config Handler) + * + * ``` + * { + * BASE_URL: process.env.BASE_URL, + * // ... other vars + * } + * ``` + * + * When using Webpack (i.e., normal usage), the build process is responsible for supplying these + * variables via command-line environment variables. That means they must be supplied at build + * time. + * + * @name ConfigDocument + * @memberof module:Config + * @property {string} ACCESS_TOKEN_COOKIE_NAME + * @property {string} ACCOUNT_PROFILE_URL + * @property {string} ACCOUNT_SETTINGS_URL + * @property {string} BASE_URL The URL of the current application. + * @property {string} CREDENTIALS_BASE_URL + * @property {string} CSRF_TOKEN_API_PATH + * @property {string} DISCOVERY_API_BASE_URL + * @property {string} PUBLISHER_BASE_URL + * @property {string} ECOMMERCE_BASE_URL + * @property {string} ENVIRONMENT This is one of: development, production, or test. + * @property {string} IGNORED_ERROR_REGEX + * @property {string} LANGUAGE_PREFERENCE_COOKIE_NAME + * @property {string} LEARNING_BASE_URL + * @property {string} LMS_BASE_URL + * @property {string} LOGIN_URL + * @property {string} LOGOUT_URL + * @property {string} STUDIO_BASE_URL + * @property {string} MARKETING_SITE_BASE_URL + * @property {string} ORDER_HISTORY_URL + * @property {string} REFRESH_ACCESS_TOKEN_ENDPOINT + * @property {boolean} SECURE_COOKIES + * @property {string} SEGMENT_KEY + * @property {string} SITE_NAME + * @property {string} USER_INFO_COOKIE_NAME + * @property {string} LOGO_URL + * @property {string} LOGO_TRADEMARK_URL + * @property {string} LOGO_WHITE_URL + * @property {string} FAVICON_URL + * @property {string} MFE_CONFIG_API_URL + * @property {string} APP_ID + * @property {string} SUPPORT_URL + * @property {string} PARAGON_THEME_URLS + */ +//# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/dist/config.js.map b/dist/config.js.map new file mode 100644 index 000000000..bfe62091f --- /dev/null +++ b/dist/config.js.map @@ -0,0 +1 @@ +{"version":3,"file":"config.js","names":["APP_CONFIG_INITIALIZED","CONFIG_CHANGED","publish","subscribe","ensureDefinedConfig","extractRegex","envVar","trim","RegExp","undefined","ENVIRONMENT","process","env","NODE_ENV","config","ACCESS_TOKEN_COOKIE_NAME","ACCOUNT_PROFILE_URL","ACCOUNT_SETTINGS_URL","BASE_URL","PUBLIC_PATH","CREDENTIALS_BASE_URL","CSRF_TOKEN_API_PATH","DISCOVERY_API_BASE_URL","PUBLISHER_BASE_URL","ECOMMERCE_BASE_URL","IGNORED_ERROR_REGEX","LANGUAGE_PREFERENCE_COOKIE_NAME","LEARNING_BASE_URL","LMS_BASE_URL","LOGIN_URL","LOGOUT_URL","STUDIO_BASE_URL","MARKETING_SITE_BASE_URL","ORDER_HISTORY_URL","REFRESH_ACCESS_TOKEN_ENDPOINT","SECURE_COOKIES","SEGMENT_KEY","SITE_NAME","USER_INFO_COOKIE_NAME","LOGO_URL","LOGO_TRADEMARK_URL","LOGO_WHITE_URL","FAVICON_URL","MFE_CONFIG_API_URL","APP_ID","SUPPORT_URL","getConfig","setConfig","newConfig","mergeConfig","Object","assign","ensureConfig","keys","requester","arguments","length","forEach","key","console","warn","concat"],"sources":["../src/config.js"],"sourcesContent":["/**\n * #### Import members from **@edx/frontend-platform**\n *\n * The configuration module provides utilities for working with an application's configuration\n * document (ConfigDocument). Configuration variables can be supplied to the\n * application in four different ways. They are applied in the following order:\n *\n * - Build-time Configuration\n * - Environment Variables\n * - JavaScript File\n * - Runtime Configuration\n *\n * Last one in wins. Variables with the same name defined via the later methods will override any\n * defined using an earlier method. i.e., if a variable is defined in Runtime Configuration, that\n * will override the same variable defined in either Build-time Configuration method (environment\n * variables or JS file). Configuration defined in a JS file will override environment variables.\n *\n * ##### Build-time Configuration\n *\n * Build-time configuration methods add config variables into the app when it is built by webpack.\n * This saves the app an API call and means it has all the information it needs to initialize right\n * away. There are two methods of supplying build-time configuration: environment variables and a\n * JavaScript file.\n *\n * ###### Environment Variables\n *\n * A set list of required config variables can be supplied as\n * command-line environment variables during the build process.\n *\n * As a simple example, these are supplied on the command-line before invoking `npm run build`:\n *\n * ```\n * LMS_BASE_URL=http://localhost:18000 npm run build\n * ```\n *\n * Note that additional variables _cannot_ be supplied via this method without using the `config`\n * initialization handler. The app won't pick them up and they'll appear `undefined`.\n *\n * This configuration method is being deprecated in favor of JavaScript File Configuration.\n *\n * ###### JavaScript File Configuration\n *\n * Configuration variables can be supplied in an optional file named env.config.js. This file must\n * export either an Object containing configuration variables or a function. The function must\n * return an Object containing configuration variables or, alternately, a promise which resolves to\n * an Object.\n *\n * Using a function or async function allows the configuration to be resolved at runtime (because\n * the function will be executed at runtime). This is not common, and the capability is included\n * for the sake of flexibility.\n *\n * JavaScript File Configuration is well-suited to extensibility use cases or component overrides,\n * in that the configuration file can depend on any installed JavaScript module. It is also the\n * preferred way of doing build-time configuration if runtime configuration isn't used by your\n * deployment of the platform.\n *\n * Exporting a config object:\n * ```\n * const config = {\n * LMS_BASE_URL: 'http://localhost:18000'\n * };\n *\n * export default config;\n * ```\n *\n * Exporting a function that returns an object:\n * ```\n * function getConfig() {\n * return {\n * LMS_BASE_URL: 'http://localhost:18000'\n * };\n * }\n * ```\n *\n * Exporting a function that returns a promise that resolves to an object:\n * ```\n * function getAsyncConfig() {\n * return new Promise((resolve, reject) => {\n * resolve({\n * LMS_BASE_URL: 'http://localhost:18000'\n * });\n * });\n * }\n *\n * export default getAsyncConfig;\n * ```\n *\n * ##### Runtime Configuration\n *\n * Configuration variables can also be supplied using the \"runtime configuration\" method, taking\n * advantage of the Micro-frontend Config API in edx-platform. More information on this API can be\n * found in the ADR which introduced it:\n *\n * https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst\n *\n * The runtime configuration method can be enabled by supplying a MFE_CONFIG_API_URL via one of the other\n * two configuration methods above.\n *\n * Runtime configuration is particularly useful if you need to supply different configurations to\n * a single deployment of a micro-frontend, for instance. It is also a perfectly valid alternative\n * to build-time configuration, though it introduces an additional API call to edx-platform on MFE\n * initialization.\n *\n * ##### Initialization Config Handler\n *\n * The configuration document can be extended by\n * applications at run-time using a `config` initialization handler. Please see the Initialization\n * documentation for more information on handlers and initialization phases.\n *\n * ```\n * initialize({\n * handlers: {\n * config: () => {\n * mergeConfig({\n * CUSTOM_VARIABLE: 'custom value',\n * LMS_BASE_URL: 'http://localhost:18001' // You can override variables, but this is uncommon.\n * }, 'App config override handler');\n * },\n * },\n * });\n * ```\n *\n * @module Config\n */\n\nimport { APP_CONFIG_INITIALIZED, CONFIG_CHANGED } from './constants';\n\nimport { publish, subscribe } from './pubSub';\nimport { ensureDefinedConfig } from './utils';\n\nfunction extractRegex(envVar) {\n // Convert the environment variable string to a regex, while guarding\n // against a non-string and an empty/whitespace-only string.\n if (typeof envVar === 'string' && envVar.trim() !== '') {\n return new RegExp(envVar);\n }\n return undefined;\n}\n\nconst ENVIRONMENT = process.env.NODE_ENV;\nlet config = {\n ACCESS_TOKEN_COOKIE_NAME: process.env.ACCESS_TOKEN_COOKIE_NAME,\n ACCOUNT_PROFILE_URL: process.env.ACCOUNT_PROFILE_URL,\n ACCOUNT_SETTINGS_URL: process.env.ACCOUNT_SETTINGS_URL,\n BASE_URL: process.env.BASE_URL,\n PUBLIC_PATH: process.env.PUBLIC_PATH || '/',\n CREDENTIALS_BASE_URL: process.env.CREDENTIALS_BASE_URL,\n CSRF_TOKEN_API_PATH: process.env.CSRF_TOKEN_API_PATH,\n DISCOVERY_API_BASE_URL: process.env.DISCOVERY_API_BASE_URL,\n PUBLISHER_BASE_URL: process.env.PUBLISHER_BASE_URL,\n ECOMMERCE_BASE_URL: process.env.ECOMMERCE_BASE_URL,\n ENVIRONMENT,\n IGNORED_ERROR_REGEX: extractRegex(process.env.IGNORED_ERROR_REGEX),\n LANGUAGE_PREFERENCE_COOKIE_NAME: process.env.LANGUAGE_PREFERENCE_COOKIE_NAME,\n LEARNING_BASE_URL: process.env.LEARNING_BASE_URL,\n LMS_BASE_URL: process.env.LMS_BASE_URL,\n LOGIN_URL: process.env.LOGIN_URL,\n LOGOUT_URL: process.env.LOGOUT_URL,\n STUDIO_BASE_URL: process.env.STUDIO_BASE_URL,\n MARKETING_SITE_BASE_URL: process.env.MARKETING_SITE_BASE_URL,\n ORDER_HISTORY_URL: process.env.ORDER_HISTORY_URL,\n REFRESH_ACCESS_TOKEN_ENDPOINT: process.env.REFRESH_ACCESS_TOKEN_ENDPOINT,\n SECURE_COOKIES: ENVIRONMENT !== 'development',\n SEGMENT_KEY: process.env.SEGMENT_KEY,\n SITE_NAME: process.env.SITE_NAME,\n USER_INFO_COOKIE_NAME: process.env.USER_INFO_COOKIE_NAME,\n LOGO_URL: process.env.LOGO_URL,\n LOGO_TRADEMARK_URL: process.env.LOGO_TRADEMARK_URL,\n LOGO_WHITE_URL: process.env.LOGO_WHITE_URL,\n FAVICON_URL: process.env.FAVICON_URL,\n MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL,\n APP_ID: process.env.APP_ID,\n SUPPORT_URL: process.env.SUPPORT_URL,\n};\n\n/**\n * Getter for the application configuration document. This is synchronous and merely returns a\n * reference to an existing object, and is thus safe to call as often as desired.\n *\n * Example:\n *\n * ```\n * import { getConfig } from '@edx/frontend-platform';\n *\n * const {\n * LMS_BASE_URL,\n * } = getConfig();\n * ```\n *\n * @returns {ConfigDocument}\n */\nexport function getConfig() {\n return config;\n}\n\n/**\n * Replaces the existing ConfigDocument. This is not commonly used, but can be helpful for tests.\n *\n * The supplied config document will be tested with `ensureDefinedConfig` to ensure it does not\n * have any `undefined` keys.\n *\n * Example:\n *\n * ```\n * import { setConfig } from '@edx/frontend-platform';\n *\n * setConfig({\n * LMS_BASE_URL, // This is overriding the ENTIRE document - this is not merged in!\n * });\n * ```\n *\n * @param {ConfigDocument} newConfig\n */\nexport function setConfig(newConfig) {\n ensureDefinedConfig(config, 'config');\n config = newConfig;\n publish(CONFIG_CHANGED);\n}\n\n/**\n * Merges additional configuration values into the ConfigDocument returned by `getConfig`. Will\n * override any values that exist with the same keys.\n *\n * ```\n * mergeConfig({\n * NEW_KEY: 'new value',\n * OTHER_NEW_KEY: 'other new value',\n * });\n *\n * If any of the key values are `undefined`, an error will be logged to 'warn'.\n *\n * @param {Object} newConfig\n */\nexport function mergeConfig(newConfig) {\n ensureDefinedConfig(newConfig, 'ProcessEnvConfigService');\n config = Object.assign(config, newConfig);\n publish(CONFIG_CHANGED);\n}\n\n/**\n * A method allowing application code to indicate that particular ConfigDocument keys are required\n * for them to function. This is useful for diagnosing development/deployment issues, primarily,\n * by surfacing misconfigurations early. For instance, if the build process fails to supply an\n * environment variable on the command-line, it's possible that one of the `process.env` variables\n * will be undefined. Should be used in conjunction with `mergeConfig` for custom `ConfigDocument`\n * properties. Requester is for informational/error reporting purposes only.\n *\n * ```\n * ensureConfig(['LMS_BASE_URL', 'LOGIN_URL'], 'MySpecialComponent');\n *\n * // Will log a warning with:\n * // \"App configuration error: LOGIN_URL is required by MySpecialComponent.\"\n * // if LOGIN_URL is undefined, for example.\n * ```\n *\n * *NOTE*: `ensureConfig` waits until `APP_CONFIG_INITIALIZED` is published to verify the existence\n * of the specified properties. This means that this function is compatible with custom `config`\n * phase handlers responsible for loading additional configuration data in the initialization\n * sequence.\n *\n * @param {Array} keys\n * @param {string} [requester='unspecified application code']\n */\nexport function ensureConfig(keys, requester = 'unspecified application code') {\n subscribe(APP_CONFIG_INITIALIZED, () => {\n keys.forEach((key) => {\n if (config[key] === undefined) {\n // eslint-disable-next-line no-console\n console.warn(`App configuration error: ${key} is required by ${requester}.`);\n }\n });\n });\n}\n\n/**\n * An object describing the current application configuration.\n *\n * In its most basic form, the initialization process loads this document via `process.env`\n * variables. There are other ways to add configuration variables to the ConfigDocument as\n * documented above (JavaScript File Configuration, Runtime Configuration, and the Initialization\n * Config Handler)\n *\n * ```\n * {\n * BASE_URL: process.env.BASE_URL,\n * // ... other vars\n * }\n * ```\n *\n * When using Webpack (i.e., normal usage), the build process is responsible for supplying these\n * variables via command-line environment variables. That means they must be supplied at build\n * time.\n *\n * @name ConfigDocument\n * @memberof module:Config\n * @property {string} ACCESS_TOKEN_COOKIE_NAME\n * @property {string} ACCOUNT_PROFILE_URL\n * @property {string} ACCOUNT_SETTINGS_URL\n * @property {string} BASE_URL The URL of the current application.\n * @property {string} CREDENTIALS_BASE_URL\n * @property {string} CSRF_TOKEN_API_PATH\n * @property {string} DISCOVERY_API_BASE_URL\n * @property {string} PUBLISHER_BASE_URL\n * @property {string} ECOMMERCE_BASE_URL\n * @property {string} ENVIRONMENT This is one of: development, production, or test.\n * @property {string} IGNORED_ERROR_REGEX\n * @property {string} LANGUAGE_PREFERENCE_COOKIE_NAME\n * @property {string} LEARNING_BASE_URL\n * @property {string} LMS_BASE_URL\n * @property {string} LOGIN_URL\n * @property {string} LOGOUT_URL\n * @property {string} STUDIO_BASE_URL\n * @property {string} MARKETING_SITE_BASE_URL\n * @property {string} ORDER_HISTORY_URL\n * @property {string} REFRESH_ACCESS_TOKEN_ENDPOINT\n * @property {boolean} SECURE_COOKIES\n * @property {string} SEGMENT_KEY\n * @property {string} SITE_NAME\n * @property {string} USER_INFO_COOKIE_NAME\n * @property {string} LOGO_URL\n * @property {string} LOGO_TRADEMARK_URL\n * @property {string} LOGO_WHITE_URL\n * @property {string} FAVICON_URL\n * @property {string} MFE_CONFIG_API_URL\n * @property {string} APP_ID\n * @property {string} SUPPORT_URL\n * @property {string} PARAGON_THEME_URLS\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,sBAAsB,EAAEC,cAAc,QAAQ,aAAa;AAEpE,SAASC,OAAO,EAAEC,SAAS,QAAQ,UAAU;AAC7C,SAASC,mBAAmB,QAAQ,SAAS;AAE7C,SAASC,YAAYA,CAACC,MAAM,EAAE;EAC5B;EACA;EACA,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAIA,MAAM,CAACC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;IACtD,OAAO,IAAIC,MAAM,CAACF,MAAM,CAAC;EAC3B;EACA,OAAOG,SAAS;AAClB;AAEA,IAAMC,WAAW,GAAGC,OAAO,CAACC,GAAG,CAACC,QAAQ;AACxC,IAAIC,MAAM,GAAG;EACXC,wBAAwB,EAAEJ,OAAO,CAACC,GAAG,CAACG,wBAAwB;EAC9DC,mBAAmB,EAAEL,OAAO,CAACC,GAAG,CAACI,mBAAmB;EACpDC,oBAAoB,EAAEN,OAAO,CAACC,GAAG,CAACK,oBAAoB;EACtDC,QAAQ,EAAEP,OAAO,CAACC,GAAG,CAACM,QAAQ;EAC9BC,WAAW,EAAER,OAAO,CAACC,GAAG,CAACO,WAAW,IAAI,GAAG;EAC3CC,oBAAoB,EAAET,OAAO,CAACC,GAAG,CAACQ,oBAAoB;EACtDC,mBAAmB,EAAEV,OAAO,CAACC,GAAG,CAACS,mBAAmB;EACpDC,sBAAsB,EAAEX,OAAO,CAACC,GAAG,CAACU,sBAAsB;EAC1DC,kBAAkB,EAAEZ,OAAO,CAACC,GAAG,CAACW,kBAAkB;EAClDC,kBAAkB,EAAEb,OAAO,CAACC,GAAG,CAACY,kBAAkB;EAClDd,WAAW,EAAXA,WAAW;EACXe,mBAAmB,EAAEpB,YAAY,CAACM,OAAO,CAACC,GAAG,CAACa,mBAAmB,CAAC;EAClEC,+BAA+B,EAAEf,OAAO,CAACC,GAAG,CAACc,+BAA+B;EAC5EC,iBAAiB,EAAEhB,OAAO,CAACC,GAAG,CAACe,iBAAiB;EAChDC,YAAY,EAAEjB,OAAO,CAACC,GAAG,CAACgB,YAAY;EACtCC,SAAS,EAAElB,OAAO,CAACC,GAAG,CAACiB,SAAS;EAChCC,UAAU,EAAEnB,OAAO,CAACC,GAAG,CAACkB,UAAU;EAClCC,eAAe,EAAEpB,OAAO,CAACC,GAAG,CAACmB,eAAe;EAC5CC,uBAAuB,EAAErB,OAAO,CAACC,GAAG,CAACoB,uBAAuB;EAC5DC,iBAAiB,EAAEtB,OAAO,CAACC,GAAG,CAACqB,iBAAiB;EAChDC,6BAA6B,EAAEvB,OAAO,CAACC,GAAG,CAACsB,6BAA6B;EACxEC,cAAc,EAAEzB,WAAW,KAAK,aAAa;EAC7C0B,WAAW,EAAEzB,OAAO,CAACC,GAAG,CAACwB,WAAW;EACpCC,SAAS,EAAE1B,OAAO,CAACC,GAAG,CAACyB,SAAS;EAChCC,qBAAqB,EAAE3B,OAAO,CAACC,GAAG,CAAC0B,qBAAqB;EACxDC,QAAQ,EAAE5B,OAAO,CAACC,GAAG,CAAC2B,QAAQ;EAC9BC,kBAAkB,EAAE7B,OAAO,CAACC,GAAG,CAAC4B,kBAAkB;EAClDC,cAAc,EAAE9B,OAAO,CAACC,GAAG,CAAC6B,cAAc;EAC1CC,WAAW,EAAE/B,OAAO,CAACC,GAAG,CAAC8B,WAAW;EACpCC,kBAAkB,EAAEhC,OAAO,CAACC,GAAG,CAAC+B,kBAAkB;EAClDC,MAAM,EAAEjC,OAAO,CAACC,GAAG,CAACgC,MAAM;EAC1BC,WAAW,EAAElC,OAAO,CAACC,GAAG,CAACiC;AAC3B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAAA,EAAG;EAC1B,OAAOhC,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASiC,SAASA,CAACC,SAAS,EAAE;EACnC5C,mBAAmB,CAACU,MAAM,EAAE,QAAQ,CAAC;EACrCA,MAAM,GAAGkC,SAAS;EAClB9C,OAAO,CAACD,cAAc,CAAC;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASgD,WAAWA,CAACD,SAAS,EAAE;EACrC5C,mBAAmB,CAAC4C,SAAS,EAAE,yBAAyB,CAAC;EACzDlC,MAAM,GAAGoC,MAAM,CAACC,MAAM,CAACrC,MAAM,EAAEkC,SAAS,CAAC;EACzC9C,OAAO,CAACD,cAAc,CAAC;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASmD,YAAYA,CAACC,IAAI,EAA8C;EAAA,IAA5CC,SAAS,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAA9C,SAAA,GAAA8C,SAAA,MAAG,8BAA8B;EAC3EpD,SAAS,CAACH,sBAAsB,EAAE,YAAM;IACtCqD,IAAI,CAACI,OAAO,CAAC,UAACC,GAAG,EAAK;MACpB,IAAI5C,MAAM,CAAC4C,GAAG,CAAC,KAAKjD,SAAS,EAAE;QAC7B;QACAkD,OAAO,CAACC,IAAI,6BAAAC,MAAA,CAA6BH,GAAG,sBAAAG,MAAA,CAAmBP,SAAS,MAAG,CAAC;MAC9E;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]} \ No newline at end of file diff --git a/dist/constants.js b/dist/constants.js new file mode 100644 index 000000000..71d23040d --- /dev/null +++ b/dist/constants.js @@ -0,0 +1,65 @@ +/** @constant */ +export var APP_TOPIC = 'APP'; +export var APP_PUBSUB_INITIALIZED = "".concat(APP_TOPIC, ".PUBSUB_INITIALIZED"); + +/** + * Event published when the application initialization sequence has finished loading any dynamic + * configuration setup in a custom config handler. + * + * @event + */ +export var APP_CONFIG_INITIALIZED = "".concat(APP_TOPIC, ".CONFIG_INITIALIZED"); + +/** + * Event published when the application initialization sequence has finished determining the user's + * authentication state, creating an authenticated API client, and executing auth handlers. + * + * @event + */ +export var APP_AUTH_INITIALIZED = "".concat(APP_TOPIC, ".AUTH_INITIALIZED"); + +/** + * Event published when the application initialization sequence has finished initializing + * internationalization and executing any i18n handlers. + * + * @event + */ +export var APP_I18N_INITIALIZED = "".concat(APP_TOPIC, ".I18N_INITIALIZED"); + +/** + * Event published when the application initialization sequence has finished initializing the + * logging service and executing any logging handlers. + * + * @event + */ +export var APP_LOGGING_INITIALIZED = "".concat(APP_TOPIC, ".LOGGING_INITIALIZED"); + +/** + * Event published when the application initialization sequence has finished initializing the + * analytics service and executing any analytics handlers. + * + * @event + */ +export var APP_ANALYTICS_INITIALIZED = "".concat(APP_TOPIC, ".ANALYTICS_INITIALIZED"); + +/** + * Event published when the application initialization sequence has finished. Applications should + * subscribe to this event and start rendering the UI when it has fired. + * + * @event + */ +export var APP_READY = "".concat(APP_TOPIC, ".READY"); + +/** + * Event published when the application initialization sequence has aborted. This is frequently + * used to show an error page when an initialization error has occurred. + * + * @see {@link module:React~ErrorPage} + * @event + */ +export var APP_INIT_ERROR = "".concat(APP_TOPIC, ".INIT_ERROR"); + +/** @constant */ +export var CONFIG_TOPIC = 'CONFIG'; +export var CONFIG_CHANGED = "".concat(CONFIG_TOPIC, ".CHANGED"); +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/dist/constants.js.map b/dist/constants.js.map new file mode 100644 index 000000000..630735411 --- /dev/null +++ b/dist/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","names":["APP_TOPIC","APP_PUBSUB_INITIALIZED","concat","APP_CONFIG_INITIALIZED","APP_AUTH_INITIALIZED","APP_I18N_INITIALIZED","APP_LOGGING_INITIALIZED","APP_ANALYTICS_INITIALIZED","APP_READY","APP_INIT_ERROR","CONFIG_TOPIC","CONFIG_CHANGED"],"sources":["../src/constants.js"],"sourcesContent":["/** @constant */\nexport const APP_TOPIC = 'APP';\n\nexport const APP_PUBSUB_INITIALIZED = `${APP_TOPIC}.PUBSUB_INITIALIZED`;\n\n/**\n * Event published when the application initialization sequence has finished loading any dynamic\n * configuration setup in a custom config handler.\n *\n * @event\n */\nexport const APP_CONFIG_INITIALIZED = `${APP_TOPIC}.CONFIG_INITIALIZED`;\n\n/**\n * Event published when the application initialization sequence has finished determining the user's\n * authentication state, creating an authenticated API client, and executing auth handlers.\n *\n * @event\n */\nexport const APP_AUTH_INITIALIZED = `${APP_TOPIC}.AUTH_INITIALIZED`;\n\n/**\n * Event published when the application initialization sequence has finished initializing\n * internationalization and executing any i18n handlers.\n *\n * @event\n */\nexport const APP_I18N_INITIALIZED = `${APP_TOPIC}.I18N_INITIALIZED`;\n\n/**\n * Event published when the application initialization sequence has finished initializing the\n * logging service and executing any logging handlers.\n *\n * @event\n */\nexport const APP_LOGGING_INITIALIZED = `${APP_TOPIC}.LOGGING_INITIALIZED`;\n\n/**\n * Event published when the application initialization sequence has finished initializing the\n * analytics service and executing any analytics handlers.\n *\n * @event\n */\nexport const APP_ANALYTICS_INITIALIZED = `${APP_TOPIC}.ANALYTICS_INITIALIZED`;\n\n/**\n * Event published when the application initialization sequence has finished. Applications should\n * subscribe to this event and start rendering the UI when it has fired.\n *\n * @event\n */\nexport const APP_READY = `${APP_TOPIC}.READY`;\n\n/**\n * Event published when the application initialization sequence has aborted. This is frequently\n * used to show an error page when an initialization error has occurred.\n *\n * @see {@link module:React~ErrorPage}\n * @event\n */\nexport const APP_INIT_ERROR = `${APP_TOPIC}.INIT_ERROR`;\n\n/** @constant */\nexport const CONFIG_TOPIC = 'CONFIG';\n\nexport const CONFIG_CHANGED = `${CONFIG_TOPIC}.CHANGED`;\n"],"mappings":"AAAA;AACA,OAAO,IAAMA,SAAS,GAAG,KAAK;AAE9B,OAAO,IAAMC,sBAAsB,MAAAC,MAAA,CAAMF,SAAS,wBAAqB;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMG,sBAAsB,MAAAD,MAAA,CAAMF,SAAS,wBAAqB;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMI,oBAAoB,MAAAF,MAAA,CAAMF,SAAS,sBAAmB;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMK,oBAAoB,MAAAH,MAAA,CAAMF,SAAS,sBAAmB;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMM,uBAAuB,MAAAJ,MAAA,CAAMF,SAAS,yBAAsB;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMO,yBAAyB,MAAAL,MAAA,CAAMF,SAAS,2BAAwB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMQ,SAAS,MAAAN,MAAA,CAAMF,SAAS,WAAQ;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMS,cAAc,MAAAP,MAAA,CAAMF,SAAS,gBAAa;;AAEvD;AACA,OAAO,IAAMU,YAAY,GAAG,QAAQ;AAEpC,OAAO,IAAMC,cAAc,MAAAT,MAAA,CAAMQ,YAAY,aAAU","ignoreList":[]} \ No newline at end of file diff --git a/dist/i18n/countries.js b/dist/i18n/countries.js new file mode 100644 index 000000000..30c9f3da2 --- /dev/null +++ b/dist/i18n/countries.js @@ -0,0 +1,70 @@ +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +/* eslint-disable import/extensions */ +import COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries'; +import { getPrimaryLanguageSubtag } from './lib'; + +/* + * COUNTRY LISTS + * + * Lists of country names localized in supported languages. + * + * TODO: When we start dynamically loading translations only for the current locale, change this. + */ + +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ar.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/en.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/es.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/fr.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/zh.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ca.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/he.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/id.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ko.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/pl.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/pt.json')); +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ru.json')); +// COUNTRIES.registerLocale(require('i18n-iso-countries/langs/th.json')); // Doesn't exist in lib. +COUNTRIES.registerLocale(require('i18n-iso-countries/langs/uk.json')); + +/** + * Provides a lookup table of country IDs to country names for the current locale. + * + * @memberof module:I18n + */ +export function getCountryMessages(locale) { + var primaryLanguageSubtag = getPrimaryLanguageSubtag(locale); + var languageCode = countryLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en'; + return COUNTRIES.getNames(languageCode); +} + +/** + * Provides a list of countries represented as objects of the following shape: + * + * { + * key, // The ID of the country + * name // The localized name of the country + * } + * + * TODO: ARCH-878: The list should be sorted alphabetically in the current locale. + * This is useful for populating dropdowns. + * + * @memberof module:I18n + */ +export function getCountryList(locale) { + var countryMessages = getCountryMessages(locale); + return Object.entries(countryMessages).map(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + code = _ref2[0], + name = _ref2[1]; + return { + code: code, + name: name + }; + }); +} +//# sourceMappingURL=countries.js.map \ No newline at end of file diff --git a/dist/i18n/countries.js.map b/dist/i18n/countries.js.map new file mode 100644 index 000000000..3949049a9 --- /dev/null +++ b/dist/i18n/countries.js.map @@ -0,0 +1 @@ +{"version":3,"file":"countries.js","names":["COUNTRIES","langs","countryLangs","getPrimaryLanguageSubtag","registerLocale","require","getCountryMessages","locale","primaryLanguageSubtag","languageCode","includes","getNames","getCountryList","countryMessages","Object","entries","map","_ref","_ref2","_slicedToArray","code","name"],"sources":["../../src/i18n/countries.js"],"sourcesContent":["/* eslint-disable import/extensions */\nimport COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries';\n\nimport { getPrimaryLanguageSubtag } from './lib';\n\n/*\n * COUNTRY LISTS\n *\n * Lists of country names localized in supported languages.\n *\n * TODO: When we start dynamically loading translations only for the current locale, change this.\n */\n\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ar.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/en.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/es.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/fr.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/zh.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ca.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/he.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/id.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ko.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/pl.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/pt.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ru.json'));\n// COUNTRIES.registerLocale(require('i18n-iso-countries/langs/th.json')); // Doesn't exist in lib.\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/uk.json'));\n\n/**\n * Provides a lookup table of country IDs to country names for the current locale.\n *\n * @memberof module:I18n\n */\nexport function getCountryMessages(locale) {\n const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale);\n const languageCode = countryLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en';\n\n return COUNTRIES.getNames(languageCode);\n}\n\n/**\n * Provides a list of countries represented as objects of the following shape:\n *\n * {\n * key, // The ID of the country\n * name // The localized name of the country\n * }\n *\n * TODO: ARCH-878: The list should be sorted alphabetically in the current locale.\n * This is useful for populating dropdowns.\n *\n * @memberof module:I18n\n */\nexport function getCountryList(locale) {\n const countryMessages = getCountryMessages(locale);\n return Object.entries(countryMessages).map(([code, name]) => ({ code, name }));\n}\n"],"mappings":";;;;;;AAAA;AACA,OAAOA,SAAS,IAAIC,KAAK,IAAIC,YAAY,QAAQ,oBAAoB;AAErE,SAASC,wBAAwB,QAAQ,OAAO;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEAH,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrEL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrE;AACAL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,kCAAkC,CAAC,CAAC;;AAErE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAACC,MAAM,EAAE;EACzC,IAAMC,qBAAqB,GAAGL,wBAAwB,CAACI,MAAM,CAAC;EAC9D,IAAME,YAAY,GAAGP,YAAY,CAAC,CAAC,CAACQ,QAAQ,CAACF,qBAAqB,CAAC,GAAGA,qBAAqB,GAAG,IAAI;EAElG,OAAOR,SAAS,CAACW,QAAQ,CAACF,YAAY,CAAC;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,cAAcA,CAACL,MAAM,EAAE;EACrC,IAAMM,eAAe,GAAGP,kBAAkB,CAACC,MAAM,CAAC;EAClD,OAAOO,MAAM,CAACC,OAAO,CAACF,eAAe,CAAC,CAACG,GAAG,CAAC,UAAAC,IAAA;IAAA,IAAAC,KAAA,GAAAC,cAAA,CAAAF,IAAA;MAAEG,IAAI,GAAAF,KAAA;MAAEG,IAAI,GAAAH,KAAA;IAAA,OAAO;MAAEE,IAAI,EAAJA,IAAI;MAAEC,IAAI,EAAJA;IAAK,CAAC;EAAA,CAAC,CAAC;AAChF","ignoreList":[]} \ No newline at end of file diff --git a/dist/i18n/index.js b/dist/i18n/index.js new file mode 100644 index 000000000..8daec8009 --- /dev/null +++ b/dist/i18n/index.js @@ -0,0 +1,91 @@ +/** + * #### Import members from **@edx/frontend-platform/i18n** + * The i18n module relies on react-intl and re-exports all of that package's exports. + * + * For each locale we want to support, react-intl needs 1) the locale-data, which includes + * information about how to format numbers, handle plurals, etc., and 2) the translations, as an + * object holding message id / translated string pairs. A locale string and the messages object are + * passed into the IntlProvider element that wraps your element hierarchy. + * + * Note that react-intl has no way of checking if the translations you give it actually have + * anything to do with the locale you pass it; it will happily use whatever messages object you pass + * in. However, if the locale data for the locale you passed into the IntlProvider was not + * correctly installed with addLocaleData, all of your translations will fall back to the default + * (in our case English), *even if you gave IntlProvider the correct messages object for that + * locale*. + * + * Messages are provided to this module via the configure() function below. + * + * + * @module Internationalization + * @see {@link https://github.com/openedx/frontend-platform/blob/master/docs/how_tos/i18n.rst} + * @see {@link https://formatjs.io/docs/react-intl/components/ Intl} for components exported from this module. + * + */ + +/** + * @name createIntl + * @kind function + * @see {@link https://formatjs.io/docs/react-intl/api#createIntl Intl} + */ + +/** + * @name FormattedDate + * @kind class + * @see {@link https://formatjs.io/docs/react-intl/components/#formatteddate Intl} + */ + +/** + * @name FormattedTime + * @kind class + * @see {@link https://formatjs.io/docs/react-intl/components/#formattedtime Intl} + */ + +/** + * @name FormattedRelativeTime + * @kind class + * @see {@link https://formatjs.io/docs/react-intl/components/#formattedrelativetime Intl} + */ + +/** + * @name FormattedNumber + * @kind class + * @see {@link https://formatjs.io/docs/react-intl/components/#formattednumber Intl} + */ + +/** + * @name FormattedPlural + * @kind class + * @see {@link https://formatjs.io/docs/react-intl/components/#formattedplural Intl} + */ + +/** + * @name FormattedMessage + * @kind class + * @see {@link https://formatjs.io/docs/react-intl/components/#formattedmessage Intl} + */ + +/** + * @name IntlProvider + * @kind class + * @see {@link https://formatjs.io/docs/react-intl/components/#intlprovider Intl} + */ + +/** + * @name defineMessages + * @kind function + * @see {@link https://formatjs.io/docs/react-intl/api#definemessagesdefinemessage Intl} + */ + +/** + * @name useIntl + * @kind function + * @see {@link https://formatjs.io/docs/react-intl/api#useIntl Intl} + */ + +export { createIntl, FormattedDate, FormattedTime, FormattedRelativeTime, FormattedNumber, FormattedPlural, FormattedMessage, defineMessages, IntlProvider, useIntl } from 'react-intl'; +export { intlShape, configure, getPrimaryLanguageSubtag, getLocale, getMessages, isRtl, handleRtl, mergeMessages, LOCALE_CHANGED, LOCALE_TOPIC } from './lib'; +export { default as injectIntl } from './injectIntlWithShim'; +export { getCountryList, getCountryMessages } from './countries'; +export { getLanguageList, getLanguageMessages } from './languages'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/i18n/index.js.map b/dist/i18n/index.js.map new file mode 100644 index 000000000..3d87cf949 --- /dev/null +++ b/dist/i18n/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","names":["createIntl","FormattedDate","FormattedTime","FormattedRelativeTime","FormattedNumber","FormattedPlural","FormattedMessage","defineMessages","IntlProvider","useIntl","intlShape","configure","getPrimaryLanguageSubtag","getLocale","getMessages","isRtl","handleRtl","mergeMessages","LOCALE_CHANGED","LOCALE_TOPIC","default","injectIntl","getCountryList","getCountryMessages","getLanguageList","getLanguageMessages"],"sources":["../../src/i18n/index.js"],"sourcesContent":["/**\n * #### Import members from **@edx/frontend-platform/i18n**\n * The i18n module relies on react-intl and re-exports all of that package's exports.\n *\n * For each locale we want to support, react-intl needs 1) the locale-data, which includes\n * information about how to format numbers, handle plurals, etc., and 2) the translations, as an\n * object holding message id / translated string pairs. A locale string and the messages object are\n * passed into the IntlProvider element that wraps your element hierarchy.\n *\n * Note that react-intl has no way of checking if the translations you give it actually have\n * anything to do with the locale you pass it; it will happily use whatever messages object you pass\n * in. However, if the locale data for the locale you passed into the IntlProvider was not\n * correctly installed with addLocaleData, all of your translations will fall back to the default\n * (in our case English), *even if you gave IntlProvider the correct messages object for that\n * locale*.\n *\n * Messages are provided to this module via the configure() function below.\n *\n *\n * @module Internationalization\n * @see {@link https://github.com/openedx/frontend-platform/blob/master/docs/how_tos/i18n.rst}\n * @see {@link https://formatjs.io/docs/react-intl/components/ Intl} for components exported from this module.\n *\n */\n\n/**\n * @name createIntl\n * @kind function\n * @see {@link https://formatjs.io/docs/react-intl/api#createIntl Intl}\n */\n\n/**\n * @name FormattedDate\n * @kind class\n * @see {@link https://formatjs.io/docs/react-intl/components/#formatteddate Intl}\n */\n\n/**\n * @name FormattedTime\n * @kind class\n * @see {@link https://formatjs.io/docs/react-intl/components/#formattedtime Intl}\n */\n\n/**\n * @name FormattedRelativeTime\n * @kind class\n * @see {@link https://formatjs.io/docs/react-intl/components/#formattedrelativetime Intl}\n */\n\n/**\n * @name FormattedNumber\n * @kind class\n * @see {@link https://formatjs.io/docs/react-intl/components/#formattednumber Intl}\n */\n\n/**\n * @name FormattedPlural\n * @kind class\n * @see {@link https://formatjs.io/docs/react-intl/components/#formattedplural Intl}\n */\n\n/**\n * @name FormattedMessage\n * @kind class\n * @see {@link https://formatjs.io/docs/react-intl/components/#formattedmessage Intl}\n */\n\n/**\n * @name IntlProvider\n * @kind class\n * @see {@link https://formatjs.io/docs/react-intl/components/#intlprovider Intl}\n */\n\n/**\n * @name defineMessages\n * @kind function\n * @see {@link https://formatjs.io/docs/react-intl/api#definemessagesdefinemessage Intl}\n */\n\n/**\n * @name useIntl\n * @kind function\n * @see {@link https://formatjs.io/docs/react-intl/api#useIntl Intl}\n */\n\nexport {\n createIntl,\n FormattedDate,\n FormattedTime,\n FormattedRelativeTime,\n FormattedNumber,\n FormattedPlural,\n FormattedMessage,\n defineMessages,\n IntlProvider,\n useIntl,\n} from 'react-intl';\n\nexport {\n intlShape,\n configure,\n getPrimaryLanguageSubtag,\n getLocale,\n getMessages,\n isRtl,\n handleRtl,\n mergeMessages,\n LOCALE_CHANGED,\n LOCALE_TOPIC,\n} from './lib';\n\nexport {\n default as injectIntl,\n} from './injectIntlWithShim';\n\nexport {\n getCountryList,\n getCountryMessages,\n} from './countries';\n\nexport {\n getLanguageList,\n getLanguageMessages,\n} from './languages';\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,SACEA,UAAU,EACVC,aAAa,EACbC,aAAa,EACbC,qBAAqB,EACrBC,eAAe,EACfC,eAAe,EACfC,gBAAgB,EAChBC,cAAc,EACdC,YAAY,EACZC,OAAO,QACF,YAAY;AAEnB,SACEC,SAAS,EACTC,SAAS,EACTC,wBAAwB,EACxBC,SAAS,EACTC,WAAW,EACXC,KAAK,EACLC,SAAS,EACTC,aAAa,EACbC,cAAc,EACdC,YAAY,QACP,OAAO;AAEd,SACEC,OAAO,IAAIC,UAAU,QAChB,sBAAsB;AAE7B,SACEC,cAAc,EACdC,kBAAkB,QACb,aAAa;AAEpB,SACEC,eAAe,EACfC,mBAAmB,QACd,aAAa","ignoreList":[]} \ No newline at end of file diff --git a/dist/i18n/injectIntlWithShim.js b/dist/i18n/injectIntlWithShim.js new file mode 100644 index 000000000..76c9b721b --- /dev/null +++ b/dist/i18n/injectIntlWithShim.js @@ -0,0 +1,70 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +import React from 'react'; +import { injectIntl } from 'react-intl'; +import { getLoggingService, intlShape } from './lib'; + +/** + * This function wraps react-intl's injectIntl function in order to add error logging to the intl + * property's formatMessage function. + * + * @memberof I18n + */ +var injectIntlWithShim = function injectIntlWithShim(WrappedComponent) { + var ShimmedIntlComponent = /*#__PURE__*/function (_React$Component) { + _inherits(ShimmedIntlComponent, _React$Component); + function ShimmedIntlComponent(props) { + var _this; + _classCallCheck(this, ShimmedIntlComponent); + _this = _callSuper(this, ShimmedIntlComponent, [props]); + _this.shimmedIntl = Object.create(_this.props.intl, { + formatMessage: { + value: function value(definition) { + var _this$props$intl; + if (definition === undefined || definition.id === undefined) { + var error = new Error('i18n error: An undefined message was supplied to intl.formatMessage.'); + if (process.env.NODE_ENV !== 'production') { + console.error(error); // eslint-disable-line no-console + return '!!! Missing message supplied to intl.formatMessage !!!'; + } + getLoggingService().logError(error); + return ''; // Fail silently in production + } + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return (_this$props$intl = _this.props.intl).formatMessage.apply(_this$props$intl, [definition].concat(args)); + } + } + }); + return _this; + } + _createClass(ShimmedIntlComponent, [{ + key: "render", + value: function render() { + return /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, this.props, { + intl: this.shimmedIntl + })); + } + }]); + return ShimmedIntlComponent; + }(React.Component); + ShimmedIntlComponent.propTypes = { + intl: intlShape.isRequired + }; + return injectIntl(ShimmedIntlComponent); +}; +export default injectIntlWithShim; +//# sourceMappingURL=injectIntlWithShim.js.map \ No newline at end of file diff --git a/dist/i18n/injectIntlWithShim.js.map b/dist/i18n/injectIntlWithShim.js.map new file mode 100644 index 000000000..677eb4026 --- /dev/null +++ b/dist/i18n/injectIntlWithShim.js.map @@ -0,0 +1 @@ +{"version":3,"file":"injectIntlWithShim.js","names":["React","injectIntl","getLoggingService","intlShape","injectIntlWithShim","WrappedComponent","ShimmedIntlComponent","_React$Component","_inherits","props","_this","_classCallCheck","_callSuper","shimmedIntl","Object","create","intl","formatMessage","value","definition","_this$props$intl","undefined","id","error","Error","process","env","NODE_ENV","console","logError","_len","arguments","length","args","Array","_key","apply","concat","_createClass","key","render","createElement","_extends","Component","propTypes","isRequired"],"sources":["../../src/i18n/injectIntlWithShim.jsx"],"sourcesContent":["import React from 'react';\nimport { injectIntl } from 'react-intl';\nimport { getLoggingService, intlShape } from './lib';\n\n/**\n * This function wraps react-intl's injectIntl function in order to add error logging to the intl\n * property's formatMessage function.\n *\n * @memberof I18n\n */\nconst injectIntlWithShim = (WrappedComponent) => {\n class ShimmedIntlComponent extends React.Component {\n constructor(props) {\n super(props);\n this.shimmedIntl = Object.create(this.props.intl, {\n formatMessage: {\n value: (definition, ...args) => {\n if (definition === undefined || definition.id === undefined) {\n const error = new Error('i18n error: An undefined message was supplied to intl.formatMessage.');\n if (process.env.NODE_ENV !== 'production') {\n console.error(error); // eslint-disable-line no-console\n return '!!! Missing message supplied to intl.formatMessage !!!';\n }\n getLoggingService().logError(error);\n return ''; // Fail silently in production\n }\n return this.props.intl.formatMessage(definition, ...args);\n },\n },\n });\n }\n\n render() {\n return ;\n }\n }\n\n ShimmedIntlComponent.propTypes = {\n intl: intlShape.isRequired,\n };\n\n return injectIntl(ShimmedIntlComponent);\n};\n\nexport default injectIntlWithShim;\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,YAAY;AACvC,SAASC,iBAAiB,EAAEC,SAAS,QAAQ,OAAO;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,kBAAkB,GAAG,SAArBA,kBAAkBA,CAAIC,gBAAgB,EAAK;EAAA,IACzCC,oBAAoB,0BAAAC,gBAAA;IAAAC,SAAA,CAAAF,oBAAA,EAAAC,gBAAA;IACxB,SAAAD,qBAAYG,KAAK,EAAE;MAAA,IAAAC,KAAA;MAAAC,eAAA,OAAAL,oBAAA;MACjBI,KAAA,GAAAE,UAAA,OAAAN,oBAAA,GAAMG,KAAK;MACXC,KAAA,CAAKG,WAAW,GAAGC,MAAM,CAACC,MAAM,CAACL,KAAA,CAAKD,KAAK,CAACO,IAAI,EAAE;QAChDC,aAAa,EAAE;UACbC,KAAK,EAAE,SAAAA,MAACC,UAAU,EAAc;YAAA,IAAAC,gBAAA;YAC9B,IAAID,UAAU,KAAKE,SAAS,IAAIF,UAAU,CAACG,EAAE,KAAKD,SAAS,EAAE;cAC3D,IAAME,KAAK,GAAG,IAAIC,KAAK,CAAC,sEAAsE,CAAC;cAC/F,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;gBACzCC,OAAO,CAACL,KAAK,CAACA,KAAK,CAAC,CAAC,CAAC;gBACtB,OAAO,wDAAwD;cACjE;cACArB,iBAAiB,CAAC,CAAC,CAAC2B,QAAQ,CAACN,KAAK,CAAC;cACnC,OAAO,EAAE,CAAC,CAAC;YACb;YAAC,SAAAO,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAToBC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;cAAJF,IAAI,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;YAAA;YAUzB,OAAO,CAAAf,gBAAA,GAAAV,KAAA,CAAKD,KAAK,CAACO,IAAI,EAACC,aAAa,CAAAmB,KAAA,CAAAhB,gBAAA,GAACD,UAAU,EAAAkB,MAAA,CAAKJ,IAAI,EAAC;UAC3D;QACF;MACF,CAAC,CAAC;MAAC,OAAAvB,KAAA;IACL;IAAC4B,YAAA,CAAAhC,oBAAA;MAAAiC,GAAA;MAAArB,KAAA,EAED,SAAAsB,OAAA,EAAS;QACP,oBAAOxC,KAAA,CAAAyC,aAAA,CAACpC,gBAAgB,EAAAqC,QAAA,KAAK,IAAI,CAACjC,KAAK;UAAEO,IAAI,EAAE,IAAI,CAACH;QAAY,EAAE,CAAC;MACrE;IAAC;IAAA,OAAAP,oBAAA;EAAA,EAvBgCN,KAAK,CAAC2C,SAAS;EA0BlDrC,oBAAoB,CAACsC,SAAS,GAAG;IAC/B5B,IAAI,EAAEb,SAAS,CAAC0C;EAClB,CAAC;EAED,OAAO5C,UAAU,CAACK,oBAAoB,CAAC;AACzC,CAAC;AAED,eAAeF,kBAAkB","ignoreList":[]} \ No newline at end of file diff --git a/dist/i18n/languages.js b/dist/i18n/languages.js new file mode 100644 index 000000000..4f7888bbe --- /dev/null +++ b/dist/i18n/languages.js @@ -0,0 +1,73 @@ +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +/* eslint-disable import/extensions */ +import LANGUAGES, { langs as languageLangs } from '@cospired/i18n-iso-languages'; +import { getPrimaryLanguageSubtag } from './lib'; + +/* + * LANGUAGE LISTS + * + * Lists of language names localized in supported languages. + * + * TODO: When we start dynamically loading translations only for the current locale, change this. + * TODO: Also note that a bunch of languages are missing here. They're present but commented out + * for reference. That's because they're not implemented in this library. If you read this and it's + * been a while, go check and see if that's changed! + */ + +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ar.json')); +LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/en.json')); +LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/es.json')); +LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/fr.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/zh.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ca.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/he.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/id.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ko.json')); +LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pl.json')); +LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pt.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ru.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/th.json')); +// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/uk.json')); + +/** + * Provides a lookup table of language IDs to language names for the current locale. + * + * @memberof I18n + */ +export var getLanguageMessages = function getLanguageMessages(locale) { + var primaryLanguageSubtag = getPrimaryLanguageSubtag(locale); + var languageCode = languageLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en'; + return LANGUAGES.getNames(languageCode); +}; + +/** + * Provides a list of languages represented as objects of the following shape: + * + * { + * key, // The ID of the language + * name // The localized name of the language + * } + * + * TODO: ARCH-878: The list should be sorted alphabetically in the current locale. + * This is useful for populating dropdowns. + * + * @memberof I18n + */ +export var getLanguageList = function getLanguageList(locale) { + var languageMessages = getLanguageMessages(locale); + return Object.entries(languageMessages).map(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + code = _ref2[0], + name = _ref2[1]; + return { + code: code, + name: name + }; + }); +}; +//# sourceMappingURL=languages.js.map \ No newline at end of file diff --git a/dist/i18n/languages.js.map b/dist/i18n/languages.js.map new file mode 100644 index 000000000..908f80af0 --- /dev/null +++ b/dist/i18n/languages.js.map @@ -0,0 +1 @@ +{"version":3,"file":"languages.js","names":["LANGUAGES","langs","languageLangs","getPrimaryLanguageSubtag","registerLocale","require","getLanguageMessages","locale","primaryLanguageSubtag","languageCode","includes","getNames","getLanguageList","languageMessages","Object","entries","map","_ref","_ref2","_slicedToArray","code","name"],"sources":["../../src/i18n/languages.js"],"sourcesContent":["/* eslint-disable import/extensions */\nimport LANGUAGES, { langs as languageLangs } from '@cospired/i18n-iso-languages';\n\nimport { getPrimaryLanguageSubtag } from './lib';\n\n/*\n * LANGUAGE LISTS\n *\n * Lists of language names localized in supported languages.\n *\n * TODO: When we start dynamically loading translations only for the current locale, change this.\n * TODO: Also note that a bunch of languages are missing here. They're present but commented out\n * for reference. That's because they're not implemented in this library. If you read this and it's\n * been a while, go check and see if that's changed!\n */\n\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ar.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/en.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/es.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/fr.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/zh.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ca.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/he.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/id.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ko.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pl.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pt.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ru.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/th.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/uk.json'));\n\n/**\n * Provides a lookup table of language IDs to language names for the current locale.\n *\n * @memberof I18n\n */\nexport const getLanguageMessages = (locale) => {\n const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale);\n const languageCode = languageLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en';\n\n return LANGUAGES.getNames(languageCode);\n};\n\n/**\n * Provides a list of languages represented as objects of the following shape:\n *\n * {\n * key, // The ID of the language\n * name // The localized name of the language\n * }\n *\n * TODO: ARCH-878: The list should be sorted alphabetically in the current locale.\n * This is useful for populating dropdowns.\n *\n * @memberof I18n\n */\nexport const getLanguageList = (locale) => {\n const languageMessages = getLanguageMessages(locale);\n return Object.entries(languageMessages).map(([code, name]) => ({ code, name }));\n};\n"],"mappings":";;;;;;AAAA;AACA,OAAOA,SAAS,IAAIC,KAAK,IAAIC,aAAa,QAAQ,8BAA8B;AAEhF,SAASC,wBAAwB,QAAQ,OAAO;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACAH,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,4CAA4C,CAAC,CAAC;AAC/EL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,4CAA4C,CAAC,CAAC;AAC/EL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,4CAA4C,CAAC,CAAC;AAC/E;AACA;AACA;AACA;AACA;AACAL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,4CAA4C,CAAC,CAAC;AAC/EL,SAAS,CAACI,cAAc,CAACC,OAAO,CAAC,4CAA4C,CAAC,CAAC;AAC/E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAIC,MAAM,EAAK;EAC7C,IAAMC,qBAAqB,GAAGL,wBAAwB,CAACI,MAAM,CAAC;EAC9D,IAAME,YAAY,GAAGP,aAAa,CAAC,CAAC,CAACQ,QAAQ,CAACF,qBAAqB,CAAC,GAAGA,qBAAqB,GAAG,IAAI;EAEnG,OAAOR,SAAS,CAACW,QAAQ,CAACF,YAAY,CAAC;AACzC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMG,eAAe,GAAG,SAAlBA,eAAeA,CAAIL,MAAM,EAAK;EACzC,IAAMM,gBAAgB,GAAGP,mBAAmB,CAACC,MAAM,CAAC;EACpD,OAAOO,MAAM,CAACC,OAAO,CAACF,gBAAgB,CAAC,CAACG,GAAG,CAAC,UAAAC,IAAA;IAAA,IAAAC,KAAA,GAAAC,cAAA,CAAAF,IAAA;MAAEG,IAAI,GAAAF,KAAA;MAAEG,IAAI,GAAAH,KAAA;IAAA,OAAO;MAAEE,IAAI,EAAJA,IAAI;MAAEC,IAAI,EAAJA;IAAK,CAAC;EAAA,CAAC,CAAC;AACjF,CAAC","ignoreList":[]} \ No newline at end of file diff --git a/dist/i18n/lib.js b/dist/i18n/lib.js new file mode 100644 index 000000000..c8643bdb4 --- /dev/null +++ b/dist/i18n/lib.js @@ -0,0 +1,307 @@ +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +import PropTypes from 'prop-types'; +import Cookies from 'universal-cookie'; +import merge from 'lodash.merge'; +import '@formatjs/intl-pluralrules/polyfill'; +import '@formatjs/intl-pluralrules/locale-data/ar'; +import '@formatjs/intl-pluralrules/locale-data/en'; +import '@formatjs/intl-pluralrules/locale-data/es'; +import '@formatjs/intl-pluralrules/locale-data/fr'; +import '@formatjs/intl-pluralrules/locale-data/zh'; +import '@formatjs/intl-pluralrules/locale-data/ca'; +import '@formatjs/intl-pluralrules/locale-data/he'; +import '@formatjs/intl-pluralrules/locale-data/id'; +import '@formatjs/intl-pluralrules/locale-data/ko'; +import '@formatjs/intl-pluralrules/locale-data/pl'; +import '@formatjs/intl-pluralrules/locale-data/pt'; +import '@formatjs/intl-pluralrules/locale-data/ru'; +import '@formatjs/intl-pluralrules/locale-data/th'; +import '@formatjs/intl-pluralrules/locale-data/uk'; +import '@formatjs/intl-relativetimeformat/polyfill'; +import '@formatjs/intl-relativetimeformat/locale-data/ar'; +import '@formatjs/intl-relativetimeformat/locale-data/en'; +import '@formatjs/intl-relativetimeformat/locale-data/es'; +import '@formatjs/intl-relativetimeformat/locale-data/fr'; +import '@formatjs/intl-relativetimeformat/locale-data/zh'; +import '@formatjs/intl-relativetimeformat/locale-data/ca'; +import '@formatjs/intl-relativetimeformat/locale-data/he'; +import '@formatjs/intl-relativetimeformat/locale-data/id'; +import '@formatjs/intl-relativetimeformat/locale-data/ko'; +import '@formatjs/intl-relativetimeformat/locale-data/pl'; +import '@formatjs/intl-relativetimeformat/locale-data/pt'; +import '@formatjs/intl-relativetimeformat/locale-data/ru'; +import '@formatjs/intl-relativetimeformat/locale-data/th'; +import '@formatjs/intl-relativetimeformat/locale-data/uk'; +var cookies = new Cookies(); +var supportedLocales = ['ar', +// Arabic +// NOTE: 'en' is not included in this list intentionally, since it's the fallback. +'es-419', +// Spanish, Latin American +'fa', +// Farsi +'fa-ir', +// Farsi, Iran +'fr', +// French +'zh-cn', +// Chinese, Simplified +'ca', +// Catalan +'he', +// Hebrew +'id', +// Indonesian +'ko-kr', +// Korean (Korea) +'pl', +// Polish +'pt-br', +// Portuguese (Brazil) +'ru', +// Russian +'th', +// Thai +'uk' // Ukrainian +]; +var rtlLocales = ['ar', +// Arabic +'he', +// Hebrew +'fa', +// Farsi (not currently supported) +'fa-ir', +// Farsi Iran +'ur' // Urdu (not currently supported) +]; +var config = null; +var loggingService = null; +var messages = null; + +/** + * @memberof module:Internationalization + * + * Prior versions of react-intl (our primary implementation of the i18n service) included a + * PropTypes-based 'shape' for its `intl` object. This has since been removed. For legacy + * compatibility, we include an `intlShape` export that is set to PropTypes.object. Usage of this + * export is deprecated. + * + * @deprecated + */ +export var intlShape = PropTypes.object; + +/** + * + * @ignore + * @returns {LoggingService} + */ +export var getLoggingService = function getLoggingService() { + return loggingService; +}; + +/** + * @memberof module:Internationalization + */ +export var LOCALE_TOPIC = 'LOCALE'; + +/** + * @memberof module:Internationalization + */ +export var LOCALE_CHANGED = "".concat(LOCALE_TOPIC, ".CHANGED"); + +/** + * + * @memberof module:Internationalization + * @returns {Cookies} + */ +export function getCookies() { + return cookies; +} + +/** + * Some of our dependencies function on primary language subtags, rather than full locales. + * This function strips a locale down to that first subtag. Depending on the code, this + * may be 2 or more characters. + * + * @param {string} code + * @memberof module:Internationalization + */ +export function getPrimaryLanguageSubtag(code) { + return code.split('-')[0]; +} + +/** + * Finds the closest supported locale to the one provided. This is done in three steps: + * + * 1. Returning the locale itself if its exact language code is supported. + * 2. Returning the primary language subtag of the language code if it is supported (ar for ar-eg, + * for instance). + * 3. Returning 'en' if neither of the above produce a supported locale. + * + * @param {string} locale + * @returns {string} + * @memberof module:Internationalization + */ +export function findSupportedLocale(locale) { + if (messages[locale] !== undefined) { + return locale; + } + if (messages[getPrimaryLanguageSubtag(locale)] !== undefined) { + return getPrimaryLanguageSubtag(locale); + } + return 'en'; +} + +/** + * Get the locale from the cookie or, failing that, the browser setting. + * Gracefully fall back to a more general primary language subtag or to English (en) + * if we don't support that language. + * + * @param {string} locale If a locale is provided, returns the closest supported locale. Optional. + * @throws An error if i18n has not yet been configured. + * @returns {string} + * @memberof module:Internationalization + */ +export function getLocale(locale) { + if (messages === null) { + throw new Error('getLocale called before configuring i18n. Call configure with messages first.'); + } + // 1. Explicit application request + if (locale !== undefined) { + return findSupportedLocale(locale); + } + // 2. User setting in cookie + var cookieLangPref = cookies.get(config.LANGUAGE_PREFERENCE_COOKIE_NAME); + if (cookieLangPref) { + return findSupportedLocale(cookieLangPref.toLowerCase()); + } + // 3. Browser language (default) + // Note that some browers prefer upper case for the region part of the locale, while others don't. + // Thus the toLowerCase, for consistency. + // https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/language + return findSupportedLocale(global.navigator.language.toLowerCase()); +} + +/** + * Returns messages for the provided locale, or the user's preferred locale if no argument is + * provided. + * + * @param {string} [locale=getLocale()] + * @memberof module:Internationalization + */ +export function getMessages() { + var locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getLocale(); + return messages[locale]; +} + +/** + * Determines if the provided locale is a right-to-left language. + * + * @param {string} locale + * @memberof module:Internationalization + */ +export function isRtl(locale) { + return rtlLocales.includes(locale); +} + +/** + * Handles applying the RTL stylesheet and "dir=rtl" attribute to the html tag if the current locale + * is a RTL language. + * + * @memberof module:Internationalization + */ +export function handleRtl() { + if (isRtl(getLocale())) { + global.document.getElementsByTagName('html')[0].setAttribute('dir', 'rtl'); + } else { + global.document.getElementsByTagName('html')[0].setAttribute('dir', 'ltr'); + } +} +var messagesShape = { + ar: PropTypes.objectOf(PropTypes.string), + // Arabic + en: PropTypes.objectOf(PropTypes.string), + 'es-419': PropTypes.objectOf(PropTypes.string), + // Spanish, Latin American + fr: PropTypes.objectOf(PropTypes.string), + // French + 'zh-cn': PropTypes.objectOf(PropTypes.string), + // Chinese, Simplified + ca: PropTypes.objectOf(PropTypes.string), + // Catalan + he: PropTypes.objectOf(PropTypes.string), + // Hebrew + id: PropTypes.objectOf(PropTypes.string), + // Indonesian + 'ko-kr': PropTypes.objectOf(PropTypes.string), + // Korean (Korea) + pl: PropTypes.objectOf(PropTypes.string), + // Polish + 'pt-br': PropTypes.objectOf(PropTypes.string), + // Portuguese (Brazil) + ru: PropTypes.objectOf(PropTypes.string), + // Russian + th: PropTypes.objectOf(PropTypes.string), + // Thai + uk: PropTypes.objectOf(PropTypes.string) // Ukrainian +}; +var optionsShape = { + config: PropTypes.object.isRequired, + loggingService: PropTypes.shape({ + logError: PropTypes.func.isRequired + }).isRequired, + messages: PropTypes.oneOfType([PropTypes.shape(messagesShape), PropTypes.arrayOf(PropTypes.shape(messagesShape))]).isRequired +}; + +/** + * + * + * @param {Object} newMessages + * @returns {Object} + * @memberof module:Internationalization + */ +export function mergeMessages(newMessages) { + var msgs = Array.isArray(newMessages) ? merge.apply(void 0, [{}].concat(_toConsumableArray(newMessages))) : newMessages; + messages = merge(messages, msgs); + return messages; +} + +/** + * Configures the i18n library with messages for your application. + * + * Logs a warning if it detects a locale it doesn't expect (as defined by the supportedLocales list + * above), or if an expected locale is not provided. + * + * @param {Object} options + * @param {LoggingService} options.loggingService + * @param {Object} options.config + * @param {Object} options.messages + * @memberof module:Internationalization + */ +export function configure(options) { + PropTypes.checkPropTypes(optionsShape, options, 'property', 'i18n'); + // eslint-disable-next-line prefer-destructuring + loggingService = options.loggingService; + // eslint-disable-next-line prefer-destructuring + config = options.config; + messages = Array.isArray(options.messages) ? merge.apply(void 0, [{}].concat(_toConsumableArray(options.messages))) : options.messages; + if (config.ENVIRONMENT !== 'production') { + Object.keys(messages).forEach(function (key) { + if (supportedLocales.indexOf(key) < 0) { + console.warn("Unexpected locale: ".concat(key)); // eslint-disable-line no-console + } + }); + supportedLocales.forEach(function (key) { + if (messages[key] === undefined) { + console.warn("Missing locale: ".concat(key)); // eslint-disable-line no-console + } + }); + } + handleRtl(); +} +//# sourceMappingURL=lib.js.map \ No newline at end of file diff --git a/dist/i18n/lib.js.map b/dist/i18n/lib.js.map new file mode 100644 index 000000000..a5e2c5158 --- /dev/null +++ b/dist/i18n/lib.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lib.js","names":["PropTypes","Cookies","merge","cookies","supportedLocales","rtlLocales","config","loggingService","messages","intlShape","object","getLoggingService","LOCALE_TOPIC","LOCALE_CHANGED","concat","getCookies","getPrimaryLanguageSubtag","code","split","findSupportedLocale","locale","undefined","getLocale","Error","cookieLangPref","get","LANGUAGE_PREFERENCE_COOKIE_NAME","toLowerCase","global","navigator","language","getMessages","arguments","length","isRtl","includes","handleRtl","document","getElementsByTagName","setAttribute","messagesShape","ar","objectOf","string","en","fr","ca","he","id","pl","ru","th","uk","optionsShape","isRequired","shape","logError","func","oneOfType","arrayOf","mergeMessages","newMessages","msgs","Array","isArray","apply","_toConsumableArray","configure","options","checkPropTypes","ENVIRONMENT","Object","keys","forEach","key","indexOf","console","warn"],"sources":["../../src/i18n/lib.js"],"sourcesContent":["import PropTypes from 'prop-types';\nimport Cookies from 'universal-cookie';\nimport merge from 'lodash.merge';\n\nimport '@formatjs/intl-pluralrules/polyfill';\nimport '@formatjs/intl-pluralrules/locale-data/ar';\nimport '@formatjs/intl-pluralrules/locale-data/en';\nimport '@formatjs/intl-pluralrules/locale-data/es';\nimport '@formatjs/intl-pluralrules/locale-data/fr';\nimport '@formatjs/intl-pluralrules/locale-data/zh';\nimport '@formatjs/intl-pluralrules/locale-data/ca';\nimport '@formatjs/intl-pluralrules/locale-data/he';\nimport '@formatjs/intl-pluralrules/locale-data/id';\nimport '@formatjs/intl-pluralrules/locale-data/ko';\nimport '@formatjs/intl-pluralrules/locale-data/pl';\nimport '@formatjs/intl-pluralrules/locale-data/pt';\nimport '@formatjs/intl-pluralrules/locale-data/ru';\nimport '@formatjs/intl-pluralrules/locale-data/th';\nimport '@formatjs/intl-pluralrules/locale-data/uk';\n\nimport '@formatjs/intl-relativetimeformat/polyfill';\nimport '@formatjs/intl-relativetimeformat/locale-data/ar';\nimport '@formatjs/intl-relativetimeformat/locale-data/en';\nimport '@formatjs/intl-relativetimeformat/locale-data/es';\nimport '@formatjs/intl-relativetimeformat/locale-data/fr';\nimport '@formatjs/intl-relativetimeformat/locale-data/zh';\nimport '@formatjs/intl-relativetimeformat/locale-data/ca';\nimport '@formatjs/intl-relativetimeformat/locale-data/he';\nimport '@formatjs/intl-relativetimeformat/locale-data/id';\nimport '@formatjs/intl-relativetimeformat/locale-data/ko';\nimport '@formatjs/intl-relativetimeformat/locale-data/pl';\nimport '@formatjs/intl-relativetimeformat/locale-data/pt';\nimport '@formatjs/intl-relativetimeformat/locale-data/ru';\nimport '@formatjs/intl-relativetimeformat/locale-data/th';\nimport '@formatjs/intl-relativetimeformat/locale-data/uk';\n\nconst cookies = new Cookies();\nconst supportedLocales = [\n 'ar', // Arabic\n // NOTE: 'en' is not included in this list intentionally, since it's the fallback.\n 'es-419', // Spanish, Latin American\n 'fa', // Farsi\n 'fa-ir', // Farsi, Iran\n 'fr', // French\n 'zh-cn', // Chinese, Simplified\n 'ca', // Catalan\n 'he', // Hebrew\n 'id', // Indonesian\n 'ko-kr', // Korean (Korea)\n 'pl', // Polish\n 'pt-br', // Portuguese (Brazil)\n 'ru', // Russian\n 'th', // Thai\n 'uk', // Ukrainian\n];\nconst rtlLocales = [\n 'ar', // Arabic\n 'he', // Hebrew\n 'fa', // Farsi (not currently supported)\n 'fa-ir', // Farsi Iran\n 'ur', // Urdu (not currently supported)\n];\n\nlet config = null;\nlet loggingService = null;\nlet messages = null;\n\n/**\n * @memberof module:Internationalization\n *\n * Prior versions of react-intl (our primary implementation of the i18n service) included a\n * PropTypes-based 'shape' for its `intl` object. This has since been removed. For legacy\n * compatibility, we include an `intlShape` export that is set to PropTypes.object. Usage of this\n * export is deprecated.\n *\n * @deprecated\n */\nexport const intlShape = PropTypes.object;\n\n/**\n *\n * @ignore\n * @returns {LoggingService}\n */\nexport const getLoggingService = () => loggingService;\n\n/**\n * @memberof module:Internationalization\n */\nexport const LOCALE_TOPIC = 'LOCALE';\n\n/**\n * @memberof module:Internationalization\n */\nexport const LOCALE_CHANGED = `${LOCALE_TOPIC}.CHANGED`;\n\n/**\n *\n * @memberof module:Internationalization\n * @returns {Cookies}\n */\nexport function getCookies() {\n return cookies;\n}\n\n/**\n * Some of our dependencies function on primary language subtags, rather than full locales.\n * This function strips a locale down to that first subtag. Depending on the code, this\n * may be 2 or more characters.\n *\n * @param {string} code\n * @memberof module:Internationalization\n */\nexport function getPrimaryLanguageSubtag(code) {\n return code.split('-')[0];\n}\n\n/**\n * Finds the closest supported locale to the one provided. This is done in three steps:\n *\n * 1. Returning the locale itself if its exact language code is supported.\n * 2. Returning the primary language subtag of the language code if it is supported (ar for ar-eg,\n * for instance).\n * 3. Returning 'en' if neither of the above produce a supported locale.\n *\n * @param {string} locale\n * @returns {string}\n * @memberof module:Internationalization\n */\nexport function findSupportedLocale(locale) {\n if (messages[locale] !== undefined) {\n return locale;\n }\n\n if (messages[getPrimaryLanguageSubtag(locale)] !== undefined) {\n return getPrimaryLanguageSubtag(locale);\n }\n\n return 'en';\n}\n\n/**\n * Get the locale from the cookie or, failing that, the browser setting.\n * Gracefully fall back to a more general primary language subtag or to English (en)\n * if we don't support that language.\n *\n * @param {string} locale If a locale is provided, returns the closest supported locale. Optional.\n * @throws An error if i18n has not yet been configured.\n * @returns {string}\n * @memberof module:Internationalization\n */\nexport function getLocale(locale) {\n if (messages === null) {\n throw new Error('getLocale called before configuring i18n. Call configure with messages first.');\n }\n // 1. Explicit application request\n if (locale !== undefined) {\n return findSupportedLocale(locale);\n }\n // 2. User setting in cookie\n const cookieLangPref = cookies\n .get(config.LANGUAGE_PREFERENCE_COOKIE_NAME);\n if (cookieLangPref) {\n return findSupportedLocale(cookieLangPref.toLowerCase());\n }\n // 3. Browser language (default)\n // Note that some browers prefer upper case for the region part of the locale, while others don't.\n // Thus the toLowerCase, for consistency.\n // https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/language\n return findSupportedLocale(global.navigator.language.toLowerCase());\n}\n\n/**\n * Returns messages for the provided locale, or the user's preferred locale if no argument is\n * provided.\n *\n * @param {string} [locale=getLocale()]\n * @memberof module:Internationalization\n */\nexport function getMessages(locale = getLocale()) {\n return messages[locale];\n}\n\n/**\n * Determines if the provided locale is a right-to-left language.\n *\n * @param {string} locale\n * @memberof module:Internationalization\n */\nexport function isRtl(locale) {\n return rtlLocales.includes(locale);\n}\n\n/**\n * Handles applying the RTL stylesheet and \"dir=rtl\" attribute to the html tag if the current locale\n * is a RTL language.\n *\n * @memberof module:Internationalization\n */\nexport function handleRtl() {\n if (isRtl(getLocale())) {\n global.document.getElementsByTagName('html')[0].setAttribute('dir', 'rtl');\n } else {\n global.document.getElementsByTagName('html')[0].setAttribute('dir', 'ltr');\n }\n}\n\nconst messagesShape = {\n ar: PropTypes.objectOf(PropTypes.string), // Arabic\n en: PropTypes.objectOf(PropTypes.string),\n 'es-419': PropTypes.objectOf(PropTypes.string), // Spanish, Latin American\n fr: PropTypes.objectOf(PropTypes.string), // French\n 'zh-cn': PropTypes.objectOf(PropTypes.string), // Chinese, Simplified\n ca: PropTypes.objectOf(PropTypes.string), // Catalan\n he: PropTypes.objectOf(PropTypes.string), // Hebrew\n id: PropTypes.objectOf(PropTypes.string), // Indonesian\n 'ko-kr': PropTypes.objectOf(PropTypes.string), // Korean (Korea)\n pl: PropTypes.objectOf(PropTypes.string), // Polish\n 'pt-br': PropTypes.objectOf(PropTypes.string), // Portuguese (Brazil)\n ru: PropTypes.objectOf(PropTypes.string), // Russian\n th: PropTypes.objectOf(PropTypes.string), // Thai\n uk: PropTypes.objectOf(PropTypes.string), // Ukrainian\n};\n\nconst optionsShape = {\n config: PropTypes.object.isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n }).isRequired,\n messages: PropTypes.oneOfType([\n PropTypes.shape(messagesShape),\n PropTypes.arrayOf(PropTypes.shape(messagesShape)),\n ]).isRequired,\n};\n\n/**\n *\n *\n * @param {Object} newMessages\n * @returns {Object}\n * @memberof module:Internationalization\n */\nexport function mergeMessages(newMessages) {\n const msgs = Array.isArray(newMessages) ? merge({}, ...newMessages) : newMessages;\n messages = merge(messages, msgs);\n\n return messages;\n}\n\n/**\n * Configures the i18n library with messages for your application.\n *\n * Logs a warning if it detects a locale it doesn't expect (as defined by the supportedLocales list\n * above), or if an expected locale is not provided.\n *\n * @param {Object} options\n * @param {LoggingService} options.loggingService\n * @param {Object} options.config\n * @param {Object} options.messages\n * @memberof module:Internationalization\n */\nexport function configure(options) {\n PropTypes.checkPropTypes(optionsShape, options, 'property', 'i18n');\n // eslint-disable-next-line prefer-destructuring\n loggingService = options.loggingService;\n // eslint-disable-next-line prefer-destructuring\n config = options.config;\n messages = Array.isArray(options.messages) ? merge({}, ...options.messages) : options.messages;\n\n if (config.ENVIRONMENT !== 'production') {\n Object.keys(messages).forEach((key) => {\n if (supportedLocales.indexOf(key) < 0) {\n console.warn(`Unexpected locale: ${key}`); // eslint-disable-line no-console\n }\n });\n\n supportedLocales.forEach((key) => {\n if (messages[key] === undefined) {\n console.warn(`Missing locale: ${key}`); // eslint-disable-line no-console\n }\n });\n }\n\n handleRtl();\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/i18n/scripts/README.md b/dist/i18n/scripts/README.md new file mode 100644 index 000000000..0a3fa7bb6 --- /dev/null +++ b/dist/i18n/scripts/README.md @@ -0,0 +1,29 @@ +# i18n/scripts + +This directory contains the `transifex-utils.js` and `intl-imports.js` files which are shared across all micro-frontends. + +The package.json of `frontend-platform` includes the following sections: + +``` + "bin": { + "intl-imports.js": "i18n/scripts/intl-imports.js" + "transifex-utils.js": "i18n/scripts/transifex-utils.js" + }, +``` + +This config block causes boths scripts to be copied to the following path when `frontend-platform` is installed as a +dependency of a micro-frontend: + +``` +/node_modules/.bin/intl-imports.js +/node_modules/.bin/transifex-utils.js +``` + +All micro-frontends have a `Makefile` with a line that loads the scripts from the above path: + +``` +intl_imports = ./node_modules/.bin/intl-imports.js +transifex_utils = ./node_modules/.bin/transifex-utils.js +``` + +So if you delete either of the files or the `scripts` directory, you'll break all micro-frontend builds. Happy coding! diff --git a/dist/i18n/scripts/intl-imports.js b/dist/i18n/scripts/intl-imports.js new file mode 100755 index 000000000..52ab6828d --- /dev/null +++ b/dist/i18n/scripts/intl-imports.js @@ -0,0 +1,177 @@ +#!/usr/bin/env node +var scriptHelpDocument = "\nNAME\n intl-imports.js \u2014 Script to generate the src/i18n/index.js file that exports messages from all the languages for Micro-frontends.\n\nSYNOPSIS\n intl-imports.js [DIRECTORY ...]\n\nDESCRIPTION\n This script is intended to run after 'atlas' has pulled the files.\n \n This expects to run inside a Micro-frontend root directory with the following structure:\n \n frontend-app-learning $ tree src/i18n/\n src/i18n/\n \u251C\u2500\u2500 index.js\n \u2514\u2500\u2500 messages\n \u251C\u2500\u2500 frontend-app-example\n \u2502 \u251C\u2500\u2500 ar.json\n \u2502 \u251C\u2500\u2500 es_419.json\n \u2502 \u2514\u2500\u2500 zh_CN.json\n \u251C\u2500\u2500 frontend-component-footer\n \u2502 \u251C\u2500\u2500 ar.json\n \u2502 \u251C\u2500\u2500 es_419.json\n \u2502 \u2514\u2500\u2500 zh_CN.json\n \u2514\u2500\u2500 frontend-component-header (empty directory)\n \n \n \n With the structure above it's expected to run with the following command in Makefile:\n \n \n $ node_modules/.bin/intl-imports.js frontend-component-footer frontend-component-header frontend-app-example\n \n \n It will generate two type of files:\n \n - Main src/i18n/index.js which overrides the Micro-frontend provided with a sample output of:\n \n \"\"\"\n import messagesFromFrontendComponentFooter from './messages/frontend-component-footer';\n // Skipped import due to missing './messages/frontend-component-footer/index.js' likely due to empty translations.\n import messagesFromFrontendAppExample from './messages/frontend-app-example';\n \n export default [\n messagesFromFrontendComponentFooter,\n messagesFromFrontendAppExample,\n ];\n \"\"\"\n \n - Each sub-directory has src/i18n/messages/frontend-component-header/index.js which is imported by the main file.:\n \n \"\"\"\n import messagesOfArLanguage from './ar.json';\n import messagesOfDeLanguage from './de.json';\n import messagesOfEs419Language from './es_419.json';\n export default {\n 'ar': messagesOfArLanguage,\n 'de': messagesOfDeLanguage,\n 'es-419': messagesOfEs419Language,\n };\n \"\"\"\n"; +var fs = require('fs'); +var path = require('path'); +var camelCase = require('lodash.camelcase'); +var loggingPrefix = path.basename("".concat(__filename)); // the name of this JS file + +// Header note for generated src/i18n/index.js file +var filesCodeGeneratorNoticeHeader = "// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n"; + +/** + * Create frontend-app-example/index.js file with proper imports. + * + * @param directory - a directory name containing .json files from Transifex e.g. "frontend-app-example". + * @param log - Mockable process.stdout.write + * @param writeFileSync - Mockable fs.writeFileSync + * @param i18nDir - Path to `src/i18n` directory + * + * @return object - An object containing directory name and whether its "index.js" file was successfully written. + */ +function generateSubdirectoryMessageFile(_ref) { + var directory = _ref.directory, + log = _ref.log, + writeFileSync = _ref.writeFileSync, + i18nDir = _ref.i18nDir; + var importLines = []; + var messagesLines = []; + var counter = { + nonEmptyLanguages: 0 + }; + var messagesDir = "".concat(i18nDir, "/messages"); // The directory of Micro-frontend i18n messages + + try { + var files = fs.readdirSync("".concat(messagesDir, "/").concat(directory), { + withFileTypes: true + }); + files.sort(); // Sorting ensures a consistent generated `index.js` order of imports cross-platforms. + + var jsonFiles = files.filter(function (file) { + return file.isFile() && file.name.endsWith('.json'); + }); + if (!jsonFiles.length) { + log("".concat(loggingPrefix, ": Not creating '").concat(directory, "/index.js' because no .json translation files were found.\n")); + return { + directory: directory, + isWritten: false + }; + } + jsonFiles.forEach(function (file) { + var filename = file.name; + // Gets `fr_CA` from `fr_CA.json` + var languageCode = filename.replace(/\.json$/, ''); + // React-friendly language code fr_CA --> fr-ca + var reactIntlLanguageCode = languageCode.toLowerCase().replace(/_/g, '-'); + // camelCase variable name + var messagesCamelCaseVar = camelCase("messages_Of_".concat(languageCode, "_Language")); + var filePath = "".concat(messagesDir, "/").concat(directory, "/").concat(filename); + try { + var entries = JSON.parse(fs.readFileSync(filePath, { + encoding: 'utf8' + })); + if (!Object.keys(entries).length) { + importLines.push("// Note: Skipped empty '".concat(filename, "' messages file.")); + return; // Skip the language + } + } catch (e) { + importLines.push("// Error: unable to parse '".concat(filename, "' messages file.")); + log("".concat(loggingPrefix, ": NOTICE: Skipping '").concat(directory, "/").concat(filename, "' due to error: ").concat(e, ".\n")); + return; // Skip the language + } + counter.nonEmptyLanguages += 1; + importLines.push("import ".concat(messagesCamelCaseVar, " from './").concat(filename, "';")); + messagesLines.splice(1, 0, " '".concat(reactIntlLanguageCode, "': ").concat(messagesCamelCaseVar, ",")); + }); + if (counter.nonEmptyLanguages) { + // See the help message above for sample output. + var messagesFileContent = [filesCodeGeneratorNoticeHeader, importLines.join('\n'), '\nexport default {', messagesLines.join('\n'), '};\n'].join('\n'); + writeFileSync("".concat(messagesDir, "/").concat(directory, "/index.js"), messagesFileContent); + return { + directory: directory, + isWritten: true + }; + } + log("".concat(loggingPrefix, ": Skipping '").concat(directory, "' because no languages were found.\n")); + } catch (e) { + log("".concat(loggingPrefix, ": NOTICE: Skipping '").concat(directory, "' due to error: ").concat(e, ".\n")); + } + return { + directory: directory, + isWritten: false + }; +} + +/** + * Create main `src/i18n/index.js` messages import file. + * + * + * @param processedDirectories - List of directories with a boolean flag whether its "index.js" file is written + * The format is "[\{ directory: "frontend-component-example", isWritten: false \}, ...]" + * @param log - Mockable process.stdout.write + * @param writeFileSync - Mockable fs.writeFileSync + * @param i18nDir` - Path to `src/i18n` directory + */ +function generateMainMessagesFile(_ref2) { + var processedDirectories = _ref2.processedDirectories, + log = _ref2.log, + writeFileSync = _ref2.writeFileSync, + i18nDir = _ref2.i18nDir; + var importLines = []; + var exportLines = []; + processedDirectories.forEach(function (processedDirectory) { + var directory = processedDirectory.directory, + isWritten = processedDirectory.isWritten; + if (isWritten) { + var moduleCamelCaseVariableName = camelCase("messages_from_".concat(directory)); + importLines.push("import ".concat(moduleCamelCaseVariableName, " from './messages/").concat(directory, "';")); + exportLines.push(" ".concat(moduleCamelCaseVariableName, ",")); + } else { + var skipMessage = "Skipped import due to missing '".concat(directory, "/index.js' likely due to empty translations."); + importLines.push("// ".concat(skipMessage, ".")); + log("".concat(loggingPrefix, ": ").concat(skipMessage, "\n")); + } + }); + + // See the help message above for sample output. + var indexFileContent = [filesCodeGeneratorNoticeHeader, importLines.join('\n'), '\nexport default [', exportLines.join('\n'), '];\n'].join('\n'); + writeFileSync("".concat(i18nDir, "/index.js"), indexFileContent); +} + +/* + * Main function of the file. + */ +function main(_ref3) { + var directories = _ref3.directories, + log = _ref3.log, + writeFileSync = _ref3.writeFileSync, + pwd = _ref3.pwd; + var i18nDir = "".concat(pwd, "/src/i18n"); // The Micro-frontend i18n root directory + + if (directories.includes('--help') || directories.includes('-h')) { + log(scriptHelpDocument); + } else if (!directories.length) { + log(scriptHelpDocument); + log("".concat(loggingPrefix, ": Error: A list of directories is required.\n")); + } else if (!fs.existsSync(i18nDir) || !fs.lstatSync(i18nDir).isDirectory()) { + log(scriptHelpDocument); + log("".concat(loggingPrefix, ": Error: src/i18n directory was not found.\n")); + } else { + var processedDirectories = directories.map(function (directory) { + return generateSubdirectoryMessageFile({ + directory: directory, + log: log, + writeFileSync: writeFileSync, + i18nDir: i18nDir + }); + }); + generateMainMessagesFile({ + processedDirectories: processedDirectories, + log: log, + writeFileSync: writeFileSync, + i18nDir: i18nDir + }); + } +} +if (require.main === module) { + // Run the main() function if called from the command line. + main({ + directories: process.argv.slice(2), + log: function log(text) { + return process.stdout.write(text); + }, + writeFileSync: fs.writeFileSync, + pwd: process.env.PWD + }); +} +module.exports.main = main; // Allow tests to use the main function. +//# sourceMappingURL=intl-imports.js.map \ No newline at end of file diff --git a/dist/i18n/scripts/intl-imports.js.map b/dist/i18n/scripts/intl-imports.js.map new file mode 100644 index 000000000..c93cd2b72 --- /dev/null +++ b/dist/i18n/scripts/intl-imports.js.map @@ -0,0 +1 @@ +{"version":3,"file":"intl-imports.js","names":["scriptHelpDocument","fs","require","path","camelCase","loggingPrefix","basename","concat","__filename","filesCodeGeneratorNoticeHeader","generateSubdirectoryMessageFile","_ref","directory","log","writeFileSync","i18nDir","importLines","messagesLines","counter","nonEmptyLanguages","messagesDir","files","readdirSync","withFileTypes","sort","jsonFiles","filter","file","isFile","name","endsWith","length","isWritten","forEach","filename","languageCode","replace","reactIntlLanguageCode","toLowerCase","messagesCamelCaseVar","filePath","entries","JSON","parse","readFileSync","encoding","Object","keys","push","e","splice","messagesFileContent","join","generateMainMessagesFile","_ref2","processedDirectories","exportLines","processedDirectory","moduleCamelCaseVariableName","skipMessage","indexFileContent","main","_ref3","directories","pwd","includes","existsSync","lstatSync","isDirectory","map","module","process","argv","slice","text","stdout","write","env","PWD","exports"],"sources":["../../../src/i18n/scripts/intl-imports.js"],"sourcesContent":["#!/usr/bin/env node\n\nconst scriptHelpDocument = `\nNAME\n intl-imports.js — Script to generate the src/i18n/index.js file that exports messages from all the languages for Micro-frontends.\n\nSYNOPSIS\n intl-imports.js [DIRECTORY ...]\n\nDESCRIPTION\n This script is intended to run after 'atlas' has pulled the files.\n \n This expects to run inside a Micro-frontend root directory with the following structure:\n \n frontend-app-learning $ tree src/i18n/\n src/i18n/\n ├── index.js\n └── messages\n ├── frontend-app-example\n │ ├── ar.json\n │ ├── es_419.json\n │ └── zh_CN.json\n ├── frontend-component-footer\n │ ├── ar.json\n │ ├── es_419.json\n │ └── zh_CN.json\n └── frontend-component-header (empty directory)\n \n \n \n With the structure above it's expected to run with the following command in Makefile:\n \n \n $ node_modules/.bin/intl-imports.js frontend-component-footer frontend-component-header frontend-app-example\n \n \n It will generate two type of files:\n \n - Main src/i18n/index.js which overrides the Micro-frontend provided with a sample output of:\n \n \"\"\"\n import messagesFromFrontendComponentFooter from './messages/frontend-component-footer';\n // Skipped import due to missing './messages/frontend-component-footer/index.js' likely due to empty translations.\n import messagesFromFrontendAppExample from './messages/frontend-app-example';\n \n export default [\n messagesFromFrontendComponentFooter,\n messagesFromFrontendAppExample,\n ];\n \"\"\"\n \n - Each sub-directory has src/i18n/messages/frontend-component-header/index.js which is imported by the main file.:\n \n \"\"\"\n import messagesOfArLanguage from './ar.json';\n import messagesOfDeLanguage from './de.json';\n import messagesOfEs419Language from './es_419.json';\n export default {\n 'ar': messagesOfArLanguage,\n 'de': messagesOfDeLanguage,\n 'es-419': messagesOfEs419Language,\n };\n \"\"\"\n`;\n\nconst fs = require('fs');\nconst path = require('path');\nconst camelCase = require('lodash.camelcase');\n\nconst loggingPrefix = path.basename(`${__filename}`); // the name of this JS file\n\n// Header note for generated src/i18n/index.js file\nconst filesCodeGeneratorNoticeHeader = `// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n`;\n\n/**\n * Create frontend-app-example/index.js file with proper imports.\n *\n * @param directory - a directory name containing .json files from Transifex e.g. \"frontend-app-example\".\n * @param log - Mockable process.stdout.write\n * @param writeFileSync - Mockable fs.writeFileSync\n * @param i18nDir - Path to `src/i18n` directory\n *\n * @return object - An object containing directory name and whether its \"index.js\" file was successfully written.\n */\nfunction generateSubdirectoryMessageFile({\n directory,\n log,\n writeFileSync,\n i18nDir,\n}) {\n const importLines = [];\n const messagesLines = [];\n const counter = { nonEmptyLanguages: 0 };\n const messagesDir = `${i18nDir}/messages`; // The directory of Micro-frontend i18n messages\n\n try {\n const files = fs.readdirSync(`${messagesDir}/${directory}`, { withFileTypes: true });\n files.sort(); // Sorting ensures a consistent generated `index.js` order of imports cross-platforms.\n\n const jsonFiles = files.filter(file => file.isFile() && file.name.endsWith('.json'));\n\n if (!jsonFiles.length) {\n log(`${loggingPrefix}: Not creating '${directory}/index.js' because no .json translation files were found.\\n`);\n return {\n directory,\n isWritten: false,\n };\n }\n\n jsonFiles.forEach((file) => {\n const filename = file.name;\n // Gets `fr_CA` from `fr_CA.json`\n const languageCode = filename.replace(/\\.json$/, '');\n // React-friendly language code fr_CA --> fr-ca\n const reactIntlLanguageCode = languageCode.toLowerCase().replace(/_/g, '-');\n // camelCase variable name\n const messagesCamelCaseVar = camelCase(`messages_Of_${languageCode}_Language`);\n const filePath = `${messagesDir}/${directory}/${filename}`;\n\n try {\n const entries = JSON.parse(fs.readFileSync(filePath, { encoding: 'utf8' }));\n\n if (!Object.keys(entries).length) {\n importLines.push(`// Note: Skipped empty '${filename}' messages file.`);\n return; // Skip the language\n }\n } catch (e) {\n importLines.push(`// Error: unable to parse '${filename}' messages file.`);\n log(`${loggingPrefix}: NOTICE: Skipping '${directory}/${filename}' due to error: ${e}.\\n`);\n return; // Skip the language\n }\n\n counter.nonEmptyLanguages += 1;\n importLines.push(`import ${messagesCamelCaseVar} from './${filename}';`);\n messagesLines.splice(1, 0, ` '${reactIntlLanguageCode}': ${messagesCamelCaseVar},`);\n });\n\n if (counter.nonEmptyLanguages) {\n // See the help message above for sample output.\n const messagesFileContent = [\n filesCodeGeneratorNoticeHeader,\n importLines.join('\\n'),\n '\\nexport default {',\n messagesLines.join('\\n'),\n '};\\n',\n ].join('\\n');\n\n writeFileSync(`${messagesDir}/${directory}/index.js`, messagesFileContent);\n return {\n directory,\n isWritten: true,\n };\n }\n log(`${loggingPrefix}: Skipping '${directory}' because no languages were found.\\n`);\n } catch (e) {\n log(`${loggingPrefix}: NOTICE: Skipping '${directory}' due to error: ${e}.\\n`);\n }\n\n return {\n directory,\n isWritten: false,\n };\n}\n\n/**\n * Create main `src/i18n/index.js` messages import file.\n *\n *\n * @param processedDirectories - List of directories with a boolean flag whether its \"index.js\" file is written\n * The format is \"[\\{ directory: \"frontend-component-example\", isWritten: false \\}, ...]\"\n * @param log - Mockable process.stdout.write\n * @param writeFileSync - Mockable fs.writeFileSync\n * @param i18nDir` - Path to `src/i18n` directory\n */\nfunction generateMainMessagesFile({\n processedDirectories,\n log,\n writeFileSync,\n i18nDir,\n}) {\n const importLines = [];\n const exportLines = [];\n\n processedDirectories.forEach(processedDirectory => {\n const { directory, isWritten } = processedDirectory;\n if (isWritten) {\n const moduleCamelCaseVariableName = camelCase(`messages_from_${directory}`);\n importLines.push(`import ${moduleCamelCaseVariableName} from './messages/${directory}';`);\n exportLines.push(` ${moduleCamelCaseVariableName},`);\n } else {\n const skipMessage = `Skipped import due to missing '${directory}/index.js' likely due to empty translations.`;\n importLines.push(`// ${skipMessage}.`);\n log(`${loggingPrefix}: ${skipMessage}\\n`);\n }\n });\n\n // See the help message above for sample output.\n const indexFileContent = [\n filesCodeGeneratorNoticeHeader,\n importLines.join('\\n'),\n '\\nexport default [',\n exportLines.join('\\n'),\n '];\\n',\n ].join('\\n');\n\n writeFileSync(`${i18nDir}/index.js`, indexFileContent);\n}\n\n/*\n * Main function of the file.\n */\nfunction main({\n directories,\n log,\n writeFileSync,\n pwd,\n}) {\n const i18nDir = `${pwd}/src/i18n`; // The Micro-frontend i18n root directory\n\n if (directories.includes('--help') || directories.includes('-h')) {\n log(scriptHelpDocument);\n } else if (!directories.length) {\n log(scriptHelpDocument);\n log(`${loggingPrefix}: Error: A list of directories is required.\\n`);\n } else if (!fs.existsSync(i18nDir) || !fs.lstatSync(i18nDir).isDirectory()) {\n log(scriptHelpDocument);\n log(`${loggingPrefix}: Error: src/i18n directory was not found.\\n`);\n } else {\n const processedDirectories = directories.map(directory => generateSubdirectoryMessageFile({\n directory,\n log,\n writeFileSync,\n i18nDir,\n }));\n generateMainMessagesFile({\n processedDirectories,\n log,\n writeFileSync,\n i18nDir,\n });\n }\n}\n\nif (require.main === module) {\n // Run the main() function if called from the command line.\n main({\n directories: process.argv.slice(2),\n log: text => process.stdout.write(text),\n writeFileSync: fs.writeFileSync,\n pwd: process.env.PWD,\n });\n}\n\nmodule.exports.main = main; // Allow tests to use the main function.\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/i18n/scripts/transifex-utils.js b/dist/i18n/scripts/transifex-utils.js new file mode 100755 index 000000000..19139d5ac --- /dev/null +++ b/dist/i18n/scripts/transifex-utils.js @@ -0,0 +1,72 @@ +#!/usr/bin/env node +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +var fs = require('fs'); +var glob = require('glob'); +var path = require('path'); + +/* + * See the Makefile for how the required hash file is downloaded from Transifex. + */ + +/* + * Expected input: a directory, possibly containing subdirectories, with .json files. Each .json + * file is an array of translation triplets (id, description, defaultMessage). + * + * + */ +function gatherJson(dir) { + var ret = []; + var files = glob.sync("".concat(dir, "/**/*.json")); + files.forEach(function (filename) { + var messages = JSON.parse(fs.readFileSync(filename)); + ret.push.apply(ret, _toConsumableArray(messages)); + }); + return ret; +} + +// the hash file returns ids whose periods are "escaped" (sort of), like this: +// "key": "profile\\.sociallinks\\.social\\.links" +// so our regular messageIds won't match them out of the box +function escapeDots(messageId) { + return messageId.replace(/\./g, '\\.'); +} +var jsonDir = process.argv[2]; +var messageObjects = gatherJson(jsonDir); +if (messageObjects.length === 0) { + process.exitCode = 1; + throw new Error('Found no messages'); +} +if (process.argv[3] === '--comments') { + // prepare to handle the translator notes + var loggingPrefix = path.basename("".concat(__filename)); // the name of this JS file + var bashScriptsPath = process.argv[4] && process.argv[4] === '--v3-scripts-path' ? './node_modules/@edx/reactifex/bash_scripts' : './node_modules/reactifex/bash_scripts'; + var hashFile = "".concat(bashScriptsPath, "/hashmap.json"); + process.stdout.write("".concat(loggingPrefix, ": reading hash file ").concat(hashFile, "\n")); + var messageInfo = JSON.parse(fs.readFileSync(hashFile)); + var outputFile = "".concat(bashScriptsPath, "/hashed_data.txt"); + process.stdout.write("".concat(loggingPrefix, ": writing to output file ").concat(outputFile, "\n")); + fs.writeFileSync(outputFile, ''); + messageObjects.forEach(function (message) { + var transifexFormatId = escapeDots(message.id); + var info = messageInfo.find(function (mi) { + return mi.key === transifexFormatId; + }); + if (info) { + fs.appendFileSync(outputFile, "".concat(info.string_hash, "|").concat(message.description, "\n")); + } else { + process.stdout.write("".concat(loggingPrefix, ": string ").concat(message.id, " does not yet exist on transifex!\n")); + } + }); +} else { + var output = {}; + messageObjects.forEach(function (message) { + output[message.id] = message.defaultMessage; + }); + fs.writeFileSync(process.argv[3], JSON.stringify(output, null, 2)); +} +//# sourceMappingURL=transifex-utils.js.map \ No newline at end of file diff --git a/dist/i18n/scripts/transifex-utils.js.map b/dist/i18n/scripts/transifex-utils.js.map new file mode 100644 index 000000000..59ba61a19 --- /dev/null +++ b/dist/i18n/scripts/transifex-utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"transifex-utils.js","names":["_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","TypeError","o","minLen","_arrayLikeToArray","n","Object","prototype","toString","call","slice","constructor","name","Array","from","test","iter","Symbol","iterator","isArray","len","length","i","arr2","fs","require","glob","path","gatherJson","dir","ret","files","sync","concat","forEach","filename","messages","JSON","parse","readFileSync","push","apply","escapeDots","messageId","replace","jsonDir","process","argv","messageObjects","exitCode","Error","loggingPrefix","basename","__filename","bashScriptsPath","hashFile","stdout","write","messageInfo","outputFile","writeFileSync","message","transifexFormatId","id","info","find","mi","key","appendFileSync","string_hash","description","output","defaultMessage","stringify"],"sources":["../../../src/i18n/scripts/transifex-utils.js"],"sourcesContent":["#!/usr/bin/env node\n\nconst fs = require('fs');\nconst glob = require('glob');\nconst path = require('path');\n\n/*\n * See the Makefile for how the required hash file is downloaded from Transifex.\n */\n\n/*\n * Expected input: a directory, possibly containing subdirectories, with .json files. Each .json\n * file is an array of translation triplets (id, description, defaultMessage).\n *\n *\n */\nfunction gatherJson(dir) {\n const ret = [];\n const files = glob.sync(`${dir}/**/*.json`);\n\n files.forEach((filename) => {\n const messages = JSON.parse(fs.readFileSync(filename));\n ret.push(...messages);\n });\n return ret;\n}\n\n// the hash file returns ids whose periods are \"escaped\" (sort of), like this:\n// \"key\": \"profile\\\\.sociallinks\\\\.social\\\\.links\"\n// so our regular messageIds won't match them out of the box\nfunction escapeDots(messageId) {\n return messageId.replace(/\\./g, '\\\\.');\n}\n\nconst jsonDir = process.argv[2];\nconst messageObjects = gatherJson(jsonDir);\n\nif (messageObjects.length === 0) {\n process.exitCode = 1;\n throw new Error('Found no messages');\n}\n\nif (process.argv[3] === '--comments') { // prepare to handle the translator notes\n const loggingPrefix = path.basename(`${__filename}`); // the name of this JS file\n const bashScriptsPath = (\n process.argv[4] && process.argv[4] === '--v3-scripts-path'\n ? './node_modules/@edx/reactifex/bash_scripts'\n : './node_modules/reactifex/bash_scripts');\n\n const hashFile = `${bashScriptsPath}/hashmap.json`;\n process.stdout.write(`${loggingPrefix}: reading hash file ${hashFile}\\n`);\n const messageInfo = JSON.parse(fs.readFileSync(hashFile));\n\n const outputFile = `${bashScriptsPath}/hashed_data.txt`;\n process.stdout.write(`${loggingPrefix}: writing to output file ${outputFile}\\n`);\n fs.writeFileSync(outputFile, '');\n\n messageObjects.forEach((message) => {\n const transifexFormatId = escapeDots(message.id);\n\n const info = messageInfo.find(mi => mi.key === transifexFormatId);\n if (info) {\n fs.appendFileSync(outputFile, `${info.string_hash}|${message.description}\\n`);\n } else {\n process.stdout.write(`${loggingPrefix}: string ${message.id} does not yet exist on transifex!\\n`);\n }\n });\n} else {\n const output = {};\n\n messageObjects.forEach((message) => {\n output[message.id] = message.defaultMessage;\n });\n fs.writeFileSync(process.argv[3], JSON.stringify(output, null, 2));\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 000000000..b34ca6f92 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,7 @@ +export { modifyObjectKeys, camelCaseObject, snakeCaseObject, convertKeyNames, getQueryParameters, ensureDefinedConfig, parseURL, getPath } from './utils'; +export { APP_TOPIC, APP_PUBSUB_INITIALIZED, APP_CONFIG_INITIALIZED, APP_AUTH_INITIALIZED, APP_I18N_INITIALIZED, APP_LOGGING_INITIALIZED, APP_ANALYTICS_INITIALIZED, APP_READY, APP_INIT_ERROR, CONFIG_TOPIC, CONFIG_CHANGED } from './constants'; +export { initialize, history, initError, auth } from './initialize'; +export { publish, subscribe, unsubscribe } from './pubSub'; +export { getConfig, setConfig, mergeConfig, ensureConfig } from './config'; +export { initializeMockApp, mockMessages } from './testing'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 000000000..6333f5b47 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","names":["modifyObjectKeys","camelCaseObject","snakeCaseObject","convertKeyNames","getQueryParameters","ensureDefinedConfig","parseURL","getPath","APP_TOPIC","APP_PUBSUB_INITIALIZED","APP_CONFIG_INITIALIZED","APP_AUTH_INITIALIZED","APP_I18N_INITIALIZED","APP_LOGGING_INITIALIZED","APP_ANALYTICS_INITIALIZED","APP_READY","APP_INIT_ERROR","CONFIG_TOPIC","CONFIG_CHANGED","initialize","history","initError","auth","publish","subscribe","unsubscribe","getConfig","setConfig","mergeConfig","ensureConfig","initializeMockApp","mockMessages"],"sources":["../src/index.js"],"sourcesContent":["export {\n modifyObjectKeys,\n camelCaseObject,\n snakeCaseObject,\n convertKeyNames,\n getQueryParameters,\n ensureDefinedConfig,\n parseURL,\n getPath,\n} from './utils';\nexport {\n APP_TOPIC,\n APP_PUBSUB_INITIALIZED,\n APP_CONFIG_INITIALIZED,\n APP_AUTH_INITIALIZED,\n APP_I18N_INITIALIZED,\n APP_LOGGING_INITIALIZED,\n APP_ANALYTICS_INITIALIZED,\n APP_READY,\n APP_INIT_ERROR,\n CONFIG_TOPIC,\n CONFIG_CHANGED,\n} from './constants';\nexport {\n initialize,\n history,\n initError,\n auth,\n} from './initialize';\nexport {\n publish,\n subscribe,\n unsubscribe,\n} from './pubSub';\nexport {\n getConfig,\n setConfig,\n mergeConfig,\n ensureConfig,\n} from './config';\nexport {\n initializeMockApp,\n mockMessages,\n} from './testing';\n"],"mappings":"AAAA,SACEA,gBAAgB,EAChBC,eAAe,EACfC,eAAe,EACfC,eAAe,EACfC,kBAAkB,EAClBC,mBAAmB,EACnBC,QAAQ,EACRC,OAAO,QACF,SAAS;AAChB,SACEC,SAAS,EACTC,sBAAsB,EACtBC,sBAAsB,EACtBC,oBAAoB,EACpBC,oBAAoB,EACpBC,uBAAuB,EACvBC,yBAAyB,EACzBC,SAAS,EACTC,cAAc,EACdC,YAAY,EACZC,cAAc,QACT,aAAa;AACpB,SACEC,UAAU,EACVC,OAAO,EACPC,SAAS,EACTC,IAAI,QACC,cAAc;AACrB,SACEC,OAAO,EACPC,SAAS,EACTC,WAAW,QACN,UAAU;AACjB,SACEC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,YAAY,QACP,UAAU;AACjB,SACEC,iBAAiB,EACjBC,YAAY,QACP,WAAW","ignoreList":[]} \ No newline at end of file diff --git a/dist/initialize.js b/dist/initialize.js new file mode 100644 index 000000000..1f77f863b --- /dev/null +++ b/dist/initialize.js @@ -0,0 +1,494 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +/** + * #### Import members from **@edx/frontend-platform** + * + * The initialization module provides a function for managing an application's initialization + * lifecycle. It also provides constants and default handler implementations. + * + * ``` + * import { + * initialize, + * APP_INIT_ERROR, + * APP_READY, + * subscribe, + * } from '@edx/frontend-platform'; + * import { AppProvider, ErrorPage, PageWrap } from '@edx/frontend-platform/react'; + * import React from 'react'; + * import ReactDOM from 'react-dom'; + * import { Routes, Route } from 'react-router-dom'; + * + * subscribe(APP_READY, () => { + * ReactDOM.render( + * + *
+ *
+ * + * } /> + * + *
+ *