@edx/frontend-platform 8.3.9 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,23 +26,16 @@ In addition, frontend-platform provides an extensible application initialization
26
26
  ## Getting started
27
27
 
28
28
  ### One-time setup if you have not upgraded node/npm
29
- IMPORTANT: There is now a new node/npm version being used by frontend-platform as of
30
- https://github.com/openedx/frontend-platform/pull/259
31
29
 
32
30
  #### Install nvm
33
- This is highly recommended to be able to leverage different node/npm versions.
34
- For a some time, different repositories may be using different versions of node/npm.
35
-
36
- Alternatively, please install node16 and npm8 for use with this repository.
31
+ This is highly recommended to be able to leverage different node/npm versions. For some time, different repositories may be using different versions of node/npm.
37
32
 
38
33
  #### Switch to node/npm version for this repo
39
- ```nvm use```
40
- if you don't have the right node/npm versions, nvm will instruct you to install those
34
+ In the project’s root directory, run `nvm use` to set your environment to the correct node version. If the required node or npm versions are not installed, nvm will prompt you to install them.
41
35
 
42
36
  #### Clean out old node modules and reinstall
43
37
  This step is needed because node now uses a different package lock format, and it's important to reinstall
44
- dependencies based on this new package file. Delete node_modules, and issue an `npm ci`
45
-
38
+ dependencies based on this new package file. Delete `node_modules`, and run `npm ci`.
46
39
 
47
40
  ### Standard getting started steps
48
41
 
@@ -98,7 +91,7 @@ initialize({
98
91
  });
99
92
  ```
100
93
 
101
- 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:
94
+ When using runtime configuration via `mergeConfig` as 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:
102
95
 
103
96
  ```jsx
104
97
  import { getConfig } from '@edx/frontend-platform/config';
@@ -113,6 +106,24 @@ const ExampleComponent = () => {
113
106
  };
114
107
  ```
115
108
 
109
+ #### Overriding default external links
110
+
111
+ A `getExternalLinkUrl` function is provided in `config.js` which can be used to override default external links. To make use of this function, provide an object that maps default links to custom links. This object should be added to the `config` object defined in the `env.config.[js,jsx,ts,tsx]`, and must be named `externalLinkUrlOverrides`. Here is an example:
112
+
113
+ ```js
114
+ // env.config.js
115
+
116
+ const config = {
117
+ // other custom configuration here
118
+ externalLinkUrlOverrides: {
119
+ "https://docs.openedx.org/en/latest/educators/index.html": "https://custom.example.com/educators/index.html",
120
+ "https://creativecommons.org/licenses": "https://www.tldrlegal.com/license/creative-commons-attribution-cc",
121
+ },
122
+ };
123
+
124
+ export default config;
125
+ ```
126
+
116
127
  ### Service interfaces
117
128
 
118
129
  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).
@@ -130,7 +141,7 @@ The included service implementations are:
130
141
  - Axios/JWT (auth)
131
142
  - React Intl (i18n)
132
143
 
133
- 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.
144
+ NOTE: As of this writing, i18n is _not_ configurable. The `initialize()` function does not allow applications to supply an alternative i18n implementation; this is because the interface and implementation for i18n has not yet been separated and modularized.
134
145
 
135
146
  # Local Development & Testing Locally
136
147
 
package/config.js CHANGED
@@ -40,10 +40,10 @@
40
40
  *
41
41
  * ###### JavaScript File Configuration
42
42
  *
43
- * Configuration variables can be supplied in an optional file named env.config.js. This file must
44
- * export either an Object containing configuration variables or a function. The function must
45
- * return an Object containing configuration variables or, alternately, a promise which resolves to
46
- * an Object.
43
+ * Configuration variables can be supplied in an optional file named env.config.js (it can also be
44
+ * a `.jsx`, `.ts`, or `.tsx` file). This file must export either an Object containing configuration
45
+ * variables or a function. The function must return an Object containing configuration variables or,
46
+ * alternatively, a promise which resolves to an Object.
47
47
  *
48
48
  * Using a function or async function allows the configuration to be resolved at runtime (because
49
49
  * the function will be executed at runtime). This is not common, and the capability is included
@@ -89,11 +89,9 @@
89
89
  *
90
90
  * Configuration variables can also be supplied using the "runtime configuration" method, taking
91
91
  * advantage of the Micro-frontend Config API in edx-platform. More information on this API can be
92
- * found in the ADR which introduced it:
92
+ * found in [the ADR which introduced it][1].
93
93
  *
94
- * https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst
95
- *
96
- * The runtime configuration method can be enabled by supplying a MFE_CONFIG_API_URL via one of the other
94
+ * The runtime configuration method can be enabled by supplying a `MFE_CONFIG_API_URL` via one of the other
97
95
  * two configuration methods above.
98
96
  *
99
97
  * Runtime configuration is particularly useful if you need to supply different configurations to
@@ -103,9 +101,9 @@
103
101
  *
104
102
  * ##### Initialization Config Handler
105
103
  *
106
- * The configuration document can be extended by
107
- * applications at run-time using a `config` initialization handler. Please see the Initialization
108
- * documentation for more information on handlers and initialization phases.
104
+ * The configuration document can be extended by applications at run-time using a `config`
105
+ * initialization handler. Please see the Initialization documentation for more information on
106
+ * handlers and initialization phases.
109
107
  *
110
108
  * ```
111
109
  * initialize({
@@ -114,13 +112,15 @@
114
112
  * mergeConfig({
115
113
  * CUSTOM_VARIABLE: 'custom value',
116
114
  * LMS_BASE_URL: 'http://localhost:18001' // You can override variables, but this is uncommon.
117
- * }, 'App config override handler');
115
+ * }, 'App config override handler');
118
116
  * },
119
117
  * },
120
118
  * });
121
119
  * ```
122
120
  *
123
121
  * @module Config
122
+ *
123
+ * [1]: https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst
124
124
  */
125
125
 
126
126
  import { APP_CONFIG_INITIALIZED, CONFIG_CHANGED } from './constants';
@@ -220,7 +220,7 @@ var config = {
220
220
  * ```
221
221
  *
222
222
  * @returns {ConfigDocument}
223
- */
223
+ */
224
224
  export function getConfig() {
225
225
  return config;
226
226
  }
@@ -305,13 +305,40 @@ export function ensureConfig(keys) {
305
305
  });
306
306
  }
307
307
 
308
+ /**
309
+ * Get an external link URL based on the URL provided. If the passed in URL is overridden in the
310
+ * `externalLinkUrlOverrides` object, it will return the overridden URL. Otherwise, it will return
311
+ * the provided URL.
312
+ *
313
+ *
314
+ * @param {string} url - The default URL.
315
+ * @returns {string} - The external link URL. Defaults to the input URL if not found in the
316
+ * `externalLinkUrlOverrides` object. If the input URL is invalid, '#' is returned.
317
+ *
318
+ * @example
319
+ * import { getExternalLinkUrl } from '@edx/frontend-platform';
320
+ *
321
+ * <Hyperlink
322
+ * destination={getExternalLinkUrl(data.helpLink)}
323
+ * target="_blank"
324
+ * >
325
+ */
326
+ export function getExternalLinkUrl(url) {
327
+ // Guard against non-strings or whitespace-only strings
328
+ if (typeof url !== 'string' || !url.trim()) {
329
+ return '#';
330
+ }
331
+ var overriddenLinkUrls = getConfig().externalLinkUrlOverrides || {};
332
+ return overriddenLinkUrls[url] || url;
333
+ }
334
+
308
335
  /**
309
336
  * An object describing the current application configuration.
310
337
  *
311
338
  * In its most basic form, the initialization process loads this document via `process.env`
312
339
  * variables. There are other ways to add configuration variables to the ConfigDocument as
313
340
  * documented above (JavaScript File Configuration, Runtime Configuration, and the Initialization
314
- * Config Handler)
341
+ * Config Handler).
315
342
  *
316
343
  * ```
317
344
  * {
package/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":["APP_CONFIG_INITIALIZED","CONFIG_CHANGED","publish","subscribe","ensureDefinedConfig","extractRegex","envVar","trim","RegExp","undefined","parseParagonThemeUrls","paragonUrlsJson","JSON","parse","err","SyntaxError","console","error","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","PARAGON_THEME_URLS","getConfig","setConfig","newConfig","mergeConfig","Object","assign","ensureConfig","keys","requester","arguments","length","forEach","key","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\n/**\n * Safely parses a JSON string coming from the environment variables.\n * If the JSON is invalid, the function returns an empty object and logs an error to the console.\n *\n * @param {string} paragonUrlsJson - The JSON string representing Paragon theme URLs.\n * @returns {Object|undefined} - Returns a parsed object if the JSON is valid; otherwise, returns\n * an empty object if invalid or undefined if no input is provided.\n *\n * @example\n * const jsonString = '{\n * \"core\":{\"urls\":{\"default\":\"core.min.css\"}},\n * \"defaults\":{\"light\":\"light\"},\n * \"variants\":{\"light\":{\"urls\":{\"default\":\"light.min.css\"}}}\n * }';\n * const parsedUrls = parseParagonThemeUrls(jsonString);\n * console.log(parsedUrls); // Outputs the parsed JSON object\n */\nfunction parseParagonThemeUrls(paragonUrlsJson) {\n if (!paragonUrlsJson) {\n return undefined;\n }\n try {\n return JSON.parse(paragonUrlsJson);\n } catch (err) {\n if (err instanceof SyntaxError) {\n // eslint-disable-next-line no-console\n console.error('Unable to parse PARAGON_THEME_URLS JSON.\\nPlease check https://github.com/openedx/frontend-platform/tree/master/docs/how_tos/theming.md for the expected formatting.\\nAn empty object ({}) will be returned, which will cause the theming configuration to fall back to the installed packages.');\n return {};\n }\n // In case of a different type of error, return the error object itself\n return err;\n }\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 PARAGON_THEME_URLS: parseParagonThemeUrls(process.env.PARAGON_THEME_URLS),\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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,qBAAqBA,CAACC,eAAe,EAAE;EAC9C,IAAI,CAACA,eAAe,EAAE;IACpB,OAAOF,SAAS;EAClB;EACA,IAAI;IACF,OAAOG,IAAI,CAACC,KAAK,CAACF,eAAe,CAAC;EACpC,CAAC,CAAC,OAAOG,GAAG,EAAE;IACZ,IAAIA,GAAG,YAAYC,WAAW,E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AC;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,SAAS4D,YAAYA,CAACC,IAAI,EAA8C;EAAA,IAA5CC,SAAS,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAvD,SAAA,GAAAuD,SAAA,MAAG,8BAA8B;EAC3E7D,SAAS,CAACH,sBAAsB,EAAE,YAAM;IACtC8D,IAAI,CAACI,OAAO,CAAC,UAACC,GAAG,EAAK;MACpB,IAAI7C,MAAM,CAAC6C,GAAG,CAAC,KAAK1D,SAAS,EAAE;QAC7B;QACAO,OAAO,CAACoD,IAAI,6BAAAC,MAAA,CAA6BF,GAAG,sBAAAE,MAAA,CAAmBN,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":[]}
1
+ {"version":3,"file":"config.js","names":["APP_CONFIG_INITIALIZED","CONFIG_CHANGED","publish","subscribe","ensureDefinedConfig","extractRegex","envVar","trim","RegExp","undefined","parseParagonThemeUrls","paragonUrlsJson","JSON","parse","err","SyntaxError","console","error","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","PARAGON_THEME_URLS","getConfig","setConfig","newConfig","mergeConfig","Object","assign","ensureConfig","keys","requester","arguments","length","forEach","key","warn","concat","getExternalLinkUrl","url","overriddenLinkUrls","externalLinkUrlOverrides"],"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 (it can also be\n * a `.jsx`, `.ts`, or `.tsx` file). This file must export either an Object containing configuration\n * variables or a function. The function must return an Object containing configuration variables or,\n * alternatively, a promise which resolves to 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][1].\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 applications at run-time using a `config`\n * initialization handler. Please see the Initialization documentation for more information on\n * 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 * [1]: https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst\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\n/**\n * Safely parses a JSON string coming from the environment variables.\n * If the JSON is invalid, the function returns an empty object and logs an error to the console.\n *\n * @param {string} paragonUrlsJson - The JSON string representing Paragon theme URLs.\n * @returns {Object|undefined} - Returns a parsed object if the JSON is valid; otherwise, returns\n * an empty object if invalid or undefined if no input is provided.\n *\n * @example\n * const jsonString = '{\n * \"core\":{\"urls\":{\"default\":\"core.min.css\"}},\n * \"defaults\":{\"light\":\"light\"},\n * \"variants\":{\"light\":{\"urls\":{\"default\":\"light.min.css\"}}}\n * }';\n * const parsedUrls = parseParagonThemeUrls(jsonString);\n * console.log(parsedUrls); // Outputs the parsed JSON object\n */\nfunction parseParagonThemeUrls(paragonUrlsJson) {\n if (!paragonUrlsJson) {\n return undefined;\n }\n try {\n return JSON.parse(paragonUrlsJson);\n } catch (err) {\n if (err instanceof SyntaxError) {\n // eslint-disable-next-line no-console\n console.error('Unable to parse PARAGON_THEME_URLS JSON.\\nPlease check https://github.com/openedx/frontend-platform/tree/master/docs/how_tos/theming.md for the expected formatting.\\nAn empty object ({}) will be returned, which will cause the theming configuration to fall back to the installed packages.');\n return {};\n }\n // In case of a different type of error, return the error object itself\n return err;\n }\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 PARAGON_THEME_URLS: parseParagonThemeUrls(process.env.PARAGON_THEME_URLS),\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 * Get an external link URL based on the URL provided. If the passed in URL is overridden in the\n * `externalLinkUrlOverrides` object, it will return the overridden URL. Otherwise, it will return\n * the provided URL.\n *\n *\n * @param {string} url - The default URL.\n * @returns {string} - The external link URL. Defaults to the input URL if not found in the\n * `externalLinkUrlOverrides` object. If the input URL is invalid, '#' is returned.\n *\n * @example\n * import { getExternalLinkUrl } from '@edx/frontend-platform';\n *\n * <Hyperlink\n * destination={getExternalLinkUrl(data.helpLink)}\n * target=\"_blank\"\n * >\n */\nexport function getExternalLinkUrl(url) {\n // Guard against non-strings or whitespace-only strings\n if (typeof url !== 'string' || !url.trim()) {\n return '#';\n }\n\n const overriddenLinkUrls = getConfig().externalLinkUrlOverrides || {};\n return overriddenLinkUrls[url] || url;\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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,qBAAqBA,CAACC,eAAe,EAAE;EAC9C,IAAI,CAACA,eAAe,EAAE;IACpB,OAAOF,SAAS;EAClB;EACA,IAAI;IACF,OAAOG,IAAI,CAACC,KAAK,CAACF,eAAe,CAAC;EACpC,CAAC,CAAC,OAAOG,GAAG,EAAE;IACZ,IAAIA,GAAG,YAAYC,WAAW,E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AC;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,SAAS4D,YAAYA,CAACC,IAAI,EAA8C;EAAA,IAA5CC,SAAS,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAvD,SAAA,GAAAuD,SAAA,MAAG,8BAA8B;EAC3E7D,SAAS,CAACH,sBAAsB,EAAE,YAAM;IACtC8D,IAAI,CAACI,OAAO,CAAC,UAACC,GAAG,EAAK;MACpB,IAAI7C,MAAM,CAAC6C,GAAG,CAAC,KAAK1D,SAAS,EAAE;QAC7B;QACAO,OAAO,CAACoD,IAAI,6BAAAC,MAAA,CAA6BF,GAAG,sBAAAE,MAAA,CAAmBN,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,OAAO,SAASO,kBAAkBA,CAACC,GAAG,EAAE;EACtC;EACA,IAAI,OAAOA,GAAG,KAAK,QAAQ,IAAI,CAACA,GAAG,CAAChE,IAAI,CAAC,CAAC,EAAE;IAC1C,OAAO,GAAG;EACZ;EAEA,IAAMiE,kBAAkB,GAAGjB,SAAS,CAAC,CAAC,CAACkB,wBAAwB,IAAI,CAAC,CAAC;EACrE,OAAOD,kBAAkB,CAACD,GAAG,CAAC,IAAIA,GAAG;AACvC;;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":[]}
package/index.js CHANGED
@@ -2,6 +2,6 @@ export { modifyObjectKeys, camelCaseObject, snakeCaseObject, convertKeyNames, ge
2
2
  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';
3
3
  export { initialize, history, initError, auth } from './initialize';
4
4
  export { publish, subscribe, unsubscribe } from './pubSub';
5
- export { getConfig, setConfig, mergeConfig, ensureConfig } from './config';
5
+ export { getConfig, setConfig, mergeConfig, ensureConfig, getExternalLinkUrl } from './config';
6
6
  export { initializeMockApp, mockMessages } from './testing';
7
7
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
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":[]}
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","getExternalLinkUrl","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 getExternalLinkUrl,\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,EACZC,kBAAkB,QACb,UAAU;AACjB,SACEC,iBAAiB,EACjBC,YAAY,QACP,WAAW","ignoreList":[]}
package/initialize.js CHANGED
@@ -418,7 +418,7 @@ function _initialize() {
418
418
 
419
419
  // This allows us to replace the implementations of the logging, analytics, and auth services
420
420
  // based on keys in the ConfigDocument. The JavaScript File Configuration method is the only
421
- // one capable of supplying an alternate implementation since it can import other modules.
421
+ // one capable of supplying an alternative implementation since it can import other modules.
422
422
  // If a service wasn't supplied we fall back to the default parameters on the initialize
423
423
  // function signature.
424
424
  loggingServiceImpl = getConfig().loggingService || loggingService;
package/initialize.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"initialize.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","_asyncToGenerator","arguments","apply","_next","_throw","createBrowserHistory","createMemoryHistory","envConfig","getPath","publish","getConfig","mergeConfig","configure","configureLogging","getLoggingService","NewRelicLoggingService","logError","configureAnalytics","SegmentAnalyticsService","identifyAnonymousUser","identifyAuthenticatedUser","GoogleAnalyticsLoader","getAuthenticatedHttpClient","configureAuth","ensureAuthenticatedUser","fetchAuthenticatedUser","hydrateAuthenticatedUser","getAuthenticatedUser","AxiosJwtAuthService","configureI18n","APP_PUBSUB_INITIALIZED","APP_CONFIG_INITIALIZED","APP_AUTH_INITIALIZED","APP_I18N_INITIALIZED","APP_LOGGING_INITIALIZED","APP_ANALYTICS_INITIALIZED","APP_READY","APP_INIT_ERROR","configureCache","history","window","basename","PUBLIC_PATH","initError","_x","_initError","_callee2","error","_callee2$","_context2","auth","_x2","_x3","_auth","_callee3","requireUser","hydrateUser","_callee3$","_context3","globalThis","location","href","jsFileConfig","_jsFileConfig","_callee4","config","_callee4$","_context4","runtimeConfig","_runtimeConfig","_callee5","_getConfig","MFE_CONFIG_API_URL","APP_ID","apiConfig","apiService","params","url","_yield$apiService$get","data","_callee5$","_context5","headers","accept","URLSearchParams","append","concat","toString","get","t0","console","message","loadExternalScripts","externalScripts","ExternalScript","script","loadScript","analytics","_analytics","_callee6","authenticatedUser","_callee6$","_context6","userId","applyOverrideHandlers","overrides","noOp","_ref","_callee","_callee$","_context","_objectSpread","pubSub","logging","i18n","ready","initialize","_x4","_initialize","_callee7","_ref2","_ref2$loggingService","loggingService","_ref2$analyticsServic","analyticsService","_ref2$authService","authService","_ref2$authMiddleware","authMiddleware","_ref2$externalScripts","_ref2$requireAuthenti","_ref2$hydrateAuthenti","messages","_ref2$handlers","overrideHandlers","handlers","loggingServiceImpl","analyticsServiceImpl","authServiceImpl","_callee7$","_context7","requireAuthenticatedUser","middleware","httpClient","isRedirecting"],"sources":["../src/initialize.js"],"sourcesContent":["/**\n * #### Import members from **@edx/frontend-platform**\n *\n * The initialization module provides a function for managing an application's initialization\n * lifecycle. It also provides constants and default handler implementations.\n *\n * ```\n * import {\n * initialize,\n * APP_INIT_ERROR,\n * APP_READY,\n * subscribe,\n * } from '@edx/frontend-platform';\n * import { AppProvider, ErrorPage, PageWrap } from '@edx/frontend-platform/react';\n * import React from 'react';\n * import ReactDOM from 'react-dom';\n * import { Routes, Route } from 'react-router-dom';\n *\n * subscribe(APP_READY, () => {\n * ReactDOM.render(\n * <AppProvider store={configureStore()}>\n * <Header />\n * <main>\n * <Routes>\n * <Route path=\"/\" element={<PageWrap><PaymentPage /></PageWrap>} />\n * </Routes>\n * </main>\n * <Footer />\n * </AppProvider>,\n * document.getElementById('root'),\n * );\n * });\n *\n * subscribe(APP_INIT_ERROR, (error) => {\n * ReactDOM.render(<ErrorPage message={error.message} />, document.getElementById('root'));\n * });\n *\n * initialize({\n * messages: [appMessages],\n * requireAuthenticatedUser: true,\n * hydrateAuthenticatedUser: true,\n * });\n\n```\n * @module Initialization\n */\n\nimport { createBrowserHistory, createMemoryHistory } from 'history';\n/*\nThis 'env.config' package is a special 'magic' alias in our webpack configuration in frontend-build.\nIt points at an `env.config.js` file in the root of an MFE's repository if it exists and falls back\nto an empty object `{}` if the file doesn't exist. This acts like an 'optional' import, in a sense.\nNote that the env.config.js file in frontend-platform's root directory is NOT used by the actual\ninitialization code, it's just there for the test suite and example application.\n*/\nimport envConfig from 'env.config'; // eslint-disable-line import/no-unresolved\nimport { getPath } from './utils';\nimport {\n publish,\n} from './pubSub';\n// eslint-disable-next-line import/no-cycle\nimport {\n getConfig, mergeConfig,\n} from './config';\nimport {\n configure as configureLogging, getLoggingService, NewRelicLoggingService, logError,\n} from './logging';\nimport {\n configure as configureAnalytics, SegmentAnalyticsService, identifyAnonymousUser, identifyAuthenticatedUser,\n} from './analytics';\nimport { GoogleAnalyticsLoader } from './scripts';\nimport {\n getAuthenticatedHttpClient,\n configure as configureAuth,\n ensureAuthenticatedUser,\n fetchAuthenticatedUser,\n hydrateAuthenticatedUser,\n getAuthenticatedUser,\n AxiosJwtAuthService,\n} from './auth';\nimport { configure as configureI18n } from './i18n';\nimport {\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, APP_INIT_ERROR,\n} from './constants';\nimport configureCache from './auth/LocalForageCache';\n\n/**\n * A browser history or memory history object created by the [history](https://github.com/ReactTraining/history)\n * package. Applications are encouraged to use this history object, rather than creating their own,\n * as behavior may be undefined when managing history via multiple mechanisms/instances. Note that\n * in environments where browser history may be inaccessible due to `window` being undefined, this\n * falls back to memory history.\n */\nexport const history = (typeof window !== 'undefined')\n ? createBrowserHistory({\n basename: getPath(getConfig().PUBLIC_PATH),\n }) : createMemoryHistory();\n\n/**\n * The string basename that is the root directory of this MFE.\n *\n * In devstack, this should always just return \"/\", because each MFE is in its own server/domain.\n *\n * In Tutor, all MFEs are deployed to a common server, each under a different top-level directory.\n * The basename is the root path for a given MFE, e.g. \"/library-authoring\". It is set by tutor-mfe\n * as an ENV variable in the Docker file, and we read it here from that configuration so that it\n * can be passed into a Router later.\n */\nexport const basename = getPath(getConfig().PUBLIC_PATH);\n\n/**\n * The default handler for the initialization lifecycle's `initError` phase. Logs the error to the\n * LoggingService using `logError`\n *\n * @see {@link module:frontend-platform/logging~logError}\n * @param {*} error\n */\nexport async function initError(error) {\n logError(error);\n}\n\n/**\n * The default handler for the initialization lifecycle's `auth` phase.\n *\n * The handler has several responsibilities:\n * - Determining the user's authentication state (authenticated or anonymous)\n * - Optionally redirecting to login if the application requires an authenticated user.\n * - Optionally loading additional user information via the application's user account data\n * endpoint.\n *\n * @param {boolean} requireUser Whether or not we should redirect to login if a user is not\n * authenticated.\n * @param {boolean} hydrateUser Whether or not we should fetch additional user account data.\n */\nexport async function auth(requireUser, hydrateUser) {\n if (requireUser) {\n await ensureAuthenticatedUser(globalThis.location.href);\n } else {\n await fetchAuthenticatedUser();\n }\n\n if (hydrateUser && getAuthenticatedUser() !== null) {\n // We intentionally do not await the promise returned by hydrateAuthenticatedUser. All the\n // critical data is returned as part of fetch/ensureAuthenticatedUser above, and anything else\n // is a nice-to-have for application code.\n hydrateAuthenticatedUser();\n }\n}\n\n/**\n * Set or overrides configuration via an env.config.js file in the consuming application.\n * This env.config.js is loaded at runtime and must export one of two things:\n *\n * - An object which will be merged into the application config via `mergeConfig`.\n * - A function which returns an object which will be merged into the application config via\n * `mergeConfig`. This function can return a promise.\n */\nasync function jsFileConfig() {\n let config = {};\n if (typeof envConfig === 'function') {\n config = await envConfig();\n } else {\n config = envConfig;\n }\n\n mergeConfig(config);\n}\n\n/*\n * Set or overrides configuration through an API.\n * This method allows runtime configuration.\n * Set a basic configuration when an error happen and allow initError and display the ErrorPage.\n */\nasync function runtimeConfig() {\n try {\n const { MFE_CONFIG_API_URL, APP_ID } = getConfig();\n\n if (MFE_CONFIG_API_URL) {\n const apiConfig = { headers: { accept: 'application/json' } };\n const apiService = await configureCache();\n\n const params = new URLSearchParams();\n params.append('mfe', APP_ID);\n const url = `${MFE_CONFIG_API_URL}?${params.toString()}`;\n\n const { data } = await apiService.get(url, apiConfig);\n mergeConfig(data);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error with config API', error.message);\n }\n}\n\nexport function loadExternalScripts(externalScripts, data) {\n externalScripts.forEach(ExternalScript => {\n const script = new ExternalScript(data);\n script.loadScript();\n });\n}\n\n/**\n * The default handler for the initialization lifecycle's `analytics` phase.\n *\n * The handler is responsible for identifying authenticated and anonymous users with the analytics\n * service. This is a pre-requisite for sending analytics events, thus, we do it during the\n * initialization sequence so that analytics is ready once the application's UI code starts to load.\n *\n */\nexport async function analytics() {\n const authenticatedUser = getAuthenticatedUser();\n if (authenticatedUser && authenticatedUser.userId) {\n identifyAuthenticatedUser(authenticatedUser.userId);\n } else {\n await identifyAnonymousUser();\n }\n}\n\nfunction applyOverrideHandlers(overrides) {\n const noOp = async () => { };\n return {\n pubSub: noOp,\n config: noOp,\n logging: noOp,\n auth,\n analytics,\n i18n: noOp,\n ready: noOp,\n initError,\n ...overrides, // This will override any same-keyed handlers from above.\n };\n}\n\n/**\n * Invokes the application initialization sequence.\n *\n * The sequence proceeds through a number of lifecycle phases, during which pertinent services are\n * configured.\n *\n * Using the `handlers` option, lifecycle phase handlers can be overridden to perform custom\n * functionality. Note that while these override handlers _do_ replace the default handler\n * functionality for analytics, auth, and initError (the other phases have no default\n * functionality), they do _not_ override the configuration of the actual services that those\n * handlers leverage.\n *\n * Some services can be overridden via the loggingService and analyticsService options. The other\n * services (auth and i18n) cannot currently be overridden.\n *\n * The following lifecycle phases exist:\n *\n * - pubSub: A no-op by default.\n * - config: A no-op by default.\n * - logging: A no-op by default.\n * - auth: Uses the 'auth' handler defined above.\n * - analytics: Uses the 'analytics' handler defined above.\n * - i18n: A no-op by default.\n * - ready: A no-op by default.\n * - initError: Uses the 'initError' handler defined above.\n *\n * @param {Object} [options]\n * @param {*} [options.loggingService=NewRelicLoggingService] The `LoggingService` implementation\n * to use.\n * @param {*} [options.analyticsService=SegmentAnalyticsService] The `AnalyticsService`\n * implementation to use.\n * @param {*} [options.authMiddleware=[]] An array of middleware to apply to http clients in the auth service.\n * @param {*} [options.externalScripts=[GoogleAnalyticsLoader]] An array of externalScripts.\n * By default added GoogleAnalyticsLoader.\n * @param {*} [options.requireAuthenticatedUser=false] If true, turns on automatic login\n * redirection for unauthenticated users. Defaults to false, meaning that by default the\n * application will allow anonymous/unauthenticated sessions.\n * @param {*} [options.hydrateAuthenticatedUser=false] If true, makes an API call to the user\n * account endpoint (`${App.config.LMS_BASE_URL}/api/user/v1/accounts/${username}`) to fetch\n * detailed account information for the authenticated user. This data is merged into the return\n * value of `getAuthenticatedUser`, overriding any duplicate keys that already exist. Defaults to\n * false, meaning that no additional account information will be loaded.\n * @param {*} [options.messages] A i18n-compatible messages object, or an array of such objects. If\n * an array is provided, duplicate keys are resolved with the last-one-in winning.\n * @param {*} [options.handlers={}] An optional object of handlers which can be used to replace the\n * default behavior of any part of the startup sequence. It can also be used to add additional\n * initialization behavior before or after the rest of the sequence.\n */\nexport async function initialize({\n loggingService = NewRelicLoggingService,\n analyticsService = SegmentAnalyticsService,\n authService = AxiosJwtAuthService,\n authMiddleware = [],\n externalScripts = [GoogleAnalyticsLoader],\n requireAuthenticatedUser: requireUser = false,\n hydrateAuthenticatedUser: hydrateUser = false,\n messages,\n handlers: overrideHandlers = {},\n}) {\n const handlers = applyOverrideHandlers(overrideHandlers);\n try {\n // Pub/Sub\n await handlers.pubSub();\n publish(APP_PUBSUB_INITIALIZED);\n\n // Configuration\n await handlers.config();\n await jsFileConfig();\n await runtimeConfig();\n publish(APP_CONFIG_INITIALIZED);\n\n loadExternalScripts(externalScripts, {\n config: getConfig(),\n });\n\n // This allows us to replace the implementations of the logging, analytics, and auth services\n // based on keys in the ConfigDocument. The JavaScript File Configuration method is the only\n // one capable of supplying an alternate implementation since it can import other modules.\n // If a service wasn't supplied we fall back to the default parameters on the initialize\n // function signature.\n const loggingServiceImpl = getConfig().loggingService || loggingService;\n const analyticsServiceImpl = getConfig().analyticsService || analyticsService;\n const authServiceImpl = getConfig().authService || authService;\n\n // Logging\n configureLogging(loggingServiceImpl, {\n config: getConfig(),\n });\n await handlers.logging();\n publish(APP_LOGGING_INITIALIZED);\n\n // Internationalization\n configureI18n({\n messages,\n config: getConfig(),\n loggingService: getLoggingService(),\n });\n await handlers.i18n();\n publish(APP_I18N_INITIALIZED);\n\n // Authentication\n configureAuth(authServiceImpl, {\n loggingService: getLoggingService(),\n config: getConfig(),\n middleware: authMiddleware,\n });\n\n await handlers.auth(requireUser, hydrateUser);\n publish(APP_AUTH_INITIALIZED);\n\n // Analytics\n configureAnalytics(analyticsServiceImpl, {\n config: getConfig(),\n loggingService: getLoggingService(),\n httpClient: getAuthenticatedHttpClient(),\n });\n await handlers.analytics();\n publish(APP_ANALYTICS_INITIALIZED);\n\n // Application Ready\n await handlers.ready();\n publish(APP_READY);\n } catch (error) {\n if (!error.isRedirecting) {\n // Initialization Error\n await handlers.initError(error);\n publish(APP_INIT_ERROR, error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"initialize.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","_asyncToGenerator","arguments","apply","_next","_throw","createBrowserHistory","createMemoryHistory","envConfig","getPath","publish","getConfig","mergeConfig","configure","configureLogging","getLoggingService","NewRelicLoggingService","logError","configureAnalytics","SegmentAnalyticsService","identifyAnonymousUser","identifyAuthenticatedUser","GoogleAnalyticsLoader","getAuthenticatedHttpClient","configureAuth","ensureAuthenticatedUser","fetchAuthenticatedUser","hydrateAuthenticatedUser","getAuthenticatedUser","AxiosJwtAuthService","configureI18n","APP_PUBSUB_INITIALIZED","APP_CONFIG_INITIALIZED","APP_AUTH_INITIALIZED","APP_I18N_INITIALIZED","APP_LOGGING_INITIALIZED","APP_ANALYTICS_INITIALIZED","APP_READY","APP_INIT_ERROR","configureCache","history","window","basename","PUBLIC_PATH","initError","_x","_initError","_callee2","error","_callee2$","_context2","auth","_x2","_x3","_auth","_callee3","requireUser","hydrateUser","_callee3$","_context3","globalThis","location","href","jsFileConfig","_jsFileConfig","_callee4","config","_callee4$","_context4","runtimeConfig","_runtimeConfig","_callee5","_getConfig","MFE_CONFIG_API_URL","APP_ID","apiConfig","apiService","params","url","_yield$apiService$get","data","_callee5$","_context5","headers","accept","URLSearchParams","append","concat","toString","get","t0","console","message","loadExternalScripts","externalScripts","ExternalScript","script","loadScript","analytics","_analytics","_callee6","authenticatedUser","_callee6$","_context6","userId","applyOverrideHandlers","overrides","noOp","_ref","_callee","_callee$","_context","_objectSpread","pubSub","logging","i18n","ready","initialize","_x4","_initialize","_callee7","_ref2","_ref2$loggingService","loggingService","_ref2$analyticsServic","analyticsService","_ref2$authService","authService","_ref2$authMiddleware","authMiddleware","_ref2$externalScripts","_ref2$requireAuthenti","_ref2$hydrateAuthenti","messages","_ref2$handlers","overrideHandlers","handlers","loggingServiceImpl","analyticsServiceImpl","authServiceImpl","_callee7$","_context7","requireAuthenticatedUser","middleware","httpClient","isRedirecting"],"sources":["../src/initialize.js"],"sourcesContent":["/**\n * #### Import members from **@edx/frontend-platform**\n *\n * The initialization module provides a function for managing an application's initialization\n * lifecycle. It also provides constants and default handler implementations.\n *\n * ```\n * import {\n * initialize,\n * APP_INIT_ERROR,\n * APP_READY,\n * subscribe,\n * } from '@edx/frontend-platform';\n * import { AppProvider, ErrorPage, PageWrap } from '@edx/frontend-platform/react';\n * import React from 'react';\n * import ReactDOM from 'react-dom';\n * import { Routes, Route } from 'react-router-dom';\n *\n * subscribe(APP_READY, () => {\n * ReactDOM.render(\n * <AppProvider store={configureStore()}>\n * <Header />\n * <main>\n * <Routes>\n * <Route path=\"/\" element={<PageWrap><PaymentPage /></PageWrap>} />\n * </Routes>\n * </main>\n * <Footer />\n * </AppProvider>,\n * document.getElementById('root'),\n * );\n * });\n *\n * subscribe(APP_INIT_ERROR, (error) => {\n * ReactDOM.render(<ErrorPage message={error.message} />, document.getElementById('root'));\n * });\n *\n * initialize({\n * messages: [appMessages],\n * requireAuthenticatedUser: true,\n * hydrateAuthenticatedUser: true,\n * });\n\n```\n * @module Initialization\n */\n\nimport { createBrowserHistory, createMemoryHistory } from 'history';\n/*\nThis 'env.config' package is a special 'magic' alias in our webpack configuration in frontend-build.\nIt points at an `env.config.js` file in the root of an MFE's repository if it exists and falls back\nto an empty object `{}` if the file doesn't exist. This acts like an 'optional' import, in a sense.\nNote that the env.config.js file in frontend-platform's root directory is NOT used by the actual\ninitialization code, it's just there for the test suite and example application.\n*/\nimport envConfig from 'env.config'; // eslint-disable-line import/no-unresolved\nimport { getPath } from './utils';\nimport {\n publish,\n} from './pubSub';\n// eslint-disable-next-line import/no-cycle\nimport {\n getConfig, mergeConfig,\n} from './config';\nimport {\n configure as configureLogging, getLoggingService, NewRelicLoggingService, logError,\n} from './logging';\nimport {\n configure as configureAnalytics, SegmentAnalyticsService, identifyAnonymousUser, identifyAuthenticatedUser,\n} from './analytics';\nimport { GoogleAnalyticsLoader } from './scripts';\nimport {\n getAuthenticatedHttpClient,\n configure as configureAuth,\n ensureAuthenticatedUser,\n fetchAuthenticatedUser,\n hydrateAuthenticatedUser,\n getAuthenticatedUser,\n AxiosJwtAuthService,\n} from './auth';\nimport { configure as configureI18n } from './i18n';\nimport {\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, APP_INIT_ERROR,\n} from './constants';\nimport configureCache from './auth/LocalForageCache';\n\n/**\n * A browser history or memory history object created by the [history](https://github.com/ReactTraining/history)\n * package. Applications are encouraged to use this history object, rather than creating their own,\n * as behavior may be undefined when managing history via multiple mechanisms/instances. Note that\n * in environments where browser history may be inaccessible due to `window` being undefined, this\n * falls back to memory history.\n */\nexport const history = (typeof window !== 'undefined')\n ? createBrowserHistory({\n basename: getPath(getConfig().PUBLIC_PATH),\n }) : createMemoryHistory();\n\n/**\n * The string basename that is the root directory of this MFE.\n *\n * In devstack, this should always just return \"/\", because each MFE is in its own server/domain.\n *\n * In Tutor, all MFEs are deployed to a common server, each under a different top-level directory.\n * The basename is the root path for a given MFE, e.g. \"/library-authoring\". It is set by tutor-mfe\n * as an ENV variable in the Docker file, and we read it here from that configuration so that it\n * can be passed into a Router later.\n */\nexport const basename = getPath(getConfig().PUBLIC_PATH);\n\n/**\n * The default handler for the initialization lifecycle's `initError` phase. Logs the error to the\n * LoggingService using `logError`\n *\n * @see {@link module:frontend-platform/logging~logError}\n * @param {*} error\n */\nexport async function initError(error) {\n logError(error);\n}\n\n/**\n * The default handler for the initialization lifecycle's `auth` phase.\n *\n * The handler has several responsibilities:\n * - Determining the user's authentication state (authenticated or anonymous)\n * - Optionally redirecting to login if the application requires an authenticated user.\n * - Optionally loading additional user information via the application's user account data\n * endpoint.\n *\n * @param {boolean} requireUser Whether or not we should redirect to login if a user is not\n * authenticated.\n * @param {boolean} hydrateUser Whether or not we should fetch additional user account data.\n */\nexport async function auth(requireUser, hydrateUser) {\n if (requireUser) {\n await ensureAuthenticatedUser(globalThis.location.href);\n } else {\n await fetchAuthenticatedUser();\n }\n\n if (hydrateUser && getAuthenticatedUser() !== null) {\n // We intentionally do not await the promise returned by hydrateAuthenticatedUser. All the\n // critical data is returned as part of fetch/ensureAuthenticatedUser above, and anything else\n // is a nice-to-have for application code.\n hydrateAuthenticatedUser();\n }\n}\n\n/**\n * Set or overrides configuration via an env.config.js file in the consuming application.\n * This env.config.js is loaded at runtime and must export one of two things:\n *\n * - An object which will be merged into the application config via `mergeConfig`.\n * - A function which returns an object which will be merged into the application config via\n * `mergeConfig`. This function can return a promise.\n */\nasync function jsFileConfig() {\n let config = {};\n if (typeof envConfig === 'function') {\n config = await envConfig();\n } else {\n config = envConfig;\n }\n\n mergeConfig(config);\n}\n\n/*\n * Set or overrides configuration through an API.\n * This method allows runtime configuration.\n * Set a basic configuration when an error happen and allow initError and display the ErrorPage.\n */\nasync function runtimeConfig() {\n try {\n const { MFE_CONFIG_API_URL, APP_ID } = getConfig();\n\n if (MFE_CONFIG_API_URL) {\n const apiConfig = { headers: { accept: 'application/json' } };\n const apiService = await configureCache();\n\n const params = new URLSearchParams();\n params.append('mfe', APP_ID);\n const url = `${MFE_CONFIG_API_URL}?${params.toString()}`;\n\n const { data } = await apiService.get(url, apiConfig);\n mergeConfig(data);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error with config API', error.message);\n }\n}\n\nexport function loadExternalScripts(externalScripts, data) {\n externalScripts.forEach(ExternalScript => {\n const script = new ExternalScript(data);\n script.loadScript();\n });\n}\n\n/**\n * The default handler for the initialization lifecycle's `analytics` phase.\n *\n * The handler is responsible for identifying authenticated and anonymous users with the analytics\n * service. This is a pre-requisite for sending analytics events, thus, we do it during the\n * initialization sequence so that analytics is ready once the application's UI code starts to load.\n *\n */\nexport async function analytics() {\n const authenticatedUser = getAuthenticatedUser();\n if (authenticatedUser && authenticatedUser.userId) {\n identifyAuthenticatedUser(authenticatedUser.userId);\n } else {\n await identifyAnonymousUser();\n }\n}\n\nfunction applyOverrideHandlers(overrides) {\n const noOp = async () => { };\n return {\n pubSub: noOp,\n config: noOp,\n logging: noOp,\n auth,\n analytics,\n i18n: noOp,\n ready: noOp,\n initError,\n ...overrides, // This will override any same-keyed handlers from above.\n };\n}\n\n/**\n * Invokes the application initialization sequence.\n *\n * The sequence proceeds through a number of lifecycle phases, during which pertinent services are\n * configured.\n *\n * Using the `handlers` option, lifecycle phase handlers can be overridden to perform custom\n * functionality. Note that while these override handlers _do_ replace the default handler\n * functionality for analytics, auth, and initError (the other phases have no default\n * functionality), they do _not_ override the configuration of the actual services that those\n * handlers leverage.\n *\n * Some services can be overridden via the loggingService and analyticsService options. The other\n * services (auth and i18n) cannot currently be overridden.\n *\n * The following lifecycle phases exist:\n *\n * - pubSub: A no-op by default.\n * - config: A no-op by default.\n * - logging: A no-op by default.\n * - auth: Uses the 'auth' handler defined above.\n * - analytics: Uses the 'analytics' handler defined above.\n * - i18n: A no-op by default.\n * - ready: A no-op by default.\n * - initError: Uses the 'initError' handler defined above.\n *\n * @param {Object} [options]\n * @param {*} [options.loggingService=NewRelicLoggingService] The `LoggingService` implementation\n * to use.\n * @param {*} [options.analyticsService=SegmentAnalyticsService] The `AnalyticsService`\n * implementation to use.\n * @param {*} [options.authMiddleware=[]] An array of middleware to apply to http clients in the auth service.\n * @param {*} [options.externalScripts=[GoogleAnalyticsLoader]] An array of externalScripts.\n * By default added GoogleAnalyticsLoader.\n * @param {*} [options.requireAuthenticatedUser=false] If true, turns on automatic login\n * redirection for unauthenticated users. Defaults to false, meaning that by default the\n * application will allow anonymous/unauthenticated sessions.\n * @param {*} [options.hydrateAuthenticatedUser=false] If true, makes an API call to the user\n * account endpoint (`${App.config.LMS_BASE_URL}/api/user/v1/accounts/${username}`) to fetch\n * detailed account information for the authenticated user. This data is merged into the return\n * value of `getAuthenticatedUser`, overriding any duplicate keys that already exist. Defaults to\n * false, meaning that no additional account information will be loaded.\n * @param {*} [options.messages] A i18n-compatible messages object, or an array of such objects. If\n * an array is provided, duplicate keys are resolved with the last-one-in winning.\n * @param {*} [options.handlers={}] An optional object of handlers which can be used to replace the\n * default behavior of any part of the startup sequence. It can also be used to add additional\n * initialization behavior before or after the rest of the sequence.\n */\nexport async function initialize({\n loggingService = NewRelicLoggingService,\n analyticsService = SegmentAnalyticsService,\n authService = AxiosJwtAuthService,\n authMiddleware = [],\n externalScripts = [GoogleAnalyticsLoader],\n requireAuthenticatedUser: requireUser = false,\n hydrateAuthenticatedUser: hydrateUser = false,\n messages,\n handlers: overrideHandlers = {},\n}) {\n const handlers = applyOverrideHandlers(overrideHandlers);\n try {\n // Pub/Sub\n await handlers.pubSub();\n publish(APP_PUBSUB_INITIALIZED);\n\n // Configuration\n await handlers.config();\n await jsFileConfig();\n await runtimeConfig();\n publish(APP_CONFIG_INITIALIZED);\n\n loadExternalScripts(externalScripts, {\n config: getConfig(),\n });\n\n // This allows us to replace the implementations of the logging, analytics, and auth services\n // based on keys in the ConfigDocument. The JavaScript File Configuration method is the only\n // one capable of supplying an alternative implementation since it can import other modules.\n // If a service wasn't supplied we fall back to the default parameters on the initialize\n // function signature.\n const loggingServiceImpl = getConfig().loggingService || loggingService;\n const analyticsServiceImpl = getConfig().analyticsService || analyticsService;\n const authServiceImpl = getConfig().authService || authService;\n\n // Logging\n configureLogging(loggingServiceImpl, {\n config: getConfig(),\n });\n await handlers.logging();\n publish(APP_LOGGING_INITIALIZED);\n\n // Internationalization\n configureI18n({\n messages,\n config: getConfig(),\n loggingService: getLoggingService(),\n });\n await handlers.i18n();\n publish(APP_I18N_INITIALIZED);\n\n // Authentication\n configureAuth(authServiceImpl, {\n loggingService: getLoggingService(),\n config: getConfig(),\n middleware: authMiddleware,\n });\n\n await handlers.auth(requireUser, hydrateUser);\n publish(APP_AUTH_INITIALIZED);\n\n // Analytics\n configureAnalytics(analyticsServiceImpl, {\n config: getConfig(),\n loggingService: getLoggingService(),\n httpClient: getAuthenticatedHttpClient(),\n });\n await handlers.analytics();\n publish(APP_ANALYTICS_INITIALIZED);\n\n // Application Ready\n await handlers.ready();\n publish(APP_READY);\n } catch (error) {\n if (!error.isRedirecting) {\n // Initialization Error\n await handlers.initError(error);\n publish(APP_INIT_ERROR, error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edx/frontend-platform",
3
- "version": "8.3.9",
3
+ "version": "8.4.0",
4
4
  "description": "Foundational application framework for Open edX micro-frontend applications.",
5
5
  "main": "index.js",
6
6
  "publishConfig": {
@@ -87,7 +87,7 @@ export var getDefaultThemeVariant = function getDefaultThemeVariant(_ref) {
87
87
  * A custom React hook that manages the application's theme state and injects the appropriate CSS for the theme core
88
88
  * and theme variants (e.g., light and dark modes) into the HTML document. It handles dynamically loading the theme
89
89
  * CSS based on the current theme variant, and ensures that the theme variant's CSS is preloaded for runtime theme
90
- * switching.This is done using "alternate" stylesheets. That is, the browser will download the CSS for the
90
+ * switching. This is done using "alternate" stylesheets. That is, the browser will download the CSS for the
91
91
  * non-current theme variants with a lower priority than the current one.
92
92
  *
93
93
  * The hook also responds to system theme preference changes (e.g., via the `prefers-color-scheme` media query),
@@ -1 +1 @@
1
- {"version":3,"file":"useParagonTheme.js","names":["useCallback","useEffect","useReducer","useState","SELECTED_THEME_VARIANT_KEY","logError","paragonThemeActions","paragonThemeReducer","isEmptyObject","useParagonThemeCore","useParagonThemeUrls","useParagonThemeVariants","getDefaultThemeVariant","_ref","_window$matchMedia","_window","themeVariants","_ref$themeVariantDefa","themeVariantDefaults","undefined","themeVariantKeys","Object","keys","length","themeVariantKey","name","metadata","persistedSelectedParagonThemeVariant","localStorage","getItem","hasDarkSystemPreference","window","matchMedia","call","matches","defaultDarkThemeVariant","dark","darkThemeVariantMetadata","defaultLightThemeVariant","light","lightThemeVariantMetadata","useParagonTheme","_getDefaultThemeVaria","paragonThemeUrls","_ref2","themeCore","core","defaults","variants","initialParagonThemeState","isThemeLoaded","themeVariant","_useReducer","_useReducer2","_slicedToArray","themeState","dispatch","_useState","_useState2","isCoreThemeLoaded","setIsCoreThemeLoaded","onLoadThemeCore","_useState3","_useState4","hasLoadedThemeVariants","setHasLoadedThemeVariants","onLoadThemeVariants","onComplete","handleDarkModeSystemPreferenceChange","prefersDarkMode","setParagonThemeVariant","concat","currentThemeVariant","onDarkModeSystemPreferenceChange","hasThemeConfig","urls","setParagonThemeLoaded"],"sources":["../../../../src/react/hooks/paragon/useParagonTheme.js"],"sourcesContent":["import {\n useCallback, useEffect, useReducer, useState,\n} from 'react';\n\nimport { SELECTED_THEME_VARIANT_KEY } from '../../constants';\nimport { logError } from '../../../logging';\nimport { paragonThemeActions, paragonThemeReducer } from '../../reducers';\nimport { isEmptyObject } from './utils';\n\nimport useParagonThemeCore from './useParagonThemeCore';\nimport useParagonThemeUrls from './useParagonThemeUrls';\nimport useParagonThemeVariants from './useParagonThemeVariants';\n\n/**\n* Finds the default theme variant from the given theme variants object. If no default theme exists, the light theme\n* variant is returned as a fallback.\n*\n* It prioritizes:\n* 1. A persisted theme variant from localStorage.\n* 2. A system preference (`prefers-color-scheme`).\n* 3. The configured default theme variant.\n*\n* @param {Object.<string, ParagonThemeVariant>|undefined} themeVariants - An object where the keys are theme variant\n* names (e.g., \"light\", \"dark\") and the values are objects containing URLs for theme CSS files.\n* @param {Object} [options.themeVariantDefaults={}] - An object containing default theme variant preferences.\n*\n* @returns {Object|undefined} The default theme variant, or `undefined` if no valid theme variant is found.\n*\n*/\nexport const getDefaultThemeVariant = ({ themeVariants, themeVariantDefaults = {} }) => {\n if (!themeVariants) {\n return undefined;\n }\n\n const themeVariantKeys = Object.keys(themeVariants);\n\n // If there is only one theme variant, return it since it's the only one that may be used.\n if (themeVariantKeys.length === 1) {\n const themeVariantKey = themeVariantKeys[0];\n return {\n name: themeVariantKey,\n metadata: themeVariants[themeVariantKey],\n };\n }\n\n // Prioritize persisted localStorage theme variant preference.\n const persistedSelectedParagonThemeVariant = localStorage.getItem(SELECTED_THEME_VARIANT_KEY);\n if (persistedSelectedParagonThemeVariant && themeVariants[persistedSelectedParagonThemeVariant]) {\n return {\n name: persistedSelectedParagonThemeVariant,\n metadata: themeVariants[persistedSelectedParagonThemeVariant],\n };\n }\n\n // Then, detect system preference via `prefers-color-scheme` media query and use\n // the default dark theme variant, if one exists.\n const hasDarkSystemPreference = !!window.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n const defaultDarkThemeVariant = themeVariantDefaults.dark;\n const darkThemeVariantMetadata = themeVariants[defaultDarkThemeVariant];\n\n if (hasDarkSystemPreference && defaultDarkThemeVariant && darkThemeVariantMetadata) {\n return {\n name: defaultDarkThemeVariant,\n metadata: darkThemeVariantMetadata,\n };\n }\n\n const defaultLightThemeVariant = themeVariantDefaults.light;\n const lightThemeVariantMetadata = themeVariants[defaultLightThemeVariant];\n\n // Handle edge case where the default light theme variant is not configured or provided.\n if (!defaultLightThemeVariant || !lightThemeVariantMetadata) {\n return undefined;\n }\n\n // Otherwise, fallback to using the default light theme variant as configured.\n return {\n name: defaultLightThemeVariant,\n metadata: lightThemeVariantMetadata,\n };\n};\n\n/**\n * A custom React hook that manages the application's theme state and injects the appropriate CSS for the theme core\n * and theme variants (e.g., light and dark modes) into the HTML document. It handles dynamically loading the theme\n * CSS based on the current theme variant, and ensures that the theme variant's CSS is preloaded for runtime theme\n * switching.This is done using \"alternate\" stylesheets. That is, the browser will download the CSS for the\n * non-current theme variants with a lower priority than the current one.\n *\n * The hook also responds to system theme preference changes (e.g., via the `prefers-color-scheme` media query),\n * and can automatically switch the theme based on the system's dark mode or light mode preference.\n *\n * @memberof module:React\n *\n * @returns {Array} - An array containing:\n * 1. An object representing the current theme state.\n * 2. A dispatch function to mutate the app theme state (e.g., change the theme variant).\n *\n * * @example\n * const [themeState, dispatch] = useParagonTheme();\n * console.log(themeState.isThemeLoaded); // true when the theme has been successfully loaded.\n *\n * // Dispatch an action to change the theme variant\n * dispatch(paragonThemeActions.setParagonThemeVariant('dark'));\n */\nconst useParagonTheme = () => {\n const paragonThemeUrls = useParagonThemeUrls();\n const {\n core: themeCore,\n defaults: themeVariantDefaults,\n variants: themeVariants,\n } = paragonThemeUrls || {};\n const initialParagonThemeState = {\n isThemeLoaded: false,\n themeVariant: getDefaultThemeVariant({ themeVariants, themeVariantDefaults })?.name,\n };\n const [themeState, dispatch] = useReducer(paragonThemeReducer, initialParagonThemeState);\n\n const [isCoreThemeLoaded, setIsCoreThemeLoaded] = useState(false);\n const onLoadThemeCore = useCallback(() => {\n setIsCoreThemeLoaded(true);\n }, []);\n\n const [hasLoadedThemeVariants, setHasLoadedThemeVariants] = useState(false);\n const onLoadThemeVariants = useCallback(() => {\n setHasLoadedThemeVariants(true);\n }, []);\n\n // load the core theme CSS\n useParagonThemeCore({\n themeCore,\n onComplete: onLoadThemeCore,\n });\n\n // respond to system preference changes with regard to `prefers-color-scheme: dark`.\n const handleDarkModeSystemPreferenceChange = useCallback((prefersDarkMode) => {\n // Ignore system preference change if the theme variant is already set in localStorage.\n if (localStorage.getItem(SELECTED_THEME_VARIANT_KEY)) {\n return;\n }\n\n if (prefersDarkMode && themeVariantDefaults?.dark) {\n dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.dark));\n } else if (!prefersDarkMode && themeVariantDefaults?.light) {\n dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.light));\n } else {\n logError(`Could not set theme variant based on system preference (prefers dark mode: ${prefersDarkMode})`, themeVariantDefaults, themeVariants);\n }\n }, [themeVariantDefaults, themeVariants]);\n\n // load the theme variant(s) CSS\n useParagonThemeVariants({\n themeVariants,\n onComplete: onLoadThemeVariants,\n currentThemeVariant: themeState.themeVariant,\n onDarkModeSystemPreferenceChange: handleDarkModeSystemPreferenceChange,\n });\n\n useEffect(() => {\n // theme is already loaded, do nothing\n if (themeState.isThemeLoaded) {\n return;\n }\n\n const hasThemeConfig = (themeCore?.urls && !isEmptyObject(themeVariants));\n if (!hasThemeConfig) {\n // no theme URLs to load, set loading to false.\n dispatch(paragonThemeActions.setParagonThemeLoaded(true));\n }\n\n // Return early if neither the core theme CSS nor any theme variant CSS is loaded.\n if (!isCoreThemeLoaded || !hasLoadedThemeVariants) {\n return;\n }\n\n // All application theme URLs are loaded\n dispatch(paragonThemeActions.setParagonThemeLoaded(true));\n }, [\n themeState.isThemeLoaded,\n isCoreThemeLoaded,\n hasLoadedThemeVariants,\n themeCore?.urls,\n themeVariants,\n ]);\n\n return [themeState, dispatch];\n};\n\nexport default useParagonTheme;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useParagonTheme.js","names":["useCallback","useEffect","useReducer","useState","SELECTED_THEME_VARIANT_KEY","logError","paragonThemeActions","paragonThemeReducer","isEmptyObject","useParagonThemeCore","useParagonThemeUrls","useParagonThemeVariants","getDefaultThemeVariant","_ref","_window$matchMedia","_window","themeVariants","_ref$themeVariantDefa","themeVariantDefaults","undefined","themeVariantKeys","Object","keys","length","themeVariantKey","name","metadata","persistedSelectedParagonThemeVariant","localStorage","getItem","hasDarkSystemPreference","window","matchMedia","call","matches","defaultDarkThemeVariant","dark","darkThemeVariantMetadata","defaultLightThemeVariant","light","lightThemeVariantMetadata","useParagonTheme","_getDefaultThemeVaria","paragonThemeUrls","_ref2","themeCore","core","defaults","variants","initialParagonThemeState","isThemeLoaded","themeVariant","_useReducer","_useReducer2","_slicedToArray","themeState","dispatch","_useState","_useState2","isCoreThemeLoaded","setIsCoreThemeLoaded","onLoadThemeCore","_useState3","_useState4","hasLoadedThemeVariants","setHasLoadedThemeVariants","onLoadThemeVariants","onComplete","handleDarkModeSystemPreferenceChange","prefersDarkMode","setParagonThemeVariant","concat","currentThemeVariant","onDarkModeSystemPreferenceChange","hasThemeConfig","urls","setParagonThemeLoaded"],"sources":["../../../../src/react/hooks/paragon/useParagonTheme.js"],"sourcesContent":["import {\n useCallback, useEffect, useReducer, useState,\n} from 'react';\n\nimport { SELECTED_THEME_VARIANT_KEY } from '../../constants';\nimport { logError } from '../../../logging';\nimport { paragonThemeActions, paragonThemeReducer } from '../../reducers';\nimport { isEmptyObject } from './utils';\n\nimport useParagonThemeCore from './useParagonThemeCore';\nimport useParagonThemeUrls from './useParagonThemeUrls';\nimport useParagonThemeVariants from './useParagonThemeVariants';\n\n/**\n* Finds the default theme variant from the given theme variants object. If no default theme exists, the light theme\n* variant is returned as a fallback.\n*\n* It prioritizes:\n* 1. A persisted theme variant from localStorage.\n* 2. A system preference (`prefers-color-scheme`).\n* 3. The configured default theme variant.\n*\n* @param {Object.<string, ParagonThemeVariant>|undefined} themeVariants - An object where the keys are theme variant\n* names (e.g., \"light\", \"dark\") and the values are objects containing URLs for theme CSS files.\n* @param {Object} [options.themeVariantDefaults={}] - An object containing default theme variant preferences.\n*\n* @returns {Object|undefined} The default theme variant, or `undefined` if no valid theme variant is found.\n*\n*/\nexport const getDefaultThemeVariant = ({ themeVariants, themeVariantDefaults = {} }) => {\n if (!themeVariants) {\n return undefined;\n }\n\n const themeVariantKeys = Object.keys(themeVariants);\n\n // If there is only one theme variant, return it since it's the only one that may be used.\n if (themeVariantKeys.length === 1) {\n const themeVariantKey = themeVariantKeys[0];\n return {\n name: themeVariantKey,\n metadata: themeVariants[themeVariantKey],\n };\n }\n\n // Prioritize persisted localStorage theme variant preference.\n const persistedSelectedParagonThemeVariant = localStorage.getItem(SELECTED_THEME_VARIANT_KEY);\n if (persistedSelectedParagonThemeVariant && themeVariants[persistedSelectedParagonThemeVariant]) {\n return {\n name: persistedSelectedParagonThemeVariant,\n metadata: themeVariants[persistedSelectedParagonThemeVariant],\n };\n }\n\n // Then, detect system preference via `prefers-color-scheme` media query and use\n // the default dark theme variant, if one exists.\n const hasDarkSystemPreference = !!window.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n const defaultDarkThemeVariant = themeVariantDefaults.dark;\n const darkThemeVariantMetadata = themeVariants[defaultDarkThemeVariant];\n\n if (hasDarkSystemPreference && defaultDarkThemeVariant && darkThemeVariantMetadata) {\n return {\n name: defaultDarkThemeVariant,\n metadata: darkThemeVariantMetadata,\n };\n }\n\n const defaultLightThemeVariant = themeVariantDefaults.light;\n const lightThemeVariantMetadata = themeVariants[defaultLightThemeVariant];\n\n // Handle edge case where the default light theme variant is not configured or provided.\n if (!defaultLightThemeVariant || !lightThemeVariantMetadata) {\n return undefined;\n }\n\n // Otherwise, fallback to using the default light theme variant as configured.\n return {\n name: defaultLightThemeVariant,\n metadata: lightThemeVariantMetadata,\n };\n};\n\n/**\n * A custom React hook that manages the application's theme state and injects the appropriate CSS for the theme core\n * and theme variants (e.g., light and dark modes) into the HTML document. It handles dynamically loading the theme\n * CSS based on the current theme variant, and ensures that the theme variant's CSS is preloaded for runtime theme\n * switching. This is done using \"alternate\" stylesheets. That is, the browser will download the CSS for the\n * non-current theme variants with a lower priority than the current one.\n *\n * The hook also responds to system theme preference changes (e.g., via the `prefers-color-scheme` media query),\n * and can automatically switch the theme based on the system's dark mode or light mode preference.\n *\n * @memberof module:React\n *\n * @returns {Array} - An array containing:\n * 1. An object representing the current theme state.\n * 2. A dispatch function to mutate the app theme state (e.g., change the theme variant).\n *\n * * @example\n * const [themeState, dispatch] = useParagonTheme();\n * console.log(themeState.isThemeLoaded); // true when the theme has been successfully loaded.\n *\n * // Dispatch an action to change the theme variant\n * dispatch(paragonThemeActions.setParagonThemeVariant('dark'));\n */\nconst useParagonTheme = () => {\n const paragonThemeUrls = useParagonThemeUrls();\n const {\n core: themeCore,\n defaults: themeVariantDefaults,\n variants: themeVariants,\n } = paragonThemeUrls || {};\n const initialParagonThemeState = {\n isThemeLoaded: false,\n themeVariant: getDefaultThemeVariant({ themeVariants, themeVariantDefaults })?.name,\n };\n const [themeState, dispatch] = useReducer(paragonThemeReducer, initialParagonThemeState);\n\n const [isCoreThemeLoaded, setIsCoreThemeLoaded] = useState(false);\n const onLoadThemeCore = useCallback(() => {\n setIsCoreThemeLoaded(true);\n }, []);\n\n const [hasLoadedThemeVariants, setHasLoadedThemeVariants] = useState(false);\n const onLoadThemeVariants = useCallback(() => {\n setHasLoadedThemeVariants(true);\n }, []);\n\n // load the core theme CSS\n useParagonThemeCore({\n themeCore,\n onComplete: onLoadThemeCore,\n });\n\n // respond to system preference changes with regard to `prefers-color-scheme: dark`.\n const handleDarkModeSystemPreferenceChange = useCallback((prefersDarkMode) => {\n // Ignore system preference change if the theme variant is already set in localStorage.\n if (localStorage.getItem(SELECTED_THEME_VARIANT_KEY)) {\n return;\n }\n\n if (prefersDarkMode && themeVariantDefaults?.dark) {\n dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.dark));\n } else if (!prefersDarkMode && themeVariantDefaults?.light) {\n dispatch(paragonThemeActions.setParagonThemeVariant(themeVariantDefaults.light));\n } else {\n logError(`Could not set theme variant based on system preference (prefers dark mode: ${prefersDarkMode})`, themeVariantDefaults, themeVariants);\n }\n }, [themeVariantDefaults, themeVariants]);\n\n // load the theme variant(s) CSS\n useParagonThemeVariants({\n themeVariants,\n onComplete: onLoadThemeVariants,\n currentThemeVariant: themeState.themeVariant,\n onDarkModeSystemPreferenceChange: handleDarkModeSystemPreferenceChange,\n });\n\n useEffect(() => {\n // theme is already loaded, do nothing\n if (themeState.isThemeLoaded) {\n return;\n }\n\n const hasThemeConfig = (themeCore?.urls && !isEmptyObject(themeVariants));\n if (!hasThemeConfig) {\n // no theme URLs to load, set loading to false.\n dispatch(paragonThemeActions.setParagonThemeLoaded(true));\n }\n\n // Return early if neither the core theme CSS nor any theme variant CSS is loaded.\n if (!isCoreThemeLoaded || !hasLoadedThemeVariants) {\n return;\n }\n\n // All application theme URLs are loaded\n dispatch(paragonThemeActions.setParagonThemeLoaded(true));\n }, [\n themeState.isThemeLoaded,\n isCoreThemeLoaded,\n hasLoadedThemeVariants,\n themeCore?.urls,\n themeVariants,\n ]);\n\n return [themeState, dispatch];\n};\n\nexport default useParagonTheme;\n"],"mappings":"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","ignoreList":[]}