@edx/frontend-platform 2.5.2 → 2.6.2
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/auth/AxiosJwtAuthService.js +4 -2
- package/auth/AxiosJwtAuthService.js.map +1 -1
- package/config.js +3 -1
- package/config.js.map +1 -1
- package/i18n/countries.js +14 -13
- package/i18n/countries.js.map +1 -1
- package/i18n/languages.js +6 -5
- package/i18n/languages.js.map +1 -1
- package/package.json +1 -1
|
@@ -87,9 +87,11 @@ var AxiosJwtAuthService = /*#__PURE__*/function () {
|
|
|
87
87
|
_this.cachedAuthenticatedHttpClient = _this.authenticatedHttpClient;
|
|
88
88
|
_this.cachedHttpClient = _this.httpClient;
|
|
89
89
|
logFrontendAuthError(_this.loggingService, "configureCache failed with error: ".concat(e.message));
|
|
90
|
+
})["finally"](function () {
|
|
91
|
+
_this.middleware = options.middleware;
|
|
92
|
+
|
|
93
|
+
_this.applyMiddleware(options.middleware);
|
|
90
94
|
});
|
|
91
|
-
this.middleware = options.middleware;
|
|
92
|
-
this.applyMiddleware(options.middleware);
|
|
93
95
|
}
|
|
94
96
|
/**
|
|
95
97
|
* Applies middleware to the axios instances in this service.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AxiosJwtAuthService.js","names":["axios","PropTypes","logFrontendAuthError","camelCaseObject","ensureDefinedConfig","createJwtTokenProviderInterceptor","createCsrfTokenProviderInterceptor","createProcessAxiosRequestErrorInterceptor","AxiosJwtTokenService","AxiosCsrfTokenService","configureCache","optionsPropTypes","config","shape","BASE_URL","string","isRequired","LMS_BASE_URL","LOGIN_URL","LOGOUT_URL","REFRESH_ACCESS_TOKEN_ENDPOINT","ACCESS_TOKEN_COOKIE_NAME","CSRF_TOKEN_API_PATH","loggingService","logError","func","logInfo","AxiosJwtAuthService","options","authenticatedHttpClient","httpClient","cachedAuthenticatedHttpClient","cachedHttpClient","authenticatedUser","checkPropTypes","jwtTokenService","csrfTokenService","addAuthenticationToHttpClient","create","then","cachedAxiosClient","e","message","middleware","applyMiddleware","clients","forEach","middlewareFn","client","error","useCache","redirectUrl","encodeURIComponent","global","location","assign","getLoginRedirectUrl","getLogoutRedirectUrl","authUser","getJwtToken","forceRefresh","decodedAccessToken","setAuthenticatedUser","email","userId","user_id","username","preferred_username","roles","administrator","name","getAuthenticatedUser","fetchAuthenticatedUser","isRedirectFromLoginPage","document","referrer","startsWith","redirectLoopError","Error","redirectToLogin","unauthorizedError","isRedirecting","user","get","response","data","newHttpClient","Object","defaults","withCredentials","refreshAccessTokenInterceptor","shouldSkip","axiosRequestConfig","isPublic","attachCsrfTokenInterceptor","method","isCsrfExempt","CSRF_PROTECTED_METHODS","includes","processAxiosRequestErrorInterceptor","interceptors","request","use"],"sources":["../../src/auth/AxiosJwtAuthService.js"],"sourcesContent":["import axios from 'axios';\nimport PropTypes from 'prop-types';\nimport { logFrontendAuthError } from './utils';\nimport { camelCaseObject, ensureDefinedConfig } from '../utils';\nimport createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor';\nimport createCsrfTokenProviderInterceptor from './interceptors/createCsrfTokenProviderInterceptor';\nimport createProcessAxiosRequestErrorInterceptor from './interceptors/createProcessAxiosRequestErrorInterceptor';\nimport AxiosJwtTokenService from './AxiosJwtTokenService';\nimport AxiosCsrfTokenService from './AxiosCsrfTokenService';\nimport configureCache from './LocalForageCache';\n\nconst optionsPropTypes = {\n config: PropTypes.shape({\n BASE_URL: PropTypes.string.isRequired,\n LMS_BASE_URL: PropTypes.string.isRequired,\n LOGIN_URL: PropTypes.string.isRequired,\n LOGOUT_URL: PropTypes.string.isRequired,\n REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired,\n ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired,\n CSRF_TOKEN_API_PATH: PropTypes.string.isRequired,\n }).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n};\n\n/**\n * @implements {AuthService}\n * @memberof module:Auth\n */\nclass AxiosJwtAuthService {\n /**\n * @param {Object} options\n * @param {Object} options.config\n * @param {string} options.config.BASE_URL\n * @param {string} options.config.LMS_BASE_URL\n * @param {string} options.config.LOGIN_URL\n * @param {string} options.config.LOGOUT_URL\n * @param {string} options.config.REFRESH_ACCESS_TOKEN_ENDPOINT\n * @param {string} options.config.ACCESS_TOKEN_COOKIE_NAME\n * @param {string} options.config.CSRF_TOKEN_API_PATH\n * @param {Object} options.loggingService requires logError and logInfo methods\n */\n constructor(options) {\n this.authenticatedHttpClient = null;\n this.httpClient = null;\n this.cachedAuthenticatedHttpClient = null;\n this.cachedHttpClient = null;\n this.authenticatedUser = null;\n\n ensureDefinedConfig(options, 'AuthService');\n PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService');\n\n this.config = options.config;\n this.loggingService = options.loggingService;\n this.jwtTokenService = new AxiosJwtTokenService(\n this.loggingService,\n this.config.ACCESS_TOKEN_COOKIE_NAME,\n this.config.REFRESH_ACCESS_TOKEN_ENDPOINT,\n );\n this.csrfTokenService = new AxiosCsrfTokenService(this.config.CSRF_TOKEN_API_PATH);\n this.authenticatedHttpClient = this.addAuthenticationToHttpClient(axios.create());\n this.httpClient = axios.create();\n configureCache()\n .then((cachedAxiosClient) => {\n this.cachedAuthenticatedHttpClient = this.addAuthenticationToHttpClient(cachedAxiosClient);\n this.cachedHttpClient = cachedAxiosClient;\n })\n .catch((e) => {\n // fallback to non-cached HTTP clients and log error\n this.cachedAuthenticatedHttpClient = this.authenticatedHttpClient;\n this.cachedHttpClient = this.httpClient;\n logFrontendAuthError(this.loggingService, `configureCache failed with error: ${e.message}`);\n });\n\n this.middleware = options.middleware;\n this.applyMiddleware(options.middleware);\n }\n\n /**\n * Applies middleware to the axios instances in this service.\n *\n * @param {Array} middleware Middleware to apply.\n */\n applyMiddleware(middleware = []) {\n const clients = [\n this.authenticatedHttpClient, this.httpClient,\n this.cachedAuthenticatedHttpClient, this.cachedHttpClient,\n ];\n try {\n (middleware).forEach((middlewareFn) => {\n clients.forEach((client) => client && middlewareFn(client));\n });\n } catch (error) {\n logFrontendAuthError(this.loggingService, error);\n throw error;\n }\n }\n\n /**\n * Gets the authenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n *\n * @returns {HttpClient} A configured axios http client which can be used for authenticated\n * requests.\n */\n getAuthenticatedHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedAuthenticatedHttpClient;\n }\n\n return this.authenticatedHttpClient;\n }\n\n /**\n * Gets the unauthenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n * @returns {HttpClient} A configured axios http client.\n */\n getHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedHttpClient;\n }\n\n return this.httpClient;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getJwtTokenService() {\n return this.jwtTokenService;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getCsrfTokenService() {\n return this.csrfTokenService;\n }\n\n /**\n * Builds a URL to the login page with a post-login redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLoginRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n getLoginRedirectUrl(redirectUrl = this.config.BASE_URL) {\n return `${this.config.LOGIN_URL}?next=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the login page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n redirectToLogin(redirectUrl = this.config.BASE_URL) {\n global.location.assign(this.getLoginRedirectUrl(redirectUrl));\n }\n\n /**\n * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLogoutRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n getLogoutRedirectUrl(redirectUrl = this.config.BASE_URL) {\n return `${this.config.LOGOUT_URL}?redirect_url=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the logout page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n redirectToLogout(redirectUrl = this.config.BASE_URL) {\n global.location.assign(this.getLogoutRedirectUrl(redirectUrl));\n }\n\n /**\n * If it exists, returns the user data representing the currently authenticated user. If the\n * user is anonymous, returns null.\n *\n * @returns {UserData|null}\n */\n getAuthenticatedUser() {\n return this.authenticatedUser;\n }\n\n /**\n * Sets the authenticated user to the provided value.\n *\n * @param {UserData} authUser\n */\n setAuthenticatedUser(authUser) {\n this.authenticatedUser = authUser;\n }\n\n /**\n * Reads the authenticated user's access token. Resolves to null if the user is\n * unauthenticated.\n *\n * @returns {Promise<UserData>|Promise<null>} Resolves to the user's access token if they are\n * logged in.\n */\n async fetchAuthenticatedUser(options = {}) {\n const decodedAccessToken = await this.jwtTokenService.getJwtToken(options.forceRefresh || false);\n\n if (decodedAccessToken !== null) {\n this.setAuthenticatedUser({\n email: decodedAccessToken.email,\n userId: decodedAccessToken.user_id,\n username: decodedAccessToken.preferred_username,\n roles: decodedAccessToken.roles || [],\n administrator: decodedAccessToken.administrator,\n name: decodedAccessToken.name,\n });\n } else {\n this.setAuthenticatedUser(null);\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Ensures a user is authenticated. It will redirect to login when not\n * authenticated.\n *\n * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not\n * authenticated.\n * @returns {Promise<UserData>}\n */\n async ensureAuthenticatedUser(redirectUrl = this.config.BASE_URL) {\n await this.fetchAuthenticatedUser();\n\n if (this.getAuthenticatedUser() === null) {\n const isRedirectFromLoginPage = global.document.referrer\n && global.document.referrer.startsWith(this.config.LOGIN_URL);\n\n if (isRedirectFromLoginPage) {\n const redirectLoopError = new Error('Redirect from login page. Rejecting to avoid infinite redirect loop.');\n logFrontendAuthError(this.loggingService, redirectLoopError);\n throw redirectLoopError;\n }\n\n // The user is not authenticated, send them to the login page.\n this.redirectToLogin(redirectUrl);\n\n const unauthorizedError = new Error('Failed to ensure the user is authenticated');\n unauthorizedError.isRedirecting = true;\n throw unauthorizedError;\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Fetches additional user account information for the authenticated user and merges it into the\n * existing authenticatedUser object, available via getAuthenticatedUser().\n *\n * ```\n * console.log(authenticatedUser); // Will be sparse and only contain basic information.\n * await hydrateAuthenticatedUser()\n * const authenticatedUser = getAuthenticatedUser();\n * console.log(authenticatedUser); // Will contain additional user information\n * ```\n *\n * @returns {Promise<null>}\n */\n async hydrateAuthenticatedUser() {\n const user = this.getAuthenticatedUser();\n if (user !== null) {\n const response = await this.authenticatedHttpClient\n .get(`${this.config.LMS_BASE_URL}/api/user/v1/accounts/${user.username}`);\n this.setAuthenticatedUser({ ...user, ...camelCaseObject(response.data) });\n }\n }\n\n /**\n * Adds authentication defaults and interceptors to an HTTP client instance.\n *\n * @param {HttpClient} newHttpClient\n * @param {Object} config\n * @param {string} [config.REFRESH_ACCESS_TOKEN_ENDPOINT]\n * @param {string} [config.ACCESS_TOKEN_COOKIE_NAME]\n * @param {string} [config.CSRF_TOKEN_API_PATH]\n * @returns {HttpClient} A configured Axios HTTP client.\n */\n addAuthenticationToHttpClient(newHttpClient) {\n const httpClient = Object.create(newHttpClient);\n // Set withCredentials to true. Enables cross-site Access-Control requests\n // to be made using cookies, authorization headers or TLS client\n // certificates. More on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials\n httpClient.defaults.withCredentials = true;\n\n // Axios interceptors\n\n // The JWT access token interceptor attempts to refresh the user's jwt token\n // before any request unless the isPublic flag is set on the request config.\n const refreshAccessTokenInterceptor = createJwtTokenProviderInterceptor({\n jwtTokenService: this.jwtTokenService,\n shouldSkip: axiosRequestConfig => axiosRequestConfig.isPublic,\n });\n // The CSRF token intercepter fetches and caches a csrf token for any post,\n // put, patch, or delete request. That token is then added to the request\n // headers.\n const attachCsrfTokenInterceptor = createCsrfTokenProviderInterceptor({\n csrfTokenService: this.csrfTokenService,\n CSRF_TOKEN_API_PATH: this.config.CSRF_TOKEN_API_PATH,\n shouldSkip: (axiosRequestConfig) => {\n const { method, isCsrfExempt } = axiosRequestConfig;\n const CSRF_PROTECTED_METHODS = ['post', 'put', 'patch', 'delete'];\n return isCsrfExempt || !CSRF_PROTECTED_METHODS.includes(method);\n },\n });\n\n const processAxiosRequestErrorInterceptor = createProcessAxiosRequestErrorInterceptor({\n loggingService: this.loggingService,\n });\n\n // Request interceptors: Axios runs the interceptors in reverse order from\n // how they are listed. After fetching csrf tokens no longer require jwt\n // authentication, it won't matter which happens first. This change is\n // coming soon in edx-platform. Nov. 2019\n httpClient.interceptors.request.use(attachCsrfTokenInterceptor);\n httpClient.interceptors.request.use(refreshAccessTokenInterceptor);\n\n // Response interceptor: moves axios response error data into the error\n // object at error.customAttributes\n httpClient.interceptors.response.use(\n response => response,\n processAxiosRequestErrorInterceptor,\n );\n\n return httpClient;\n }\n}\n\nexport default AxiosJwtAuthService;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AxiosJwtAuthService.js","names":["axios","PropTypes","logFrontendAuthError","camelCaseObject","ensureDefinedConfig","createJwtTokenProviderInterceptor","createCsrfTokenProviderInterceptor","createProcessAxiosRequestErrorInterceptor","AxiosJwtTokenService","AxiosCsrfTokenService","configureCache","optionsPropTypes","config","shape","BASE_URL","string","isRequired","LMS_BASE_URL","LOGIN_URL","LOGOUT_URL","REFRESH_ACCESS_TOKEN_ENDPOINT","ACCESS_TOKEN_COOKIE_NAME","CSRF_TOKEN_API_PATH","loggingService","logError","func","logInfo","AxiosJwtAuthService","options","authenticatedHttpClient","httpClient","cachedAuthenticatedHttpClient","cachedHttpClient","authenticatedUser","checkPropTypes","jwtTokenService","csrfTokenService","addAuthenticationToHttpClient","create","then","cachedAxiosClient","e","message","middleware","applyMiddleware","clients","forEach","middlewareFn","client","error","useCache","redirectUrl","encodeURIComponent","global","location","assign","getLoginRedirectUrl","getLogoutRedirectUrl","authUser","getJwtToken","forceRefresh","decodedAccessToken","setAuthenticatedUser","email","userId","user_id","username","preferred_username","roles","administrator","name","getAuthenticatedUser","fetchAuthenticatedUser","isRedirectFromLoginPage","document","referrer","startsWith","redirectLoopError","Error","redirectToLogin","unauthorizedError","isRedirecting","user","get","response","data","newHttpClient","Object","defaults","withCredentials","refreshAccessTokenInterceptor","shouldSkip","axiosRequestConfig","isPublic","attachCsrfTokenInterceptor","method","isCsrfExempt","CSRF_PROTECTED_METHODS","includes","processAxiosRequestErrorInterceptor","interceptors","request","use"],"sources":["../../src/auth/AxiosJwtAuthService.js"],"sourcesContent":["import axios from 'axios';\nimport PropTypes from 'prop-types';\nimport { logFrontendAuthError } from './utils';\nimport { camelCaseObject, ensureDefinedConfig } from '../utils';\nimport createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor';\nimport createCsrfTokenProviderInterceptor from './interceptors/createCsrfTokenProviderInterceptor';\nimport createProcessAxiosRequestErrorInterceptor from './interceptors/createProcessAxiosRequestErrorInterceptor';\nimport AxiosJwtTokenService from './AxiosJwtTokenService';\nimport AxiosCsrfTokenService from './AxiosCsrfTokenService';\nimport configureCache from './LocalForageCache';\n\nconst optionsPropTypes = {\n config: PropTypes.shape({\n BASE_URL: PropTypes.string.isRequired,\n LMS_BASE_URL: PropTypes.string.isRequired,\n LOGIN_URL: PropTypes.string.isRequired,\n LOGOUT_URL: PropTypes.string.isRequired,\n REFRESH_ACCESS_TOKEN_ENDPOINT: PropTypes.string.isRequired,\n ACCESS_TOKEN_COOKIE_NAME: PropTypes.string.isRequired,\n CSRF_TOKEN_API_PATH: PropTypes.string.isRequired,\n }).isRequired,\n loggingService: PropTypes.shape({\n logError: PropTypes.func.isRequired,\n logInfo: PropTypes.func.isRequired,\n }).isRequired,\n};\n\n/**\n * @implements {AuthService}\n * @memberof module:Auth\n */\nclass AxiosJwtAuthService {\n /**\n * @param {Object} options\n * @param {Object} options.config\n * @param {string} options.config.BASE_URL\n * @param {string} options.config.LMS_BASE_URL\n * @param {string} options.config.LOGIN_URL\n * @param {string} options.config.LOGOUT_URL\n * @param {string} options.config.REFRESH_ACCESS_TOKEN_ENDPOINT\n * @param {string} options.config.ACCESS_TOKEN_COOKIE_NAME\n * @param {string} options.config.CSRF_TOKEN_API_PATH\n * @param {Object} options.loggingService requires logError and logInfo methods\n */\n constructor(options) {\n this.authenticatedHttpClient = null;\n this.httpClient = null;\n this.cachedAuthenticatedHttpClient = null;\n this.cachedHttpClient = null;\n this.authenticatedUser = null;\n\n ensureDefinedConfig(options, 'AuthService');\n PropTypes.checkPropTypes(optionsPropTypes, options, 'options', 'AuthService');\n\n this.config = options.config;\n this.loggingService = options.loggingService;\n this.jwtTokenService = new AxiosJwtTokenService(\n this.loggingService,\n this.config.ACCESS_TOKEN_COOKIE_NAME,\n this.config.REFRESH_ACCESS_TOKEN_ENDPOINT,\n );\n this.csrfTokenService = new AxiosCsrfTokenService(this.config.CSRF_TOKEN_API_PATH);\n this.authenticatedHttpClient = this.addAuthenticationToHttpClient(axios.create());\n this.httpClient = axios.create();\n configureCache()\n .then((cachedAxiosClient) => {\n this.cachedAuthenticatedHttpClient = this.addAuthenticationToHttpClient(cachedAxiosClient);\n this.cachedHttpClient = cachedAxiosClient;\n })\n .catch((e) => {\n // fallback to non-cached HTTP clients and log error\n this.cachedAuthenticatedHttpClient = this.authenticatedHttpClient;\n this.cachedHttpClient = this.httpClient;\n logFrontendAuthError(this.loggingService, `configureCache failed with error: ${e.message}`);\n }).finally(() => {\n this.middleware = options.middleware;\n this.applyMiddleware(options.middleware);\n });\n }\n\n /**\n * Applies middleware to the axios instances in this service.\n *\n * @param {Array} middleware Middleware to apply.\n */\n applyMiddleware(middleware = []) {\n const clients = [\n this.authenticatedHttpClient, this.httpClient,\n this.cachedAuthenticatedHttpClient, this.cachedHttpClient,\n ];\n try {\n (middleware).forEach((middlewareFn) => {\n clients.forEach((client) => client && middlewareFn(client));\n });\n } catch (error) {\n logFrontendAuthError(this.loggingService, error);\n throw error;\n }\n }\n\n /**\n * Gets the authenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n *\n * @returns {HttpClient} A configured axios http client which can be used for authenticated\n * requests.\n */\n getAuthenticatedHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedAuthenticatedHttpClient;\n }\n\n return this.authenticatedHttpClient;\n }\n\n /**\n * Gets the unauthenticated HTTP client for the service. This is an axios instance.\n *\n * @param {Object} [options] Optional options for how the HTTP client should be configured.\n * @param {boolean} [options.useCache] Whether to use front end caching for all requests made\n * with the returned client.\n * @returns {HttpClient} A configured axios http client.\n */\n getHttpClient(options = {}) {\n if (options.useCache) {\n return this.cachedHttpClient;\n }\n\n return this.httpClient;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getJwtTokenService() {\n return this.jwtTokenService;\n }\n\n /**\n * Used primarily for testing.\n *\n * @ignore\n */\n getCsrfTokenService() {\n return this.csrfTokenService;\n }\n\n /**\n * Builds a URL to the login page with a post-login redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLoginRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/login?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n getLoginRedirectUrl(redirectUrl = this.config.BASE_URL) {\n return `${this.config.LOGIN_URL}?next=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the login page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging in.\n */\n redirectToLogin(redirectUrl = this.config.BASE_URL) {\n global.location.assign(this.getLoginRedirectUrl(redirectUrl));\n }\n\n /**\n * Builds a URL to the logout page with a post-logout redirect URL attached as a query parameter.\n *\n * ```\n * const url = getLogoutRedirectUrl('http://localhost/mypage');\n * console.log(url); // http://localhost/logout?next=http%3A%2F%2Flocalhost%2Fmypage\n * ```\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n getLogoutRedirectUrl(redirectUrl = this.config.BASE_URL) {\n return `${this.config.LOGOUT_URL}?redirect_url=${encodeURIComponent(redirectUrl)}`;\n }\n\n /**\n * Redirects the user to the logout page.\n *\n * @param {string} redirectUrl The URL the user should be redirected to after logging out.\n */\n redirectToLogout(redirectUrl = this.config.BASE_URL) {\n global.location.assign(this.getLogoutRedirectUrl(redirectUrl));\n }\n\n /**\n * If it exists, returns the user data representing the currently authenticated user. If the\n * user is anonymous, returns null.\n *\n * @returns {UserData|null}\n */\n getAuthenticatedUser() {\n return this.authenticatedUser;\n }\n\n /**\n * Sets the authenticated user to the provided value.\n *\n * @param {UserData} authUser\n */\n setAuthenticatedUser(authUser) {\n this.authenticatedUser = authUser;\n }\n\n /**\n * Reads the authenticated user's access token. Resolves to null if the user is\n * unauthenticated.\n *\n * @returns {Promise<UserData>|Promise<null>} Resolves to the user's access token if they are\n * logged in.\n */\n async fetchAuthenticatedUser(options = {}) {\n const decodedAccessToken = await this.jwtTokenService.getJwtToken(options.forceRefresh || false);\n\n if (decodedAccessToken !== null) {\n this.setAuthenticatedUser({\n email: decodedAccessToken.email,\n userId: decodedAccessToken.user_id,\n username: decodedAccessToken.preferred_username,\n roles: decodedAccessToken.roles || [],\n administrator: decodedAccessToken.administrator,\n name: decodedAccessToken.name,\n });\n } else {\n this.setAuthenticatedUser(null);\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Ensures a user is authenticated. It will redirect to login when not\n * authenticated.\n *\n * @param {string} [redirectUrl=config.BASE_URL] to return user after login when not\n * authenticated.\n * @returns {Promise<UserData>}\n */\n async ensureAuthenticatedUser(redirectUrl = this.config.BASE_URL) {\n await this.fetchAuthenticatedUser();\n\n if (this.getAuthenticatedUser() === null) {\n const isRedirectFromLoginPage = global.document.referrer\n && global.document.referrer.startsWith(this.config.LOGIN_URL);\n\n if (isRedirectFromLoginPage) {\n const redirectLoopError = new Error('Redirect from login page. Rejecting to avoid infinite redirect loop.');\n logFrontendAuthError(this.loggingService, redirectLoopError);\n throw redirectLoopError;\n }\n\n // The user is not authenticated, send them to the login page.\n this.redirectToLogin(redirectUrl);\n\n const unauthorizedError = new Error('Failed to ensure the user is authenticated');\n unauthorizedError.isRedirecting = true;\n throw unauthorizedError;\n }\n\n return this.getAuthenticatedUser();\n }\n\n /**\n * Fetches additional user account information for the authenticated user and merges it into the\n * existing authenticatedUser object, available via getAuthenticatedUser().\n *\n * ```\n * console.log(authenticatedUser); // Will be sparse and only contain basic information.\n * await hydrateAuthenticatedUser()\n * const authenticatedUser = getAuthenticatedUser();\n * console.log(authenticatedUser); // Will contain additional user information\n * ```\n *\n * @returns {Promise<null>}\n */\n async hydrateAuthenticatedUser() {\n const user = this.getAuthenticatedUser();\n if (user !== null) {\n const response = await this.authenticatedHttpClient\n .get(`${this.config.LMS_BASE_URL}/api/user/v1/accounts/${user.username}`);\n this.setAuthenticatedUser({ ...user, ...camelCaseObject(response.data) });\n }\n }\n\n /**\n * Adds authentication defaults and interceptors to an HTTP client instance.\n *\n * @param {HttpClient} newHttpClient\n * @param {Object} config\n * @param {string} [config.REFRESH_ACCESS_TOKEN_ENDPOINT]\n * @param {string} [config.ACCESS_TOKEN_COOKIE_NAME]\n * @param {string} [config.CSRF_TOKEN_API_PATH]\n * @returns {HttpClient} A configured Axios HTTP client.\n */\n addAuthenticationToHttpClient(newHttpClient) {\n const httpClient = Object.create(newHttpClient);\n // Set withCredentials to true. Enables cross-site Access-Control requests\n // to be made using cookies, authorization headers or TLS client\n // certificates. More on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials\n httpClient.defaults.withCredentials = true;\n\n // Axios interceptors\n\n // The JWT access token interceptor attempts to refresh the user's jwt token\n // before any request unless the isPublic flag is set on the request config.\n const refreshAccessTokenInterceptor = createJwtTokenProviderInterceptor({\n jwtTokenService: this.jwtTokenService,\n shouldSkip: axiosRequestConfig => axiosRequestConfig.isPublic,\n });\n // The CSRF token intercepter fetches and caches a csrf token for any post,\n // put, patch, or delete request. That token is then added to the request\n // headers.\n const attachCsrfTokenInterceptor = createCsrfTokenProviderInterceptor({\n csrfTokenService: this.csrfTokenService,\n CSRF_TOKEN_API_PATH: this.config.CSRF_TOKEN_API_PATH,\n shouldSkip: (axiosRequestConfig) => {\n const { method, isCsrfExempt } = axiosRequestConfig;\n const CSRF_PROTECTED_METHODS = ['post', 'put', 'patch', 'delete'];\n return isCsrfExempt || !CSRF_PROTECTED_METHODS.includes(method);\n },\n });\n\n const processAxiosRequestErrorInterceptor = createProcessAxiosRequestErrorInterceptor({\n loggingService: this.loggingService,\n });\n\n // Request interceptors: Axios runs the interceptors in reverse order from\n // how they are listed. After fetching csrf tokens no longer require jwt\n // authentication, it won't matter which happens first. This change is\n // coming soon in edx-platform. Nov. 2019\n httpClient.interceptors.request.use(attachCsrfTokenInterceptor);\n httpClient.interceptors.request.use(refreshAccessTokenInterceptor);\n\n // Response interceptor: moves axios response error data into the error\n // object at error.customAttributes\n httpClient.interceptors.response.use(\n response => response,\n processAxiosRequestErrorInterceptor,\n );\n\n return httpClient;\n }\n}\n\nexport default AxiosJwtAuthService;\n"],"mappings":"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"}
|
package/config.js
CHANGED
|
@@ -67,7 +67,8 @@ var config = {
|
|
|
67
67
|
LOGO_WHITE_URL: process.env.LOGO_WHITE_URL,
|
|
68
68
|
FAVICON_URL: process.env.FAVICON_URL,
|
|
69
69
|
MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL,
|
|
70
|
-
APP_ID: process.env.APP_ID
|
|
70
|
+
APP_ID: process.env.APP_ID,
|
|
71
|
+
SUPPORT_URL: process.env.SUPPORT_URL
|
|
71
72
|
};
|
|
72
73
|
/**
|
|
73
74
|
* Getter for the application configuration document. This is synchronous and merely returns a
|
|
@@ -196,5 +197,6 @@ export function ensureConfig(keys) {
|
|
|
196
197
|
* @property {string} FAVICON_URL
|
|
197
198
|
* @property {string} MFE_CONFIG_API_URL
|
|
198
199
|
* @property {string} APP_ID
|
|
200
|
+
* @property {string} SUPPORT_URL
|
|
199
201
|
*/
|
|
200
202
|
//# 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","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"}
|
|
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","SUPPORT_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 MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL,\n APP_ID: process.env.APP_ID,\n SUPPORT_URL: process.env.SUPPORT_URL,\n};\n\n/**\n * Getter for the application configuration document. This is synchronous and merely returns a\n * reference to an existing object, and is thus safe to call as often as desired. 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 * @property {string} SUPPORT_URL\n */\n"],"mappings":"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AAcnC,MAAd,EAAsBgC,SAAtB,CAAT;EACA5C,OAAO,CAACD,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,SAASiD,YAAT,CAAsBC,IAAtB,EAAwE;EAAA,IAA5CC,SAA4C,uEAAhC,8BAAgC;EAC7EjD,SAAS,CAACH,sBAAD,EAAyB,YAAM;IACtCmD,IAAI,CAACE,OAAL,CAAa,UAACC,GAAD,EAAS;MACpB,IAAIxC,MAAM,CAACwC,GAAD,CAAN,KAAgB7C,SAApB,EAA+B;QAC7B;QACA8C,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;AACA"}
|
package/i18n/countries.js
CHANGED
|
@@ -10,6 +10,7 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
10
10
|
|
|
11
11
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
12
12
|
|
|
13
|
+
/* eslint-disable import/extensions */
|
|
13
14
|
import COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries';
|
|
14
15
|
import { getPrimaryLanguageSubtag } from './lib';
|
|
15
16
|
/*
|
|
@@ -20,20 +21,20 @@ import { getPrimaryLanguageSubtag } from './lib';
|
|
|
20
21
|
* TODO: When we start dynamically loading translations only for the current locale, change this.
|
|
21
22
|
*/
|
|
22
23
|
|
|
23
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ar'));
|
|
24
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/en'));
|
|
25
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/es'));
|
|
26
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/fr'));
|
|
27
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/zh'));
|
|
28
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ca'));
|
|
29
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/he'));
|
|
30
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/id'));
|
|
31
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ko'));
|
|
32
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/pl'));
|
|
33
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/pt'));
|
|
34
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ru')); // COUNTRIES.registerLocale(require('i18n-iso-countries/langs/th.json')); // Doesn't exist in lib.
|
|
24
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ar.json'));
|
|
25
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/en.json'));
|
|
26
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/es.json'));
|
|
27
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/fr.json'));
|
|
28
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/zh.json'));
|
|
29
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ca.json'));
|
|
30
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/he.json'));
|
|
31
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/id.json'));
|
|
32
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ko.json'));
|
|
33
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/pl.json'));
|
|
34
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/pt.json'));
|
|
35
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/ru.json')); // COUNTRIES.registerLocale(require('i18n-iso-countries/langs/th.json')); // Doesn't exist in lib.
|
|
35
36
|
|
|
36
|
-
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/uk'));
|
|
37
|
+
COUNTRIES.registerLocale(require('i18n-iso-countries/langs/uk.json'));
|
|
37
38
|
/**
|
|
38
39
|
* Provides a lookup table of country IDs to country names for the current locale.
|
|
39
40
|
*
|
package/i18n/countries.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"countries.js","names":["COUNTRIES","langs","countryLangs","getPrimaryLanguageSubtag","registerLocale","require","getCountryMessages","locale","primaryLanguageSubtag","languageCode","includes","getNames","getCountryList","countryMessages","Object","entries","map","code","name"],"sources":["../../src/i18n/countries.js"],"sourcesContent":["import COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries';\n\nimport { getPrimaryLanguageSubtag } from './lib';\n\n/*\n * COUNTRY LISTS\n *\n * Lists of country names localized in supported languages.\n *\n * TODO: When we start dynamically loading translations only for the current locale, change this.\n */\n\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ar'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/en'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/es'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/fr'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/zh'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ca'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/he'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/id'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ko'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/pl'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/pt'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ru'));\n// COUNTRIES.registerLocale(require('i18n-iso-countries/langs/th.json')); // Doesn't exist in lib.\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/uk'));\n\n/**\n * Provides a lookup table of country IDs to country names for the current locale.\n *\n * @memberof module:I18n\n */\nexport function getCountryMessages(locale) {\n const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale);\n const languageCode = countryLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en';\n\n return COUNTRIES.getNames(languageCode);\n}\n\n/**\n * Provides a list of countries represented as objects of the following shape:\n *\n * {\n * key, // The ID of the country\n * name // The localized name of the country\n * }\n *\n * TODO: ARCH-878: The list should be sorted alphabetically in the current locale.\n * This is useful for populating dropdowns.\n *\n * @memberof module:I18n\n */\nexport function getCountryList(locale) {\n const countryMessages = getCountryMessages(locale);\n return Object.entries(countryMessages).map(([code, name]) => ({ code, name }));\n}\n"],"mappings":";;;;;;;;;;;;AAAA,OAAOA,SAAP,IAAoBC,KAAK,IAAIC,YAA7B,QAAiD,oBAAjD;AAEA,SAASC,wBAAT,QAAyC,OAAzC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEAH,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"countries.js","names":["COUNTRIES","langs","countryLangs","getPrimaryLanguageSubtag","registerLocale","require","getCountryMessages","locale","primaryLanguageSubtag","languageCode","includes","getNames","getCountryList","countryMessages","Object","entries","map","code","name"],"sources":["../../src/i18n/countries.js"],"sourcesContent":["/* eslint-disable import/extensions */\nimport COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries';\n\nimport { getPrimaryLanguageSubtag } from './lib';\n\n/*\n * COUNTRY LISTS\n *\n * Lists of country names localized in supported languages.\n *\n * TODO: When we start dynamically loading translations only for the current locale, change this.\n */\n\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ar.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/en.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/es.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/fr.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/zh.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ca.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/he.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/id.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ko.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/pl.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/pt.json'));\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/ru.json'));\n// COUNTRIES.registerLocale(require('i18n-iso-countries/langs/th.json')); // Doesn't exist in lib.\nCOUNTRIES.registerLocale(require('i18n-iso-countries/langs/uk.json'));\n\n/**\n * Provides a lookup table of country IDs to country names for the current locale.\n *\n * @memberof module:I18n\n */\nexport function getCountryMessages(locale) {\n const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale);\n const languageCode = countryLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en';\n\n return COUNTRIES.getNames(languageCode);\n}\n\n/**\n * Provides a list of countries represented as objects of the following shape:\n *\n * {\n * key, // The ID of the country\n * name // The localized name of the country\n * }\n *\n * TODO: ARCH-878: The list should be sorted alphabetically in the current locale.\n * This is useful for populating dropdowns.\n *\n * @memberof module:I18n\n */\nexport function getCountryList(locale) {\n const countryMessages = getCountryMessages(locale);\n return Object.entries(countryMessages).map(([code, name]) => ({ code, name }));\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AACA,OAAOA,SAAP,IAAoBC,KAAK,IAAIC,YAA7B,QAAiD,oBAAjD;AAEA,SAASC,wBAAT,QAAyC,OAAzC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEAH,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC,E,CACA;;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,kCAAD,CAAhC;AAEA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,kBAAT,CAA4BC,MAA5B,EAAoC;EACzC,IAAMC,qBAAqB,GAAGL,wBAAwB,CAACI,MAAD,CAAtD;EACA,IAAME,YAAY,GAAGP,YAAY,GAAGQ,QAAf,CAAwBF,qBAAxB,IAAiDA,qBAAjD,GAAyE,IAA9F;EAEA,OAAOR,SAAS,CAACW,QAAV,CAAmBF,YAAnB,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASG,cAAT,CAAwBL,MAAxB,EAAgC;EACrC,IAAMM,eAAe,GAAGP,kBAAkB,CAACC,MAAD,CAA1C;EACA,OAAOO,MAAM,CAACC,OAAP,CAAeF,eAAf,EAAgCG,GAAhC,CAAoC;IAAA;IAAA,IAAEC,IAAF;IAAA,IAAQC,IAAR;;IAAA,OAAmB;MAAED,IAAI,EAAJA,IAAF;MAAQC,IAAI,EAAJA;IAAR,CAAnB;EAAA,CAApC,CAAP;AACD"}
|
package/i18n/languages.js
CHANGED
|
@@ -10,6 +10,7 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
10
10
|
|
|
11
11
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
12
12
|
|
|
13
|
+
/* eslint-disable import/extensions */
|
|
13
14
|
import LANGUAGES, { langs as languageLangs } from '@cospired/i18n-iso-languages';
|
|
14
15
|
import { getPrimaryLanguageSubtag } from './lib';
|
|
15
16
|
/*
|
|
@@ -24,16 +25,16 @@ import { getPrimaryLanguageSubtag } from './lib';
|
|
|
24
25
|
*/
|
|
25
26
|
// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ar.json'));
|
|
26
27
|
|
|
27
|
-
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/en'));
|
|
28
|
-
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/es'));
|
|
29
|
-
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/fr')); // LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/zh.json'));
|
|
28
|
+
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/en.json'));
|
|
29
|
+
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/es.json'));
|
|
30
|
+
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/fr.json')); // LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/zh.json'));
|
|
30
31
|
// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ca.json'));
|
|
31
32
|
// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/he.json'));
|
|
32
33
|
// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/id.json'));
|
|
33
34
|
// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ko.json'));
|
|
34
35
|
|
|
35
|
-
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pl'));
|
|
36
|
-
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pt')); // LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ru.json'));
|
|
36
|
+
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pl.json'));
|
|
37
|
+
LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pt.json')); // LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ru.json'));
|
|
37
38
|
// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/th.json'));
|
|
38
39
|
// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/uk.json'));
|
|
39
40
|
|
package/i18n/languages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"languages.js","names":["LANGUAGES","langs","languageLangs","getPrimaryLanguageSubtag","registerLocale","require","getLanguageMessages","locale","primaryLanguageSubtag","languageCode","includes","getNames","getLanguageList","languageMessages","Object","entries","map","code","name"],"sources":["../../src/i18n/languages.js"],"sourcesContent":["import LANGUAGES, { langs as languageLangs } from '@cospired/i18n-iso-languages';\n\nimport { getPrimaryLanguageSubtag } from './lib';\n\n/*\n * LANGUAGE LISTS\n *\n * Lists of language names localized in supported languages.\n *\n * TODO: When we start dynamically loading translations only for the current locale, change this.\n * TODO: Also note that a bunch of languages are missing here. They're present but commented out\n * for reference. That's because they're not implemented in this library. If you read this and it's\n * been a while, go check and see if that's changed!\n */\n\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ar.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/en'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/es'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/fr'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/zh.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ca.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/he.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/id.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ko.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pl'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pt'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ru.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/th.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/uk.json'));\n\n/**\n * Provides a lookup table of language IDs to language names for the current locale.\n *\n * @memberof I18n\n */\nexport const getLanguageMessages = (locale) => {\n const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale);\n const languageCode = languageLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en';\n\n return LANGUAGES.getNames(languageCode);\n};\n\n/**\n * Provides a list of languages represented as objects of the following shape:\n *\n * {\n * key, // The ID of the language\n * name // The localized name of the language\n * }\n *\n * TODO: ARCH-878: The list should be sorted alphabetically in the current locale.\n * This is useful for populating dropdowns.\n *\n * @memberof I18n\n */\nexport const getLanguageList = (locale) => {\n const languageMessages = getLanguageMessages(locale);\n return Object.entries(languageMessages).map(([code, name]) => ({ code, name }));\n};\n"],"mappings":";;;;;;;;;;;;AAAA,OAAOA,SAAP,IAAoBC,KAAK,IAAIC,aAA7B,QAAkD,8BAAlD;AAEA,SAASC,wBAAT,QAAyC,OAAzC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACAH,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"languages.js","names":["LANGUAGES","langs","languageLangs","getPrimaryLanguageSubtag","registerLocale","require","getLanguageMessages","locale","primaryLanguageSubtag","languageCode","includes","getNames","getLanguageList","languageMessages","Object","entries","map","code","name"],"sources":["../../src/i18n/languages.js"],"sourcesContent":["/* eslint-disable import/extensions */\nimport LANGUAGES, { langs as languageLangs } from '@cospired/i18n-iso-languages';\n\nimport { getPrimaryLanguageSubtag } from './lib';\n\n/*\n * LANGUAGE LISTS\n *\n * Lists of language names localized in supported languages.\n *\n * TODO: When we start dynamically loading translations only for the current locale, change this.\n * TODO: Also note that a bunch of languages are missing here. They're present but commented out\n * for reference. That's because they're not implemented in this library. If you read this and it's\n * been a while, go check and see if that's changed!\n */\n\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ar.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/en.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/es.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/fr.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/zh.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ca.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/he.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/id.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ko.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pl.json'));\nLANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/pt.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/ru.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/th.json'));\n// LANGUAGES.registerLocale(require('@cospired/i18n-iso-languages/langs/uk.json'));\n\n/**\n * Provides a lookup table of language IDs to language names for the current locale.\n *\n * @memberof I18n\n */\nexport const getLanguageMessages = (locale) => {\n const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale);\n const languageCode = languageLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en';\n\n return LANGUAGES.getNames(languageCode);\n};\n\n/**\n * Provides a list of languages represented as objects of the following shape:\n *\n * {\n * key, // The ID of the language\n * name // The localized name of the language\n * }\n *\n * TODO: ARCH-878: The list should be sorted alphabetically in the current locale.\n * This is useful for populating dropdowns.\n *\n * @memberof I18n\n */\nexport const getLanguageList = (locale) => {\n const languageMessages = getLanguageMessages(locale);\n return Object.entries(languageMessages).map(([code, name]) => ({ code, name }));\n};\n"],"mappings":";;;;;;;;;;;;AAAA;AACA,OAAOA,SAAP,IAAoBC,KAAK,IAAIC,aAA7B,QAAkD,8BAAlD;AAEA,SAASC,wBAAT,QAAyC,OAAzC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACAH,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,4CAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,4CAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,4CAAD,CAAhC,E,CACA;AACA;AACA;AACA;AACA;;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,4CAAD,CAAhC;AACAL,SAAS,CAACI,cAAV,CAAyBC,OAAO,CAAC,4CAAD,CAAhC,E,CACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AACA,OAAO,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAACC,MAAD,EAAY;EAC7C,IAAMC,qBAAqB,GAAGL,wBAAwB,CAACI,MAAD,CAAtD;EACA,IAAME,YAAY,GAAGP,aAAa,GAAGQ,QAAhB,CAAyBF,qBAAzB,IAAkDA,qBAAlD,GAA0E,IAA/F;EAEA,OAAOR,SAAS,CAACW,QAAV,CAAmBF,YAAnB,CAAP;AACD,CALM;AAOP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,IAAMG,eAAe,GAAG,SAAlBA,eAAkB,CAACL,MAAD,EAAY;EACzC,IAAMM,gBAAgB,GAAGP,mBAAmB,CAACC,MAAD,CAA5C;EACA,OAAOO,MAAM,CAACC,OAAP,CAAeF,gBAAf,EAAiCG,GAAjC,CAAqC;IAAA;IAAA,IAAEC,IAAF;IAAA,IAAQC,IAAR;;IAAA,OAAmB;MAAED,IAAI,EAAJA,IAAF;MAAQC,IAAI,EAAJA;IAAR,CAAnB;EAAA,CAArC,CAAP;AACD,CAHM"}
|