@arsedizioni/ars-utils 22.5.52 → 22.5.54

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 (41) hide show
  1. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +15 -15
  2. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +42 -42
  3. package/fesm2022/arsedizioni-ars-utils-core.date.mjs +9 -9
  4. package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs +3 -3
  5. package/fesm2022/arsedizioni-ars-utils-core.mjs +48 -48
  6. package/fesm2022/arsedizioni-ars-utils-core.validators.mjs +42 -42
  7. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +162 -44
  8. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
  9. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +18 -9
  10. package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
  11. package/fesm2022/arsedizioni-ars-utils-ui.controls.date.mjs +6 -6
  12. package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs +9 -9
  13. package/fesm2022/arsedizioni-ars-utils-ui.controls.tree.mjs +3 -3
  14. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +18 -18
  15. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs +12 -12
  16. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs +9 -9
  17. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs +15 -15
  18. package/fesm2022/arsedizioni-ars-utils-ui.files.mjs +12 -12
  19. package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs +3 -3
  20. package/fesm2022/arsedizioni-ars-utils-ui.help.mjs +9 -9
  21. package/fesm2022/arsedizioni-ars-utils-ui.mjs +61 -61
  22. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs +3 -3
  23. package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs +6 -6
  24. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +6 -6
  25. package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs +3 -3
  26. package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs +9 -9
  27. package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs +9 -9
  28. package/package.json +1 -1
  29. package/types/arsedizioni-ars-utils-clipper.common.d.ts +5 -5
  30. package/types/arsedizioni-ars-utils-clipper.ui.d.ts +1 -1
  31. package/types/arsedizioni-ars-utils-core.d.ts +5 -5
  32. package/types/arsedizioni-ars-utils-core.date.d.ts +3 -3
  33. package/types/arsedizioni-ars-utils-evolution.common.d.ts +41 -11
  34. package/types/arsedizioni-ars-utils-support.common.d.ts +11 -2
  35. package/types/arsedizioni-ars-utils-ui.d.ts +2 -2
  36. package/types/arsedizioni-ars-utils-ui.dialogs.d.ts +1 -1
  37. package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts +1 -1
  38. package/types/arsedizioni-ars-utils-ui.help.d.ts +2 -2
  39. package/types/arsedizioni-ars-utils-ui.paginator.d.ts +1 -1
  40. package/types/arsedizioni-ars-utils-ui.shell.d.ts +1 -1
  41. package/types/arsedizioni-ars-utils-ui.tinymce.d.ts +1 -1
@@ -2,13 +2,29 @@ import { HttpResponse, HttpClient } from '@angular/common/http';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, signal, Service, DestroyRef } from '@angular/core';
4
4
  import { BroadcastService, SystemUtils } from '@arsedizioni/ars-utils/core';
5
- import { tap, catchError, throwError, EMPTY, of } from 'rxjs';
5
+ import { retry, timer, throwError, tap, catchError, EMPTY, of } from 'rxjs';
6
6
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import { catchError as catchError$1, map, finalize } from 'rxjs/operators';
8
8
 
9
9
  const EvolutionMessages = {
10
10
  // Error
11
11
  ERROR: '§evo-error',
12
+ /**
13
+ * The session is gone: a 401 on a request that was not a sign-in attempt.
14
+ * Emitted once per dead session by `evolutionAuthInterceptor`, which re-arms on the first
15
+ * good response. The twin of `ClipperMessages.ERROR_401`.
16
+ */
17
+ ERROR_401: '§evo-error-401',
18
+ /**
19
+ * The API is not answering: the interceptor has already sent the request three times over ten
20
+ * seconds and none of them got an answer carrying an `ApiResult` envelope. Emitted once per
21
+ * outage, however many requests were in flight, and re-armed on the first good response.
22
+ *
23
+ * Deliberately not an `ERROR`: a server being replaced is neither a failed operation to report
24
+ * in a dialog nor an expired session to sign out of, and the host application usually answers it
25
+ * with a banner that clears itself.
26
+ */
27
+ ERROR_UNAVAILABLE: '§evo-error-unavailable',
12
28
  SUCCESS: '§evo-success',
13
29
  SUCCESS_TOAST: '§evo-success-toast',
14
30
  // Login
@@ -492,8 +508,61 @@ var ERPPlace;
492
508
  class EvolutionComplianceContextInfo {
493
509
  }
494
510
 
511
+ /**
512
+ * HTML text helpers with no dependencies of their own.
513
+ *
514
+ * Not exported from `public_api`: it is an internal detail of this entry point, the twin of the one
515
+ * in `clipper.common`. The two entry points are independent, so neither imports the other's copy.
516
+ */
517
+ function escapeHtml(value) {
518
+ if (value === undefined || value === null)
519
+ return undefined;
520
+ return String(value)
521
+ .replaceAll('&', '&')
522
+ .replaceAll('<', '&lt;')
523
+ .replaceAll('>', '&gt;')
524
+ .replaceAll('"', '&quot;')
525
+ .replaceAll("'", "&#39;");
526
+ }
527
+
495
528
  /** Minimum milliseconds between consecutive generic error broadcasts (debounce guard). */
496
529
  const ERROR_DEBOUNCE_MS = 5000;
530
+ /** How many more times a request is sent when the API is not there. */
531
+ const UNAVAILABLE_RETRIES = 2;
532
+ /** How long to wait before each of those retries, in milliseconds. */
533
+ const UNAVAILABLE_RETRY_DELAY = 5000;
534
+ /** The statuses a server that is being replaced answers with, plus the one it cannot answer at all. */
535
+ const UNAVAILABLE_STATUSES = [0, 500, 502, 503, 504];
536
+ /**
537
+ * Returns whether the failure means the API is not there, rather than the request being wrong.
538
+ *
539
+ * The discriminator is the body, not the status. An error raised INSIDE the application arrives
540
+ * wrapped in the usual `ApiResult` envelope, so it has been seen, parsed and acted upon: replaying
541
+ * it would run whatever it already ran a second time. A server that is being replaced answers with
542
+ * IIS's own HTML, or with nothing at all — no envelope — and that request never reached any
543
+ * handler. Only the second kind is retried, which is what makes it safe to retry a POST.
544
+ * @param error - The raw HTTP error object.
545
+ * @returns True when the request is worth sending again.
546
+ */
547
+ function isServiceUnavailable(error) {
548
+ if (!UNAVAILABLE_STATUSES.includes(parseInt(error?.status ?? '0')))
549
+ return false;
550
+ const body = error?.error;
551
+ const isApiEnvelope = !!body
552
+ && typeof body === 'object'
553
+ && !(body instanceof Blob)
554
+ && ('success' in body || 'problem' in body);
555
+ return !isApiEnvelope;
556
+ }
557
+ /**
558
+ * Returns whether the failure means the session is gone rather than the request being wrong.
559
+ * @param errorStatus - The numeric HTTP status code.
560
+ * @param url - The request URL.
561
+ * @returns True when the link to Evolution has to be dropped.
562
+ */
563
+ function isSessionExpired(errorStatus, url) {
564
+ return errorStatus === 401 && !isAuthEndpoint(url);
565
+ }
497
566
  /**
498
567
  * Returns whether the URL is an authentication endpoint, where a 401 is a normal outcome -- wrong
499
568
  * credentials, a rejected code, a refused passkey -- rather than an expired or invalid session.
@@ -521,8 +590,8 @@ function isAuthEndpoint(url) {
521
590
  *
522
591
  * `/session/status` runs unconditionally at every bootstrap, including for users who never linked
523
592
  * Evolution at all. When the API is unreachable, reporting that failure would show "Evolution non è
524
- * disponibile" to somebody who never asked Evolution for anything: the error is still rethrown for
525
- * the caller to observe, but nothing is broadcast.
593
+ * disponibile" to somebody who never asked Evolution for anything: the probe simply stays unanswered
594
+ * and the link state keeps whatever the stored hint says.
526
595
  * @param url - The request URL.
527
596
  * @returns True when the URL is the status probe.
528
597
  */
@@ -531,15 +600,23 @@ function isStatusProbe(url) {
531
600
  }
532
601
  /**
533
602
  * Resolves the user-facing message for a failed request.
603
+ *
604
+ * There is no branch for status 0 any more, nor for the 5xx family: a request that got no answer,
605
+ * or an answer with no `ApiResult` envelope, never reaches here — it is retried and then reported
606
+ * as `ERROR_UNAVAILABLE`. What is left is the failures the API itself described.
607
+ *
608
+ * Whatever the API sends is escaped before anything else happens to it. The dialog that shows this
609
+ * string binds it with `[innerHTML]` through a pipe that calls `bypassSecurityTrustHtml`, so an
610
+ * error message echoing back something a user had typed would be rendered as markup rather than
611
+ * read as text. The paragraph breaks in the default branch are applied AFTER the escape, which is
612
+ * exactly why they survive it and nothing else does.
534
613
  * @param error - The raw HTTP error object.
535
614
  * @param errorStatus - The numeric HTTP status code.
536
- * @returns A localised message, ready to be rendered as HTML.
615
+ * @returns A localised message, safe to render as HTML.
537
616
  */
538
617
  function resolveErrorMessage(error, errorStatus) {
539
- const message = error?.error?.message ?? error?.message;
618
+ const message = escapeHtml(error?.error?.message ?? error?.message);
540
619
  switch (errorStatus) {
541
- case 0:
542
- return "In questo momento Evolution non è disponibile. Riprova tra qualche minuto.";
543
620
  case 401:
544
621
  // A 401 that reaches here comes from a sign-in attempt; anything else was classified as a
545
622
  // dead session before this function was called.
@@ -571,15 +648,29 @@ function resolveErrorMessage(error, errorStatus) {
571
648
  * failures used to arrive as `200 OK` with `success: false`, and a dead session had to be guessed
572
649
  * from a 405, a 410 or any 5xx. Now the status is the truth -- a 401 on an already-authenticated
573
650
  * request means the session is gone, a 403 means the permission is missing, a 5xx means the server
574
- * broke, and those are three different things that used to be one. `invalidateSession` is
575
- * therefore now, and only, a 401 outside the authentication endpoints.
651
+ * broke, and those are three different things that used to be one.
576
652
  *
577
- * `EvolutionServiceFlags.NotifySystemErrors` still governs one narrow case, and only that one: a
578
- * 5xx, i.e. a failure of the server rather than of the request. Without the flag it is swallowed,
579
- * as it always was in this library.
653
+ * A dead session is broadcast as `EvolutionMessages.ERROR_401`, for the host application to handle
654
+ * centrally; every other failure stays an `EvolutionMessages.ERROR` carrying a message. The two are
655
+ * separate because they call for opposite things: one drops the link, the other shows a dialog and
656
+ * leaves the user where they are. It used to be an `ERROR` flagged `invalidateSession`, with a
657
+ * message of its own; `invalidateSession` is now always false.
580
658
  *
581
- * Errors are re-thrown rather than swallowed: call sites rely on their `error` callback firing, and
582
- * on `finalize` clearing a busy dialog.
659
+ * Between them sits a third case, which is neither: the API is being replaced. A deployment answers
660
+ * with a 5xx that has no `ApiResult` envelope, or does not answer at all, for the few seconds the
661
+ * process takes to come back. That is not worth a dialog and not worth a redirect either, so the
662
+ * request is simply sent again — twice, five seconds apart — and only if the third attempt fails
663
+ * too does it become `EvolutionMessages.ERROR_UNAVAILABLE`, once per outage.
664
+ *
665
+ * `EvolutionServiceFlags.NotifySystemErrors` therefore now governs one narrower case: a 5xx that
666
+ * DOES carry an envelope, i.e. a server error the API itself described. Without the flag it is
667
+ * swallowed, as it always was in this library.
668
+ *
669
+ * Errors are consumed, not re-thrown, exactly as `clipperAuthInterceptor` does: every failure is
670
+ * reported on the bus, and a subscriber to a failing request simply completes without emitting. A
671
+ * caller that must know how a request ended reads `ApiResult.success`; a busy dialog is cleared by
672
+ * `finalize`, which runs on completion as it ran on error. An `error` callback no longer fires for
673
+ * an HTTP failure.
583
674
  *
584
675
  * Register it with `withInterceptors`:
585
676
  * @example
@@ -600,6 +691,11 @@ function evolutionAuthInterceptor(serviceUri, flags = EvolutionServiceFlags.None
600
691
  * several in-flight requests fail at once; re-armed on the next successful response.
601
692
  */
602
693
  let sessionExpiredNotified = false;
694
+ /**
695
+ * Whether the unavailable-API notification has already been sent. A deployment fails every
696
+ * request in flight, and one notification is enough. Re-armed on the next successful response.
697
+ */
698
+ let unavailableNotified = false;
603
699
  /**
604
700
  * Broadcasts a generic, user-facing error for an Evolution HTTP failure, debounced.
605
701
  * @param error - The raw error value thrown by the HTTP layer.
@@ -608,7 +704,7 @@ function evolutionAuthInterceptor(serviceUri, flags = EvolutionServiceFlags.None
608
704
  * @returns void
609
705
  */
610
706
  function notifyError(error, errorStatus, broadcastService) {
611
- // A broken server is the one case the flag still governs.
707
+ // A 5xx the API described itself is the one case the flag still governs.
612
708
  if (errorStatus >= 500 && (flags & EvolutionServiceFlags.NotifySystemErrors) === 0)
613
709
  return;
614
710
  const now = Date.now();
@@ -643,10 +739,20 @@ function evolutionAuthInterceptor(serviceUri, flags = EvolutionServiceFlags.None
643
739
  'X-Evo-Account': sessionStorage.getItem(EVOLUTION_ACTIVE_ACCOUNT_KEY) ?? ''
644
740
  }
645
741
  });
646
- return next(authenticatedRequest).pipe(tap(event => {
647
- // A response means the session is valid again: re-arm the expiry notifier.
742
+ return next(authenticatedRequest).pipe(
743
+ // An API that is being replaced is not an error to show, it is a wait: two more attempts,
744
+ // five seconds apart. Anything else is rethrown on the spot, so a request that genuinely
745
+ // failed still fails immediately.
746
+ retry({
747
+ count: UNAVAILABLE_RETRIES,
748
+ delay: error => isServiceUnavailable(error)
749
+ ? timer(UNAVAILABLE_RETRY_DELAY)
750
+ : throwError(() => error)
751
+ }), tap(event => {
752
+ // A response means the session is valid again, and the API is back: re-arm both notifiers.
648
753
  if (event instanceof HttpResponse) {
649
754
  sessionExpiredNotified = false;
755
+ unavailableNotified = false;
650
756
  }
651
757
  }), catchError((error) => {
652
758
  // Which request this was is read from the request, not from `error.url`: a failure with no
@@ -655,27 +761,36 @@ function evolutionAuthInterceptor(serviceUri, flags = EvolutionServiceFlags.None
655
761
  // before the pipe was built.
656
762
  const errorStatus = parseInt(error?.status ?? '0');
657
763
  if (isStatusProbe(authenticatedRequest.url)) {
658
- // The silent probe stays silent: its caller reads the outcome from the rethrown error,
659
- // nobody else needs to hear about it.
764
+ // The silent probe stays silent: its caller reads the outcome from the stream, nobody
765
+ // else needs to hear about it.
660
766
  }
661
- else if (errorStatus === 401 && !isAuthEndpoint(authenticatedRequest.url)) {
767
+ else if (isServiceUnavailable(error)) {
768
+ // Three attempts over ten seconds and the API is still not answering. There is nothing
769
+ // left to retry, so the host application is told once, however many requests were in
770
+ // flight. Reported whatever the flags say: `NotifySystemErrors` governs a 5xx the API
771
+ // described itself, and a server that never answered described nothing.
772
+ if (!unavailableNotified) {
773
+ unavailableNotified = true;
774
+ broadcastService.sendMessage(EvolutionMessages.ERROR_UNAVAILABLE);
775
+ }
776
+ }
777
+ else if (isSessionExpired(errorStatus, authenticatedRequest.url)) {
662
778
  // Expired or invalidated session on an authenticated request. Notified once: several
663
779
  // in-flight requests failing together is how a single expiry becomes a wall of dialogs.
664
780
  if (!sessionExpiredNotified) {
665
781
  sessionExpiredNotified = true;
666
- broadcastService.sendMessage(EvolutionMessages.ERROR, {
667
- invalidateSession: true,
668
- message: "La sessione di lavoro non è più valida.",
669
- title: "Errore in Evolution",
670
- errorStatus,
671
- service: serviceUri
672
- });
782
+ broadcastService.sendMessage(EvolutionMessages.ERROR_401);
673
783
  }
674
784
  }
675
785
  else {
786
+ // Any other failure, including a 401 from a sign-in attempt.
676
787
  notifyError(error, errorStatus, broadcastService);
677
788
  }
678
- return throwError(() => error);
789
+ // Consumed, not rethrown — as in `clipperAuthInterceptor`. The failure has been reported on
790
+ // the bus, and rethrowing it a second time only gave every subscriber its own chance to
791
+ // report it again: a wrong password used to end in two dialogs, the second one saying
792
+ // "Evolution non disponibile".
793
+ return EMPTY;
679
794
  }));
680
795
  };
681
796
  }
@@ -851,10 +966,10 @@ class CoreService {
851
966
  sessionStorage.removeItem('evolution_client_id');
852
967
  this.reset();
853
968
  }
854
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CoreService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
855
- static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.5", ngImport: i0, type: CoreService }); }
969
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CoreService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
970
+ static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.6", ngImport: i0, type: CoreService }); }
856
971
  }
857
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CoreService, decorators: [{
972
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CoreService, decorators: [{
858
973
  type: Service
859
974
  }] });
860
975
 
@@ -996,7 +1111,10 @@ class LoginService {
996
1111
  this.logout().subscribe(r => {
997
1112
  if (!r.success) {
998
1113
  if (r.message) {
999
- this.broadcastService.sendMessage(EvolutionMessages.ERROR, { message: "<p>" + r.message + "</p><br><br><hr><p class='small'><i>Per eliminare la configurazione di Evolution accedere a:<br><b>menu > personalizza > collegamenti</b></i></p>" });
1114
+ this.broadcastService.sendMessage(EvolutionMessages.ERROR,
1115
+ // The surrounding markup is ours; the server's message is escaped, because the dialog
1116
+ // renders this string as HTML.
1117
+ { message: "<p>" + escapeHtml(r.message) + "</p><br><br><hr><p class='small'><i>Per eliminare la configurazione di Evolution accedere a:<br><b>menu > personalizza > collegamenti</b></i></p>" });
1000
1118
  }
1001
1119
  }
1002
1120
  else if ((this.core.flags & EvolutionServiceFlags.DisplayConnectionStateMessages) > 0) {
@@ -1219,10 +1337,10 @@ class LoginService {
1219
1337
  this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
1220
1338
  }
1221
1339
  }
1222
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: LoginService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1223
- static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.5", ngImport: i0, type: LoginService }); }
1340
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: LoginService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1341
+ static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.6", ngImport: i0, type: LoginService }); }
1224
1342
  }
1225
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: LoginService, decorators: [{
1343
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: LoginService, decorators: [{
1226
1344
  type: Service
1227
1345
  }] });
1228
1346
 
@@ -1310,10 +1428,10 @@ class ComplianceService {
1310
1428
  addActivities(params) {
1311
1429
  return this.httpClient.post(this.core.serviceUri + '/compliance/activities/add', params);
1312
1430
  }
1313
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ComplianceService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1314
- static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.5", ngImport: i0, type: ComplianceService }); }
1431
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ComplianceService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1432
+ static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.6", ngImport: i0, type: ComplianceService }); }
1315
1433
  }
1316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ComplianceService, decorators: [{
1434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ComplianceService, decorators: [{
1317
1435
  type: Service
1318
1436
  }] });
1319
1437
 
@@ -1383,10 +1501,10 @@ class AccountService {
1383
1501
  refreshLicence() {
1384
1502
  return this.httpClient.get(this.core.serviceUri + '/account/licenses/refresh/' + (this.core.user?.userId ?? -1));
1385
1503
  }
1386
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AccountService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1387
- static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.5", ngImport: i0, type: AccountService }); }
1504
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AccountService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1505
+ static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.6", ngImport: i0, type: AccountService }); }
1388
1506
  }
1389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AccountService, decorators: [{
1507
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AccountService, decorators: [{
1390
1508
  type: Service
1391
1509
  }] });
1392
1510
 
@@ -1460,10 +1578,10 @@ class EvolutionService {
1460
1578
  * @returns void
1461
1579
  */
1462
1580
  ping() { this.session.ping(); }
1463
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EvolutionService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1464
- static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.5", ngImport: i0, type: EvolutionService }); }
1581
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: EvolutionService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
1582
+ static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.6", ngImport: i0, type: EvolutionService }); }
1465
1583
  }
1466
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EvolutionService, decorators: [{
1584
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: EvolutionService, decorators: [{
1467
1585
  type: Service
1468
1586
  }] });
1469
1587