@eui/core 13.0.0-beta.14 → 13.0.0-beta.18

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.
Files changed (210) hide show
  1. package/docs/classes/ActivatedRouteAction.html +43 -43
  2. package/docs/classes/AddApiQueueItemAction.html +43 -43
  3. package/docs/classes/AddAppLoadedConfigModulesAction.html +43 -43
  4. package/docs/classes/ApiQueueServiceMock.html +26 -526
  5. package/docs/classes/AsyncStorageService.html +43 -469
  6. package/docs/classes/AsyncStorageServiceMock.html +40 -1225
  7. package/docs/classes/EmptyApiQueueAction.html +43 -43
  8. package/docs/classes/EuiCoreRootGuardClass.html +8 -6
  9. package/docs/classes/EuiError.html +8 -6
  10. package/docs/classes/I18nResourceImpl.html +25 -26
  11. package/docs/classes/InitStoreAction.html +43 -43
  12. package/docs/classes/LogServiceMock.html +10 -10
  13. package/docs/classes/OpenIdConnectServiceMock.html +10 -46
  14. package/docs/classes/RemoveApiQueueItemAction.html +43 -43
  15. package/docs/classes/RouterMock.html +77 -84
  16. package/docs/classes/StorageService.html +31 -36
  17. package/docs/classes/StorageServiceMock.html +16 -479
  18. package/docs/classes/StoreMock.html +41 -47
  19. package/docs/classes/TranslateServiceMock.html +251 -270
  20. package/docs/classes/UpdateAppConnectionAction.html +43 -43
  21. package/docs/classes/UpdateAppStatusAction.html +43 -43
  22. package/docs/classes/UpdateAppVersionAction.html +43 -43
  23. package/docs/classes/UpdateCurrentModuleAction.html +43 -43
  24. package/docs/classes/UpdateI18nStateAction.html +43 -43
  25. package/docs/classes/UpdateLocaleStateAction.html +43 -43
  26. package/docs/classes/UpdateNotificationsListAction.html +43 -43
  27. package/docs/classes/UpdateUserDashboardAction.html +43 -43
  28. package/docs/classes/UpdateUserDetailsAction.html +43 -43
  29. package/docs/classes/UpdateUserPreferencesAction.html +43 -43
  30. package/docs/classes/UpdateUserRightsAction.html +43 -43
  31. package/docs/classes/UpdateUserStateAction.html +43 -43
  32. package/docs/classes/UxErrorManager.html +39 -43
  33. package/docs/dependencies.html +44 -41
  34. package/docs/directives/TranslateMockDirective.html +9 -7
  35. package/docs/index.html +7 -6
  36. package/docs/injectables/ApiQueueService.html +33 -40
  37. package/docs/injectables/CoreAppEffects.html +98 -99
  38. package/docs/injectables/EuiPermissionService.html +26 -31
  39. package/docs/injectables/GlobalErrorHandler.html +12 -11
  40. package/docs/injectables/I18nLoader.html +28 -30
  41. package/docs/injectables/I18nService.html +42 -48
  42. package/docs/injectables/I18nServiceMock.html +32 -569
  43. package/docs/injectables/LocalForageService.html +75 -1549
  44. package/docs/injectables/LocalStorageService.html +38 -499
  45. package/docs/injectables/LocaleService.html +23 -28
  46. package/docs/injectables/LocaleServiceMock.html +21 -198
  47. package/docs/injectables/LogService.html +11 -10
  48. package/docs/injectables/OpenIdConnectService.html +10 -10
  49. package/docs/injectables/SessionStorageService.html +38 -499
  50. package/docs/injectables/StoreService.html +24 -28
  51. package/docs/injectables/StoreServiceMock.html +18 -360
  52. package/docs/injectables/UserService.html +24 -27
  53. package/docs/injectables/UserServiceMock.html +31 -196
  54. package/docs/injectables/UxAppShellService.html +299 -355
  55. package/docs/injectables/UxDynamicComponentService.html +16 -16
  56. package/docs/injectables/UxDynamicMenuService.html +38 -40
  57. package/docs/injectables/UxErrorFeedbackService.html +42 -48
  58. package/docs/injectables/UxTimezoneService.html +18 -22
  59. package/docs/interceptors/AddLangParamInterceptor.html +11 -10
  60. package/docs/interceptors/CachePreventionInterceptor.html +11 -10
  61. package/docs/interceptors/CorsSecurityInterceptor.html +11 -10
  62. package/docs/interceptors/CsrfPreventionInterceptor.html +11 -10
  63. package/docs/interceptors/EuLoginSessionTimeoutHandlingInterceptor.html +11 -10
  64. package/docs/interceptors/HttpErrorHandlerInterceptor.html +11 -10
  65. package/docs/interceptors/OpenIdConnectInterceptor.html +35 -35
  66. package/docs/interceptors/UxRequestErrorModelInterceptor.html +11 -10
  67. package/docs/interfaces/LoadedResources.html +37 -12
  68. package/docs/interfaces/LoadedResourcesError.html +28 -10
  69. package/docs/interfaces/ModuleLoadEvent.html +37 -12
  70. package/docs/interfaces/OpenIdConnectUserDetails.html +64 -18
  71. package/docs/interfaces/ResourceError.html +37 -12
  72. package/docs/interfaces/TimeZone.html +28 -10
  73. package/docs/interfaces/UIState.html +325 -76
  74. package/docs/js/libs/prism.js +46 -14
  75. package/docs/js/menu-wc.js +76 -79
  76. package/docs/js/menu-wc_es5.js +60 -0
  77. package/docs/js/menu.js +15 -11
  78. package/docs/js/search/lunr.min.js +3 -3
  79. package/docs/js/search/search_index.js +2 -2
  80. package/docs/license.html +6 -5
  81. package/docs/miscellaneous/enumerations.html +18 -17
  82. package/docs/miscellaneous/functions.html +261 -140
  83. package/docs/miscellaneous/typealiases.html +18 -17
  84. package/docs/miscellaneous/variables.html +1719 -1811
  85. package/docs/modules/CoreModule.html +13 -14
  86. package/docs/modules/I18nModule.html +11 -11
  87. package/docs/modules/LogModule.html +16 -16
  88. package/docs/modules/TranslateMockModule.html +8 -6
  89. package/docs/modules.html +6 -5
  90. package/docs/pipes/TranslateMockPipe.html +10 -9
  91. package/docs/styles/bootstrap.min.css +4 -3
  92. package/docs/styles/compodoc.css +41 -33
  93. package/docs/styles/dark.css +113 -0
  94. package/docs/styles/laravel.css +52 -6
  95. package/docs/styles/material.css +31 -7
  96. package/docs/styles/original.css +12 -6
  97. package/docs/styles/postmark.css +23 -7
  98. package/docs/styles/prism.css +169 -135
  99. package/docs/styles/readthedocs.css +22 -11
  100. package/docs/styles/stripe.css +48 -5
  101. package/docs/styles/vagrant.css +42 -6
  102. package/{esm2015/eui-core.js → esm2020/eui-core.mjs} +0 -0
  103. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  104. package/{esm2015/lib/eui-core.module.js → esm2020/lib/eui-core.module.mjs} +5 -5
  105. package/{esm2015/lib/helpers/date-helpers.js → esm2020/lib/helpers/date-helpers.mjs} +0 -0
  106. package/{esm2015/lib/helpers/dom-helpers.js → esm2020/lib/helpers/dom-helpers.mjs} +0 -0
  107. package/{esm2015/lib/helpers/event-helpers.js → esm2020/lib/helpers/event-helpers.mjs} +0 -0
  108. package/{esm2015/lib/helpers/form-helpers.js → esm2020/lib/helpers/form-helpers.mjs} +0 -0
  109. package/{esm2015/lib/helpers/format-helpers.js → esm2020/lib/helpers/format-helpers.mjs} +0 -0
  110. package/{esm2015/lib/helpers/http-helpers.js → esm2020/lib/helpers/http-helpers.mjs} +0 -0
  111. package/{esm2015/lib/helpers/index.js → esm2020/lib/helpers/index.mjs} +0 -0
  112. package/{esm2015/lib/helpers/utils.js → esm2020/lib/helpers/utils.mjs} +0 -0
  113. package/{esm2015/lib/interceptors/add-lang-param.interceptor.js → esm2020/lib/interceptors/add-lang-param.interceptor.mjs} +4 -4
  114. package/{esm2015/lib/interceptors/cache-prevention.interceptor.js → esm2020/lib/interceptors/cache-prevention.interceptor.mjs} +4 -4
  115. package/{esm2015/lib/interceptors/cors-security.interceptor.js → esm2020/lib/interceptors/cors-security.interceptor.mjs} +4 -4
  116. package/{esm2015/lib/interceptors/csrf-prevention.interceptor.js → esm2020/lib/interceptors/csrf-prevention.interceptor.mjs} +4 -4
  117. package/esm2020/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +61 -0
  118. package/{esm2015/lib/interceptors/index.js → esm2020/lib/interceptors/index.mjs} +0 -0
  119. package/{esm2015/lib/interceptors/openid/index.js → esm2020/lib/interceptors/openid/index.mjs} +0 -0
  120. package/esm2020/lib/interceptors/openid/openid-connect.interceptor.mjs +146 -0
  121. package/{esm2015/lib/interceptors/openid/openid-connect.service.js → esm2020/lib/interceptors/openid/openid-connect.service.mjs} +4 -4
  122. package/{esm2015/lib/interceptors/openid/openid-connect.service.mock.js → esm2020/lib/interceptors/openid/openid-connect.service.mock.mjs} +0 -0
  123. package/{esm2015/lib/interceptors/ux-request-error-model.interceptor.js → esm2020/lib/interceptors/ux-request-error-model.interceptor.mjs} +4 -4
  124. package/{esm2015/lib/services/app/eui-init-app.js → esm2020/lib/services/app/eui-init-app.mjs} +0 -0
  125. package/esm2020/lib/services/app/eui-pre-init-app.mjs +42 -0
  126. package/{esm2015/lib/services/app/eui-startup.js → esm2020/lib/services/app/eui-startup.mjs} +0 -0
  127. package/{esm2015/lib/services/app/factories/log.js → esm2020/lib/services/app/factories/log.mjs} +0 -0
  128. package/{esm2015/lib/services/app/index.js → esm2020/lib/services/app/index.mjs} +0 -0
  129. package/esm2020/lib/services/config/defaults.mjs +63 -0
  130. package/{esm2015/lib/services/config/tokens.js → esm2020/lib/services/config/tokens.mjs} +5 -2
  131. package/{esm2015/lib/services/errors/eui.error.js → esm2020/lib/services/errors/eui.error.mjs} +0 -0
  132. package/{esm2015/lib/services/errors/global-error-handler.js → esm2020/lib/services/errors/global-error-handler.mjs} +4 -4
  133. package/{esm2015/lib/services/errors/http-error-handler-callback-functions.js → esm2020/lib/services/errors/http-error-handler-callback-functions.mjs} +0 -0
  134. package/{esm2015/lib/services/errors/http-error-handler.interceptor.js → esm2020/lib/services/errors/http-error-handler.interceptor.mjs} +4 -4
  135. package/{esm2015/lib/services/errors/index.js → esm2020/lib/services/errors/index.mjs} +0 -0
  136. package/{esm2015/lib/services/i18n/i18n.loader.js → esm2020/lib/services/i18n/i18n.loader.mjs} +4 -4
  137. package/{esm2015/lib/services/i18n/i18n.resource.js → esm2020/lib/services/i18n/i18n.resource.mjs} +0 -0
  138. package/esm2020/lib/services/i18n/i18n.service.mjs +222 -0
  139. package/{esm2015/lib/services/i18n/i18n.service.mock.js → esm2020/lib/services/i18n/i18n.service.mock.mjs} +4 -4
  140. package/{esm2015/lib/services/i18n/index.js → esm2020/lib/services/i18n/index.mjs} +0 -0
  141. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  142. package/{esm2015/lib/services/locale/index.js → esm2020/lib/services/locale/index.mjs} +0 -0
  143. package/esm2020/lib/services/locale/locale.service.mjs +250 -0
  144. package/{esm2015/lib/services/log/index.js → esm2020/lib/services/log/index.mjs} +0 -0
  145. package/{esm2015/lib/services/log/log.module.js → esm2020/lib/services/log/log.module.mjs} +5 -5
  146. package/{esm2015/lib/services/log/log.service.js → esm2020/lib/services/log/log.service.mjs} +4 -4
  147. package/{esm2015/lib/services/log/log.service.mock.js → esm2020/lib/services/log/log.service.mock.mjs} +0 -0
  148. package/{esm2015/lib/services/permission/permission.service.js → esm2020/lib/services/permission/permission.service.mjs} +5 -5
  149. package/{esm2015/lib/services/queue/api-queue.service.js → esm2020/lib/services/queue/api-queue.service.mjs} +4 -4
  150. package/{esm2015/lib/services/queue/api-queue.service.mock.js → esm2020/lib/services/queue/api-queue.service.mock.mjs} +0 -0
  151. package/{esm2015/lib/services/queue/index.js → esm2020/lib/services/queue/index.mjs} +0 -0
  152. package/{esm2015/lib/services/storage/async-storage.service.js → esm2020/lib/services/storage/async-storage.service.mjs} +0 -0
  153. package/{esm2015/lib/services/storage/async-storage.service.mock.js → esm2020/lib/services/storage/async-storage.service.mock.mjs} +0 -0
  154. package/{esm2015/lib/services/storage/index.js → esm2020/lib/services/storage/index.mjs} +0 -0
  155. package/{esm2015/lib/services/storage/local-forage.service.js → esm2020/lib/services/storage/local-forage.service.mjs} +4 -4
  156. package/{esm2015/lib/services/storage/local-storage.service.js → esm2020/lib/services/storage/local-storage.service.mjs} +4 -4
  157. package/{esm2015/lib/services/storage/session-storage.service.js → esm2020/lib/services/storage/session-storage.service.mjs} +4 -4
  158. package/{esm2015/lib/services/storage/storage.service.js → esm2020/lib/services/storage/storage.service.mjs} +0 -0
  159. package/{esm2015/lib/services/storage/storage.service.mock.js → esm2020/lib/services/storage/storage.service.mock.mjs} +0 -0
  160. package/{esm2015/lib/services/store/actions/app.actions.js → esm2020/lib/services/store/actions/app.actions.mjs} +0 -0
  161. package/{esm2015/lib/services/store/actions/i18n.actions.js → esm2020/lib/services/store/actions/i18n.actions.mjs} +0 -0
  162. package/{esm2015/lib/services/store/actions/index.js → esm2020/lib/services/store/actions/index.mjs} +0 -0
  163. package/{esm2015/lib/services/store/actions/locale.actions.js → esm2020/lib/services/store/actions/locale.actions.mjs} +0 -0
  164. package/{esm2015/lib/services/store/actions/notifications.actions.js → esm2020/lib/services/store/actions/notifications.actions.mjs} +0 -0
  165. package/{esm2015/lib/services/store/actions/user.actions.js → esm2020/lib/services/store/actions/user.actions.mjs} +0 -0
  166. package/{esm2015/lib/services/store/effects/app.effects.js → esm2020/lib/services/store/effects/app.effects.mjs} +5 -5
  167. package/{esm2015/lib/services/store/effects/index.js → esm2020/lib/services/store/effects/index.mjs} +0 -0
  168. package/{esm2015/lib/services/store/index.js → esm2020/lib/services/store/index.mjs} +0 -0
  169. package/esm2020/lib/services/store/reducers/app.reducers.mjs +57 -0
  170. package/{esm2015/lib/services/store/reducers/core.reducers.js → esm2020/lib/services/store/reducers/core.reducers.mjs} +0 -0
  171. package/esm2020/lib/services/store/reducers/i18n.reducers.mjs +18 -0
  172. package/{esm2015/lib/services/store/reducers/index.js → esm2020/lib/services/store/reducers/index.mjs} +0 -0
  173. package/esm2020/lib/services/store/reducers/locale.reducers.mjs +18 -0
  174. package/esm2020/lib/services/store/reducers/meta.reducers.mjs +91 -0
  175. package/{esm2015/lib/services/store/reducers/notifications.reducers.js → esm2020/lib/services/store/reducers/notifications.reducers.mjs} +0 -0
  176. package/esm2020/lib/services/store/reducers/user.reducers.mjs +43 -0
  177. package/{esm2015/lib/services/store/store.service.js → esm2020/lib/services/store/store.service.mjs} +4 -4
  178. package/{esm2015/lib/services/store/store.service.mock.js → esm2020/lib/services/store/store.service.mock.mjs} +4 -4
  179. package/{esm2015/lib/services/user/index.js → esm2020/lib/services/user/index.mjs} +0 -0
  180. package/{esm2015/lib/services/user/user.service.js → esm2020/lib/services/user/user.service.mjs} +4 -4
  181. package/{esm2015/lib/services/user/user.service.mock.js → esm2020/lib/services/user/user.service.mock.mjs} +4 -4
  182. package/esm2020/lib/services/ux-app-shell.service.mjs +633 -0
  183. package/{esm2015/lib/services/ux-dynamic-component/ux-dynamic-component.service.js → esm2020/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs} +4 -4
  184. package/{esm2015/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.js → esm2020/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.mjs} +4 -4
  185. package/{esm2015/lib/services/ux-error-feedback/ux-error-feedback.service.js → esm2020/lib/services/ux-error-feedback/ux-error-feedback.service.mjs} +4 -4
  186. package/{esm2015/lib/services/ux-error-feedback/ux-error-handler.operator.js → esm2020/lib/services/ux-error-feedback/ux-error-handler.operator.mjs} +0 -0
  187. package/{esm2015/lib/services/ux-timezone.service.js → esm2020/lib/services/ux-timezone.service.mjs} +4 -4
  188. package/fesm2015/{eui-core.js → eui-core.mjs} +270 -247
  189. package/fesm2015/eui-core.mjs.map +1 -0
  190. package/fesm2020/eui-core.mjs +4592 -0
  191. package/fesm2020/eui-core.mjs.map +1 -0
  192. package/lib/services/locale/locale.service.d.ts.map +1 -1
  193. package/lib/services/permission/permission.service.d.ts +1 -1
  194. package/lib/services/permission/permission.service.d.ts.map +1 -1
  195. package/package.json +19 -6
  196. package/bundles/eui-core.umd.js +0 -5323
  197. package/bundles/eui-core.umd.js.map +0 -1
  198. package/esm2015/lib/interceptors/eu-login-session-timeout-handling.interceptor.js +0 -61
  199. package/esm2015/lib/interceptors/openid/openid-connect.interceptor.js +0 -146
  200. package/esm2015/lib/services/app/eui-pre-init-app.js +0 -47
  201. package/esm2015/lib/services/config/defaults.js +0 -49
  202. package/esm2015/lib/services/i18n/i18n.service.js +0 -219
  203. package/esm2015/lib/services/locale/locale.service.js +0 -255
  204. package/esm2015/lib/services/store/reducers/app.reducers.js +0 -49
  205. package/esm2015/lib/services/store/reducers/i18n.reducers.js +0 -15
  206. package/esm2015/lib/services/store/reducers/locale.reducers.js +0 -15
  207. package/esm2015/lib/services/store/reducers/meta.reducers.js +0 -92
  208. package/esm2015/lib/services/store/reducers/user.reducers.js +0 -43
  209. package/esm2015/lib/services/ux-app-shell.service.js +0 -584
  210. package/fesm2015/eui-core.js.map +0 -1
@@ -1,61 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { HttpResponse } from '@angular/common/http';
3
- import { tap } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- // The EuLoginSessionTimeoutHandlingInterceptor assumes that the EU login client is configured with:
6
- // <redirectionInterceptor>eu.cec.digit.ecas.client.http.ajax.JsonAjaxRedirectionInterceptor</redirectionInterceptor>
7
- // WARNING: The default EU login client behaviour that provides the JSON-un-parsable login HTML page, is no longer supported!
8
- export class EuLoginSessionTimeoutHandlingInterceptor {
9
- intercept(request, next) {
10
- return next.handle(request)
11
- .pipe(tap((event) => {
12
- this.checkRequestSuccessForEULoginSessionTimeout(request, event);
13
- return event;
14
- }, error => {
15
- this.checkRequestErrorForEULoginSessionTimeout(request, error);
16
- }));
17
- }
18
- checkRequestSuccessForEULoginSessionTimeout(request, event) {
19
- if (event instanceof HttpResponse) {
20
- if (this.isSsoResponse(event.body)) {
21
- this.reauthenticate(request, event);
22
- }
23
- }
24
- }
25
- checkRequestErrorForEULoginSessionTimeout(request, response) {
26
- // intentionally blank; meant for overriding
27
- }
28
- isSsoResponse(body) {
29
- if (body) {
30
- if (typeof body !== 'string') {
31
- return (body.success === false &&
32
- body.status === 'ECAS_AUTHENTICATION_REQUIRED' &&
33
- body.code === 303 &&
34
- body.message === 'session expired');
35
- }
36
- else {
37
- const html = body;
38
- return ((html.indexOf('<meta name="Keywords" content="EU Login, ECAS, Authentication, Security" />') >= 0 &&
39
- html.indexOf('<meta name="Description" content="EU Login" />') >= 0) ||
40
- html.indexOf('<meta name="Description" content="European Commission Authentication Service" />') >= 0 ||
41
- html.indexOf('<title>Mock Login Form</title>') >= 0 ||
42
- html.indexOf('<title>Redirecting To ECAS</title>') >= 0 ||
43
- html === '{ success : false, status : "ECAS_AUTHENTICATION_REQUIRED", code : 303, message : "session expired" }' ||
44
- html === '{ "success" : false, "status" : "ECAS_AUTHENTICATION_REQUIRED", "code" : 303, "message": "session expired" }');
45
- }
46
- }
47
- else {
48
- return false;
49
- }
50
- }
51
- reauthenticate(request, response) {
52
- // tslint:disable-next-line:deprecation
53
- document.location.reload(true);
54
- }
55
- }
56
- /** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
57
- /** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor });
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, decorators: [{
59
- type: Injectable
60
- }] });
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnRlcmNlcHRvcnMvZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUtILFlBQVksRUFFZixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFckMsb0dBQW9HO0FBQ3BHLHFIQUFxSDtBQUNySCw2SEFBNkg7QUFFN0gsTUFBTSxPQUFPLHdDQUF3QztJQUNqRCxTQUFTLENBQUMsT0FBeUIsRUFBRSxJQUFpQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ3RCLElBQUksQ0FDRCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakUsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ1YsQ0FBQztJQUVTLDJDQUEyQyxDQUFDLE9BQXlCLEVBQUUsS0FBcUI7UUFDbEcsSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBcUIsS0FBTSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBcUIsS0FBSyxDQUFDLENBQUM7YUFDMUQ7U0FDSjtJQUVMLENBQUM7SUFFUyx5Q0FBeUMsQ0FBQyxPQUF5QixFQUFFLFFBQTBCO1FBQ3JHLDRDQUE0QztJQUNoRCxDQUFDO0lBRVMsYUFBYSxDQUFDLElBQVM7UUFDN0IsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDMUIsT0FBTyxDQUNILElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSztvQkFDdEIsSUFBSSxDQUFDLE1BQU0sS0FBSyw4QkFBOEI7b0JBQzlDLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRztvQkFDakIsSUFBSSxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsQ0FDckMsQ0FBQzthQUNMO2lCQUFNO2dCQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDbEIsT0FBTyxDQUNILENBQ0ksSUFBSSxDQUFDLE9BQU8sQ0FBQyw2RUFBNkUsQ0FBQyxJQUFJLENBQUM7b0JBQ2hHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0RBQWdELENBQUMsSUFBSSxDQUFDLENBQ3RFO29CQUNELElBQUksQ0FBQyxPQUFPLENBQUMsa0ZBQWtGLENBQUMsSUFBSSxDQUFDO29CQUNyRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQztvQkFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUM7b0JBQ3ZELElBQUksS0FBSyx1R0FBdUc7b0JBQ2hILElBQUksS0FBSyw4R0FBOEcsQ0FDMUgsQ0FBQzthQUNMO1NBQ0o7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVTLGNBQWMsQ0FBQyxPQUF5QixFQUFFLFFBQTBCO1FBQzFFLHVDQUF1QztRQUN2QyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDOzsrSkF6RFEsd0NBQXdDO21LQUF4Qyx3Q0FBd0M7a0dBQXhDLHdDQUF3QztrQkFEcEQsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgSHR0cEV2ZW50LFxuICAgIEh0dHBIYW5kbGVyLFxuICAgIEh0dHBJbnRlcmNlcHRvcixcbiAgICBIdHRwUmVxdWVzdCxcbiAgICBIdHRwUmVzcG9uc2UsXG4gICAgSHR0cFJlc3BvbnNlQmFzZVxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8vIFRoZSBFdUxvZ2luU2Vzc2lvblRpbWVvdXRIYW5kbGluZ0ludGVyY2VwdG9yIGFzc3VtZXMgdGhhdCB0aGUgRVUgbG9naW4gY2xpZW50IGlzIGNvbmZpZ3VyZWQgd2l0aDpcbi8vIDxyZWRpcmVjdGlvbkludGVyY2VwdG9yPmV1LmNlYy5kaWdpdC5lY2FzLmNsaWVudC5odHRwLmFqYXguSnNvbkFqYXhSZWRpcmVjdGlvbkludGVyY2VwdG9yPC9yZWRpcmVjdGlvbkludGVyY2VwdG9yPlxuLy8gV0FSTklORzogVGhlIGRlZmF1bHQgRVUgbG9naW4gY2xpZW50IGJlaGF2aW91ciB0aGF0IHByb3ZpZGVzIHRoZSBKU09OLXVuLXBhcnNhYmxlIGxvZ2luIEhUTUwgcGFnZSwgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCFcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFdUxvZ2luU2Vzc2lvblRpbWVvdXRIYW5kbGluZ0ludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdFN1Y2Nlc3NGb3JFVUxvZ2luU2Vzc2lvblRpbWVvdXQocmVxdWVzdCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdEVycm9yRm9yRVVMb2dpblNlc3Npb25UaW1lb3V0KHJlcXVlc3QsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrUmVxdWVzdFN1Y2Nlc3NGb3JFVUxvZ2luU2Vzc2lvblRpbWVvdXQocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgZXZlbnQ6IEh0dHBFdmVudDxhbnk+KSB7XG4gICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTc29SZXNwb25zZSgoPEh0dHBSZXNwb25zZTxhbnk+PmV2ZW50KS5ib2R5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhdXRoZW50aWNhdGUocmVxdWVzdCwgPEh0dHBSZXNwb25zZTxhbnk+PmV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrUmVxdWVzdEVycm9yRm9yRVVMb2dpblNlc3Npb25UaW1lb3V0KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgYmxhbms7IG1lYW50IGZvciBvdmVycmlkaW5nXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzU3NvUmVzcG9uc2UoYm9keTogYW55KSB7XG4gICAgICAgIGlmIChib2R5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYm9keS5zdWNjZXNzID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgICBib2R5LnN0YXR1cyA9PT0gJ0VDQVNfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQnICYmXG4gICAgICAgICAgICAgICAgICAgIGJvZHkuY29kZSA9PT0gMzAzICYmXG4gICAgICAgICAgICAgICAgICAgIGJvZHkubWVzc2FnZSA9PT0gJ3Nlc3Npb24gZXhwaXJlZCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzxtZXRhIG5hbWU9XCJLZXl3b3Jkc1wiIGNvbnRlbnQ9XCJFVSBMb2dpbiwgRUNBUywgQXV0aGVudGljYXRpb24sIFNlY3VyaXR5XCIgLz4nKSA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzxtZXRhIG5hbWU9XCJEZXNjcmlwdGlvblwiIGNvbnRlbnQ9XCJFVSBMb2dpblwiIC8+JykgPj0gMFxuICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgIGh0bWwuaW5kZXhPZignPG1ldGEgbmFtZT1cIkRlc2NyaXB0aW9uXCIgY29udGVudD1cIkV1cm9wZWFuIENvbW1pc3Npb24gQXV0aGVudGljYXRpb24gU2VydmljZVwiIC8+JykgPj0gMCB8fFxuICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzx0aXRsZT5Nb2NrIExvZ2luIEZvcm08L3RpdGxlPicpID49IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgaHRtbC5pbmRleE9mKCc8dGl0bGU+UmVkaXJlY3RpbmcgVG8gRUNBUzwvdGl0bGU+JykgPj0gMCB8fFxuICAgICAgICAgICAgICAgICAgICBodG1sID09PSAneyBzdWNjZXNzIDogZmFsc2UsIHN0YXR1cyA6IFwiRUNBU19BVVRIRU5USUNBVElPTl9SRVFVSVJFRFwiLCBjb2RlIDogMzAzLCBtZXNzYWdlIDogXCJzZXNzaW9uIGV4cGlyZWRcIiB9JyB8fFxuICAgICAgICAgICAgICAgICAgICBodG1sID09PSAneyBcInN1Y2Nlc3NcIiA6IGZhbHNlLCBcInN0YXR1c1wiIDogXCJFQ0FTX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEXCIsIFwiY29kZVwiIDogMzAzLCBcIm1lc3NhZ2VcIjogXCJzZXNzaW9uIGV4cGlyZWRcIiB9J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhdXRoZW50aWNhdGUocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRlcHJlY2F0aW9uXG4gICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCh0cnVlKTtcbiAgICB9XG59XG4iXX0=
@@ -1,146 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { HttpErrorResponse, HttpEventType, HttpHeaders, } from '@angular/common/http';
3
- import { of, Subject, throwError } from 'rxjs';
4
- import { catchError } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- export class OpenIdConnectInterceptor {
7
- constructor() {
8
- // By default, the original request should at least be retries once in case the cached API Gateway token expires:
9
- this.defaultMaximumRequestRetries = 1;
10
- // check if the OpenIdConnect is defined
11
- if (typeof OpenIdConnect === 'undefined') {
12
- console.error('Please include the script openid-login.js in your index.html file.', 'For more details, please consult the documentation regarding the Http Interceptors and OpenID Connect configuration.');
13
- }
14
- }
15
- intercept(request, next, retryCount = 0, retryCallback) {
16
- if (typeof OpenIdConnect !== 'undefined') {
17
- let authorizedRequest = retryCallback;
18
- if (!authorizedRequest) {
19
- authorizedRequest = new Subject();
20
- }
21
- OpenIdConnect.getAuthorizationHeaders(request.urlWithParams, (headers) => {
22
- let newRequest = request;
23
- if (headers) {
24
- let newHeaders = request.headers;
25
- if (newHeaders) {
26
- for (const headerName in headers) {
27
- if (headers.hasOwnProperty(headerName)) {
28
- newHeaders = newHeaders.set(headerName, headers[headerName]);
29
- }
30
- }
31
- }
32
- else {
33
- newHeaders = new HttpHeaders(headers);
34
- }
35
- newRequest = request.clone({
36
- withCredentials: false,
37
- headers: newHeaders,
38
- });
39
- }
40
- const subscription = next.handle(newRequest)
41
- .pipe(catchError((response) => {
42
- return this.handleErrorResponse(response, request, next, retryCount, authorizedRequest, subscription);
43
- }))
44
- .subscribe((httpEvent) => {
45
- if (httpEvent) {
46
- authorizedRequest.next(httpEvent);
47
- if (httpEvent.type === HttpEventType.Response) {
48
- if (subscription) {
49
- subscription.unsubscribe();
50
- }
51
- authorizedRequest.complete();
52
- }
53
- }
54
- });
55
- }, (errorResponse) => {
56
- const errorProperties = {
57
- error: errorResponse,
58
- };
59
- if (errorResponse) {
60
- errorProperties.status = errorResponse.status;
61
- errorProperties.statusText = errorResponse.statusText;
62
- }
63
- return this.handleErrorResponse(new HttpErrorResponse(errorProperties), request, next, retryCount, authorizedRequest, null);
64
- });
65
- return authorizedRequest;
66
- }
67
- else {
68
- return next.handle(request);
69
- }
70
- }
71
- handleErrorResponse(response, originalRequest, next, retryCount = 0, retryCallback, subscription) {
72
- if (response) {
73
- if (response.error && response.error.error === 'invalid_request') {
74
- // The ID token is invalid or incorrect; retrieve another one:
75
- OpenIdConnect.renewIdToken();
76
- }
77
- else if (this.apiGatewayTokenExpired(response)) {
78
- OpenIdConnect.clearCachedApiGatewayAccessToken();
79
- return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
80
- }
81
- else if (response.status === 401 || response.status === 403) {
82
- // The EU Login access token is invalid. (403)
83
- // The target service is unable to read the access token, for example because the EU Login session ended. (401)
84
- // Retry in case the access token became invalid too quickly:
85
- return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
86
- }
87
- else if (response.status === 0) {
88
- // One of the access token requests or the original request was not sent.
89
- // Most likely one of the CORS pre-flight requests failed, or the browser is offline.
90
- console.warn('The OpenID Connect call may have issues:\n' +
91
- '* the CORS pre-flight requests for the OpenID Connect access tokens or for the REST call could be failing\n' +
92
- '* the browser could be currently offline.');
93
- }
94
- }
95
- if (subscription) {
96
- subscription.unsubscribe();
97
- }
98
- if (retryCallback) {
99
- retryCallback.error(response);
100
- retryCallback.complete();
101
- }
102
- return throwError(response);
103
- }
104
- retryRequest(originalRequest, response, next, retryCount = 0, retryCallback, subscription) {
105
- if (retryCount < this.maximumRequestRetries()) {
106
- this.intercept(originalRequest, next, retryCount + 1, retryCallback);
107
- }
108
- else {
109
- console.error('The OpenID Connect call may have issues:\n' +
110
- '* the client ID could be invalid\n' +
111
- '* the API Gateway access token could be invalid\n' +
112
- '* the EU Login access token for the target service could be invalid.');
113
- if (subscription) {
114
- subscription.unsubscribe();
115
- }
116
- if (retryCallback) {
117
- retryCallback.error(response);
118
- retryCallback.complete();
119
- }
120
- }
121
- return of(null);
122
- }
123
- apiGatewayTokenExpired(response) {
124
- if (response && response.status === 401) {
125
- const message = '' + response.error;
126
- return message.indexOf('<ams:code>900901</ams:code>') >= 0;
127
- }
128
- else {
129
- return false;
130
- }
131
- }
132
- maximumRequestRetries() {
133
- if (OpenIdConnect.config && OpenIdConnect.config.maximumRequestRetries >= 0) {
134
- return OpenIdConnect.config.maximumRequestRetries;
135
- }
136
- else {
137
- return this.defaultMaximumRequestRetries;
138
- }
139
- }
140
- }
141
- /** @nocollapse */ OpenIdConnectInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: OpenIdConnectInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
142
- /** @nocollapse */ OpenIdConnectInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: OpenIdConnectInterceptor });
143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: OpenIdConnectInterceptor, decorators: [{
144
- type: Injectable
145
- }], ctorParameters: function () { return []; } });
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9vcGVuaWQvb3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsaUJBQWlCLEVBRWpCLGFBQWEsRUFFYixXQUFXLEdBSWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFPNUMsTUFBTSxPQUFPLHdCQUF3QjtJQUlqQztRQUhBLGlIQUFpSDtRQUNqSCxpQ0FBNEIsR0FBRyxDQUFDLENBQUM7UUFHN0Isd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQ1Qsb0VBQW9FLEVBQ3BFLHNIQUFzSCxDQUN6SCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUNMLE9BQXlCLEVBQ3pCLElBQWlCLEVBQ2pCLFVBQVUsR0FBRyxDQUFDLEVBQ2QsYUFBdUM7UUFFdkMsSUFBSSxPQUFPLGFBQWEsS0FBSyxXQUFXLEVBQUU7WUFDdEMsSUFBSSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7WUFDdEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUNwQixpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQzthQUNyRDtZQUVELGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQzFFLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQztnQkFDekIsSUFBSSxP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V0FBVyxFQUFFLENBQUM7YUFDOUI7WUFDRCxJQUFJLGFBQWEsRUFBRTtnQkFDZixhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDNUI7U0FDSjtRQUVELE9BQU8sRUFBRSxDQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxRQUEyQjtRQUN4RCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUQ7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVTLHFCQUFxQjtRQUMzQixJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEVBQUU7WUFDekUsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1NBQ3JEO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztTQUM1QztJQUNMLENBQUM7OytJQXRLUSx3QkFBd0I7bUpBQXhCLHdCQUF3QjtrR0FBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICBIdHRwRXZlbnQsXG4gICAgSHR0cEV2ZW50VHlwZSxcbiAgICBIdHRwSGFuZGxlcixcbiAgICBIdHRwSGVhZGVycyxcbiAgICBIdHRwSW50ZXJjZXB0b3IsXG4gICAgSHR0cFJlcXVlc3QsXG4gICAgSHR0cFJlc3BvbnNlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGluIHRoZSBqYXZhc2NyaXB0IGZpbGUgb3BlbmlkLWxvZ2luLmpzXG4vLyBhbmQgd2lsbCBiZSBpbXBvcnRlZCBpbiB0aGUgZVVJIGFwcGxpY2F0aW9ucycgaW5kZXguaHRtbCBmaWxlLCB3aGVuIG5lY2Vzc2FyeS5cbmRlY2xhcmUgdmFyIE9wZW5JZENvbm5lY3Q6IGFueTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9wZW5JZENvbm5lY3RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgLy8gQnkgZGVmYXVsdCwgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgc2hvdWxkIGF0IGxlYXN0IGJlIHJldHJpZXMgb25jZSBpbiBjYXNlIHRoZSBjYWNoZWQgQVBJIEdhdGV3YXkgdG9rZW4gZXhwaXJlczpcbiAgICBkZWZhdWx0TWF4aW11bVJlcXVlc3RSZXRyaWVzID0gMTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGUgT3BlbklkQ29ubmVjdCBpcyBkZWZpbmVkXG4gICAgICAgIGlmICh0eXBlb2YgT3BlbklkQ29ubmVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1BsZWFzZSBpbmNsdWRlIHRoZSBzY3JpcHQgb3BlbmlkLWxvZ2luLmpzIGluIHlvdXIgaW5kZXguaHRtbCBmaWxlLicsXG4gICAgICAgICAgICAgICAgJ0ZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyB0aGUgSHR0cCBJbnRlcmNlcHRvcnMgYW5kIE9wZW5JRCBDb25uZWN0IGNvbmZpZ3VyYXRpb24uJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnRlcmNlcHQoXG4gICAgICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgICAgIG5leHQ6IEh0dHBIYW5kbGVyLFxuICAgICAgICByZXRyeUNvdW50ID0gMCxcbiAgICAgICAgcmV0cnlDYWxsYmFjaz86IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+LFxuICAgICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBPcGVuSWRDb25uZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGF1dGhvcml6ZWRSZXF1ZXN0ID0gcmV0cnlDYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghYXV0aG9yaXplZFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBhdXRob3JpemVkUmVxdWVzdCA9IG5ldyBTdWJqZWN0PEh0dHBFdmVudDxhbnk+PigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPcGVuSWRDb25uZWN0LmdldEF1dGhvcml6YXRpb25IZWFkZXJzKHJlcXVlc3QudXJsV2l0aFBhcmFtcywgKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuZXdSZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IG5ld0hlYWRlcnMuc2V0KGhlYWRlck5hbWUsIGhlYWRlcnMgW2hlYWRlck5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5ld1JlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXdIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXh0LmhhbmRsZShuZXdSZXF1ZXN0KVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2UsIHJlcXVlc3QsIG5leHQsIHJldHJ5Q291bnQsIGF1dGhvcml6ZWRSZXF1ZXN0LCBzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoaHR0cEV2ZW50OiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWRSZXF1ZXN0Lm5leHQoaHR0cEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cEV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZFJlcXVlc3QuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgKGVycm9yUmVzcG9uc2U6IFhNTEh0dHBSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQcm9wZXJ0aWVzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JQcm9wZXJ0aWVzLnN0YXR1cyA9IGVycm9yUmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICBlcnJvclByb3BlcnRpZXMuc3RhdHVzVGV4dCA9IGVycm9yUmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvclJlc3BvbnNlKG5ldyBIdHRwRXJyb3JSZXNwb25zZShlcnJvclByb3BlcnRpZXMpLCByZXF1ZXN0LCBuZXh0LCByZXRyeUNvdW50LCBhdXRob3JpemVkUmVxdWVzdCwgbnVsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWRSZXF1ZXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUVycm9yUmVzcG9uc2UoXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICAgICAgb3JpZ2luYWxSZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxuICAgICAgICBuZXh0OiBIdHRwSGFuZGxlcixcbiAgICAgICAgcmV0cnlDb3VudDogbnVtYmVyID0gMCxcbiAgICAgICAgcmV0cnlDYWxsYmFjazogU3ViamVjdDxIdHRwRXZlbnQ8YW55Pj4sXG4gICAgICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uLFxuICAgICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgJiYgcmVzcG9uc2UuZXJyb3IuZXJyb3IgPT09ICdpbnZhbGlkX3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIElEIHRva2VuIGlzIGludmFsaWQgb3IgaW5jb3JyZWN0OyByZXRyaWV2ZSBhbm90aGVyIG9uZTpcbiAgICAgICAgICAgICAgICBPcGVuSWRDb25uZWN0LnJlbmV3SWRUb2tlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFwaUdhdGV3YXlUb2tlbkV4cGlyZWQocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgT3BlbklkQ29ubmVjdC5jbGVhckNhY2hlZEFwaUdhdGV3YXlBY2Nlc3NUb2tlbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJldHJ5UmVxdWVzdChvcmlnaW5hbFJlcXVlc3QsIHJlc3BvbnNlLCBuZXh0LCByZXRyeUNvdW50LCByZXRyeUNhbGxiYWNrLCBzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBFVSBMb2dpbiBhY2Nlc3MgdG9rZW4gaXMgaW52YWxpZC4gKDQwMylcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IHNlcnZpY2UgaXMgdW5hYmxlIHRvIHJlYWQgdGhlIGFjY2VzcyB0b2tlbiwgZm9yIGV4YW1wbGUgYmVjYXVzZSB0aGUgRVUgTG9naW4gc2Vzc2lvbiBlbmRlZC4gKDQwMSlcbiAgICAgICAgICAgICAgICAvLyBSZXRyeSBpbiBjYXNlIHRoZSBhY2Nlc3MgdG9rZW4gYmVjYW1lIGludmFsaWQgdG9vIHF1aWNrbHk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9yaWdpbmFsUmVxdWVzdCwgcmVzcG9uc2UsIG5leHQsIHJldHJ5Q291bnQsIHJldHJ5Q2FsbGJhY2ssIHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIE9uZSBvZiB0aGUgYWNjZXNzIHRva2VuIHJlcXVlc3RzIG9yIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHdhcyBub3Qgc2VudC5cbiAgICAgICAgICAgICAgICAvLyBNb3N0IGxpa2VseSBvbmUgb2YgdGhlIENPUlMgcHJlLWZsaWdodCByZXF1ZXN0cyBmYWlsZWQsIG9yIHRoZSBicm93c2VyIGlzIG9mZmxpbmUuXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAnVGhlIE9wZW5JRCBDb25uZWN0IGNhbGwgbWF5IGhhdmUgaXNzdWVzOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnKiB0aGUgQ09SUyBwcmUtZmxpZ2h0IHJlcXVlc3RzIGZvciB0aGUgT3BlbklEIENvbm5lY3QgYWNjZXNzIHRva2VucyBvciBmb3IgdGhlIFJFU1QgY2FsbCBjb3VsZCBiZSBmYWlsaW5nXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICcqIHRoZSBicm93c2VyIGNvdWxkIGJlIGN1cnJlbnRseSBvZmZsaW5lLicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRyeUNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXRyeUNhbGxiYWNrLmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmV0cnlSZXF1ZXN0KFxuICAgICAgICBvcmlnaW5hbFJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICAgICAgbmV4dDogSHR0cEhhbmRsZXIsXG4gICAgICAgIHJldHJ5Q291bnQ6IG51bWJlciA9IDAsXG4gICAgICAgIHJldHJ5Q2FsbGJhY2s6IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+LFxuICAgICAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbixcbiAgICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIGlmIChyZXRyeUNvdW50IDwgdGhpcy5tYXhpbXVtUmVxdWVzdFJldHJpZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHQob3JpZ2luYWxSZXF1ZXN0LCBuZXh0LCByZXRyeUNvdW50ICsgMSwgcmV0cnlDYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdUaGUgT3BlbklEIENvbm5lY3QgY2FsbCBtYXkgaGF2ZSBpc3N1ZXM6XFxuJyArXG4gICAgICAgICAgICAgICAgJyogdGhlIGNsaWVudCBJRCBjb3VsZCBiZSBpbnZhbGlkXFxuJyArXG4gICAgICAgICAgICAgICAgJyogdGhlIEFQSSBHYXRld2F5IGFjY2VzcyB0b2tlbiBjb3VsZCBiZSBpbnZhbGlkXFxuJyArXG4gICAgICAgICAgICAgICAgJyogdGhlIEVVIExvZ2luIGFjY2VzcyB0b2tlbiBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGNvdWxkIGJlIGludmFsaWQuJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmV0cnlDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suZXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZjxhbnk+KG51bGwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcGlHYXRld2F5VG9rZW5FeHBpcmVkKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnJyArIHJlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuaW5kZXhPZignPGFtczpjb2RlPjkwMDkwMTwvYW1zOmNvZGU+JykgPj0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBtYXhpbXVtUmVxdWVzdFJldHJpZXMoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKE9wZW5JZENvbm5lY3QuY29uZmlnICYmIE9wZW5JZENvbm5lY3QuY29uZmlnLm1heGltdW1SZXF1ZXN0UmV0cmllcyA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gT3BlbklkQ29ubmVjdC5jb25maWcubWF4aW11bVJlcXVlc3RSZXRyaWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1heGltdW1SZXF1ZXN0UmV0cmllcztcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -1,47 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { xhr } from '@eui/base';
3
- /**
4
- * Function to be used before the AppModule is bootstrapped. It is currently used to load dynamic configurations.
5
- * It needs to be added in your application main.ts file.
6
- * @param envConfig the current environment configuration
7
- * @returns the updated environment configuration, as a promise
8
- */
9
- export function preInitApp(envConfig) {
10
- return __awaiter(this, void 0, void 0, function* () {
11
- const envDynamicConfig = envConfig && envConfig.envDynamicConfig;
12
- if (envDynamicConfig) {
13
- // load the local configuration file, if defined
14
- const euiAppJsonConfig = yield loadEuiDynamicEnvironmentConfig(envDynamicConfig.uri, envDynamicConfig.configTimeout || 2000);
15
- envConfig.loadedEnvDynamicConfig = euiAppJsonConfig;
16
- return envConfig;
17
- }
18
- return envConfig;
19
- });
20
- }
21
- /**
22
- * Function to load asynchronously a dynamic configuration (from a local path or a web service)
23
- * @param url the path to the configuration
24
- * @param timeout possible timeout
25
- * @returns EuiAppJsonConfig promise
26
- */
27
- export function loadEuiDynamicEnvironmentConfig(url, timeout) {
28
- return __awaiter(this, void 0, void 0, function* () {
29
- // if the url is specified
30
- if (url) {
31
- // fetch the config
32
- try {
33
- return yield xhr({
34
- url: url,
35
- timeout: timeout,
36
- });
37
- }
38
- catch (error) {
39
- // send a warning to the console
40
- console.warn('Dynamic configuration cannot be loaded from url', url, error);
41
- }
42
- }
43
- // the dynamic config is not loaded
44
- return null;
45
- });
46
- }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpLXByZS1pbml0LWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYXBwL2V1aS1wcmUtaW5pdC1hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBb0QsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxGOzs7OztHQUtHO0FBRUgsTUFBTSxVQUFnQixVQUFVLENBQUMsU0FBdUI7O1FBRXBELE1BQU0sZ0JBQWdCLEdBQXFCLFNBQVMsSUFBSSxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDbkYsSUFBSSxnQkFBZ0IsRUFBRTtZQUNsQixnREFBZ0Q7WUFDaEQsTUFBTSxnQkFBZ0IsR0FBcUIsTUFBTSwrQkFBK0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQ2pHLGdCQUFnQixDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM1QyxTQUFTLENBQUMsc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7WUFDcEQsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0NBQUE7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBZ0IsK0JBQStCLENBQUMsR0FBVyxFQUFFLE9BQWdCOztRQUMvRSwwQkFBMEI7UUFDMUIsSUFBSSxHQUFHLEVBQUU7WUFDTCxtQkFBbUI7WUFDbkIsSUFBSTtnQkFDQSxPQUFPLE1BQU0sR0FBRyxDQUFtQjtvQkFDL0IsR0FBRyxFQUFFLEdBQUc7b0JBQ1IsT0FBTyxFQUFFLE9BQU87aUJBQ25CLENBQUMsQ0FBQzthQUNOO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ1osZ0NBQWdDO2dCQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMvRTtTQUNKO1FBQ0QsbUNBQW1DO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudkR5bmFtaWNDb25maWcsIEV1aUFwcEpzb25Db25maWcsIEV1aUVudkNvbmZpZywgeGhyIH0gZnJvbSAnQGV1aS9iYXNlJztcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBiZSB1c2VkIGJlZm9yZSB0aGUgQXBwTW9kdWxlIGlzIGJvb3RzdHJhcHBlZC4gSXQgaXMgY3VycmVudGx5IHVzZWQgdG8gbG9hZCBkeW5hbWljIGNvbmZpZ3VyYXRpb25zLlxuICogSXQgbmVlZHMgdG8gYmUgYWRkZWQgaW4geW91ciBhcHBsaWNhdGlvbiBtYWluLnRzIGZpbGUuXG4gKiBAcGFyYW0gZW52Q29uZmlnIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIHRoZSB1cGRhdGVkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24sIGFzIGEgcHJvbWlzZVxuICovXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVJbml0QXBwKGVudkNvbmZpZzogRXVpRW52Q29uZmlnKTogUHJvbWlzZTxFdWlFbnZDb25maWc+IHtcblxuICAgIGNvbnN0IGVudkR5bmFtaWNDb25maWc6IEVudkR5bmFtaWNDb25maWcgPSBlbnZDb25maWcgJiYgZW52Q29uZmlnLmVudkR5bmFtaWNDb25maWc7XG4gICAgaWYgKGVudkR5bmFtaWNDb25maWcpIHtcbiAgICAgICAgLy8gbG9hZCB0aGUgbG9jYWwgY29uZmlndXJhdGlvbiBmaWxlLCBpZiBkZWZpbmVkXG4gICAgICAgIGNvbnN0IGV1aUFwcEpzb25Db25maWc6IEV1aUFwcEpzb25Db25maWcgPSBhd2FpdCBsb2FkRXVpRHluYW1pY0Vudmlyb25tZW50Q29uZmlnKGVudkR5bmFtaWNDb25maWcudXJpLFxuICAgICAgICAgICAgZW52RHluYW1pY0NvbmZpZy5jb25maWdUaW1lb3V0IHx8IDIwMDApO1xuICAgICAgICBlbnZDb25maWcubG9hZGVkRW52RHluYW1pY0NvbmZpZyA9IGV1aUFwcEpzb25Db25maWc7XG4gICAgICAgIHJldHVybiBlbnZDb25maWc7XG4gICAgfVxuICAgIHJldHVybiBlbnZDb25maWc7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gbG9hZCBhc3luY2hyb25vdXNseSBhIGR5bmFtaWMgY29uZmlndXJhdGlvbiAoZnJvbSBhIGxvY2FsIHBhdGggb3IgYSB3ZWIgc2VydmljZSlcbiAqIEBwYXJhbSB1cmwgdGhlIHBhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB0aW1lb3V0IHBvc3NpYmxlIHRpbWVvdXRcbiAqIEByZXR1cm5zIEV1aUFwcEpzb25Db25maWcgcHJvbWlzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEV1aUR5bmFtaWNFbnZpcm9ubWVudENvbmZpZyh1cmw6IHN0cmluZywgdGltZW91dD86IG51bWJlcik6IFByb21pc2U8RXVpQXBwSnNvbkNvbmZpZz4ge1xuICAgIC8vIGlmIHRoZSB1cmwgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHVybCkge1xuICAgICAgICAvLyBmZXRjaCB0aGUgY29uZmlnXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgeGhyPEV1aUFwcEpzb25Db25maWc+KHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBzZW5kIGEgd2FybmluZyB0byB0aGUgY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEeW5hbWljIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGxvYWRlZCBmcm9tIHVybCcsIHVybCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBkeW5hbWljIGNvbmZpZyBpcyBub3QgbG9hZGVkXG4gICAgcmV0dXJuIG51bGw7XG59XG4iXX0=
@@ -1,49 +0,0 @@
1
- import { LogLevel, ConsoleAppender, } from '@eui/base';
2
- /** default log configuration */
3
- export const DEFAULT_LOG_CONFIG = {
4
- baseLoggerName: 'root',
5
- logLevel: LogLevel.ERROR,
6
- logAppenders: {
7
- type: ConsoleAppender,
8
- prefixFormat: '[{level}]',
9
- },
10
- };
11
- export const DEFAULT_I18N_SERVICE_CONFIG = {
12
- languages: ['en'],
13
- defaultLanguage: 'en',
14
- };
15
- export const DEFAULT_I18N_LOADER_CONFIG = {};
16
- export const DEFAULT_LOCALE_SERVICE_CONFIG = {
17
- id: 'en',
18
- available: ['en'],
19
- registered: ['en'],
20
- bindWithTranslate: false,
21
- affectGlobalLocale: false
22
- };
23
- export const DEFAULT_HTTP_ERROR_HANDLER_CONFIG = {
24
- routes: [],
25
- };
26
- export const DEFAULT_GLOBAL_CONFIG = {
27
- showConnectionStatus: true,
28
- i18n: {
29
- i18nService: Object.assign({}, DEFAULT_I18N_SERVICE_CONFIG),
30
- i18nLoader: Object.assign({}, DEFAULT_I18N_LOADER_CONFIG),
31
- },
32
- locale: Object.assign({}, DEFAULT_LOCALE_SERVICE_CONFIG),
33
- user: {
34
- defaultUserPreferences: {
35
- locale: Object.assign({}, DEFAULT_LOCALE_SERVICE_CONFIG)
36
- }
37
- }
38
- };
39
- export const DEFAULT_EUI_APP_CONFIG = {
40
- global: Object.assign({}, DEFAULT_GLOBAL_CONFIG),
41
- };
42
- export const DEFAULT_EUI_ENV_CONFIG = {
43
- envAppHandlersConfig: {},
44
- };
45
- export const DEFAULT_EUI_CONFIG = {
46
- appConfig: Object.assign({}, DEFAULT_EUI_APP_CONFIG),
47
- environment: Object.assign({}, DEFAULT_EUI_ENV_CONFIG),
48
- };
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2NvbmZpZy9kZWZhdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBS0gsUUFBUSxFQUVSLGVBQWUsR0FLbEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsZ0NBQWdDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFjO0lBQ3pDLGNBQWMsRUFBRSxNQUFNO0lBQ3RCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztJQUN4QixZQUFZLEVBQUU7UUFDVixJQUFJLEVBQUUsZUFBZTtRQUNyQixZQUFZLEVBQUUsV0FBVztLQUM1QjtDQUNKLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBc0I7SUFDMUQsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2pCLGVBQWUsRUFBRSxJQUFJO0NBQ3hCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBcUIsRUFBRSxDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUF3QjtJQUM5RCxFQUFFLEVBQUUsSUFBSTtJQUNSLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNqQixVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDbEIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixrQkFBa0IsRUFBRSxLQUFLO0NBQzVCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBMkI7SUFDckUsTUFBTSxFQUFFLEVBQUU7Q0FDYixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWlCO0lBQy9DLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsSUFBSSxFQUFFO1FBQ0YsV0FBVyxvQkFDSiwyQkFBMkIsQ0FDakM7UUFDRCxVQUFVLG9CQUNILDBCQUEwQixDQUNoQztLQUNKO0lBQ0QsTUFBTSxvQkFDQyw2QkFBNkIsQ0FDbkM7SUFDRCxJQUFJLEVBQUU7UUFDRixzQkFBc0IsRUFBRTtZQUNwQixNQUFNLG9CQUNDLDZCQUE2QixDQUNuQztTQUNKO0tBQ0o7Q0FDSixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWlCO0lBQ2hELE1BQU0sb0JBQ0MscUJBQXFCLENBQzNCO0NBQ0osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFpQjtJQUNoRCxvQkFBb0IsRUFBRSxFQUFFO0NBQzNCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBYztJQUN6QyxTQUFTLG9CQUNGLHNCQUFzQixDQUM1QjtJQUNELFdBQVcsb0JBQ0osc0JBQXNCLENBQzVCO0NBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRXVpQ29uZmlnLFxuICAgIEV1aUFwcENvbmZpZyxcbiAgICBFdWlFbnZDb25maWcsXG4gICAgR2xvYmFsQ29uZmlnLFxuICAgIExvZ0xldmVsLFxuICAgIExvZ0NvbmZpZyxcbiAgICBDb25zb2xlQXBwZW5kZXIsXG4gICAgSHR0cEVycm9ySGFuZGxlckNvbmZpZyxcbiAgICBJMThuTG9hZGVyQ29uZmlnLFxuICAgIEkxOG5TZXJ2aWNlQ29uZmlnLFxuICAgIExvY2FsZVNlcnZpY2VDb25maWcsXG59IGZyb20gJ0BldWkvYmFzZSc7XG5cbi8qKiBkZWZhdWx0IGxvZyBjb25maWd1cmF0aW9uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0dfQ09ORklHOiBMb2dDb25maWcgPSB7XG4gICAgYmFzZUxvZ2dlck5hbWU6ICdyb290JyxcbiAgICBsb2dMZXZlbDogTG9nTGV2ZWwuRVJST1IsXG4gICAgbG9nQXBwZW5kZXJzOiB7XG4gICAgICAgIHR5cGU6IENvbnNvbGVBcHBlbmRlcixcbiAgICAgICAgcHJlZml4Rm9ybWF0OiAnW3tsZXZlbH1dJyxcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSTE4Tl9TRVJWSUNFX0NPTkZJRzogSTE4blNlcnZpY2VDb25maWcgPSB7XG4gICAgbGFuZ3VhZ2VzOiBbJ2VuJ10sXG4gICAgZGVmYXVsdExhbmd1YWdlOiAnZW4nLFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSTE4Tl9MT0FERVJfQ09ORklHOiBJMThuTG9hZGVyQ29uZmlnID0ge307XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPQ0FMRV9TRVJWSUNFX0NPTkZJRzogTG9jYWxlU2VydmljZUNvbmZpZyA9IHtcbiAgICBpZDogJ2VuJyxcbiAgICBhdmFpbGFibGU6IFsnZW4nXSxcbiAgICByZWdpc3RlcmVkOiBbJ2VuJ10sXG4gICAgYmluZFdpdGhUcmFuc2xhdGU6IGZhbHNlLFxuICAgIGFmZmVjdEdsb2JhbExvY2FsZTogZmFsc2Vcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0hUVFBfRVJST1JfSEFORExFUl9DT05GSUc6IEh0dHBFcnJvckhhbmRsZXJDb25maWcgPSB7XG4gICAgcm91dGVzOiBbXSxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0dMT0JBTF9DT05GSUc6IEdsb2JhbENvbmZpZyA9IHtcbiAgICBzaG93Q29ubmVjdGlvblN0YXR1czogdHJ1ZSxcbiAgICBpMThuOiB7XG4gICAgICAgIGkxOG5TZXJ2aWNlOiB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX0kxOE5fU0VSVklDRV9DT05GSUcsXG4gICAgICAgIH0sXG4gICAgICAgIGkxOG5Mb2FkZXI6IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSTE4Tl9MT0FERVJfQ09ORklHLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbG9jYWxlOiB7XG4gICAgICAgIC4uLkRFRkFVTFRfTE9DQUxFX1NFUlZJQ0VfQ09ORklHXG4gICAgfSxcbiAgICB1c2VyOiB7XG4gICAgICAgIGRlZmF1bHRVc2VyUHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICAgIGxvY2FsZToge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfTE9DQUxFX1NFUlZJQ0VfQ09ORklHXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVVJX0FQUF9DT05GSUc6IEV1aUFwcENvbmZpZyA9IHtcbiAgICBnbG9iYWw6IHtcbiAgICAgICAgLi4uREVGQVVMVF9HTE9CQUxfQ09ORklHLFxuICAgIH0sXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9FVUlfRU5WX0NPTkZJRzogRXVpRW52Q29uZmlnID0ge1xuICAgIGVudkFwcEhhbmRsZXJzQ29uZmlnOiB7fSxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VVSV9DT05GSUc6IEV1aUNvbmZpZyA9IHtcbiAgICBhcHBDb25maWc6IHtcbiAgICAgICAgLi4uREVGQVVMVF9FVUlfQVBQX0NPTkZJRyxcbiAgICB9LFxuICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLkRFRkFVTFRfRVVJX0VOVl9DT05GSUcsXG4gICAgfSxcbn07XG4iXX0=
@@ -1,219 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { Inject, Injectable, Optional } from '@angular/core';
3
- import { TranslateService } from '@ngx-translate/core';
4
- import { BehaviorSubject, forkJoin, of } from 'rxjs';
5
- import { catchError, filter, map, take, tap, switchMap } from 'rxjs/operators';
6
- import { EuiLazyService, getI18nServiceConfigFromBase, getI18nState, getActiveLang, getLastAddedModule, getBrowserDefaultLanguage, UxEuLanguages, } from '@eui/base';
7
- import { I18nLoader } from './i18n.loader';
8
- import { GLOBAL_CONFIG_TOKEN } from '../config/tokens';
9
- import { LogService } from '../log/log.service';
10
- import { StoreService } from '../store/store.service';
11
- import { UpdateI18nStateAction } from '../store/actions/i18n.actions';
12
- import { DEFAULT_I18N_SERVICE_CONFIG } from '../config/defaults';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@ngx-translate/core";
15
- import * as i2 from "../log/log.service";
16
- import * as i3 from "../store/store.service";
17
- export class I18nService extends EuiLazyService {
18
- constructor(baseGlobalConfig, translateService, logService, store, document) {
19
- super({ activeLang: 'en' });
20
- this.baseGlobalConfig = baseGlobalConfig;
21
- this.translateService = translateService;
22
- this.logService = logService;
23
- this.store = store;
24
- this.document = document;
25
- this.config = getI18nServiceConfigFromBase(this.baseGlobalConfig);
26
- this.onModuleLoad = new BehaviorSubject({ ready: false, name: null });
27
- }
28
- getState(keyOrMapFn) {
29
- return this.store.select(getI18nState);
30
- }
31
- updateState(langState) {
32
- this.updateHTMLDOMLang(langState.activeLang);
33
- this.store.dispatch(new UpdateI18nStateAction(langState));
34
- }
35
- init(langState) {
36
- const initLang = langState && langState.activeLang ? langState.activeLang : this.preparedDefaultLanguage();
37
- const initState = Object.assign(Object.assign({}, langState), { activeLang: initLang });
38
- if (typeof initLang === 'string') {
39
- super.initEuiService(this.store);
40
- this.updateState(initState);
41
- return this.setup(initLang);
42
- }
43
- return of({ success: false, error: 'Initial active lang should be string' });
44
- }
45
- /**
46
- * A pipe function that could serve as a wrapper of another observable
47
- * e.g. ngx-translate i18n.onReady('my_module').pipe(switchMap(()=>translate.get('eui.KEY')));
48
- * WARNING: onReady will emit only once for a loaded Module, going to another and then going back will not result
49
- * into another emission.
50
- * @param moduleName the name of the module that has been given through the eUI globalConfig. In case non provided
51
- * fetch module name from the state.
52
- */
53
- onReady(moduleName) {
54
- return this.onModuleLoad.pipe(switchMap((evt) => moduleName ? of(evt) :
55
- this.store.select(getLastAddedModule).pipe(tap(m => moduleName = m), map(() => evt))),
56
- // emit only if event emitted matches the module name and is ready
57
- filter((evt) => evt.ready === true && evt.name === moduleName),
58
- // make sure that observable completes
59
- take(1));
60
- }
61
- lazyLoad(config) {
62
- const moduleId = Math.floor((Math.random() * 100000) + 1).toLocaleString();
63
- return this.addResources(config, moduleId);
64
- }
65
- lazyLoadInit(moduleConfig, moduleName) {
66
- const i18nLoaderConfig = moduleConfig;
67
- // add resources
68
- return this.addResources(i18nLoaderConfig, moduleName);
69
- }
70
- /**
71
- * Add resources based of a config loader
72
- * @param config I18nLoaderConfig
73
- * @return Promise<EuiServiceStatus> an EuiServiceStatus when translation has fully loaded
74
- */
75
- addResources(config, moduleName) {
76
- // emit that module is loading
77
- this.onModuleLoad.next({ ready: false, name: moduleName });
78
- const loader = this.translateService.currentLoader;
79
- if (loader instanceof I18nLoader) {
80
- const langSubscription = [];
81
- const i18nLoader = loader;
82
- // add the resources to the loader
83
- const resources = i18nLoader.addResources(config);
84
- // manually load the resources for the CURRENT language and add them to the translate service
85
- langSubscription.push(i18nLoader.loadResources(resources, this.translateService.currentLang)
86
- .pipe(take(1), tap((loadedResources) => {
87
- // add the new set of translations to the current language
88
- this.translateService.setTranslation(this.translateService.currentLang, loadedResources.translations, true);
89
- if (loadedResources.hasError) {
90
- i18nLoader.removeResources(loadedResources.errors.map(err => err.resource));
91
- }
92
- })));
93
- // if the current language is different than the DEFAULT language
94
- if (this.translateService.currentLang !== this.translateService.defaultLang) {
95
- // manually load the resources for the default language and add them to the translate service
96
- langSubscription.push(i18nLoader.loadResources(resources, this.translateService.defaultLang)
97
- .pipe(take(1), tap((loadedResources) => {
98
- this.translateService.setTranslation(this.translateService.defaultLang, loadedResources.translations, true);
99
- if (loadedResources.hasError) {
100
- i18nLoader.removeResources(loadedResources.errors.map(err => err.resource));
101
- }
102
- })));
103
- }
104
- return forkJoin(langSubscription).pipe(map((loadedResourcesArr) => {
105
- return !loadedResourcesArr[0].hasError ?
106
- { success: true } :
107
- { success: false, error: loadedResourcesArr[0].errors };
108
- }), tap(() => {
109
- // emit status of module loading progress
110
- this.onModuleLoad.next({ ready: true, name: moduleName });
111
- }), catchError(error => {
112
- // emit status of module loading progress
113
- this.onModuleLoad.next({ ready: true, name: moduleName, error: error });
114
- return of({ success: false, error: error });
115
- }));
116
- }
117
- else {
118
- return of({ success: false, error: 'currentLoader is not an I18nLoader.' });
119
- }
120
- }
121
- /**
122
- * Prepares the default language
123
- */
124
- preparedDefaultLanguage() {
125
- const browserPref = getBrowserDefaultLanguage();
126
- // If user has browser preferred lang, and that language is part of the languages array
127
- if (browserPref && this.config.languages && UxEuLanguages.getLanguageCodes(this.config.languages).includes(browserPref)) {
128
- return browserPref;
129
- }
130
- return this.config.defaultLanguage;
131
- }
132
- /**
133
- * @param default_language if given default language to override default language coming from the
134
- * configuration token.
135
- */
136
- setup(initLanguage) {
137
- // use the default config as a reference base
138
- this.config = Object.assign({}, DEFAULT_I18N_SERVICE_CONFIG, this.config);
139
- // configure the translate config service
140
- if (this.config.languages) {
141
- this.translateService.addLangs(UxEuLanguages.getLanguageCodes(this.config.languages));
142
- if (this.logService) {
143
- this.logService.info(`I18n accepted languages set to ${UxEuLanguages.getLanguageCodes(this.config.languages)}`);
144
- }
145
- }
146
- // set the current language, causing to load translations
147
- return this.translateService
148
- .use(initLanguage)
149
- .pipe(tap(() => {
150
- this.bindActiveLangStateToTranslateService();
151
- this.bindTranslateServiceLangChangeToState();
152
- if (this.config.defaultLanguage) {
153
- this.setDefaultLanguage(this.config.defaultLanguage);
154
- }
155
- }), map(() => {
156
- return { success: true };
157
- }), catchError((error) => {
158
- return of({ success: false, error: error });
159
- }));
160
- }
161
- bindActiveLangStateToTranslateService() {
162
- this.store.select(getActiveLang).subscribe((lang) => {
163
- if (lang !== null && (this.translateService.currentLang !== lang)) {
164
- this.use(lang);
165
- }
166
- });
167
- }
168
- bindTranslateServiceLangChangeToState() {
169
- this.translateService.onLangChange.subscribe((event) => {
170
- if (this.stateInstance.activeLang !== event.lang) {
171
- this.updateState({ activeLang: event.lang });
172
- }
173
- if (this.logService) {
174
- this.logService.info(`I18n current language set to ${event.lang}`);
175
- }
176
- });
177
- }
178
- setDefaultLanguage(defaultLanguage) {
179
- // removed, current language is already calculated in init, setup function fill use it directly, not default
180
- // this.translateService.currentLang = default_language || this.config.defaultLanguage;
181
- this.translateService.setDefaultLang(defaultLanguage);
182
- if (this.logService) {
183
- this.logService.info(`I18n default language set to ${defaultLanguage}`);
184
- }
185
- }
186
- /**
187
- * change the currently used language
188
- * @param lang is the language code based on the convention you used e.g. (en or en-EN)
189
- * @returns Observable that returns an object contain the object translation for given language after language
190
- * fully loaded.
191
- */
192
- use(lang) {
193
- return this.translateService.use(lang);
194
- }
195
- /**
196
- * updates the HTML element lang attribute
197
- * @private
198
- */
199
- updateHTMLDOMLang(lang) {
200
- this.document.documentElement.lang = lang;
201
- }
202
- }
203
- /** @nocollapse */ I18nService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: I18nService, deps: [{ token: GLOBAL_CONFIG_TOKEN }, { token: i1.TranslateService }, { token: i2.LogService, optional: true }, { token: i3.StoreService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
204
- /** @nocollapse */ I18nService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: I18nService, providedIn: 'root' });
205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: I18nService, decorators: [{
206
- type: Injectable,
207
- args: [{
208
- providedIn: 'root',
209
- }]
210
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
211
- type: Inject,
212
- args: [GLOBAL_CONFIG_TOKEN]
213
- }] }, { type: i1.TranslateService }, { type: i2.LogService, decorators: [{
214
- type: Optional
215
- }] }, { type: i3.StoreService }, { type: Document, decorators: [{
216
- type: Inject,
217
- args: [DOCUMENT]
218
- }] }]; } });
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9pMThuL2kxOG4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUVILGNBQWMsRUFFZCw0QkFBNEIsRUFDNUIsWUFBWSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsRUFLbEIseUJBQXlCLEVBQ3pCLGFBQWEsR0FDaEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7QUFXakUsTUFBTSxPQUFPLFdBQTZDLFNBQVEsY0FBNkI7SUFLM0YsWUFDMkMsZ0JBQThCLEVBQzNELGdCQUFrQyxFQUN0QixVQUFz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SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFDLElBQVk7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUM5QyxDQUFDOztrSUFwT1EsV0FBVyxrQkFNUixtQkFBbUIsbUhBSW5CLFFBQVE7c0lBVlgsV0FBVyxjQUZSLE1BQU07a0dBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQU9RLE1BQU07MkJBQUMsbUJBQW1COzswQkFFMUIsUUFBUTt5REFFMkIsUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGFuZ0NoYW5nZUV2ZW50LCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIHRha2UsIHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBHbG9iYWxDb25maWcsXG4gICAgRXVpTGF6eVNlcnZpY2UsXG4gICAgRXVpU2VydmljZVN0YXR1cyxcbiAgICBnZXRJMThuU2VydmljZUNvbmZpZ0Zyb21CYXNlLFxuICAgIGdldEkxOG5TdGF0ZSxcbiAgICBnZXRBY3RpdmVMYW5nLFxuICAgIGdldExhc3RBZGRlZE1vZHVsZSxcbiAgICBJMThuTG9hZGVyQ29uZmlnLFxuICAgIEkxOG5TZXJ2aWNlQ29uZmlnLFxuICAgIEkxOG5TdGF0ZSxcbiAgICBNb2R1bGVDb25maWcsXG4gICAgZ2V0QnJvd3NlckRlZmF1bHRMYW5ndWFnZSxcbiAgICBVeEV1TGFuZ3VhZ2VzLFxufSBmcm9tICdAZXVpL2Jhc2UnO1xuXG5pbXBvcnQgeyBJMThuTG9hZGVyLCBMb2FkZWRSZXNvdXJjZXMgfSBmcm9tICcuL2kxOG4ubG9hZGVyJztcbmltcG9ydCB7IEdMT0JBTF9DT05GSUdfVE9LRU4gfSBmcm9tICcuLi9jb25maWcvdG9rZW5zJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi9sb2cvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vc3RvcmUvc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBVcGRhdGVJMThuU3RhdGVBY3Rpb24gfSBmcm9tICcuLi9zdG9yZS9hY3Rpb25zL2kxOG4uYWN0aW9ucyc7XG5pbXBvcnQgeyBERUZBVUxUX0kxOE5fU0VSVklDRV9DT05GSUcgfSBmcm9tICcuLi9jb25maWcvZGVmYXVsdHMnO1xuXG5pbnRlcmZhY2UgTW9kdWxlTG9hZEV2ZW50IHtcbiAgICByZWFkeTogYm9vbGVhbjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZXJyb3I/OiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEkxOG5TZXJ2aWNlPFQgZXh0ZW5kcyBJMThuU3RhdGUgPSBJMThuU3RhdGU+IGV4dGVuZHMgRXVpTGF6eVNlcnZpY2U8VCB8IEkxOG5TdGF0ZT4ge1xuXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogSTE4blNlcnZpY2VDb25maWc7XG4gICAgcHJvdGVjdGVkIG9uTW9kdWxlTG9hZDogQmVoYXZpb3JTdWJqZWN0PE1vZHVsZUxvYWRFdmVudD47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChHTE9CQUxfQ09ORklHX1RPS0VOKSBwcm90ZWN0ZWQgYmFzZUdsb2JhbENvbmZpZzogR2xvYmFsQ29uZmlnLFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBzdG9yZTogU3RvcmVTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoeyBhY3RpdmVMYW5nOiAnZW4nIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGdldEkxOG5TZXJ2aWNlQ29uZmlnRnJvbUJhc2UodGhpcy5iYXNlR2xvYmFsQ29uZmlnKTtcbiAgICAgICAgdGhpcy5vbk1vZHVsZUxvYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1vZHVsZUxvYWRFdmVudD4oeyByZWFkeTogZmFsc2UsIG5hbWU6IG51bGwgfSk7XG4gICAgfVxuXG4gICAgZ2V0U3RhdGU8SyA9IFQ+KG1hcEZuPzogKHN0YXRlOiBUKSA9PiBLKTogT2JzZXJ2YWJsZTxLPjtcbiAgICBnZXRTdGF0ZTxhIGV4dGVuZHMga2V5b2YgVD4oa2V5PzogYSk6IE9ic2VydmFibGU8VFthXT47XG4gICAgZ2V0U3RhdGU8Sz4oa2V5T3JNYXBGbj86ICgoc3RhdGU6IFQpID0+IEspIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxLPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRJMThuU3RhdGUpO1xuICAgIH1cblxuICAgIHVwZGF0ZVN0YXRlKGxhbmdTdGF0ZTogVCB8IEkxOG5TdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUhUTUxET01MYW5nKGxhbmdTdGF0ZS5hY3RpdmVMYW5nKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVXBkYXRlSTE4blN0YXRlQWN0aW9uKGxhbmdTdGF0ZSkpO1xuICAgIH1cblxuICAgIGluaXQobGFuZ1N0YXRlPzogVCk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICBjb25zdCBpbml0TGFuZyA9IGxhbmdTdGF0ZSAmJiBsYW5nU3RhdGUuYWN0aXZlTGFuZyA/IGxhbmdTdGF0ZS5hY3RpdmVMYW5nIDogdGhpcy5wcmVwYXJlZERlZmF1bHRMYW5ndWFnZSgpO1xuICAgICAgICBjb25zdCBpbml0U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5sYW5nU3RhdGUsXG4gICAgICAgICAgICBhY3RpdmVMYW5nOiBpbml0TGFuZyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbml0TGFuZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmluaXRFdWlTZXJ2aWNlKHRoaXMuc3RvcmUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZShpbml0U3RhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dXAoaW5pdExhbmcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0luaXRpYWwgYWN0aXZlIGxhbmcgc2hvdWxkIGJlIHN0cmluZycgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBwaXBlIGZ1bmN0aW9uIHRoYXQgY291bGQgc2VydmUgYXMgYSB3cmFwcGVyIG9mIGFub3RoZXIgb2JzZXJ2YWJsZVxuICAgICAqIGUuZy4gbmd4LXRyYW5zbGF0ZSBpMThuLm9uUmVhZHkoJ215X21vZHVsZScpLnBpcGUoc3dpdGNoTWFwKCgpPT50cmFuc2xhdGUuZ2V0KCdldWkuS0VZJykpKTtcbiAgICAgKiBXQVJOSU5HOiBvblJlYWR5IHdpbGwgZW1pdCBvbmx5IG9uY2UgZm9yIGEgbG9hZGVkIE1vZHVsZSwgZ29pbmcgdG8gYW5vdGhlciBhbmQgdGhlbiBnb2luZyBiYWNrIHdpbGwgbm90IHJlc3VsdFxuICAgICAqIGludG8gYW5vdGhlciBlbWlzc2lvbi5cbiAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgaGFzIGJlZW4gZ2l2ZW4gdGhyb3VnaCB0aGUgZVVJIGdsb2JhbENvbmZpZy4gSW4gY2FzZSBub24gcHJvdmlkZWRcbiAgICAgKiBmZXRjaCBtb2R1bGUgbmFtZSBmcm9tIHRoZSBzdGF0ZS5cbiAgICAgKi9cbiAgICBvblJlYWR5KG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbk1vZHVsZUxvYWQucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoZXZ0OiBNb2R1bGVMb2FkRXZlbnQpID0+IG1vZHVsZU5hbWUgPyBvZihldnQpIDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRMYXN0QWRkZWRNb2R1bGUpLnBpcGUodGFwKG0gPT4gbW9kdWxlTmFtZSA9IG0pLCBtYXAoKCkgPT4gZXZ0KSkpLFxuICAgICAgICAgICAgLy8gZW1pdCBvbmx5IGlmIGV2ZW50IGVtaXR0ZWQgbWF0Y2hlcyB0aGUgbW9kdWxlIG5hbWUgYW5kIGlzIHJlYWR5XG4gICAgICAgICAgICBmaWx0ZXIoKGV2dDogTW9kdWxlTG9hZEV2ZW50KSA9PiBldnQucmVhZHkgPT09IHRydWUgJiYgZXZ0Lm5hbWUgPT09IG1vZHVsZU5hbWUpLFxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgb2JzZXJ2YWJsZSBjb21wbGV0ZXNcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGxhenlMb2FkKGNvbmZpZzogSTE4bkxvYWRlckNvbmZpZyk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiAxMDAwMDApICsgMSkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmVzb3VyY2VzKGNvbmZpZywgbW9kdWxlSWQpO1xuICAgIH1cblxuICAgIGxhenlMb2FkSW5pdChtb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZywgbW9kdWxlTmFtZT86IHN0cmluZyk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICBjb25zdCBpMThuTG9hZGVyQ29uZmlnID0gbW9kdWxlQ29uZmlnIGFzIEkxOG5Mb2FkZXJDb25maWc7XG4gICAgICAgIC8vIGFkZCByZXNvdXJjZXNcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmVzb3VyY2VzKGkxOG5Mb2FkZXJDb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCByZXNvdXJjZXMgYmFzZWQgb2YgYSBjb25maWcgbG9hZGVyXG4gICAgICogQHBhcmFtIGNvbmZpZyBJMThuTG9hZGVyQ29uZmlnXG4gICAgICogQHJldHVybiBQcm9taXNlPEV1aVNlcnZpY2VTdGF0dXM+IGFuIEV1aVNlcnZpY2VTdGF0dXMgd2hlbiB0cmFuc2xhdGlvbiBoYXMgZnVsbHkgbG9hZGVkXG4gICAgICovXG4gICAgcHVibGljIGFkZFJlc291cmNlcyhjb25maWc6IEkxOG5Mb2FkZXJDb25maWcsIG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV1aVNlcnZpY2VTdGF0dXM+IHtcblxuICAgICAgICAvLyBlbWl0IHRoYXQgbW9kdWxlIGlzIGxvYWRpbmdcbiAgICAgICAgdGhpcy5vbk1vZHVsZUxvYWQubmV4dCh7IHJlYWR5OiBmYWxzZSwgbmFtZTogbW9kdWxlTmFtZSB9KTtcblxuICAgICAgICBjb25zdCBsb2FkZXIgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExvYWRlcjtcbiAgICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIEkxOG5Mb2FkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmdTdWJzY3JpcHRpb246IE9ic2VydmFibGU8YW55PltdID0gW107XG4gICAgICAgICAgICBjb25zdCBpMThuTG9hZGVyID0gPEkxOG5Mb2FkZXI+bG9hZGVyO1xuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIHJlc291cmNlcyB0byB0aGUgbG9hZGVyXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBpMThuTG9hZGVyLmFkZFJlc291cmNlcyhjb25maWcpO1xuXG4gICAgICAgICAgICAvLyBtYW51YWxseSBsb2FkIHRoZSByZXNvdXJjZXMgZm9yIHRoZSBDVVJSRU5UIGxhbmd1YWdlIGFuZCBhZGQgdGhlbSB0byB0aGUgdHJhbnNsYXRlIHNlcnZpY2VcbiAgICAgICAgICAgIGxhbmdTdWJzY3JpcHRpb24ucHVzaChpMThuTG9hZGVyLmxvYWRSZXNvdXJjZXMocmVzb3VyY2VzLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgIHRhcCgobG9hZGVkUmVzb3VyY2VzOiBMb2FkZWRSZXNvdXJjZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbmV3IHNldCBvZiB0cmFuc2xhdGlvbnMgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXRUcmFuc2xhdGlvbih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcsIGxvYWRlZFJlc291cmNlcy50cmFuc2xhdGlvbnMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZFJlc291cmNlcy5oYXNFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5Mb2FkZXIucmVtb3ZlUmVzb3VyY2VzKGxvYWRlZFJlc291cmNlcy5lcnJvcnMubWFwKGVyciA9PiBlcnIucmVzb3VyY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGxhbmd1YWdlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBERUZBVUxUIGxhbmd1YWdlXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nICE9PSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZGVmYXVsdExhbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSBsb2FkIHRoZSByZXNvdXJjZXMgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGFuZCBhZGQgdGhlbSB0byB0aGUgdHJhbnNsYXRlIHNlcnZpY2VcbiAgICAgICAgICAgICAgICBsYW5nU3Vic2NyaXB0aW9uLnB1c2goaTE4bkxvYWRlci5sb2FkUmVzb3VyY2VzKHJlc291cmNlcywgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmRlZmF1bHRMYW5nKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXAoKGxvYWRlZFJlc291cmNlczogTG9hZGVkUmVzb3VyY2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKHRoaXMudHJhbnNsYXRlU2VydmljZS5kZWZhdWx0TGFuZywgbG9hZGVkUmVzb3VyY2VzLnRyYW5zbGF0aW9ucywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZFJlc291cmNlcy5oYXNFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuTG9hZGVyLnJlbW92ZVJlc291cmNlcyhsb2FkZWRSZXNvdXJjZXMuZXJyb3JzLm1hcChlcnIgPT4gZXJyLnJlc291cmNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4obGFuZ1N1YnNjcmlwdGlvbikucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxvYWRlZFJlc291cmNlc0FycjogTG9hZGVkUmVzb3VyY2VzW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFsb2FkZWRSZXNvdXJjZXNBcnJbMF0uaGFzRXJyb3IgP1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBzdWNjZXNzOiB0cnVlIH0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGxvYWRlZFJlc291cmNlc0FyclswXS5lcnJvcnMgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IHN0YXR1cyBvZiBtb2R1bGUgbG9hZGluZyBwcm9ncmVzc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTW9kdWxlTG9hZC5uZXh0KHsgcmVhZHk6IHRydWUsIG5hbWU6IG1vZHVsZU5hbWUgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgc3RhdHVzIG9mIG1vZHVsZSBsb2FkaW5nIHByb2dyZXNzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Nb2R1bGVMb2FkLm5leHQoeyByZWFkeTogdHJ1ZSwgbmFtZTogbW9kdWxlTmFtZSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ2N1cnJlbnRMb2FkZXIgaXMgbm90IGFuIEkxOG5Mb2FkZXIuJyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIHRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlZERlZmF1bHRMYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBicm93c2VyUHJlZiA9IGdldEJyb3dzZXJEZWZhdWx0TGFuZ3VhZ2UoKTtcbiAgICAgICAgLy8gSWYgdXNlciBoYXMgYnJvd3NlciBwcmVmZXJyZWQgbGFuZywgYW5kIHRoYXQgbGFuZ3VhZ2UgaXMgcGFydCBvZiB0aGUgbGFuZ3VhZ2VzIGFycmF5XG4gICAgICAgIGlmIChicm93c2VyUHJlZiAmJiB0aGlzLmNvbmZpZy5sYW5ndWFnZXMgJiYgVXhFdUxhbmd1YWdlcy5nZXRMYW5ndWFnZUNvZGVzKHRoaXMuY29uZmlnLmxhbmd1YWdlcykuaW5jbHVkZXMoYnJvd3NlclByZWYpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlclByZWY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRlZmF1bHRMYW5ndWFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZGVmYXVsdF9sYW5ndWFnZSBpZiBnaXZlbiBkZWZhdWx0IGxhbmd1YWdlIHRvIG92ZXJyaWRlIGRlZmF1bHQgbGFuZ3VhZ2UgY29taW5nIGZyb20gdGhlXG4gICAgICogY29uZmlndXJhdGlvbiB0b2tlbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldHVwKGluaXRMYW5ndWFnZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxFdWlTZXJ2aWNlU3RhdHVzPiB7XG4gICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBjb25maWcgYXMgYSByZWZlcmVuY2UgYmFzZVxuICAgICAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfSTE4Tl9TRVJWSUNFX0NPTkZJRywgdGhpcy5jb25maWcpO1xuICAgICAgICAvLyBjb25maWd1cmUgdGhlIHRyYW5zbGF0ZSBjb25maWcgc2VydmljZVxuICAgICAgICBpZiAodGhpcy5jb25maWcubGFuZ3VhZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuYWRkTGFuZ3MoVXhFdUxhbmd1YWdlcy5nZXRMYW5ndWFnZUNvZGVzKHRoaXMuY29uZmlnLmxhbmd1YWdlcykpO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9nU2VydmljZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5pbmZvKGBJMThuIGFjY2VwdGVkIGxhbmd1YWdlcyBzZXQgdG8gJHtVeEV1TGFuZ3VhZ2VzLmdldExhbmd1YWdlQ29kZXModGhpcy5jb25maWcubGFuZ3VhZ2VzKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UsIGNhdXNpbmcgdG8gbG9hZCB0cmFuc2xhdGlvbnNcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgICAgICAgICAgLnVzZShpbml0TGFuZ3VhZ2UpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRBY3RpdmVMYW5nU3RhdGVUb1RyYW5zbGF0ZVNlcnZpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kVHJhbnNsYXRlU2VydmljZUxhbmdDaGFuZ2VUb1N0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0TGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdExhbmd1YWdlKHRoaXMuY29uZmlnLmRlZmF1bHRMYW5ndWFnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kQWN0aXZlTGFuZ1N0YXRlVG9UcmFuc2xhdGVTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVMYW5nKS5zdWJzY3JpYmUoKGxhbmc6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGxhbmcgIT09IG51bGwgJiYgKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyAhPT0gbGFuZykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZShsYW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kVHJhbnNsYXRlU2VydmljZUxhbmdDaGFuZ2VUb1N0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoZXZlbnQ6IExhbmdDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVJbnN0YW5jZS5hY3RpdmVMYW5nICE9PSBldmVudC5sYW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh7IGFjdGl2ZUxhbmc6IGV2ZW50LmxhbmcgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmluZm8oYEkxOG4gY3VycmVudCBsYW5ndWFnZSBzZXQgdG8gJHtldmVudC5sYW5nfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERlZmF1bHRMYW5ndWFnZShkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZykge1xuICAgICAgICAvLyByZW1vdmVkLCBjdXJyZW50IGxhbmd1YWdlIGlzIGFscmVhZHkgY2FsY3VsYXRlZCBpbiBpbml0LCBzZXR1cCBmdW5jdGlvbiBmaWxsIHVzZSBpdCBkaXJlY3RseSwgbm90IGRlZmF1bHRcbiAgICAgICAgLy8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nID0gZGVmYXVsdF9sYW5ndWFnZSB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXREZWZhdWx0TGFuZyhkZWZhdWx0TGFuZ3VhZ2UpO1xuICAgICAgICBpZiAodGhpcy5sb2dTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuaW5mbyhgSTE4biBkZWZhdWx0IGxhbmd1YWdlIHNldCB0byAke2RlZmF1bHRMYW5ndWFnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNoYW5nZSB0aGUgY3VycmVudGx5IHVzZWQgbGFuZ3VhZ2VcbiAgICAgKiBAcGFyYW0gbGFuZyBpcyB0aGUgbGFuZ3VhZ2UgY29kZSBiYXNlZCBvbiB0aGUgY29udmVudGlvbiB5b3UgdXNlZCBlLmcuIChlbiBvciBlbi1FTilcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbiB0aGUgb2JqZWN0IHRyYW5zbGF0aW9uIGZvciBnaXZlbiBsYW5ndWFnZSBhZnRlciBsYW5ndWFnZVxuICAgICAqIGZ1bGx5IGxvYWRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVzZShsYW5nOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnVzZShsYW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGVzIHRoZSBIVE1MIGVsZW1lbnQgbGFuZyBhdHRyaWJ1dGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlSFRNTERPTUxhbmcobGFuZzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmxhbmcgPSBsYW5nO1xuICAgIH1cbn1cbiJdfQ==