@edx/frontend-platform 2.4.0 → 2.5.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/config.js +5 -1
- package/config.js.map +1 -1
- package/initialize.js +116 -45
- package/initialize.js.map +1 -1
- package/package.json +1 -2
package/config.js
CHANGED
|
@@ -65,7 +65,9 @@ var config = {
|
|
|
65
65
|
LOGO_URL: process.env.LOGO_URL,
|
|
66
66
|
LOGO_TRADEMARK_URL: process.env.LOGO_TRADEMARK_URL,
|
|
67
67
|
LOGO_WHITE_URL: process.env.LOGO_WHITE_URL,
|
|
68
|
-
FAVICON_URL: process.env.FAVICON_URL
|
|
68
|
+
FAVICON_URL: process.env.FAVICON_URL,
|
|
69
|
+
MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL,
|
|
70
|
+
APP_ID: process.env.APP_ID
|
|
69
71
|
};
|
|
70
72
|
/**
|
|
71
73
|
* Getter for the application configuration document. This is synchronous and merely returns a
|
|
@@ -192,5 +194,7 @@ export function ensureConfig(keys) {
|
|
|
192
194
|
* @property {string} LOGO_TRADEMARK_URL
|
|
193
195
|
* @property {string} LOGO_WHITE_URL
|
|
194
196
|
* @property {string} FAVICON_URL
|
|
197
|
+
* @property {string} MFE_CONFIG_API_URL
|
|
198
|
+
* @property {string} APP_ID
|
|
195
199
|
*/
|
|
196
200
|
//# sourceMappingURL=config.js.map
|
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","ENVIRONMENT","process","env","NODE_ENV","config","ACCESS_TOKEN_COOKIE_NAME","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","getConfig","setConfig","newConfig","mergeConfig","Object","assign","ensureConfig","keys","requester","forEach","key","console","warn"],"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). This module uses `process.env` to import configuration variables\n * from the command-line build process. It can be dynamically extended at run-time using a\n * `config` initialization handler. Please see the Initialization documentation for more\n * information on handlers and initialization phases.\n *\n * ```\n * import { getConfig } from '@edx/frontend-platform';\n *\n * const {\n * BASE_URL,\n * LMS_BASE_URL,\n * LOGIN_URL,\n * LOGIN_URL,\n * REFRESH_ACCESS_TOKEN_ENDPOINT,\n * ACCESS_TOKEN_COOKIE_NAME,\n * CSRF_TOKEN_API_PATH,\n * } = getConfig();\n * ```\n *\n * @module Config\n */\n\nimport { APP_CONFIG_INITIALIZED, CONFIG_CHANGED } from './constants';\n\nimport { publish, subscribe } from './pubSub';\nimport { ensureDefinedConfig } from './utils';\n\nfunction extractRegex(envVar) {\n // Convert the environment variable string to a regex, while guarding\n // against a non-string and an empty/whitespace-only string.\n if (typeof envVar === 'string' && envVar.trim() !== '') {\n return new RegExp(envVar);\n }\n return undefined;\n}\n\nconst ENVIRONMENT = process.env.NODE_ENV;\nlet config = {\n ACCESS_TOKEN_COOKIE_NAME: process.env.ACCESS_TOKEN_COOKIE_NAME,\n 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};\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. The document\n * should have the following keys at a minimum:\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 * @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 * The implementation loads this document via `process.env` variables.\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} 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 */\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":["APP_CONFIG_INITIALIZED","CONFIG_CHANGED","publish","subscribe","ensureDefinedConfig","extractRegex","envVar","trim","RegExp","undefined","ENVIRONMENT","process","env","NODE_ENV","config","ACCESS_TOKEN_COOKIE_NAME","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","getConfig","setConfig","newConfig","mergeConfig","Object","assign","ensureConfig","keys","requester","forEach","key","console","warn"],"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). This module uses `process.env` to import configuration variables\n * from the command-line build process. It can be dynamically extended at run-time using a\n * `config` initialization handler. Please see the Initialization documentation for more\n * information on handlers and initialization phases.\n *\n * ```\n * import { getConfig } from '@edx/frontend-platform';\n *\n * const {\n * BASE_URL,\n * LMS_BASE_URL,\n * LOGIN_URL,\n * LOGIN_URL,\n * REFRESH_ACCESS_TOKEN_ENDPOINT,\n * ACCESS_TOKEN_COOKIE_NAME,\n * CSRF_TOKEN_API_PATH,\n * } = getConfig();\n * ```\n *\n * @module Config\n */\n\nimport { APP_CONFIG_INITIALIZED, CONFIG_CHANGED } from './constants';\n\nimport { publish, subscribe } from './pubSub';\nimport { ensureDefinedConfig } from './utils';\n\nfunction extractRegex(envVar) {\n // Convert the environment variable string to a regex, while guarding\n // against a non-string and an empty/whitespace-only string.\n if (typeof envVar === 'string' && envVar.trim() !== '') {\n return new RegExp(envVar);\n }\n return undefined;\n}\n\nconst ENVIRONMENT = process.env.NODE_ENV;\nlet config = {\n ACCESS_TOKEN_COOKIE_NAME: process.env.ACCESS_TOKEN_COOKIE_NAME,\n 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};\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. The document\n * should have the following keys at a minimum:\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 * @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 * The implementation loads this document via `process.env` variables.\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} 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 */\n"],"mappings":"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cAAD,CAAP;AACD;AAED;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,SAASgD,YAAT,CAAsBC,IAAtB,EAAwE;EAAA,IAA5CC,SAA4C,uEAAhC,8BAAgC;EAC7EhD,SAAS,CAACH,sBAAD,EAAyB,YAAM;IACtCkD,IAAI,CAACE,OAAL,CAAa,UAACC,GAAD,EAAS;MACpB,IAAIvC,MAAM,CAACuC,GAAD,CAAN,KAAgB5C,SAApB,EAA+B;QAC7B;QACA6C,OAAO,CAACC,IAAR,oCAAyCF,GAAzC,6BAA+DF,SAA/D;MACD;IACF,CALD;EAMD,CAPQ,CAAT;AAQD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/initialize.js
CHANGED
|
@@ -57,12 +57,13 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
|
|
|
57
57
|
import { createBrowserHistory, createMemoryHistory } from 'history';
|
|
58
58
|
import { publish } from './pubSub'; // eslint-disable-next-line import/no-cycle
|
|
59
59
|
|
|
60
|
-
import { getConfig } from './config';
|
|
60
|
+
import { getConfig, mergeConfig } from './config';
|
|
61
61
|
import { configure as configureLogging, getLoggingService, NewRelicLoggingService, logError } from './logging';
|
|
62
62
|
import { configure as configureAnalytics, SegmentAnalyticsService, identifyAnonymousUser, identifyAuthenticatedUser } from './analytics';
|
|
63
63
|
import { getAuthenticatedHttpClient, configure as configureAuth, ensureAuthenticatedUser, fetchAuthenticatedUser, hydrateAuthenticatedUser, getAuthenticatedUser, AxiosJwtAuthService } from './auth';
|
|
64
64
|
import { configure as configureI18n } from './i18n';
|
|
65
65
|
import { APP_PUBSUB_INITIALIZED, APP_CONFIG_INITIALIZED, APP_AUTH_INITIALIZED, APP_I18N_INITIALIZED, APP_LOGGING_INITIALIZED, APP_ANALYTICS_INITIALIZED, APP_READY, APP_INIT_ERROR } from './constants';
|
|
66
|
+
import configureCache from './auth/LocalForageCache';
|
|
66
67
|
/**
|
|
67
68
|
* A browser history or memory history object created by the [history](https://github.com/ReactTraining/history)
|
|
68
69
|
* package. Applications are encouraged to use this history object, rather than creating their own,
|
|
@@ -120,13 +121,10 @@ function _initError() {
|
|
|
120
121
|
export function auth(_x2, _x3) {
|
|
121
122
|
return _auth.apply(this, arguments);
|
|
122
123
|
}
|
|
123
|
-
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* service. This is a pre-requisite for sending analytics events, thus, we do it during the
|
|
128
|
-
* initialization sequence so that analytics is ready once the application's UI code starts to load.
|
|
129
|
-
*
|
|
124
|
+
/*
|
|
125
|
+
* Set or overrides configuration through an API.
|
|
126
|
+
* This method allows runtime configuration.
|
|
127
|
+
* Set a basic configuration when an error happen and allow initError and display the ErrorPage.
|
|
130
128
|
*/
|
|
131
129
|
|
|
132
130
|
function _auth() {
|
|
@@ -169,38 +167,107 @@ function _auth() {
|
|
|
169
167
|
return _auth.apply(this, arguments);
|
|
170
168
|
}
|
|
171
169
|
|
|
170
|
+
export function runtimeConfig() {
|
|
171
|
+
return _runtimeConfig.apply(this, arguments);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The default handler for the initialization lifecycle's `analytics` phase.
|
|
175
|
+
*
|
|
176
|
+
* The handler is responsible for identifying authenticated and anonymous users with the analytics
|
|
177
|
+
* service. This is a pre-requisite for sending analytics events, thus, we do it during the
|
|
178
|
+
* initialization sequence so that analytics is ready once the application's UI code starts to load.
|
|
179
|
+
*
|
|
180
|
+
*/
|
|
181
|
+
|
|
182
|
+
function _runtimeConfig() {
|
|
183
|
+
_runtimeConfig = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
|
|
184
|
+
var _getConfig, MFE_CONFIG_API_URL, APP_ID, apiConfig, apiService, params, url, _yield$apiService$get, data;
|
|
185
|
+
|
|
186
|
+
return regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
187
|
+
while (1) {
|
|
188
|
+
switch (_context4.prev = _context4.next) {
|
|
189
|
+
case 0:
|
|
190
|
+
_context4.prev = 0;
|
|
191
|
+
_getConfig = getConfig(), MFE_CONFIG_API_URL = _getConfig.MFE_CONFIG_API_URL, APP_ID = _getConfig.APP_ID;
|
|
192
|
+
|
|
193
|
+
if (!MFE_CONFIG_API_URL) {
|
|
194
|
+
_context4.next = 15;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
apiConfig = {
|
|
199
|
+
headers: {
|
|
200
|
+
accept: 'application/json'
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
_context4.next = 6;
|
|
204
|
+
return configureCache();
|
|
205
|
+
|
|
206
|
+
case 6:
|
|
207
|
+
apiService = _context4.sent;
|
|
208
|
+
params = new URLSearchParams();
|
|
209
|
+
params.append('mfe', APP_ID);
|
|
210
|
+
url = "".concat(MFE_CONFIG_API_URL, "?").concat(params.toString());
|
|
211
|
+
_context4.next = 12;
|
|
212
|
+
return apiService.get(url, apiConfig);
|
|
213
|
+
|
|
214
|
+
case 12:
|
|
215
|
+
_yield$apiService$get = _context4.sent;
|
|
216
|
+
data = _yield$apiService$get.data;
|
|
217
|
+
mergeConfig(data);
|
|
218
|
+
|
|
219
|
+
case 15:
|
|
220
|
+
_context4.next = 20;
|
|
221
|
+
break;
|
|
222
|
+
|
|
223
|
+
case 17:
|
|
224
|
+
_context4.prev = 17;
|
|
225
|
+
_context4.t0 = _context4["catch"](0);
|
|
226
|
+
// eslint-disable-next-line no-console
|
|
227
|
+
console.error('Error with config API', _context4.t0.message);
|
|
228
|
+
|
|
229
|
+
case 20:
|
|
230
|
+
case "end":
|
|
231
|
+
return _context4.stop();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}, _callee4, null, [[0, 17]]);
|
|
235
|
+
}));
|
|
236
|
+
return _runtimeConfig.apply(this, arguments);
|
|
237
|
+
}
|
|
238
|
+
|
|
172
239
|
export function analytics() {
|
|
173
240
|
return _analytics.apply(this, arguments);
|
|
174
241
|
}
|
|
175
242
|
|
|
176
243
|
function _analytics() {
|
|
177
|
-
_analytics = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
244
|
+
_analytics = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
|
|
178
245
|
var authenticatedUser;
|
|
179
|
-
return regeneratorRuntime.wrap(function
|
|
246
|
+
return regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
180
247
|
while (1) {
|
|
181
|
-
switch (
|
|
248
|
+
switch (_context5.prev = _context5.next) {
|
|
182
249
|
case 0:
|
|
183
250
|
authenticatedUser = getAuthenticatedUser();
|
|
184
251
|
|
|
185
252
|
if (!(authenticatedUser && authenticatedUser.userId)) {
|
|
186
|
-
|
|
253
|
+
_context5.next = 5;
|
|
187
254
|
break;
|
|
188
255
|
}
|
|
189
256
|
|
|
190
257
|
identifyAuthenticatedUser(authenticatedUser.userId);
|
|
191
|
-
|
|
258
|
+
_context5.next = 7;
|
|
192
259
|
break;
|
|
193
260
|
|
|
194
261
|
case 5:
|
|
195
|
-
|
|
262
|
+
_context5.next = 7;
|
|
196
263
|
return identifyAnonymousUser();
|
|
197
264
|
|
|
198
265
|
case 7:
|
|
199
266
|
case "end":
|
|
200
|
-
return
|
|
267
|
+
return _context5.stop();
|
|
201
268
|
}
|
|
202
269
|
}
|
|
203
|
-
},
|
|
270
|
+
}, _callee5);
|
|
204
271
|
}));
|
|
205
272
|
return _analytics.apply(this, arguments);
|
|
206
273
|
}
|
|
@@ -288,35 +355,39 @@ export function initialize(_x4) {
|
|
|
288
355
|
}
|
|
289
356
|
|
|
290
357
|
function _initialize() {
|
|
291
|
-
_initialize = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
358
|
+
_initialize = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(_ref2) {
|
|
292
359
|
var _ref2$loggingService, loggingService, _ref2$analyticsServic, analyticsService, _ref2$authService, authService, _ref2$authMiddleware, authMiddleware, _ref2$requireAuthenti, requireUser, _ref2$hydrateAuthenti, hydrateUser, messages, _ref2$handlers, overrideHandlers, handlers;
|
|
293
360
|
|
|
294
|
-
return regeneratorRuntime.wrap(function
|
|
361
|
+
return regeneratorRuntime.wrap(function _callee6$(_context6) {
|
|
295
362
|
while (1) {
|
|
296
|
-
switch (
|
|
363
|
+
switch (_context6.prev = _context6.next) {
|
|
297
364
|
case 0:
|
|
298
365
|
_ref2$loggingService = _ref2.loggingService, loggingService = _ref2$loggingService === void 0 ? NewRelicLoggingService : _ref2$loggingService, _ref2$analyticsServic = _ref2.analyticsService, analyticsService = _ref2$analyticsServic === void 0 ? SegmentAnalyticsService : _ref2$analyticsServic, _ref2$authService = _ref2.authService, authService = _ref2$authService === void 0 ? AxiosJwtAuthService : _ref2$authService, _ref2$authMiddleware = _ref2.authMiddleware, authMiddleware = _ref2$authMiddleware === void 0 ? [] : _ref2$authMiddleware, _ref2$requireAuthenti = _ref2.requireAuthenticatedUser, requireUser = _ref2$requireAuthenti === void 0 ? false : _ref2$requireAuthenti, _ref2$hydrateAuthenti = _ref2.hydrateAuthenticatedUser, hydrateUser = _ref2$hydrateAuthenti === void 0 ? false : _ref2$hydrateAuthenti, messages = _ref2.messages, _ref2$handlers = _ref2.handlers, overrideHandlers = _ref2$handlers === void 0 ? {} : _ref2$handlers;
|
|
299
366
|
handlers = applyOverrideHandlers(overrideHandlers);
|
|
300
|
-
|
|
301
|
-
|
|
367
|
+
_context6.prev = 2;
|
|
368
|
+
_context6.next = 5;
|
|
302
369
|
return handlers.pubSub();
|
|
303
370
|
|
|
304
371
|
case 5:
|
|
305
372
|
publish(APP_PUBSUB_INITIALIZED); // Configuration
|
|
306
373
|
|
|
307
|
-
|
|
374
|
+
_context6.next = 8;
|
|
308
375
|
return handlers.config();
|
|
309
376
|
|
|
310
377
|
case 8:
|
|
378
|
+
_context6.next = 10;
|
|
379
|
+
return runtimeConfig();
|
|
380
|
+
|
|
381
|
+
case 10:
|
|
311
382
|
publish(APP_CONFIG_INITIALIZED); // Logging
|
|
312
383
|
|
|
313
384
|
configureLogging(loggingService, {
|
|
314
385
|
config: getConfig()
|
|
315
386
|
});
|
|
316
|
-
|
|
387
|
+
_context6.next = 14;
|
|
317
388
|
return handlers.logging();
|
|
318
389
|
|
|
319
|
-
case
|
|
390
|
+
case 14:
|
|
320
391
|
publish(APP_LOGGING_INITIALIZED); // Authentication
|
|
321
392
|
|
|
322
393
|
configureAuth(authService, {
|
|
@@ -324,10 +395,10 @@ function _initialize() {
|
|
|
324
395
|
config: getConfig(),
|
|
325
396
|
middleware: authMiddleware
|
|
326
397
|
});
|
|
327
|
-
|
|
398
|
+
_context6.next = 18;
|
|
328
399
|
return handlers.auth(requireUser, hydrateUser);
|
|
329
400
|
|
|
330
|
-
case
|
|
401
|
+
case 18:
|
|
331
402
|
publish(APP_AUTH_INITIALIZED); // Analytics
|
|
332
403
|
|
|
333
404
|
configureAnalytics(analyticsService, {
|
|
@@ -335,10 +406,10 @@ function _initialize() {
|
|
|
335
406
|
loggingService: getLoggingService(),
|
|
336
407
|
httpClient: getAuthenticatedHttpClient()
|
|
337
408
|
});
|
|
338
|
-
|
|
409
|
+
_context6.next = 22;
|
|
339
410
|
return handlers.analytics();
|
|
340
411
|
|
|
341
|
-
case
|
|
412
|
+
case 22:
|
|
342
413
|
publish(APP_ANALYTICS_INITIALIZED); // Internationalization
|
|
343
414
|
|
|
344
415
|
configureI18n({
|
|
@@ -346,41 +417,41 @@ function _initialize() {
|
|
|
346
417
|
config: getConfig(),
|
|
347
418
|
loggingService: getLoggingService()
|
|
348
419
|
});
|
|
349
|
-
|
|
420
|
+
_context6.next = 26;
|
|
350
421
|
return handlers.i18n();
|
|
351
422
|
|
|
352
|
-
case
|
|
423
|
+
case 26:
|
|
353
424
|
publish(APP_I18N_INITIALIZED); // Application Ready
|
|
354
425
|
|
|
355
|
-
|
|
426
|
+
_context6.next = 29;
|
|
356
427
|
return handlers.ready();
|
|
357
428
|
|
|
358
|
-
case
|
|
429
|
+
case 29:
|
|
359
430
|
publish(APP_READY);
|
|
360
|
-
|
|
431
|
+
_context6.next = 38;
|
|
361
432
|
break;
|
|
362
433
|
|
|
363
|
-
case
|
|
364
|
-
|
|
365
|
-
|
|
434
|
+
case 32:
|
|
435
|
+
_context6.prev = 32;
|
|
436
|
+
_context6.t0 = _context6["catch"](2);
|
|
366
437
|
|
|
367
|
-
if (
|
|
368
|
-
|
|
438
|
+
if (_context6.t0.isRedirecting) {
|
|
439
|
+
_context6.next = 38;
|
|
369
440
|
break;
|
|
370
441
|
}
|
|
371
442
|
|
|
372
|
-
|
|
373
|
-
return handlers.initError(
|
|
443
|
+
_context6.next = 37;
|
|
444
|
+
return handlers.initError(_context6.t0);
|
|
374
445
|
|
|
375
|
-
case
|
|
376
|
-
publish(APP_INIT_ERROR,
|
|
446
|
+
case 37:
|
|
447
|
+
publish(APP_INIT_ERROR, _context6.t0);
|
|
377
448
|
|
|
378
|
-
case
|
|
449
|
+
case 38:
|
|
379
450
|
case "end":
|
|
380
|
-
return
|
|
451
|
+
return _context6.stop();
|
|
381
452
|
}
|
|
382
453
|
}
|
|
383
|
-
},
|
|
454
|
+
}, _callee6, null, [[2, 32]]);
|
|
384
455
|
}));
|
|
385
456
|
return _initialize.apply(this, arguments);
|
|
386
457
|
}
|
package/initialize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initialize.js","names":["createBrowserHistory","createMemoryHistory","publish","getConfig","configure","configureLogging","getLoggingService","NewRelicLoggingService","logError","configureAnalytics","SegmentAnalyticsService","identifyAnonymousUser","identifyAuthenticatedUser","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","history","window","basename","PUBLIC_PATH","initError","error","auth","requireUser","hydrateUser","global","location","href","analytics","authenticatedUser","userId","applyOverrideHandlers","overrides","noOp","pubSub","config","logging","i18n","ready","initialize","loggingService","analyticsService","authService","authMiddleware","requireAuthenticatedUser","messages","handlers","overrideHandlers","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, PageRoute } from '@edx/frontend-platform/react';\n * import React from 'react';\n * import ReactDOM from 'react-dom';\n * import { Switch } from 'react-router-dom';\n *\n * subscribe(APP_READY, () => {\n * ReactDOM.render(\n * <AppProvider store={configureStore()}>\n * <Header />\n * <main>\n * <Switch>\n * <PageRoute exact path=\"/\" component={PaymentPage} />\n * </Switch>\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';\nimport {\n publish,\n} from './pubSub';\n// eslint-disable-next-line import/no-cycle\nimport { getConfig } 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 {\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';\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: getConfig().PUBLIC_PATH,\n }) : createMemoryHistory();\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(global.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 * 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.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 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 publish(APP_CONFIG_INITIALIZED);\n\n // Logging\n configureLogging(loggingService, {\n config: getConfig(),\n });\n await handlers.logging();\n publish(APP_LOGGING_INITIALIZED);\n\n // Authentication\n configureAuth(authService, {\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(analyticsService, {\n config: getConfig(),\n loggingService: getLoggingService(),\n httpClient: getAuthenticatedHttpClient(),\n });\n await handlers.analytics();\n publish(APP_ANALYTICS_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 // 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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"}
|
|
1
|
+
{"version":3,"file":"initialize.js","names":["createBrowserHistory","createMemoryHistory","publish","getConfig","mergeConfig","configure","configureLogging","getLoggingService","NewRelicLoggingService","logError","configureAnalytics","SegmentAnalyticsService","identifyAnonymousUser","identifyAuthenticatedUser","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","error","auth","requireUser","hydrateUser","global","location","href","runtimeConfig","MFE_CONFIG_API_URL","APP_ID","apiConfig","headers","accept","apiService","params","URLSearchParams","append","url","toString","get","data","console","message","analytics","authenticatedUser","userId","applyOverrideHandlers","overrides","noOp","pubSub","config","logging","i18n","ready","initialize","loggingService","analyticsService","authService","authMiddleware","requireAuthenticatedUser","messages","handlers","overrideHandlers","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, PageRoute } from '@edx/frontend-platform/react';\n * import React from 'react';\n * import ReactDOM from 'react-dom';\n * import { Switch } from 'react-router-dom';\n *\n * subscribe(APP_READY, () => {\n * ReactDOM.render(\n * <AppProvider store={configureStore()}>\n * <Header />\n * <main>\n * <Switch>\n * <PageRoute exact path=\"/\" component={PaymentPage} />\n * </Switch>\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';\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 {\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: getConfig().PUBLIC_PATH,\n }) : createMemoryHistory();\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(global.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 * 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 */\n\nexport async 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\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.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 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 runtimeConfig();\n publish(APP_CONFIG_INITIALIZED);\n\n // Logging\n configureLogging(loggingService, {\n config: getConfig(),\n });\n await handlers.logging();\n publish(APP_LOGGING_INITIALIZED);\n\n // Authentication\n configureAuth(authService, {\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(analyticsService, {\n config: getConfig(),\n loggingService: getLoggingService(),\n httpClient: getAuthenticatedHttpClient(),\n });\n await handlers.analytics();\n publish(APP_ANALYTICS_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 // 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":";;;;;;;;;;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;AAEA,SAASA,oBAAT,EAA+BC,mBAA/B,QAA0D,SAA1D;AACA,SACEC,OADF,QAEO,UAFP,C,CAGA;;AACA,SACEC,SADF,EACaC,WADb,QAEO,UAFP;AAGA,SACEC,SAAS,IAAIC,gBADf,EACiCC,iBADjC,EACoDC,sBADpD,EAC4EC,QAD5E,QAEO,WAFP;AAGA,SACEJ,SAAS,IAAIK,kBADf,EACmCC,uBADnC,EAC4DC,qBAD5D,EACmFC,yBADnF,QAEO,aAFP;AAGA,SACEC,0BADF,EAEET,SAAS,IAAIU,aAFf,EAGEC,uBAHF,EAIEC,sBAJF,EAKEC,wBALF,EAMEC,oBANF,EAOEC,mBAPF,QAQO,QARP;AASA,SAASf,SAAS,IAAIgB,aAAtB,QAA2C,QAA3C;AACA,SACEC,sBADF,EAEEC,sBAFF,EAGEC,oBAHF,EAIEC,oBAJF,EAKEC,uBALF,EAMEC,yBANF,EAOEC,SAPF,EAOaC,cAPb,QAQO,aARP;AASA,OAAOC,cAAP,MAA2B,yBAA3B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,IAAMC,OAAO,GAAI,OAAOC,MAAP,KAAkB,WAAnB,GACnBhC,oBAAoB,CAAC;EACrBiC,QAAQ,EAAE9B,SAAS,GAAG+B;AADD,CAAD,CADD,GAGhBjC,mBAAmB,EAHnB;AAKP;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,gBAAsBkC,SAAtB;EAAA;AAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;uEAhBO,kBAAyBC,KAAzB;IAAA;MAAA;QAAA;UAAA;YACL3B,QAAQ,CAAC2B,KAAD,CAAR;;UADK;UAAA;YAAA;QAAA;MA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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@edx/frontend-platform",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Foundational application framework for Open edX micro-frontend applications.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"publishConfig": {
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
"@edx/frontend-build": "9.2.2",
|
|
36
36
|
"@edx/paragon": "20.2.0",
|
|
37
37
|
"axios-mock-adapter": "1.20.0",
|
|
38
|
-
"codecov": "3.8.3",
|
|
39
38
|
"core-js": "3.21.1",
|
|
40
39
|
"enzyme": "3.11.0",
|
|
41
40
|
"enzyme-adapter-react-16": "1.15.6",
|