@abp/ng.core 7.0.1 → 7.0.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.
Files changed (118) hide show
  1. package/esm2020/lib/abstracts/ng-model.component.mjs +1 -1
  2. package/esm2020/lib/clients/http.client.mjs +34 -0
  3. package/esm2020/lib/clients/index.mjs +2 -0
  4. package/esm2020/lib/components/dynamic-layout.component.mjs +6 -4
  5. package/esm2020/lib/components/replaceable-route-container.component.mjs +1 -1
  6. package/esm2020/lib/directives/debounce.directive.mjs +1 -1
  7. package/esm2020/lib/directives/for.directive.mjs +20 -12
  8. package/esm2020/lib/directives/form-submit.directive.mjs +2 -2
  9. package/esm2020/lib/directives/replaceable-template.directive.mjs +9 -5
  10. package/esm2020/lib/directives/stop-propagation.directive.mjs +2 -2
  11. package/esm2020/lib/handlers/routes.handler.mjs +9 -7
  12. package/esm2020/lib/interceptors/api.interceptor.mjs +3 -2
  13. package/esm2020/lib/models/auth.mjs +1 -1
  14. package/esm2020/lib/models/dtos.mjs +6 -6
  15. package/esm2020/lib/models/environment.mjs +1 -1
  16. package/esm2020/lib/models/session.mjs +1 -1
  17. package/esm2020/lib/providers/include-localization-resources.provider.mjs +2 -2
  18. package/esm2020/lib/providers/locale.provider.mjs +6 -2
  19. package/esm2020/lib/proxy/pages/abp/multi-tenancy/abp-tenant.service.mjs +1 -1
  20. package/esm2020/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/abp-api-definition.service.mjs +1 -1
  21. package/esm2020/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service.mjs +1 -1
  22. package/esm2020/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-localization.service.mjs +2 -2
  23. package/esm2020/lib/proxy/volo/abp/http/modeling/models.mjs +1 -1
  24. package/esm2020/lib/proxy/volo/abp/localization/models.mjs +1 -1
  25. package/esm2020/lib/services/config-state.service.mjs +4 -1
  26. package/esm2020/lib/services/dom-insertion.service.mjs +6 -4
  27. package/esm2020/lib/services/environment.service.mjs +5 -5
  28. package/esm2020/lib/services/http-wait.service.mjs +4 -1
  29. package/esm2020/lib/services/lazy-load.service.mjs +6 -4
  30. package/esm2020/lib/services/localization.service.mjs +7 -7
  31. package/esm2020/lib/services/multi-tenancy.service.mjs +1 -1
  32. package/esm2020/lib/services/permission.service.mjs +1 -1
  33. package/esm2020/lib/services/replaceable-components.service.mjs +1 -1
  34. package/esm2020/lib/services/resource-wait.service.mjs +2 -2
  35. package/esm2020/lib/services/rest.service.mjs +2 -3
  36. package/esm2020/lib/services/router-events.service.mjs +2 -2
  37. package/esm2020/lib/services/routes.service.mjs +2 -2
  38. package/esm2020/lib/services/session-state.service.mjs +1 -1
  39. package/esm2020/lib/services/subscription.service.mjs +4 -2
  40. package/esm2020/lib/strategies/content-security.strategy.mjs +4 -2
  41. package/esm2020/lib/strategies/content.strategy.mjs +6 -2
  42. package/esm2020/lib/strategies/context.strategy.mjs +1 -1
  43. package/esm2020/lib/strategies/cross-origin.strategy.mjs +4 -2
  44. package/esm2020/lib/strategies/loading.strategy.mjs +1 -1
  45. package/esm2020/lib/tokens/http-context.token.mjs +3 -0
  46. package/esm2020/lib/tokens/include-localization-resources.token.mjs +2 -2
  47. package/esm2020/lib/tokens/index.mjs +2 -1
  48. package/esm2020/lib/tokens/localization.token.mjs +1 -1
  49. package/esm2020/lib/tokens/set-token-response-to-storage.token.mjs +4 -1
  50. package/esm2020/lib/utils/common-utils.mjs +4 -1
  51. package/esm2020/lib/utils/date-utils.mjs +3 -3
  52. package/esm2020/lib/utils/environment-utils.mjs +2 -2
  53. package/esm2020/lib/utils/factory-utils.mjs +2 -2
  54. package/esm2020/lib/utils/internal-store-utils.mjs +2 -1
  55. package/esm2020/lib/utils/lazy-load-utils.mjs +2 -2
  56. package/esm2020/lib/utils/localization-utils.mjs +1 -1
  57. package/esm2020/lib/utils/multi-tenancy-utils.mjs +7 -4
  58. package/esm2020/lib/utils/object-utils.mjs +1 -1
  59. package/esm2020/lib/utils/route-utils.mjs +2 -2
  60. package/esm2020/lib/utils/tree-utils.mjs +1 -1
  61. package/esm2020/lib/validators/range.validator.mjs +1 -1
  62. package/esm2020/lib/validators/required.validator.mjs +1 -1
  63. package/esm2020/lib/validators/string-length.validator.mjs +1 -1
  64. package/esm2020/lib/validators/username.validator.mjs +2 -2
  65. package/esm2020/locale/utils/register-locale.mjs +2 -2
  66. package/esm2020/public-api.mjs +2 -1
  67. package/esm2020/testing/lib/services/mock-permission.service.mjs +1 -1
  68. package/esm2020/testing/lib/services/mock-rest.service.mjs +2 -2
  69. package/fesm2015/abp-ng.core-locale.mjs +1 -1
  70. package/fesm2015/abp-ng.core-locale.mjs.map +1 -1
  71. package/fesm2015/abp-ng.core-testing.mjs.map +1 -1
  72. package/fesm2015/abp-ng.core.mjs +158 -73
  73. package/fesm2015/abp-ng.core.mjs.map +1 -1
  74. package/fesm2020/abp-ng.core-locale.mjs +1 -1
  75. package/fesm2020/abp-ng.core-locale.mjs.map +1 -1
  76. package/fesm2020/abp-ng.core-testing.mjs.map +1 -1
  77. package/fesm2020/abp-ng.core.mjs +148 -69
  78. package/fesm2020/abp-ng.core.mjs.map +1 -1
  79. package/lib/abstracts/ng-model.component.d.ts +4 -4
  80. package/lib/clients/http.client.d.ts +11 -0
  81. package/lib/clients/index.d.ts +1 -0
  82. package/lib/components/dynamic-layout.component.d.ts +2 -2
  83. package/lib/components/replaceable-route-container.component.d.ts +1 -1
  84. package/lib/directives/for.directive.d.ts +6 -6
  85. package/lib/directives/form-submit.directive.d.ts +1 -1
  86. package/lib/models/auth.d.ts +4 -1
  87. package/lib/models/dtos.d.ts +11 -11
  88. package/lib/models/environment.d.ts +3 -1
  89. package/lib/models/session.d.ts +1 -1
  90. package/lib/providers/include-localization-resources.provider.d.ts +1 -1
  91. package/lib/proxy/volo/abp/http/modeling/models.d.ts +1 -1
  92. package/lib/proxy/volo/abp/localization/models.d.ts +1 -0
  93. package/lib/services/config-state.service.d.ts +5 -3
  94. package/lib/services/dom-insertion.service.d.ts +1 -1
  95. package/lib/services/environment.service.d.ts +1 -1
  96. package/lib/services/localization.service.d.ts +5 -2
  97. package/lib/services/multi-tenancy.service.d.ts +1 -1
  98. package/lib/services/permission.service.d.ts +2 -2
  99. package/lib/services/replaceable-components.service.d.ts +2 -2
  100. package/lib/services/rest.service.d.ts +1 -1
  101. package/lib/services/router-events.service.d.ts +2 -2
  102. package/lib/services/routes.service.d.ts +3 -1
  103. package/lib/services/session-state.service.d.ts +1 -1
  104. package/lib/services/subscription.service.d.ts +1 -1
  105. package/lib/strategies/cross-origin.strategy.d.ts +2 -2
  106. package/lib/tokens/http-context.token.d.ts +2 -0
  107. package/lib/tokens/include-localization-resources.token.d.ts +1 -1
  108. package/lib/tokens/index.d.ts +1 -0
  109. package/lib/tokens/localization.token.d.ts +2 -2
  110. package/lib/tokens/set-token-response-to-storage.token.d.ts +3 -0
  111. package/lib/utils/common-utils.d.ts +9 -8
  112. package/lib/utils/factory-utils.d.ts +3 -1
  113. package/lib/utils/localization-utils.d.ts +1 -1
  114. package/lib/utils/object-utils.d.ts +2 -1
  115. package/lib/utils/route-utils.d.ts +2 -2
  116. package/lib/utils/tree-utils.d.ts +3 -3
  117. package/package.json +3 -3
  118. package/public-api.d.ts +1 -0
@@ -1,17 +1,18 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { ChangeDetectorRef, Component, Input, Injectable, InjectionToken, Inject, isDevMode, Optional, SkipSelf, Directive, EventEmitter, Output, Self, Injector, Pipe, NgModule, APP_INITIALIZER, LOCALE_ID, NgModuleFactory, Compiler, ComponentFactoryResolver, ApplicationRef } from '@angular/core';
3
- import { of, BehaviorSubject, Subject, throwError, combineLatest, from, Subscription, fromEvent, ReplaySubject, lastValueFrom, Observable, timer, concat } from 'rxjs';
3
+ import { of, BehaviorSubject, Subject, throwError, combineLatest, from, Subscription, fromEvent, ReplaySubject, lastValueFrom, Observable, timer, pipe, concat } from 'rxjs';
4
4
  import * as i1$1 from '@angular/router';
5
5
  import { PRIMARY_OUTLET, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, ActivatedRoute, Router, RouterModule } from '@angular/router';
6
6
  import * as i5 from '@angular/common';
7
7
  import { registerLocaleData, DOCUMENT, DatePipe, DATE_PIPE_DEFAULT_TIMEZONE, CommonModule } from '@angular/common';
8
- import { map, distinctUntilChanged, filter, catchError, switchMap, take, tap, debounceTime, mapTo, takeUntil, retryWhen, delay, shareReplay, finalize } from 'rxjs/operators';
8
+ import { map, distinctUntilChanged, filter, catchError, switchMap, take, tap, debounceTime, mapTo, takeUntil, delay, retryWhen, shareReplay, finalize } from 'rxjs/operators';
9
9
  import * as i1 from '@angular/common/http';
10
- import { HttpParams, HttpClient, HttpClientModule, HttpClientXsrfModule } from '@angular/common/http';
10
+ import { HttpParams, HttpClient, HttpClientModule, HttpClientXsrfModule, HttpContextToken, HttpHeaders, HttpContext } from '@angular/common/http';
11
11
  import compare from 'just-compare';
12
12
  import * as i1$2 from '@angular/forms';
13
13
  import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
14
14
  import clone from 'just-clone';
15
+ import { __classPrivateFieldGet } from 'tslib';
15
16
 
16
17
  // Not an abstract class on purpose. Do not change!
17
18
  class AbstractNgModelComponent {
@@ -248,6 +249,9 @@ function isNode(obj) {
248
249
  }
249
250
  function isObjectAndNotArrayNotNode(obj) {
250
251
  return isObjectAndNotArray(obj) && !isNode(obj);
252
+ }
253
+ function checkHasProp(object, key) {
254
+ return Object.prototype.hasOwnProperty.call(object, key);
251
255
  }
252
256
 
253
257
  function deepMerge(target, source) {
@@ -306,6 +310,7 @@ class InternalStore {
306
310
  this.update$.next(patchedState);
307
311
  }
308
312
  deepPatch(state) {
313
+ // TODO: Strict improve deepMerge
309
314
  this.state$.next(deepMerge(this.state, state));
310
315
  this.update$.next(state);
311
316
  }
@@ -318,7 +323,7 @@ class InternalStore {
318
323
  }
319
324
  }
320
325
 
321
- const mapToApiUrl = (key) => (apis) => (apis[key] || apis.default).url || apis.default.url;
326
+ const mapToApiUrl = (key) => (apis) => ((key && apis[key]) || apis.default).url || apis.default.url;
322
327
  const mapToIssuer = (issuer) => {
323
328
  if (!issuer) {
324
329
  return issuer;
@@ -339,7 +344,7 @@ class EnvironmentService {
339
344
  return this.store.state;
340
345
  }
341
346
  getApiUrl(key) {
342
- return mapToApiUrl(key)(this.store.state.apis);
347
+ return mapToApiUrl(key)(this.store.state?.apis);
343
348
  }
344
349
  getApiUrl$(key) {
345
350
  return this.store.sliceState(state => state.apis).pipe(map(mapToApiUrl(key)));
@@ -348,11 +353,11 @@ class EnvironmentService {
348
353
  this.store.set(environment);
349
354
  }
350
355
  getIssuer() {
351
- const issuer = this.store.state.oAuthConfig.issuer;
356
+ const issuer = this.store.state?.oAuthConfig?.issuer;
352
357
  return mapToIssuer(issuer);
353
358
  }
354
359
  getIssuer$() {
355
- return this.store.sliceState(state => state.oAuthConfig.issuer).pipe(map(mapToIssuer));
360
+ return this.store.sliceState(state => state?.oAuthConfig?.issuer).pipe(map(mapToIssuer));
356
361
  }
357
362
  }
358
363
  EnvironmentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: EnvironmentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -419,8 +424,7 @@ class RestService {
419
424
  .pipe(catchError(err => (skipHandleError ? throwError(err) : this.handleError(err))));
420
425
  }
421
426
  getParams(params, encoder) {
422
- const filteredParams = Object.keys(params).reduce((acc, key) => {
423
- const value = params[key];
427
+ const filteredParams = Object.entries(params).reduce((acc, [key, value]) => {
424
428
  if (isUndefinedOrEmptyString(value))
425
429
  return acc;
426
430
  if (value === null && !this.options.sendNullsAsQueryParam)
@@ -511,6 +515,9 @@ class ConfigStateService {
511
515
  .subscribe(res => this.store.set(res));
512
516
  }
513
517
  getLocalizationAndCombineWithAppState(appState) {
518
+ if (!appState.localization.currentCulture.cultureName) {
519
+ throw new Error('culture name should defined');
520
+ }
514
521
  return this.getlocalizationResource(appState.localization.currentCulture.cultureName).pipe(map(result => ({ ...appState, localization: { ...appState.localization, ...result } })));
515
522
  }
516
523
  getlocalizationResource(cultureName) {
@@ -771,13 +778,13 @@ class LocalizationService {
771
778
  Object.entries(remote).forEach(entry => {
772
779
  const resourceName = entry[0];
773
780
  const remoteTexts = entry[1];
774
- let resource = local.get(resourceName) || {};
781
+ let resource = local?.get(resourceName) || {};
775
782
  resource = { ...resource, ...remoteTexts };
776
- local.set(resourceName, resource);
783
+ local?.set(resourceName, resource);
777
784
  });
778
785
  }
779
786
  return local;
780
- }))
787
+ }), filter(Boolean))
781
788
  .subscribe(val => this.localizations$.next(val));
782
789
  }
783
790
  addLocalization(localizations) {
@@ -798,7 +805,7 @@ class LocalizationService {
798
805
  listenToSetLanguage() {
799
806
  this.sessionState
800
807
  .onLanguageChange$()
801
- .pipe(filter(lang => this.configState.getDeep('localization.currentCulture.cultureName') !== lang), switchMap(lang => this.configState.refreshAppState().pipe(map(() => lang))), switchMap(lang => from(this.registerLocale(lang).then(() => lang))))
808
+ .pipe(filter(lang => this.configState.getDeep('localization.currentCulture.cultureName') !== lang), switchMap(lang => this.configState.refreshAppState().pipe(map(() => lang))), filter(Boolean), switchMap(lang => from(this.registerLocale(lang).then(() => lang))))
802
809
  .subscribe(lang => this._languageChange$.next(lang));
803
810
  }
804
811
  registerLocale(locale) {
@@ -850,14 +857,14 @@ class LocalizationService {
850
857
  getLocalization(state, key, ...interpolateParams) {
851
858
  if (!key)
852
859
  key = '';
853
- let defaultValue;
860
+ let defaultValue = '';
854
861
  if (typeof key !== 'string') {
855
862
  defaultValue = key.defaultValue;
856
863
  key = key.key;
857
864
  }
858
865
  const keys = key.split('::');
859
866
  const warn = (message) => {
860
- if (isDevMode)
867
+ if (isDevMode())
861
868
  console.warn(message);
862
869
  };
863
870
  if (keys.length < 2) {
@@ -1262,7 +1269,7 @@ class AbstractNavTreeService extends AbstractTreeService {
1262
1269
  }
1263
1270
  hasInvisibleChild(identifier) {
1264
1271
  const node = this.find(item => item[this.id] === identifier);
1265
- return node?.children?.some(child => child.invisible);
1272
+ return node?.children?.some(child => child.invisible) || false;
1266
1273
  }
1267
1274
  /* istanbul ignore next */
1268
1275
  ngOnDestroy() {
@@ -1300,7 +1307,9 @@ class SubscriptionService {
1300
1307
  }
1301
1308
  closeOne(subscription) {
1302
1309
  this.removeOne(subscription);
1303
- subscription.unsubscribe();
1310
+ if (subscription) {
1311
+ subscription.unsubscribe();
1312
+ }
1304
1313
  }
1305
1314
  ngOnDestroy() {
1306
1315
  this.subscription.unsubscribe();
@@ -1335,7 +1344,7 @@ class DynamicLayoutComponent {
1335
1344
  ]);
1336
1345
  this.isLayoutVisible = true;
1337
1346
  if (dynamicLayoutComponent) {
1338
- if (isDevMode)
1347
+ if (isDevMode())
1339
1348
  console.warn('DynamicLayoutComponent must be used only in AppComponent.');
1340
1349
  return;
1341
1350
  }
@@ -1367,8 +1376,10 @@ class DynamicLayoutComponent {
1367
1376
  if (this.layoutKey === expectedLayout)
1368
1377
  return;
1369
1378
  const key = this.layouts.get(expectedLayout);
1370
- this.layout = this.getComponent(key)?.component;
1371
- this.layoutKey = expectedLayout;
1379
+ if (key) {
1380
+ this.layout = this.getComponent(key)?.component;
1381
+ this.layoutKey = expectedLayout;
1382
+ }
1372
1383
  if (!this.layout) {
1373
1384
  this.showLayoutNotFoundError(expectedLayout);
1374
1385
  }
@@ -1874,16 +1885,20 @@ class ForDirective {
1874
1885
  const rw = [];
1875
1886
  changes.forEachOperation((record, previousIndex, currentIndex) => {
1876
1887
  if (record.previousIndex == null) {
1877
- const view = this.vcRef.createEmbeddedView(this.tempRef, new AbpForContext(null, -1, -1, this.items), currentIndex);
1888
+ const view = this.vcRef.createEmbeddedView(this.tempRef, new AbpForContext(null, -1, -1, this.items), currentIndex || 0);
1878
1889
  rw.push(new RecordView(record, view));
1879
1890
  }
1880
- else if (currentIndex == null) {
1891
+ else if (currentIndex == null && previousIndex !== null) {
1881
1892
  this.vcRef.remove(previousIndex);
1882
1893
  }
1883
1894
  else {
1884
- const view = this.vcRef.get(previousIndex);
1885
- this.vcRef.move(view, currentIndex);
1886
- rw.push(new RecordView(record, view));
1895
+ if (previousIndex !== null) {
1896
+ const view = this.vcRef.get(previousIndex);
1897
+ if (view && currentIndex !== null) {
1898
+ this.vcRef.move(view, currentIndex);
1899
+ rw.push(new RecordView(record, view));
1900
+ }
1901
+ }
1887
1902
  }
1888
1903
  });
1889
1904
  for (let i = 0, l = rw.length; i < l; i++) {
@@ -1898,8 +1913,10 @@ class ForDirective {
1898
1913
  viewRef.context.list = this.items;
1899
1914
  }
1900
1915
  changes.forEachIdentityChange((record) => {
1901
- const viewRef = this.vcRef.get(record.currentIndex);
1902
- viewRef.context.$implicit = record.item;
1916
+ if (record.currentIndex !== null) {
1917
+ const viewRef = this.vcRef.get(record.currentIndex);
1918
+ viewRef.context.$implicit = record.item;
1919
+ }
1903
1920
  });
1904
1921
  }
1905
1922
  projectItems(items) {
@@ -1926,8 +1943,9 @@ class ForDirective {
1926
1943
  }
1927
1944
  }
1928
1945
  sortItems(items) {
1929
- if (this.orderBy) {
1930
- items.sort((a, b) => a[this.orderBy] > b[this.orderBy] ? 1 : a[this.orderBy] < b[this.orderBy] ? -1 : 0);
1946
+ const orderBy = this.orderBy;
1947
+ if (orderBy) {
1948
+ items.sort((a, b) => (a[orderBy] > b[orderBy] ? 1 : a[orderBy] < b[orderBy] ? -1 : 0));
1931
1949
  }
1932
1950
  else {
1933
1951
  items.sort();
@@ -1938,10 +1956,11 @@ class ForDirective {
1938
1956
  if (!Array.isArray(items))
1939
1957
  return;
1940
1958
  const compareFn = this.compareFn;
1941
- if (typeof this.filterBy !== 'undefined' &&
1959
+ const filterBy = this.filterBy;
1960
+ if (typeof filterBy !== 'undefined' &&
1942
1961
  typeof this.filterVal !== 'undefined' &&
1943
1962
  this.filterVal !== '') {
1944
- items = items.filter(item => compareFn(item[this.filterBy], this.filterVal));
1963
+ items = items.filter(item => compareFn(item[filterBy], this.filterVal));
1945
1964
  }
1946
1965
  switch (this.orderDir) {
1947
1966
  case 'ASC':
@@ -2012,7 +2031,7 @@ class FormSubmitDirective {
2012
2031
  }
2013
2032
  this.executedNgSubmit = true;
2014
2033
  });
2015
- const keyup$ = fromEvent(this.host.nativeElement, 'keyup').pipe(debounceTime(this.debounce), filter(event => !(event.target instanceof HTMLTextAreaElement)), filter((event) => event && event.key === 'Enter'));
2034
+ const keyup$ = fromEvent(this.host.nativeElement, 'keyup').pipe(debounceTime(this.debounce), filter(event => !(event.target instanceof HTMLTextAreaElement)), filter(event => event && event.key === 'Enter'));
2016
2035
  this.subscription.addOne(keyup$, () => {
2017
2036
  if (!this.executedNgSubmit) {
2018
2037
  this.host.nativeElement.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));
@@ -2236,11 +2255,15 @@ class ReplaceableTemplateDirective {
2236
2255
  [key]: {
2237
2256
  enumerable: true,
2238
2257
  configurable: true,
2239
- get: () => this.data.inputs[key]?.value,
2240
- ...(this.data.inputs[key]?.twoWay && {
2258
+ get: () => this.data.inputs?.[key]?.value,
2259
+ ...(this.data.inputs?.[key]?.twoWay && {
2241
2260
  set: (newValue) => {
2242
- this.data.inputs[key].value = newValue;
2243
- this.data.outputs[`${key}Change`](newValue);
2261
+ if (this.data.inputs?.[key]) {
2262
+ this.data.inputs[key].value = newValue;
2263
+ }
2264
+ if (this.data.outputs?.[`${key}Change`]) {
2265
+ this.data.outputs[`${key}Change`](newValue);
2266
+ }
2244
2267
  },
2245
2268
  }),
2246
2269
  },
@@ -2275,7 +2298,7 @@ class StopPropagationDirective {
2275
2298
  this.stopPropEvent = new EventEmitter();
2276
2299
  }
2277
2300
  ngOnInit() {
2278
- this.subscription.addOne(fromEvent(this.el.nativeElement, 'click'), (event) => {
2301
+ this.subscription.addOne(fromEvent(this.el.nativeElement, 'click'), event => {
2279
2302
  event.stopPropagation();
2280
2303
  this.stopPropEvent.emit(event);
2281
2304
  });
@@ -2303,14 +2326,16 @@ class RoutesHandler {
2303
2326
  }
2304
2327
  addRoutes() {
2305
2328
  this.router?.config?.forEach(({ path = '', data }) => {
2306
- if (!data?.routes)
2307
- return;
2308
- if (Array.isArray(data.routes)) {
2309
- this.routes.add(data.routes);
2329
+ const routes = data?.routes;
2330
+ if (!routes)
2310
2331
  return;
2332
+ if (Array.isArray(routes)) {
2333
+ this.routes.add(routes);
2334
+ }
2335
+ else {
2336
+ const routesFlatten = flatRoutes([{ path, ...routes }], { path: '' });
2337
+ this.routes.add(routesFlatten);
2311
2338
  }
2312
- const routes = flatRoutes([{ path, ...data.routes }], { path: '' });
2313
- this.routes.add(routes);
2314
2339
  });
2315
2340
  }
2316
2341
  }
@@ -2483,7 +2508,10 @@ class LocaleId extends String {
2483
2508
  }
2484
2509
  toString() {
2485
2510
  const { currentLang } = this.localizationService;
2486
- return differentLocales[currentLang] || currentLang;
2511
+ if (checkHasProp(differentLocales, currentLang)) {
2512
+ return differentLocales[currentLang];
2513
+ }
2514
+ return currentLang;
2487
2515
  }
2488
2516
  valueOf() {
2489
2517
  return this.toString();
@@ -2518,7 +2546,7 @@ function getRemoteEnv(injector, environment) {
2518
2546
  httpErrorReporter.reportError(err);
2519
2547
  return of(null);
2520
2548
  }), // TODO: Consider get handle function from a provider
2521
- tap(env => environmentService.setState(mergeEnvironments(environment, env, remoteEnv))))
2549
+ tap(env => environmentService.setState(mergeEnvironments(environment, env || {}, remoteEnv))))
2522
2550
  .toPromise();
2523
2551
  }
2524
2552
  function mergeEnvironments(local, remote, config) {
@@ -2654,13 +2682,16 @@ function replaceTenantNameWithinEnvironment(injector, tenancyName, placeholder =
2654
2682
  if (environment.application.baseUrl) {
2655
2683
  environment.application.baseUrl = environment.application.baseUrl.replace(placeholder, tenancyName);
2656
2684
  }
2657
- if (environment.oAuthConfig.redirectUri) {
2685
+ if (environment.oAuthConfig?.redirectUri) {
2658
2686
  environment.oAuthConfig.redirectUri = environment.oAuthConfig.redirectUri.replace(placeholder, tenancyName);
2659
2687
  }
2660
- environment.oAuthConfig.issuer = environment.oAuthConfig.issuer.replace(placeholder, tenancyName);
2688
+ if (!environment.oAuthConfig) {
2689
+ environment.oAuthConfig = {};
2690
+ }
2691
+ environment.oAuthConfig.issuer = (environment.oAuthConfig.issuer || '').replace(placeholder, tenancyName);
2661
2692
  Object.keys(environment.apis).forEach(api => {
2662
2693
  Object.keys(environment.apis[api]).forEach(key => {
2663
- environment.apis[api][key] = environment.apis[api][key].replace(placeholder, tenancyName);
2694
+ environment.apis[api][key] = (environment.apis[api][key] || '').replace(placeholder, tenancyName);
2664
2695
  });
2665
2696
  });
2666
2697
  return environmentService.setState(environment);
@@ -2736,11 +2767,11 @@ function getShortDateFormat(configStateService) {
2736
2767
  }
2737
2768
  function getShortTimeFormat(configStateService) {
2738
2769
  const dateTimeFormat = configStateService.getDeep('localization.currentCulture.dateTimeFormat');
2739
- return dateTimeFormat.shortTimePattern.replace('tt', 'a');
2770
+ return dateTimeFormat?.shortTimePattern?.replace('tt', 'a');
2740
2771
  }
2741
2772
  function getShortDateShortTimeFormat(configStateService) {
2742
2773
  const dateTimeFormat = configStateService.getDeep('localization.currentCulture.dateTimeFormat');
2743
- return `${dateTimeFormat.shortDatePattern} ${dateTimeFormat.shortTimePattern.replace('tt', 'a')}`;
2774
+ return `${dateTimeFormat.shortDatePattern} ${dateTimeFormat?.shortTimePattern?.replace('tt', 'a')}`;
2744
2775
  }
2745
2776
 
2746
2777
  class LazyModuleFactory extends NgModuleFactory {
@@ -2753,7 +2784,7 @@ class LazyModuleFactory extends NgModuleFactory {
2753
2784
  }
2754
2785
  create(parentInjector) {
2755
2786
  const injector = Injector.create({
2756
- parent: parentInjector,
2787
+ ...(parentInjector && { parent: parentInjector }),
2757
2788
  providers: this.moduleWithProviders.providers,
2758
2789
  });
2759
2790
  const compiler = injector.get(Compiler);
@@ -2855,7 +2886,9 @@ class CrossOriginStrategy {
2855
2886
  setCrossOrigin(element) {
2856
2887
  if (this.integrity)
2857
2888
  element.setAttribute('integrity', this.integrity);
2858
- element.setAttribute('crossorigin', this.crossorigin);
2889
+ if (this.crossorigin) {
2890
+ element.setAttribute('crossorigin', this.crossorigin);
2891
+ }
2859
2892
  }
2860
2893
  }
2861
2894
  class NoCrossOriginStrategy extends CrossOriginStrategy {
@@ -2924,7 +2957,7 @@ function fromLazyLoad(element, domStrategy = DOM_STRATEGY.AppendToHead(), crossO
2924
2957
  function createErrorHandler(observer, element) {
2925
2958
  return function (event) {
2926
2959
  clearCallbacks(element);
2927
- element.parentNode.removeChild(element);
2960
+ element.parentNode?.removeChild(element);
2928
2961
  observer.error(event);
2929
2962
  };
2930
2963
  }
@@ -2991,9 +3024,11 @@ class DomInsertionService {
2991
3024
  return element;
2992
3025
  }
2993
3026
  removeContent(element) {
2994
- const hash = generateHash(element.textContent);
2995
- this.inserted.delete(hash);
2996
- element.parentNode.removeChild(element);
3027
+ if (element.textContent) {
3028
+ const hash = generateHash(element.textContent);
3029
+ this.inserted.delete(hash);
3030
+ element.parentNode?.removeChild(element);
3031
+ }
2997
3032
  }
2998
3033
  has(content) {
2999
3034
  const hash = generateHash(content);
@@ -3057,6 +3092,9 @@ class HttpWaitService {
3057
3092
  this.store.patch({ filteredRequests });
3058
3093
  }
3059
3094
  applyFilter(requests) {
3095
+ if (!requests) {
3096
+ return [];
3097
+ }
3060
3098
  const { filteredRequests } = this.store.state;
3061
3099
  return requests.filter(({ method, url }) => !filteredRequests.find(filteredRequest => this.isSameRequest(filteredRequest, { method, endpoint: getPathName(url) })));
3062
3100
  }
@@ -3085,7 +3123,7 @@ class ResourceWaitService {
3085
3123
  return this.store.sliceState(({ resources }) => !!resources.size);
3086
3124
  }
3087
3125
  updateLoading$() {
3088
- return this.store.sliceUpdate(({ resources }) => !!resources.size);
3126
+ return this.store.sliceUpdate(({ resources }) => !!resources?.size);
3089
3127
  }
3090
3128
  clearLoading() {
3091
3129
  this.store.patch({ resources: new Set() });
@@ -3119,7 +3157,9 @@ class LazyLoadService {
3119
3157
  if (this.loaded.has(strategy.path))
3120
3158
  return of(new CustomEvent('load'));
3121
3159
  this.resourceWaitService.addResource(strategy.path);
3122
- return strategy.createStream().pipe(retryWhen(error$ => concat(error$.pipe(delay(retryDelay), take(retryTimes)), throwError(new CustomEvent('error')))), tap(() => {
3160
+ const delayOperator = retryDelay ? pipe(delay(retryDelay)) : pipe();
3161
+ const takeOp = retryTimes ? pipe(take(retryTimes)) : pipe();
3162
+ return strategy.createStream().pipe(retryWhen(error$ => concat(error$.pipe(delayOperator, takeOp), throwError(() => new CustomEvent('error')))), tap(() => {
3123
3163
  this.loaded.set(strategy.path, strategy.element);
3124
3164
  this.resourceWaitService.deleteResource(strategy.path);
3125
3165
  }), delay(100), shareReplay({ bufferSize: 1, refCount: true }));
@@ -3128,7 +3168,7 @@ class LazyLoadService {
3128
3168
  const element = this.loaded.get(path);
3129
3169
  if (!element)
3130
3170
  return false;
3131
- element.parentNode.removeChild(element);
3171
+ element.parentNode?.removeChild(element);
3132
3172
  this.loaded.delete(path);
3133
3173
  return true;
3134
3174
  }
@@ -3658,7 +3698,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
3658
3698
  class ListResultDto {
3659
3699
  constructor(initialValues = {}) {
3660
3700
  for (const key in initialValues) {
3661
- if (Object.prototype.hasOwnProperty.call(initialValues, key)) {
3701
+ if (checkHasProp(initialValues, key)) {
3662
3702
  this[key] = initialValues[key];
3663
3703
  }
3664
3704
  }
@@ -3673,8 +3713,7 @@ class LimitedResultRequestDto {
3673
3713
  constructor(initialValues = {}) {
3674
3714
  this.maxResultCount = 10;
3675
3715
  for (const key in initialValues) {
3676
- if (Object.prototype.hasOwnProperty.call(initialValues, key) &&
3677
- initialValues[key] !== undefined) {
3716
+ if (checkHasProp(initialValues, key) && initialValues[key] !== undefined) {
3678
3717
  this[key] = initialValues[key];
3679
3718
  }
3680
3719
  }
@@ -3693,7 +3732,7 @@ class PagedAndSortedResultRequestDto extends PagedResultRequestDto {
3693
3732
  class EntityDto {
3694
3733
  constructor(initialValues = {}) {
3695
3734
  for (const key in initialValues) {
3696
- if (Object.prototype.hasOwnProperty.call(initialValues, key)) {
3735
+ if (checkHasProp(initialValues, key)) {
3697
3736
  this[key] = initialValues[key];
3698
3737
  }
3699
3738
  }
@@ -3732,7 +3771,7 @@ class FullAuditedEntityWithUserDto extends FullAuditedEntityDto {
3732
3771
  class ExtensibleObject {
3733
3772
  constructor(initialValues = {}) {
3734
3773
  for (const key in initialValues) {
3735
- if (Object.prototype.hasOwnProperty.call(initialValues, key)) {
3774
+ if (checkHasProp(initialValues, key)) {
3736
3775
  this[key] = initialValues[key];
3737
3776
  }
3738
3777
  }
@@ -3846,7 +3885,9 @@ class LooseContentSecurityStrategy extends ContentSecurityStrategy {
3846
3885
  super(nonce);
3847
3886
  }
3848
3887
  applyCSP(element) {
3849
- element.setAttribute('nonce', this.nonce);
3888
+ if (this.nonce) {
3889
+ element.setAttribute('nonce', this.nonce);
3890
+ }
3850
3891
  }
3851
3892
  }
3852
3893
  class NoContentSecurityStrategy extends ContentSecurityStrategy {
@@ -3874,7 +3915,11 @@ class ContentStrategy {
3874
3915
  insertElement() {
3875
3916
  const element = this.createElement();
3876
3917
  if (this.options && Object.keys(this.options).length > 0) {
3877
- Object.keys(this.options).forEach(key => (element[key] = this.options[key]));
3918
+ Object.keys(this.options).forEach(key => {
3919
+ if (this.options[key]) {
3920
+ element[key] = this.options[key];
3921
+ }
3922
+ });
3878
3923
  }
3879
3924
  this.contentSecurityStrategy.applyCSP(element);
3880
3925
  this.domStrategy.insertElement(element);
@@ -4080,8 +4125,13 @@ const NAVIGATE_TO_MANAGE_PROFILE = new InjectionToken('NAVIGATE_TO_MANAGE_PROFIL
4080
4125
 
4081
4126
  const PIPE_TO_LOGIN_FN_KEY = new InjectionToken('PIPE_TO_LOGIN_FN_KEY');
4082
4127
 
4128
+ /**
4129
+ * @deprecated The token should not be used anymore.
4130
+ */
4083
4131
  const SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY = new InjectionToken('SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY');
4084
4132
 
4133
+ const IS_EXTERNAL_REQUEST = new HttpContextToken(() => false);
4134
+
4085
4135
  function validateMinAge({ age = 18 } = {}) {
4086
4136
  return (control) => {
4087
4137
  if (['', null, undefined].indexOf(control.value) > -1)
@@ -4179,7 +4229,7 @@ function isValidUrl(value) {
4179
4229
  }
4180
4230
 
4181
4231
  const onlyLetterAndNumberRegex = /^[a-zA-Z0-9]+$/;
4182
- function validateUsername({ pattern } = { pattern: onlyLetterAndNumberRegex }) {
4232
+ function validateUsername({ pattern = /.*/ } = { pattern: onlyLetterAndNumberRegex }) {
4183
4233
  return (control) => {
4184
4234
  const isValid = isValidUserName(control.value, pattern);
4185
4235
  return isValid ? null : { usernamePattern: { actualValue: control.value } };
@@ -4207,7 +4257,7 @@ class ApiInterceptor {
4207
4257
  this.httpWaitService = httpWaitService;
4208
4258
  }
4209
4259
  getAdditionalHeaders(existingHeaders) {
4210
- return existingHeaders;
4260
+ return existingHeaders || new HttpHeaders();
4211
4261
  }
4212
4262
  intercept(request, next) {
4213
4263
  this.httpWaitService.addRequest(request);
@@ -4223,11 +4273,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
4223
4273
  }]
4224
4274
  }], ctorParameters: function () { return [{ type: HttpWaitService }]; } });
4225
4275
 
4276
+ var _ExternalHttpClient_instances, _ExternalHttpClient_setPlaceholderContext;
4277
+ // source : https://github.com/armanozak/demo-angular-server-specific-interceptors
4278
+ class ExternalHttpClient extends HttpClient {
4279
+ constructor() {
4280
+ super(...arguments);
4281
+ _ExternalHttpClient_instances.add(this);
4282
+ }
4283
+ request(first, url, options = {}) {
4284
+ if (typeof first === 'string') {
4285
+ __classPrivateFieldGet(this, _ExternalHttpClient_instances, "m", _ExternalHttpClient_setPlaceholderContext).call(this, options);
4286
+ return super.request(first, url || '', options);
4287
+ }
4288
+ __classPrivateFieldGet(this, _ExternalHttpClient_instances, "m", _ExternalHttpClient_setPlaceholderContext).call(this, first);
4289
+ return super.request(first);
4290
+ }
4291
+ }
4292
+ _ExternalHttpClient_instances = new WeakSet(), _ExternalHttpClient_setPlaceholderContext = function _ExternalHttpClient_setPlaceholderContext(optionsOrRequest) {
4293
+ optionsOrRequest.context ?? (optionsOrRequest.context = new HttpContext());
4294
+ optionsOrRequest.context.set(IS_EXTERNAL_REQUEST, true);
4295
+ };
4296
+ ExternalHttpClient.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ExternalHttpClient, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
4297
+ ExternalHttpClient.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ExternalHttpClient, providedIn: 'root' });
4298
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ExternalHttpClient, decorators: [{
4299
+ type: Injectable,
4300
+ args: [{
4301
+ providedIn: 'root',
4302
+ }]
4303
+ }] });
4304
+
4226
4305
  // export * from './lib/handlers';
4227
4306
 
4228
4307
  /**
4229
4308
  * Generated bundle index. Do not edit.
4230
4309
  */
4231
4310
 
4232
- export { APP_INIT_ERROR_HANDLERS, AbpApiDefinitionService, AbpApplicationConfigurationService, AbpApplicationLocalizationService, AbpTenantService, AbpValidators, AbstractNavTreeService, AbstractNgModelComponent, AbstractTreeService, ApiInterceptor, AuditedEntityDto, AuditedEntityWithUserDto, AuthGuard, AuthService, AutofocusDirective, BaseCoreModule, BaseTreeNode, CHECK_AUTHENTICATION_STATE_FN_KEY, CONTAINER_STRATEGY, CONTENT_SECURITY_STRATEGY, CONTENT_STRATEGY, CONTEXT_STRATEGY, COOKIE_LANGUAGE_KEY, CORE_OPTIONS, CROSS_ORIGIN_STRATEGY, ClearContainerStrategy, ComponentContextStrategy, ComponentProjectionStrategy, ConfigStateService, ContainerStrategy, ContentProjectionService, ContentSecurityStrategy, ContentStrategy, ContextStrategy, CoreModule, CreationAuditedEntityDto, CreationAuditedEntityWithUserDto, CrossOriginStrategy, DOM_STRATEGY, DefaultQueueManager, DomInsertionService, DomStrategy, DynamicLayoutComponent, EntityDto, EnvironmentService, ExtensibleAuditedEntityDto, ExtensibleAuditedEntityWithUserDto, ExtensibleCreationAuditedEntityDto, ExtensibleCreationAuditedEntityWithUserDto, ExtensibleEntityDto, ExtensibleFullAuditedEntityDto, ExtensibleFullAuditedEntityWithUserDto, ExtensibleObject, ForDirective, FormSubmitDirective, FullAuditedEntityDto, FullAuditedEntityWithUserDto, HttpErrorReporterService, HttpWaitService, INCUDE_LOCALIZATION_RESOURCES_TOKEN, INJECTOR_PIPE_DATA_TOKEN, InitDirective, InputEventDebounceDirective, InsertIntoContainerStrategy, InternalStore, LIST_QUERY_DEBOUNCE_TIME, LOADER_DELAY, LOADING_STRATEGY, LOCALIZATIONS, LazyLoadService, LazyModuleFactory, LimitedResultRequestDto, ListResultDto, ListService, LoadingStrategy, LocalizationModule, LocalizationPipe, LocalizationService, LooseContentSecurityStrategy, MultiTenancyService, NAVIGATE_TO_MANAGE_PROFILE, NavigationEvent, NoContentSecurityStrategy, NoContextStrategy, NoCrossOriginStrategy, index as ObjectExtending, PIPE_TO_LOGIN_FN_KEY, PROJECTION_STRATEGY, PagedAndSortedResultRequestDto, PagedResultDto, PagedResultRequestDto, PermissionDirective, PermissionGuard, PermissionService, ProjectionStrategy, QUEUE_MANAGER, ReplaceableComponentsService, ReplaceableRouteContainerComponent, ReplaceableTemplateDirective, ResourceWaitService, RestService, RootComponentProjectionStrategy, RootCoreModule, RouterEvents, RouterOutletComponent, RouterWaitService, RoutesService, SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY, ScriptContentStrategy, ScriptLoadingStrategy, SessionStateService, ShortDatePipe, ShortDateTimePipe, ShortTimePipe, SortPipe, StopPropagationDirective, StyleContentStrategy, StyleLoadingStrategy, SubscriptionService, TENANT_KEY, TemplateContextStrategy, TemplateProjectionStrategy, ToInjectorPipe, TrackByService, WebHttpUrlEncodingCodec, coreOptionsFactory, createLocalizationPipeKeyGenerator, createLocalizer, createLocalizerWithFallback, createMapFromList, createTokenParser, createTreeFromList, createTreeNodeFilterCreator, deepMerge, differentLocales, downloadBlob, escapeHtmlChars, exists, featuresFactory, findRoute, fromLazyLoad, generateHash, generatePassword, getInitialData, getLocaleDirection, getPathName, getRemoteEnv, getRoutePath, getShortDateFormat, getShortDateShortTimeFormat, getShortTimeFormat, interpolate, isArray, isNode, isNullOrEmpty, isNullOrUndefined, isNumber, isObject, isObjectAndNotArray, isObjectAndNotArrayNotNode, isUndefinedOrEmptyString, localeInitializer, localizationContributor, localizations$, mapEnumToOptions, noop, parseTenantFromUrl, pushValueTo, reloadRoute, trackBy, trackByDeep, uuid, validateCreditCard, validateMinAge, validateRange, validateRequired, validateStringLength, validateUrl };
4311
+ export { APP_INIT_ERROR_HANDLERS, AbpApiDefinitionService, AbpApplicationConfigurationService, AbpApplicationLocalizationService, AbpTenantService, AbpValidators, AbstractNavTreeService, AbstractNgModelComponent, AbstractTreeService, ApiInterceptor, AuditedEntityDto, AuditedEntityWithUserDto, AuthGuard, AuthService, AutofocusDirective, BaseCoreModule, BaseTreeNode, CHECK_AUTHENTICATION_STATE_FN_KEY, CONTAINER_STRATEGY, CONTENT_SECURITY_STRATEGY, CONTENT_STRATEGY, CONTEXT_STRATEGY, COOKIE_LANGUAGE_KEY, CORE_OPTIONS, CROSS_ORIGIN_STRATEGY, ClearContainerStrategy, ComponentContextStrategy, ComponentProjectionStrategy, ConfigStateService, ContainerStrategy, ContentProjectionService, ContentSecurityStrategy, ContentStrategy, ContextStrategy, CoreModule, CreationAuditedEntityDto, CreationAuditedEntityWithUserDto, CrossOriginStrategy, DOM_STRATEGY, DefaultQueueManager, DomInsertionService, DomStrategy, DynamicLayoutComponent, EntityDto, EnvironmentService, ExtensibleAuditedEntityDto, ExtensibleAuditedEntityWithUserDto, ExtensibleCreationAuditedEntityDto, ExtensibleCreationAuditedEntityWithUserDto, ExtensibleEntityDto, ExtensibleFullAuditedEntityDto, ExtensibleFullAuditedEntityWithUserDto, ExtensibleObject, ExternalHttpClient, ForDirective, FormSubmitDirective, FullAuditedEntityDto, FullAuditedEntityWithUserDto, HttpErrorReporterService, HttpWaitService, INCUDE_LOCALIZATION_RESOURCES_TOKEN, INJECTOR_PIPE_DATA_TOKEN, IS_EXTERNAL_REQUEST, InitDirective, InputEventDebounceDirective, InsertIntoContainerStrategy, InternalStore, LIST_QUERY_DEBOUNCE_TIME, LOADER_DELAY, LOADING_STRATEGY, LOCALIZATIONS, LazyLoadService, LazyModuleFactory, LimitedResultRequestDto, ListResultDto, ListService, LoadingStrategy, LocalizationModule, LocalizationPipe, LocalizationService, LooseContentSecurityStrategy, MultiTenancyService, NAVIGATE_TO_MANAGE_PROFILE, NavigationEvent, NoContentSecurityStrategy, NoContextStrategy, NoCrossOriginStrategy, index as ObjectExtending, PIPE_TO_LOGIN_FN_KEY, PROJECTION_STRATEGY, PagedAndSortedResultRequestDto, PagedResultDto, PagedResultRequestDto, PermissionDirective, PermissionGuard, PermissionService, ProjectionStrategy, QUEUE_MANAGER, ReplaceableComponentsService, ReplaceableRouteContainerComponent, ReplaceableTemplateDirective, ResourceWaitService, RestService, RootComponentProjectionStrategy, RootCoreModule, RouterEvents, RouterOutletComponent, RouterWaitService, RoutesService, SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY, ScriptContentStrategy, ScriptLoadingStrategy, SessionStateService, ShortDatePipe, ShortDateTimePipe, ShortTimePipe, SortPipe, StopPropagationDirective, StyleContentStrategy, StyleLoadingStrategy, SubscriptionService, TENANT_KEY, TemplateContextStrategy, TemplateProjectionStrategy, ToInjectorPipe, TrackByService, WebHttpUrlEncodingCodec, checkHasProp, coreOptionsFactory, createLocalizationPipeKeyGenerator, createLocalizer, createLocalizerWithFallback, createMapFromList, createTokenParser, createTreeFromList, createTreeNodeFilterCreator, deepMerge, differentLocales, downloadBlob, escapeHtmlChars, exists, featuresFactory, findRoute, fromLazyLoad, generateHash, generatePassword, getInitialData, getLocaleDirection, getPathName, getRemoteEnv, getRoutePath, getShortDateFormat, getShortDateShortTimeFormat, getShortTimeFormat, interpolate, isArray, isNode, isNullOrEmpty, isNullOrUndefined, isNumber, isObject, isObjectAndNotArray, isObjectAndNotArrayNotNode, isUndefinedOrEmptyString, localeInitializer, localizationContributor, localizations$, mapEnumToOptions, noop, parseTenantFromUrl, pushValueTo, reloadRoute, trackBy, trackByDeep, uuid, validateCreditCard, validateMinAge, validateRange, validateRequired, validateStringLength, validateUrl };
4233
4312
  //# sourceMappingURL=abp-ng.core.mjs.map