@scania-nl/tegel-angular-extensions 0.0.7 → 0.0.8

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.
@@ -1,5 +1,6 @@
1
1
  import { inject, Injectable, InjectionToken, makeEnvironmentProviders, provideAppInitializer, } from '@angular/core';
2
- import { catchError, defer, firstValueFrom, from, map, of, switchMap, tap, } from 'rxjs';
2
+ import { catchError, defer, firstValueFrom, from, map, of, switchMap, tap, throwError, } from 'rxjs';
3
+ import { fromFetch } from 'rxjs/fetch';
3
4
  import { parseEnvFile } from '../core/parse-env-file';
4
5
  import * as i0 from "@angular/core";
5
6
  /**
@@ -62,13 +63,14 @@ export function provideRuntimeConfig(kit, staticEnv, { envPath = '/env/runtime.e
62
63
  * Returns an `Observable<ConfigShape>` and caches the final result.
63
64
  */
64
65
  load() {
65
- return defer(() => from(fetch(envPath).then((res) => {
66
+ return defer(() => fromFetch(envPath).pipe(switchMap((res) => {
66
67
  // Handle HTTP errors explicitly so they go through catchError
67
68
  if (!res.ok) {
68
- throw new Error(`Failed to load runtime config: ${res.status} ${res.statusText}`);
69
+ return throwError(() => new Error(`Failed to load runtime config: ${res.status} ${res.statusText}`));
69
70
  }
71
+ // Response.text() returns a Promise, which switchMap can handle
70
72
  return res.text();
71
- })).pipe(
73
+ }),
72
74
  // 1. SPA fallback guard (server returned HTML instead of .env)
73
75
  map((raw) => {
74
76
  const trimmed = raw.trim();
@@ -158,4 +160,4 @@ export function provideRuntimeConfig(kit, staticEnv, { envPath = '/env/runtime.e
158
160
  },
159
161
  ]);
160
162
  }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1ydW50aW1lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZW52L2FuZ3VsYXIvcHJvdmlkZS1ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBa0MsRUFBRSxDQUFDO0lBQzlELHNCQUFzQixHQUFHLEdBQUc7SUFDNUIsYUFBYTtJQUNiLEVBQUU7Q0FDSCxDQUFDO0FBa0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBSWxDLEdBQWlCLEVBQ2pCLFNBQThCLEVBQzlCLEVBQ0UsT0FBTyxHQUFHLGtCQUFrQixFQUM1QixLQUFLLEdBQUcsS0FBSyxFQUNiLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLEtBQUssTUFDNkIsRUFBRTtJQUt0QyxnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0lBRXpFOzs7T0FHRztJQUNILE1BQ00sb0JBQW9CO1FBQ3hCLGtEQUFrRDtRQUMxQyxNQUFNLENBQWE7UUFFM0I7OztXQUdHO1FBQ0gsSUFBSTtZQUNGLE9BQU8s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LE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRTtTQUNyRDtLQUNGLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlZmVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHogZnJvbSAnem9kJztcbmltcG9ydCB7IEVudktpdCwgU2NoZW1hT3V0cHV0LCBTdGF0aWNFbnZGcm9tIH0gZnJvbSAnLi4vY29yZS9lbnYtdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VFbnZGaWxlIH0gZnJvbSAnLi4vY29yZS9wYXJzZS1lbnYtZmlsZSc7XG5cbi8qKlxuICogQnVpbGRzIHN0eWxlZCBjb25zb2xlIGFyZ3VtZW50cyBmb3IgUnVudGltZUNvbmZpZyBsb2dzLlxuICpcbiAqIFRoZSByZXR1cm5lZCB0dXBsZSBjYW4gYmUgc3ByZWFkIGRpcmVjdGx5IGludG8gYGNvbnNvbGUubG9nYCxcbiAqIGFsbG93aW5nIHRoZSBicm93c2VyIHRvIHJlbmRlciBhIGNvbG9yZWQgYFtSdW50aW1lQ29uZmlnXWAgcHJlZml4XG4gKiB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjYWxsZXIgbG9jYXRpb24gaW4gRGV2VG9vbHMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zb2xlLmxvZyguLi5yY0FyZ3MoJ1J1bnRpbWUgb3ZlcnJpZGVzIGxvYWRlZC4nKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdGV4dCB0byBhcHBlbmQgYWZ0ZXIgdGhlIGNvbG9yZWQgcHJlZml4LlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBhcmd1bWVudHMgKGBbZm9ybWF0LCBzdHlsZSwgcmVzZXRdYCkgZm9yIGBjb25zb2xlLmxvZ2AuXG4gKi9cbmNvbnN0IHJjQXJncyA9IChtc2c6IHN0cmluZyk6IFBhcmFtZXRlcnM8dHlwZW9mIGNvbnNvbGUubG9nPiA9PiBbXG4gICclY1tSdW50aW1lQ29uZmlnXSVjICcgKyBtc2csXG4gICdjb2xvcjojMGNmOycsXG4gICcnLFxuXTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgQW5ndWxhciBydW50aW1lLWNvbmZpZyBwcm92aWRlci5cbiAqXG4gKiBAcHJvcGVydHkgZW52UGF0aFxuICogVGhlIFVSTCAob3IgcGF0aCkgdG8gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgdGhhdCB3aWxsIGJlIGZldGNoZWQgYXQgYXBwIHN0YXJ0LlxuICogRGVmYXVsdHMgdG8gYFwiL2Vudi9ydW50aW1lLmVudlwiYC5cbiAqXG4gKiBAcHJvcGVydHkgZGVidWdcbiAqIEVuYWJsZXMgdmVyYm9zZSBjb25zb2xlIGxvZ2dpbmcgd2hlbiBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKlxuICogQHByb3BlcnR5IHN0b3BPbkVycm9yXG4gKiBJZiBgdHJ1ZWAsIGFueSBmYWlsdXJlIHdoaWxlIGxvYWRpbmcvcGFyc2luZy92YWxpZGF0aW5nIHRoZSBydW50aW1lIGNvbmZpZ1xuICogd2lsbCByZWplY3QgdGhlIGFwcCBpbml0aWFsaXplciBhbmQgKiphYm9ydCBib290KiogKHJlY29tbWVuZGVkIGZvciBwcm9kKS5cbiAqIElmIGBmYWxzZWAsIHRoZSBwcm92aWRlciBmYWxscyBiYWNrIHRvIHRoZSBzdGF0aWMgZW52aXJvbm1lbnQgb25seS5cbiAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqXG4gKiBAcHJvcGVydHkgdG9rZW5cbiAqIE9wdGlvbmFsIGBJbmplY3Rpb25Ub2tlbmAgdXNlZCB0byBleHBvc2UgdGhlIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uXG4gKiB2aWEgQW5ndWxhciBkZXBlbmRlbmN5IGluamVjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHByb3ZpZGVyIHdpbGwgY3JlYXRlIG9uZVxuICogYXV0b21hdGljYWxseSBuYW1lZCBgRU5WX0NPTkZJR2AuXG4gKi9cbmludGVyZmFjZSBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnM8UyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+PiB7XG4gIC8qKiBQYXRoIHRvIHRoZSBydW50aW1lIGVudiBmaWxlIChkZWZhdWx0OiAvZW52L3J1bnRpbWUuZW52KSAqL1xuICBlbnZQYXRoPzogc3RyaW5nO1xuICAvKiogTG9nIGRlYnVnIGluZm8gdG8gY29uc29sZSAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIC8qKiBUaHJvdyBvbiBlcnJvciB0byBzdG9wIGFwcCBib290IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIHZpYSBBbmd1bGFyIERJICovXG4gIHRva2VuPzogSW5qZWN0aW9uVG9rZW48U2NoZW1hT3V0cHV0PFM+Pjtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgcHJvdmlkZXJzIHRoYXQ6XG4gKiAtIEZldGNoIGEgcnVudGltZSBgLmVudmAgZmlsZSBhdCBzdGFydHVwLFxuICogLSBQYXJzZSBpdCB0byBhIGRlZXAtcGFydGlhbCBzdHJ1Y3R1cmUgdmlhIHRoZSBraXQsXG4gKiAtIEVuZm9yY2UgcnVudGltZS1yZXF1aXJlZCBrZXlzIHdoZW4gYXBwcm9wcmlhdGUsXG4gKiAtIE1lcmdlIHdpdGggdGhlIHN0YXRpYyBlbnZpcm9ubWVudCxcbiAqIC0gVmFsaWRhdGUgdGhlICoqZmluYWwqKiBjb25maWd1cmF0aW9uIGFnYWluc3QgdGhlIFpvZCBzY2hlbWEsXG4gKiAtIEV4cG9zZSB0aGUgcmVzdWx0aW5nIGNvbmZpZyB2aWEgYSBnZW5lcmF0ZWQgYEluamVjdGlvblRva2VuYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFMgLSBab2Qgc2NoZW1hIHR5cGUgZGVzY3JpYmluZyB0aGUgZnVsbCBjb25maWcgc2hhcGUuXG4gKiBAdHlwZVBhcmFtIEsgLSBMaXN0IG9mIHJ1bnRpbWUtcmVxdWlyZWQgdG9wLWxldmVsIGtleXMuXG4gKlxuICogQHBhcmFtIGtpdFxuICogVGhlIGBFbnZLaXRgIGNyZWF0ZWQgYnkgYGNyZWF0ZUVudktpdChzY2hlbWEsIHJ1bnRpbWVSZXF1aXJlZEtleXMpYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogUnVudGltZSBsb2FkaW5nIGJlaGF2aW9yIGFuZCBESSB0b2tlbiBkZXNjcmlwdGlvbi4gU2VlIHtAbGluayBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnN9LlxuICpcbiAqIEByZXR1cm5zIFRoZSBgRW52aXJvbm1lbnRQcm92aWRlcnNgIHRvIGJlIGFkZGVkIHRvIGBhcHBDb25maWcucHJvdmlkZXJzYCxcbiAqXG4gKiBAcmVtYXJrc1xuICogLSBUaGlzIHVzZXMgYW4gQW5ndWxhciAqKmZ1bmN0aW9uYWwgYXBwIGluaXRpYWxpemVyKiogdG8gcGVyZm9ybSB0aGUgbG9hZCBzdGVwLlxuICogLSBJZiB0aGUgc2VydmVyIHJldHVybnMgYW4gSFRNTCBTUEEgZmFsbGJhY2sgKGluc3RlYWQgb2YgdGhlIGAuZW52YCBmaWxlKSwgdGhlIHByb3ZpZGVyXG4gKiAgIHF1aWV0bHkgdXNlcyB0aGUgc3RhdGljIGVudmlyb25tZW50IChubyBydW50aW1lIG92ZXJyaWRlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUnVudGltZUNvbmZpZzxcbiAgUyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+LFxuICBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIHoub3V0cHV0PFM+KVtdXG4+KFxuICBraXQ6IEVudktpdDxTLCBLPixcbiAgc3RhdGljRW52OiBTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICB7XG4gICAgZW52UGF0aCA9ICcvZW52L3J1bnRpbWUuZW52JyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHN0b3BPbkVycm9yID0gdHJ1ZSxcbiAgICB0b2tlbixcbiAgfTogUHJvdmlkZVJ1bnRpbWVDb25maWdPcHRpb25zPFM+ID0ge31cbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgLy8gVGhlIHZhbGlkYXRlZCBjb25maWcgdHlwZSBkZXJpdmVkIGZyb20gdGhlIHNjaGVtYS5cbiAgdHlwZSBFbnZDb25maWcgPSBTY2hlbWFPdXRwdXQ8Uz47XG5cbiAgLy8gVHlwZWQgdG9rZW4gdXNlZCB0byBleHBvc2UgdGhlIGZpbmFsIHZhbGlkYXRlZCBjb25maWcgdmlhIERJLlxuICBjb25zdCBjb25maWdUb2tlbiA9IHRva2VuID8/IG5ldyBJbmplY3Rpb25Ub2tlbjxFbnZDb25maWc+KCdFTlZfQ09ORklHJyk7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgc2VydmljZSB0aGF0IGhhbmRsZXMgZmV0Y2hpbmcsIHBhcnNpbmcsIHZhbGlkYXRpbmcsIGFuZCBjYWNoaW5nXG4gICAqIG9mIHRoZSBydW50aW1lIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuICBjbGFzcyBSdW50aW1lQ29uZmlnU2VydmljZSB7XG4gICAgLy8gQ2FjaGVkIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0ZWQgY29uZmlndXJhdGlvbi5cbiAgICBwcml2YXRlIGNvbmZpZz86IEVudkNvbmZpZztcblxuICAgIC8qKlxuICAgICAqIExvYWRzLCBwYXJzZXMsIG1lcmdlcyBhbmQgdmFsaWRhdGVzIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAgICogUmV0dXJucyBhbiBgT2JzZXJ2YWJsZTxDb25maWdTaGFwZT5gIGFuZCBjYWNoZXMgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICAgKi9cbiAgICBsb2FkKCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiB7XG4gICAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgICAgZnJvbShcbiAgICAgICAgICBmZXRjaChlbnZQYXRoKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBIVFRQIGVycm9ycyBleHBsaWNpdGx5IHNvIHRoZXkgZ28gdGhyb3VnaCBjYXRjaEVycm9yXG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIC8vIDEuIFNQQSBmYWxsYmFjayBndWFyZCAoc2VydmVyIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiAuZW52KVxuICAgICAgICAgIG1hcCgocmF3OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbG9va3NIdG1sID1cbiAgICAgICAgICAgICAgL15cXHMqPCFkb2N0eXBlL2kudGVzdCh0cmltbWVkKSB8fCAvXlxccyo8aHRtbFtcXHM+XS9pLnRlc3QodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAobG9va3NIdG1sKSB7XG4gICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgICAgICAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRldGVjdGVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQgb25seS4nXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTaWduYWwg4oCcbm8gcnVudGltZS5lbnYsIHVzZSBzdGF0aWMgb25seeKAnVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByYXc7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFwKCh2OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRlYnVnKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgIHYgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gJ05vIHJ1bnRpbWUgZW52aXJvbm1lbnQgZmlsZSBkZWZpbmVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQnXG4gICAgICAgICAgICAgICAgICA6ICdSdW50aW1lIGVudmlyb25tZW50IGZpbGUgbG9hZGVkLCBhcHBseWluZyBvdmVycmlkZXMuJ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIDIuIEVpdGhlciBjb250aW51ZSB0aGUgcGlwZSBvciByZXR1cm4gZGVmYXVsdHNcbiAgICAgICAgICBzd2l0Y2hNYXAoKHJhdzogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiA9PiB7XG4gICAgICAgICAgICBpZiAocmF3ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52KSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGNmZykgPT4gKHRoaXMuY29uZmlnID0gY2ZnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMy4gUGFyc2UgcmF3IGAuZW52YCB0ZXh0IC0+IG9iamVjdCwgdGhlbiBkZWVwLXBhcnRpYWwtcGFyc2UgdmlhIGtpdFxuICAgICAgICAgICAgY29uc3QgcnVudGltZUNvbmZpZ1JhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBwYXJzZUVudkZpbGUocmF3KTtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5wYXJzZVJ1bnRpbWVPdmVycmlkZXNBc3luYyhydW50aW1lQ29uZmlnUmF3KSkucGlwZShcbiAgICAgICAgICAgICAgdGFwKChvdmVycmlkZXM6IFBhcnRpYWw8RW52Q29uZmlnPikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnUnVudGltZSBjb25maWcgKHBhcnNlZCk6JyksIG92ZXJyaWRlcyk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAvLyA0LiBNZXJnZSBzdGF0aWMgKyBvdmVycmlkZXMgYW5kIHZhbGlkYXRlIHRoZSBmaW5hbCBjb25maWcgKGFzeW5jKVxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgICAgICAgKG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+KTogT2JzZXJ2YWJsZTxFbnZDb25maWc+ID0+XG4gICAgICAgICAgICAgICAgICBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52LCBvdmVycmlkZXMpKVxuICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgIC8vIDUuIENhY2hlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgbGF0ZXJcbiAgICAgICAgICAgICAgdGFwKChtZXJnZWRDb25maWc6IEVudkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnTWVyZ2VkIGNvbmZpZzonKSwgbWVyZ2VkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IG1lcmdlZENvbmZpZztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICAvLyA2LiBFcnJvciBoYW5kbGluZzogZmFpbCBmYXN0IG9yIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHRvIHN0YXRpYy1vbmx5XG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcE9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gUmVqZWN0IGFwcCBpbml0aWFsaXphdGlvbiAocmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24pXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIC4uLnJjQXJncygnRXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBydW50aW1lIGNvbmZpZzonKSxcbiAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy51c2VEZWZhdWx0cygpKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICAgKiBJZiBub3QgeWV0IGxvYWRlZCwgcmV0dXJucyBhIHZhbGlkYXRlZCBzdGF0aWMtb25seSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIGdldCgpOiBFbnZDb25maWcge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1J1bnRpbWVDb25maWdTZXJ2aWNlLmdldCgpIGNhbGxlZCBiZWZvcmUgY29uZmlndXJhdGlvbiB3YXMgbG9hZGVkLiAnICtcbiAgICAgICAgICAgICdFbnN1cmUgcHJvdmlkZUFwcEluaXRpYWxpemVyIHdhaXRzIGZvciBSdW50aW1lQ29uZmlnU2VydmljZS5sb2FkKCkuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGEgdmFsaWRhdGVkIHN0YXRpYy1vbmx5IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBVc2VkIHdoZW4gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgaXMgbWlzc2luZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVzZURlZmF1bHRzKCk6IEVudkNvbmZpZyB7XG4gICAgICAvLyBOb3RlOiB0aGlzIHVzZXMgdGhlIHN0YXRpYyBlbnY7IG1lcmdlK3ZhbGlkYXRlIGlzIHBlcmZvcm1lZCBpbiBgZ2V0KClgIGlmIG5lZWRlZC5cbiAgICAgIHRoaXMuY29uZmlnID8/PSBzdGF0aWNFbnYgYXMgRW52Q29uZmlnO1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2aWNlICsgaW5pdGlhbGl6ZXIgKyB0b2tlbiBleHBvc3VyZSB3aXRoIEFuZ3VsYXIgREkuXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIFJ1bnRpbWVDb25maWdTZXJ2aWNlLFxuXG4gICAgLy8gQW5ndWxhciAxOSsgZnVuY3Rpb25hbCBpbml0aWFsaXplciAoc3Vic2NyaWJlcyB0byB0aGUgbG9hZCBPYnNlcnZhYmxlKVxuICAgIC8vIFVzaW5nIGZpcnN0VmFsdWVGcm9tIHRvIGVuZm9yZWNlIFwiYXdhaXQgdW50aWwgbG9hZGVkXCIgc2VtYW50aWNzXG4gICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+XG4gICAgICBmaXJzdFZhbHVlRnJvbShpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmxvYWQoKSlcbiAgICApLFxuXG4gICAgLy8gRXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAge1xuICAgICAgcHJvdmlkZTogY29uZmlnVG9rZW4sXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmdldCgpLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1ydW50aW1lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZW52L2FuZ3VsYXIvcHJvdmlkZS1ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBa0MsRUFBRSxDQUFDO0lBQzlELHNCQUFzQixHQUFHLEdBQUc7SUFDNUIsYUFBYTtJQUNiLEVBQUU7Q0FDSCxDQUFDO0FBa0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBSWxDLEdBQWlCLEVBQ2pCLFNBQThCLEVBQzlCLEVBQ0UsT0FBTyxHQUFHLGtCQUFrQixFQUM1QixLQUFLLEdBQUcsS0FBSyxFQUNiLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLEtBQUssTUFDNkIsRUFBRTtJQUt0QyxnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0lBRXpFOzs7T0FHRztJQUNILE1BQ00sb0JBQW9CO1FBQ3hCLGtEQUFr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RSxDQUFDLENBQ3BEO1FBRUQsNERBQTREO1FBQzVEO1lBQ0UsT0FBTyxFQUFFLFdBQVc7WUFDcEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRTtTQUNyRDtLQUNGLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlZmVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZnJvbUZldGNoIH0gZnJvbSAncnhqcy9mZXRjaCc7XG5pbXBvcnQgeiBmcm9tICd6b2QnO1xuaW1wb3J0IHsgRW52S2l0LCBTY2hlbWFPdXRwdXQsIFN0YXRpY0VudkZyb20gfSBmcm9tICcuLi9jb3JlL2Vudi10eXBlcyc7XG5pbXBvcnQgeyBwYXJzZUVudkZpbGUgfSBmcm9tICcuLi9jb3JlL3BhcnNlLWVudi1maWxlJztcblxuLyoqXG4gKiBCdWlsZHMgc3R5bGVkIGNvbnNvbGUgYXJndW1lbnRzIGZvciBSdW50aW1lQ29uZmlnIGxvZ3MuXG4gKlxuICogVGhlIHJldHVybmVkIHR1cGxlIGNhbiBiZSBzcHJlYWQgZGlyZWN0bHkgaW50byBgY29uc29sZS5sb2dgLFxuICogYWxsb3dpbmcgdGhlIGJyb3dzZXIgdG8gcmVuZGVyIGEgY29sb3JlZCBgW1J1bnRpbWVDb25maWddYCBwcmVmaXhcbiAqIHdoaWxlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNhbGxlciBsb2NhdGlvbiBpbiBEZXZUb29scy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnNvbGUubG9nKC4uLnJjQXJncygnUnVudGltZSBvdmVycmlkZXMgbG9hZGVkLicpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0ZXh0IHRvIGFwcGVuZCBhZnRlciB0aGUgY29sb3JlZCBwcmVmaXguXG4gKiBAcmV0dXJucyBBIHR1cGxlIG9mIGFyZ3VtZW50cyAoYFtmb3JtYXQsIHN0eWxlLCByZXNldF1gKSBmb3IgYGNvbnNvbGUubG9nYC5cbiAqL1xuY29uc3QgcmNBcmdzID0gKG1zZzogc3RyaW5nKTogUGFyYW1ldGVyczx0eXBlb2YgY29uc29sZS5sb2c+ID0+IFtcbiAgJyVjW1J1bnRpbWVDb25maWddJWMgJyArIG1zZyxcbiAgJ2NvbG9yOiMwY2Y7JyxcbiAgJycsXG5dO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBBbmd1bGFyIHJ1bnRpbWUtY29uZmlnIHByb3ZpZGVyLlxuICpcbiAqIEBwcm9wZXJ0eSBlbnZQYXRoXG4gKiBUaGUgVVJMIChvciBwYXRoKSB0byB0aGUgcnVudGltZSBgLmVudmAgZmlsZSB0aGF0IHdpbGwgYmUgZmV0Y2hlZCBhdCBhcHAgc3RhcnQuXG4gKiBEZWZhdWx0cyB0byBgXCIvZW52L3J1bnRpbWUuZW52XCJgLlxuICpcbiAqIEBwcm9wZXJ0eSBkZWJ1Z1xuICogRW5hYmxlcyB2ZXJib3NlIGNvbnNvbGUgbG9nZ2luZyB3aGVuIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqXG4gKiBAcHJvcGVydHkgc3RvcE9uRXJyb3JcbiAqIElmIGB0cnVlYCwgYW55IGZhaWx1cmUgd2hpbGUgbG9hZGluZy9wYXJzaW5nL3ZhbGlkYXRpbmcgdGhlIHJ1bnRpbWUgY29uZmlnXG4gKiB3aWxsIHJlamVjdCB0aGUgYXBwIGluaXRpYWxpemVyIGFuZCAqKmFib3J0IGJvb3QqKiAocmVjb21tZW5kZWQgZm9yIHByb2QpLlxuICogSWYgYGZhbHNlYCwgdGhlIHByb3ZpZGVyIGZhbGxzIGJhY2sgdG8gdGhlIHN0YXRpYyBlbnZpcm9ubWVudCBvbmx5LlxuICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICpcbiAqIEBwcm9wZXJ0eSB0b2tlblxuICogT3B0aW9uYWwgYEluamVjdGlvblRva2VuYCB1c2VkIHRvIGV4cG9zZSB0aGUgdmFsaWRhdGVkIGNvbmZpZ3VyYXRpb25cbiAqIHZpYSBBbmd1bGFyIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcHJvdmlkZXIgd2lsbCBjcmVhdGUgb25lXG4gKiBhdXRvbWF0aWNhbGx5IG5hbWVkIGBFTlZfQ09ORklHYC5cbiAqL1xuaW50ZXJmYWNlIFByb3ZpZGVSdW50aW1lQ29uZmlnT3B0aW9uczxTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4+IHtcbiAgLyoqIFBhdGggdG8gdGhlIHJ1bnRpbWUgZW52IGZpbGUgKGRlZmF1bHQ6IC9lbnYvcnVudGltZS5lbnYpICovXG4gIGVudlBhdGg/OiBzdHJpbmc7XG4gIC8qKiBMb2cgZGVidWcgaW5mbyB0byBjb25zb2xlICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqIFRocm93IG9uIGVycm9yIHRvIHN0b3AgYXBwIGJvb3QgKGRlZmF1bHQ6IHRydWUpICovXG4gIHN0b3BPbkVycm9yPzogYm9vbGVhbjtcbiAgLyoqIEluamVjdGlvbiB0b2tlbiB1c2VkIHRvIHByb3ZpZGUgdGhlIHZhbGlkYXRlZCBjb25maWcgdmlhIEFuZ3VsYXIgREkgKi9cbiAgdG9rZW4/OiBJbmplY3Rpb25Ub2tlbjxTY2hlbWFPdXRwdXQ8Uz4+O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwcm92aWRlcnMgdGhhdDpcbiAqIC0gRmV0Y2ggYSBydW50aW1lIGAuZW52YCBmaWxlIGF0IHN0YXJ0dXAsXG4gKiAtIFBhcnNlIGl0IHRvIGEgZGVlcC1wYXJ0aWFsIHN0cnVjdHVyZSB2aWEgdGhlIGtpdCxcbiAqIC0gRW5mb3JjZSBydW50aW1lLXJlcXVpcmVkIGtleXMgd2hlbiBhcHByb3ByaWF0ZSxcbiAqIC0gTWVyZ2Ugd2l0aCB0aGUgc3RhdGljIGVudmlyb25tZW50LFxuICogLSBWYWxpZGF0ZSB0aGUgKipmaW5hbCoqIGNvbmZpZ3VyYXRpb24gYWdhaW5zdCB0aGUgWm9kIHNjaGVtYSxcbiAqIC0gRXhwb3NlIHRoZSByZXN1bHRpbmcgY29uZmlnIHZpYSBhIGdlbmVyYXRlZCBgSW5qZWN0aW9uVG9rZW5gLlxuICpcbiAqIEB0eXBlUGFyYW0gUyAtIFpvZCBzY2hlbWEgdHlwZSBkZXNjcmliaW5nIHRoZSBmdWxsIGNvbmZpZyBzaGFwZS5cbiAqIEB0eXBlUGFyYW0gSyAtIExpc3Qgb2YgcnVudGltZS1yZXF1aXJlZCB0b3AtbGV2ZWwga2V5cy5cbiAqXG4gKiBAcGFyYW0ga2l0XG4gKiBUaGUgYEVudktpdGAgY3JlYXRlZCBieSBgY3JlYXRlRW52S2l0KHNjaGVtYSwgcnVudGltZVJlcXVpcmVkS2V5cylgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBSdW50aW1lIGxvYWRpbmcgYmVoYXZpb3IgYW5kIERJIHRva2VuIGRlc2NyaXB0aW9uLiBTZWUge0BsaW5rIFByb3ZpZGVSdW50aW1lQ29uZmlnT3B0aW9uc30uXG4gKlxuICogQHJldHVybnMgVGhlIGBFbnZpcm9ubWVudFByb3ZpZGVyc2AgdG8gYmUgYWRkZWQgdG8gYGFwcENvbmZpZy5wcm92aWRlcnNgLFxuICpcbiAqIEByZW1hcmtzXG4gKiAtIFRoaXMgdXNlcyBhbiBBbmd1bGFyICoqZnVuY3Rpb25hbCBhcHAgaW5pdGlhbGl6ZXIqKiB0byBwZXJmb3JtIHRoZSBsb2FkIHN0ZXAuXG4gKiAtIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhbiBIVE1MIFNQQSBmYWxsYmFjayAoaW5zdGVhZCBvZiB0aGUgYC5lbnZgIGZpbGUpLCB0aGUgcHJvdmlkZXJcbiAqICAgcXVpZXRseSB1c2VzIHRoZSBzdGF0aWMgZW52aXJvbm1lbnQgKG5vIHJ1bnRpbWUgb3ZlcnJpZGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVSdW50aW1lQ29uZmlnPFxuICBTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4sXG4gIEsgZXh0ZW5kcyByZWFkb25seSAoa2V5b2Ygei5vdXRwdXQ8Uz4pW10sXG4+KFxuICBraXQ6IEVudktpdDxTLCBLPixcbiAgc3RhdGljRW52OiBTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICB7XG4gICAgZW52UGF0aCA9ICcvZW52L3J1bnRpbWUuZW52JyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHN0b3BPbkVycm9yID0gdHJ1ZSxcbiAgICB0b2tlbixcbiAgfTogUHJvdmlkZVJ1bnRpbWVDb25maWdPcHRpb25zPFM+ID0ge30sXG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIC8vIFRoZSB2YWxpZGF0ZWQgY29uZmlnIHR5cGUgZGVyaXZlZCBmcm9tIHRoZSBzY2hlbWEuXG4gIHR5cGUgRW52Q29uZmlnID0gU2NoZW1hT3V0cHV0PFM+O1xuXG4gIC8vIFR5cGVkIHRva2VuIHVzZWQgdG8gZXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSBESS5cbiAgY29uc3QgY29uZmlnVG9rZW4gPSB0b2tlbiA/PyBuZXcgSW5qZWN0aW9uVG9rZW48RW52Q29uZmlnPignRU5WX0NPTkZJRycpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHNlcnZpY2UgdGhhdCBoYW5kbGVzIGZldGNoaW5nLCBwYXJzaW5nLCB2YWxpZGF0aW5nLCBhbmQgY2FjaGluZ1xuICAgKiBvZiB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbiAgY2xhc3MgUnVudGltZUNvbmZpZ1NlcnZpY2Uge1xuICAgIC8vIENhY2hlZCBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAgcHJpdmF0ZSBjb25maWc/OiBFbnZDb25maWc7XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcywgcGFyc2VzLCBtZXJnZXMgYW5kIHZhbGlkYXRlcyB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgICAqIFJldHVybnMgYW4gYE9ic2VydmFibGU8Q29uZmlnU2hhcGU+YCBhbmQgY2FjaGVzIHRoZSBmaW5hbCByZXN1bHQuXG4gICAgICovXG4gICAgbG9hZCgpOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4ge1xuICAgICAgcmV0dXJuIGRlZmVyKCgpID0+XG4gICAgICAgIGZyb21GZXRjaChlbnZQYXRoKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgZXhwbGljaXRseSBzbyB0aGV5IGdvIHRocm91Z2ggY2F0Y2hFcnJvclxuICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc3BvbnNlLnRleHQoKSByZXR1cm5zIGEgUHJvbWlzZSwgd2hpY2ggc3dpdGNoTWFwIGNhbiBoYW5kbGVcbiAgICAgICAgICAgIHJldHVybiByZXMudGV4dCgpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIDEuIFNQQSBmYWxsYmFjayBndWFyZCAoc2VydmVyIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiAuZW52KVxuICAgICAgICAgIG1hcCgocmF3OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbG9va3NIdG1sID1cbiAgICAgICAgICAgICAgL15cXHMqPCFkb2N0eXBlL2kudGVzdCh0cmltbWVkKSB8fCAvXlxccyo8aHRtbFtcXHM+XS9pLnRlc3QodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAobG9va3NIdG1sKSB7XG4gICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgICAgICAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRldGVjdGVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQgb25seS4nLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNpZ25hbCDigJxubyBydW50aW1lLmVudiwgdXNlIHN0YXRpYyBvbmx54oCdXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJhdztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YXAoKHY6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgICAgIGlmICghZGVidWcpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAuLi5yY0FyZ3MoXG4gICAgICAgICAgICAgICAgdiA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRlZmluZWQsIHVzaW5nIHN0YXRpYyBlbnZpcm9ubWVudCdcbiAgICAgICAgICAgICAgICAgIDogJ1J1bnRpbWUgZW52aXJvbm1lbnQgZmlsZSBsb2FkZWQsIGFwcGx5aW5nIG92ZXJyaWRlcy4nLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyAyLiBFaXRoZXIgY29udGludWUgdGhlIHBpcGUgb3IgcmV0dXJuIGRlZmF1bHRzXG4gICAgICAgICAgc3dpdGNoTWFwKChyYXc6IHN0cmluZyB8IG51bGwpOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4gPT4ge1xuICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gZnJvbShraXQubWVyZ2VBbmRWYWxpZGF0ZUFzeW5jKHN0YXRpY0VudikpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChjZmcpID0+ICh0aGlzLmNvbmZpZyA9IGNmZykpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAzLiBQYXJzZSByYXcgYC5lbnZgIHRleHQgLT4gb2JqZWN0LCB0aGVuIGRlZXAtcGFydGlhbC1wYXJzZSB2aWEga2l0XG4gICAgICAgICAgICBjb25zdCBydW50aW1lQ29uZmlnUmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHBhcnNlRW52RmlsZShyYXcpO1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oa2l0LnBhcnNlUnVudGltZU92ZXJyaWRlc0FzeW5jKHJ1bnRpbWVDb25maWdSYXcpKS5waXBlKFxuICAgICAgICAgICAgICB0YXAoKG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coLi4ucmNBcmdzKCdSdW50aW1lIGNvbmZpZyAocGFyc2VkKTonKSwgb3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIDQuIE1lcmdlIHN0YXRpYyArIG92ZXJyaWRlcyBhbmQgdmFsaWRhdGUgdGhlIGZpbmFsIGNvbmZpZyAoYXN5bmMpXG4gICAgICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgICAgICAob3ZlcnJpZGVzOiBQYXJ0aWFsPEVudkNvbmZpZz4pOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4gPT5cbiAgICAgICAgICAgICAgICAgIGZyb20oa2l0Lm1lcmdlQW5kVmFsaWRhdGVBc3luYyhzdGF0aWNFbnYsIG92ZXJyaWRlcykpLFxuICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgIC8vIDUuIENhY2hlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgbGF0ZXJcbiAgICAgICAgICAgICAgdGFwKChtZXJnZWRDb25maWc6IEVudkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnTWVyZ2VkIGNvbmZpZzonKSwgbWVyZ2VkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IG1lcmdlZENvbmZpZztcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgLy8gNi4gRXJyb3IgaGFuZGxpbmc6IGZhaWwgZmFzdCBvciBncmFjZWZ1bGx5IGZhbGwgYmFjayB0byBzdGF0aWMtb25seVxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BPbkVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIFJlamVjdCBhcHAgaW5pdGlhbGl6YXRpb24gKHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uKVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAuLi5yY0FyZ3MoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgcnVudGltZSBjb25maWc6JyksXG4gICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnVzZURlZmF1bHRzKCkpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAgICogSWYgbm90IHlldCBsb2FkZWQsIHJldHVybnMgYSB2YWxpZGF0ZWQgc3RhdGljLW9ubHkgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBnZXQoKTogRW52Q29uZmlnIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdSdW50aW1lQ29uZmlnU2VydmljZS5nZXQoKSBjYWxsZWQgYmVmb3JlIGNvbmZpZ3VyYXRpb24gd2FzIGxvYWRlZC4gJyArXG4gICAgICAgICAgICAnRW5zdXJlIHByb3ZpZGVBcHBJbml0aWFsaXplciB3YWl0cyBmb3IgUnVudGltZUNvbmZpZ1NlcnZpY2UubG9hZCgpLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gYSB2YWxpZGF0ZWQgc3RhdGljLW9ubHkgY29uZmlndXJhdGlvblxuICAgICAqIFVzZWQgd2hlbiB0aGUgcnVudGltZSBgLmVudmAgZmlsZSBpcyBtaXNzaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXNlRGVmYXVsdHMoKTogRW52Q29uZmlnIHtcbiAgICAgIC8vIE5vdGU6IHRoaXMgdXNlcyB0aGUgc3RhdGljIGVudjsgbWVyZ2UrdmFsaWRhdGUgaXMgcGVyZm9ybWVkIGluIGBnZXQoKWAgaWYgbmVlZGVkLlxuICAgICAgdGhpcy5jb25maWcgPz89IHN0YXRpY0VudiBhcyBFbnZDb25maWc7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZpY2UgKyBpbml0aWFsaXplciArIHRva2VuIGV4cG9zdXJlIHdpdGggQW5ndWxhciBESS5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgUnVudGltZUNvbmZpZ1NlcnZpY2UsXG5cbiAgICAvLyBBbmd1bGFyIDE5KyBmdW5jdGlvbmFsIGluaXRpYWxpemVyIChzdWJzY3JpYmVzIHRvIHRoZSBsb2FkIE9ic2VydmFibGUpXG4gICAgLy8gVXNpbmcgZmlyc3RWYWx1ZUZyb20gdG8gZW5mb3JlY2UgXCJhd2FpdCB1bnRpbCBsb2FkZWRcIiBzZW1hbnRpY3NcbiAgICBwcm92aWRlQXBwSW5pdGlhbGl6ZXIoKCkgPT5cbiAgICAgIGZpcnN0VmFsdWVGcm9tKGluamVjdChSdW50aW1lQ29uZmlnU2VydmljZSkubG9hZCgpKSxcbiAgICApLFxuXG4gICAgLy8gRXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAge1xuICAgICAgcHJvdmlkZTogY29uZmlnVG9rZW4sXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmdldCgpLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
@@ -0,0 +1,121 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, TemplateRef, computed, effect, input, output, viewChild, } from '@angular/core';
3
+ import { TdsModal, TegelModule } from '@scania/tegel-angular-17';
4
+ import { DynamicComponentDirective } from '../../directives/dynamic-component.directive';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@scania/tegel-angular-17";
8
+ /**
9
+ * Renders a single modal instance backed by the Tegel <tds-modal> web component.
10
+ *
11
+ * Responsibilities:
12
+ * - Initialize the underlying web component once it is ready.
13
+ * - Apply the desired open/close state based on `modal.isOpen`.
14
+ * - Render header/body/action content (including dynamic components).
15
+ */
16
+ export class ModalComponent {
17
+ /**
18
+ * Modal configuration and runtime state.
19
+ */
20
+ modal = input.required();
21
+ /**
22
+ * Emits the modal id when the modal is closed by the user.
23
+ */
24
+ closed = output();
25
+ // Reference to the underlying web component instance.
26
+ _modalRef = viewChild(TdsModal, {
27
+ read: (ElementRef),
28
+ });
29
+ /**
30
+ * Resolved DOM element for the underlying <tds-modal>.
31
+ */
32
+ modalEl = computed(() => this._modalRef()?.nativeElement ?? null);
33
+ /** Tracks whether the modal has been initialized. */
34
+ initialized = false;
35
+ constructor() {
36
+ effect(() => {
37
+ // Track input changes and sync desired open state to the web component.
38
+ this.modal();
39
+ void this.applyOpenState();
40
+ });
41
+ }
42
+ /**
43
+ * Type guard for TemplateRef values.
44
+ * @param value Value to test.
45
+ */
46
+ isTemplateRef(value) {
47
+ return value instanceof TemplateRef;
48
+ }
49
+ /**
50
+ * Type guard for component-backed modal bodies.
51
+ * @param body Body value to test.
52
+ */
53
+ isComponentBody(body) {
54
+ return typeof body === 'object' && body !== null && 'component' in body;
55
+ }
56
+ /**
57
+ * Invokes an action button handler (sync or async).
58
+ * @param button Modal button descriptor.
59
+ */
60
+ async handleButtonClick(button) {
61
+ try {
62
+ await button.onClick?.();
63
+ }
64
+ catch (err) {
65
+ console.error('[tae-modal] Button onClick failed:', err);
66
+ }
67
+ }
68
+ /**
69
+ * Initializes the underlying <tds-modal> after view init.
70
+ */
71
+ ngAfterViewInit() {
72
+ void this.initializeModal();
73
+ }
74
+ /**
75
+ * Calls the web component's initializeModal() once.
76
+ */
77
+ async initializeModal() {
78
+ const el = this.modalEl();
79
+ if (!el) {
80
+ console.warn('[tae-modal] Modal element not found; cannot initialize.');
81
+ return;
82
+ }
83
+ if (this.initialized)
84
+ return;
85
+ const ready = await el.componentOnReady();
86
+ if (!ready) {
87
+ console.warn('[tae-modal] Modal element not ready; initialization skipped.');
88
+ return;
89
+ }
90
+ await el.initializeModal();
91
+ this.initialized = true;
92
+ }
93
+ /**
94
+ * Applies the desired open/close state to the web component.
95
+ */
96
+ async applyOpenState() {
97
+ const modal = this.modal();
98
+ const el = this.modalEl();
99
+ if (!el)
100
+ return;
101
+ if (!this.initialized) {
102
+ // Initialize once before issuing show/close calls.
103
+ await this.initializeModal();
104
+ if (!this.initialized)
105
+ return;
106
+ }
107
+ if (modal.isOpen) {
108
+ await el.showModal();
109
+ }
110
+ else {
111
+ await el.closeModal();
112
+ }
113
+ }
114
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
115
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ModalComponent, isStandalone: true, selector: "tae-modal", inputs: { modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closed: "closed" }, viewQueries: [{ propertyName: "_modalRef", first: true, predicate: TdsModal, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@let modalObj = modal();\n\n<tds-modal\n [id]=\"modalObj.id\"\n [selector]=\"modalObj.selector\"\n [referenceEl]=\"modalObj.referenceEl\"\n [size]=\"modalObj.size\"\n [actionsPosition]=\"modalObj.actionsPosition\"\n [prevent]=\"modalObj.prevent\"\n [closable]=\"modalObj.closable\"\n [tdsAlertDialog]=\"modalObj.alertDialog\"\n (tdsClose)=\"this.closed.emit(modalObj.id)\"\n>\n @let header = modalObj.header;\n @if (header) {\n @if (isTemplateRef(header)) {\n <span slot=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n </span>\n } @else {\n <span slot=\"header\">{{ header }}</span>\n }\n }\n\n @if (!modalObj.lazy || modalObj.isOpen) {\n @let body = modalObj.body;\n @if (body) {\n <span slot=\"body\">\n @if (isComponentBody(body)) {\n <ng-container\n taeDynamicComponent\n [component]=\"body.component\"\n [inputs]=\"body.inputs\"\n [outputs]=\"body.outputs\"\n />\n } @else if (isTemplateRef(body)) {\n <ng-container [ngTemplateOutlet]=\"body\" />\n } @else {\n {{ body }}\n }\n </span>\n }\n }\n\n @let buttons = modalObj.buttons;\n @if (buttons?.length) {\n <span slot=\"actions\" class=\"tds-u-flex tds-u-gap2\">\n @for (button of buttons; track $index) {\n <tds-button\n [text]=\"button.text\"\n [variant]=\"button.variant ?? 'primary'\"\n [size]=\"button.size ?? 'md'\"\n [disabled]=\"button.disabled ?? false\"\n [attr.data-dismiss-modal]=\"button.dismiss ? '' : null\"\n (click)=\"handleButtonClick(button)\"\n ></tds-button>\n }\n </span>\n }\n</tds-modal>\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TegelModule }, { kind: "component", type: i2.TdsButton, selector: "tds-button", inputs: ["animation", "disabled", "fullbleed", "modeVariant", "name", "size", "tdsAriaLabel", "text", "type", "value", "variant"] }, { kind: "component", type: i2.TdsModal, selector: "tds-modal", inputs: ["actionsPosition", "closable", "header", "prevent", "referenceEl", "selector", "show", "size", "tdsAlertDialog"] }, { kind: "directive", type: DynamicComponentDirective, selector: "[taeDynamicComponent]", inputs: ["component", "inputs", "outputs"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
116
+ }
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalComponent, decorators: [{
118
+ type: Component,
119
+ args: [{ selector: 'tae-modal', imports: [CommonModule, TegelModule, DynamicComponentDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let modalObj = modal();\n\n<tds-modal\n [id]=\"modalObj.id\"\n [selector]=\"modalObj.selector\"\n [referenceEl]=\"modalObj.referenceEl\"\n [size]=\"modalObj.size\"\n [actionsPosition]=\"modalObj.actionsPosition\"\n [prevent]=\"modalObj.prevent\"\n [closable]=\"modalObj.closable\"\n [tdsAlertDialog]=\"modalObj.alertDialog\"\n (tdsClose)=\"this.closed.emit(modalObj.id)\"\n>\n @let header = modalObj.header;\n @if (header) {\n @if (isTemplateRef(header)) {\n <span slot=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n </span>\n } @else {\n <span slot=\"header\">{{ header }}</span>\n }\n }\n\n @if (!modalObj.lazy || modalObj.isOpen) {\n @let body = modalObj.body;\n @if (body) {\n <span slot=\"body\">\n @if (isComponentBody(body)) {\n <ng-container\n taeDynamicComponent\n [component]=\"body.component\"\n [inputs]=\"body.inputs\"\n [outputs]=\"body.outputs\"\n />\n } @else if (isTemplateRef(body)) {\n <ng-container [ngTemplateOutlet]=\"body\" />\n } @else {\n {{ body }}\n }\n </span>\n }\n }\n\n @let buttons = modalObj.buttons;\n @if (buttons?.length) {\n <span slot=\"actions\" class=\"tds-u-flex tds-u-gap2\">\n @for (button of buttons; track $index) {\n <tds-button\n [text]=\"button.text\"\n [variant]=\"button.variant ?? 'primary'\"\n [size]=\"button.size ?? 'md'\"\n [disabled]=\"button.disabled ?? false\"\n [attr.data-dismiss-modal]=\"button.dismiss ? '' : null\"\n (click)=\"handleButtonClick(button)\"\n ></tds-button>\n }\n </span>\n }\n</tds-modal>\n", styles: [":host{display:contents}\n"] }]
120
+ }], ctorParameters: () => [] });
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9tb2RhbC9jb21wb25lbnRzL21vZGFsL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7QUFJekY7Ozs7Ozs7R0FPRztBQVFILE1BQU0sT0FBTyxjQUFjO0lBQ3pCOztPQUVHO0lBQ00sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVMsQ0FBQztJQUN6Qzs7T0FFRztJQUNnQixNQUFNLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFDN0Msc0RBQXNEO0lBQ3JDLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQy9DLElBQUksRUFBRSxDQUFBLFVBQStCLENBQUE7S0FDdEMsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDZ0IsT0FBTyxHQUFHLFFBQVEsQ0FDbkMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQzlD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bic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRkc01vZGFsLCBUZWdlbE1vZHVsZSB9IGZyb20gJ0BzY2FuaWEvdGVnZWwtYW5ndWxhci0xNyc7XG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9keW5hbWljLWNvbXBvbmVudC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTW9kYWwsIE1vZGFsQm9keSwgTW9kYWxDb21wb25lbnRCb2R5IH0gZnJvbSAnLi4vLi4vc2NoZW1hL21vZGFsLm1vZGVsJztcbmltcG9ydCB7IE1vZGFsQnV0dG9uIH0gZnJvbSAnLi4vLi4vc2NoZW1hL21vZGFsLnR5cGVzJztcblxuLyoqXG4gKiBSZW5kZXJzIGEgc2luZ2xlIG1vZGFsIGluc3RhbmNlIGJhY2tlZCBieSB0aGUgVGVnZWwgPHRkcy1tb2RhbD4gd2ViIGNvbXBvbmVudC5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBJbml0aWFsaXplIHRoZSB1bmRlcmx5aW5nIHdlYiBjb21wb25lbnQgb25jZSBpdCBpcyByZWFkeS5cbiAqIC0gQXBwbHkgdGhlIGRlc2lyZWQgb3Blbi9jbG9zZSBzdGF0ZSBiYXNlZCBvbiBgbW9kYWwuaXNPcGVuYC5cbiAqIC0gUmVuZGVyIGhlYWRlci9ib2R5L2FjdGlvbiBjb250ZW50IChpbmNsdWRpbmcgZHluYW1pYyBjb21wb25lbnRzKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVGVnZWxNb2R1bGUsIER5bmFtaWNDb21wb25lbnREaXJlY3RpdmVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIE1vZGFsIGNvbmZpZ3VyYXRpb24gYW5kIHJ1bnRpbWUgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBtb2RhbCA9IGlucHV0LnJlcXVpcmVkPE1vZGFsPigpO1xuICAvKipcbiAgICogRW1pdHMgdGhlIG1vZGFsIGlkIHdoZW4gdGhlIG1vZGFsIGlzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICAvLyBSZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgd2ViIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kYWxSZWYgPSB2aWV3Q2hpbGQoVGRzTW9kYWwsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmPEhUTUxUZHNNb2RhbEVsZW1lbnQ+LFxuICB9KTtcblxuICAvKipcbiAgICogUmVzb2x2ZWQgRE9NIGVsZW1lbnQgZm9yIHRoZSB1bmRlcmx5aW5nIDx0ZHMtbW9kYWw+LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZGFsRWwgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLl9tb2RhbFJlZigpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICk7XG5cbiAgLyoqIFRyYWNrcyB3aGV0aGVyIHRoZSBtb2RhbCBoYXMgYmVlbiBpbml0aWFsaXplZC4gKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBUcmFjayBpbnB1dCBjaGFuZ2VzIGFuZCBzeW5jIGRlc2lyZWQgb3BlbiBzdGF0ZSB0byB0aGUgd2ViIGNvbXBvbmVudC5cbiAgICAgIHRoaXMubW9kYWwoKTtcbiAgICAgIHZvaWQgdGhpcy5hcHBseU9wZW5TdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgZ3VhcmQgZm9yIFRlbXBsYXRlUmVmIHZhbHVlcy5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHRlc3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNUZW1wbGF0ZVJlZih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRlbXBsYXRlUmVmPHVua25vd24+IHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUeXBlIGd1YXJkIGZvciBjb21wb25lbnQtYmFja2VkIG1vZGFsIGJvZGllcy5cbiAgICogQHBhcmFtIGJvZHkgQm9keSB2YWx1ZSB0byB0ZXN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzQ29tcG9uZW50Qm9keShcbiAgICBib2R5OiBNb2RhbEJvZHk8dW5rbm93bj4sXG4gICk6IGJvZHkgaXMgTW9kYWxDb21wb25lbnRCb2R5PHVua25vd24+IHtcbiAgICByZXR1cm4gdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnICYmIGJvZHkgIT09IG51bGwgJiYgJ2NvbXBvbmVudCcgaW4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGFuIGFjdGlvbiBidXR0b24gaGFuZGxlciAoc3luYyBvciBhc3luYykuXG4gICAqIEBwYXJhbSBidXR0b24gTW9kYWwgYnV0dG9uIGRlc2NyaXB0b3IuXG4gICAqL1xuICBhc3luYyBoYW5kbGVCdXR0b25DbGljayhidXR0b246IE1vZGFsQnV0dG9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJ1dHRvbi5vbkNsaWNrPy4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t0YWUtbW9kYWxdIEJ1dHRvbiBvbkNsaWNrIGZhaWxlZDonLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdW5kZXJseWluZyA8dGRzLW1vZGFsPiBhZnRlciB2aWV3IGluaXQuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmluaXRpYWxpemVNb2RhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSB3ZWIgY29tcG9uZW50J3MgaW5pdGlhbGl6ZU1vZGFsKCkgb25jZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZU1vZGFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVsID0gdGhpcy5tb2RhbEVsKCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFlLW1vZGFsXSBNb2RhbCBlbGVtZW50IG5vdCBmb3VuZDsgY2Fubm90IGluaXRpYWxpemUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICBjb25zdCByZWFkeSA9IGF3YWl0IGVsLmNvbXBvbmVudE9uUmVhZHkoKTtcbiAgICBpZiAoIXJlYWR5KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbdGFlLW1vZGFsXSBNb2RhbCBlbGVtZW50IG5vdCByZWFkeTsgaW5pdGlhbGl6YXRpb24gc2tpcHBlZC4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBlbC5pbml0aWFsaXplTW9kYWwoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBkZXNpcmVkIG9wZW4vY2xvc2Ugc3RhdGUgdG8gdGhlIHdlYiBjb21wb25lbnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFwcGx5T3BlblN0YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5tb2RhbCgpO1xuICAgIGNvbnN0IGVsID0gdGhpcy5tb2RhbEVsKCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBvbmNlIGJlZm9yZSBpc3N1aW5nIHNob3cvY2xvc2UgY2FsbHMuXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVNb2RhbCgpO1xuICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgfVxuICAgIGlmIChtb2RhbC5pc09wZW4pIHtcbiAgICAgIGF3YWl0IGVsLnNob3dNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBlbC5jbG9zZU1vZGFsKCk7XG4gICAgfVxuICB9XG59XG4iLCJAbGV0IG1vZGFsT2JqID0gbW9kYWwoKTtcblxuPHRkcy1tb2RhbFxuICBbaWRdPVwibW9kYWxPYmouaWRcIlxuICBbc2VsZWN0b3JdPVwibW9kYWxPYmouc2VsZWN0b3JcIlxuICBbcmVmZXJlbmNlRWxdPVwibW9kYWxPYmoucmVmZXJlbmNlRWxcIlxuICBbc2l6ZV09XCJtb2RhbE9iai5zaXplXCJcbiAgW2FjdGlvbnNQb3NpdGlvbl09XCJtb2RhbE9iai5hY3Rpb25zUG9zaXRpb25cIlxuICBbcHJldmVudF09XCJtb2RhbE9iai5wcmV2ZW50XCJcbiAgW2Nsb3NhYmxlXT1cIm1vZGFsT2JqLmNsb3NhYmxlXCJcbiAgW3Rkc0FsZXJ0RGlhbG9nXT1cIm1vZGFsT2JqLmFsZXJ0RGlhbG9nXCJcbiAgKHRkc0Nsb3NlKT1cInRoaXMuY2xvc2VkLmVtaXQobW9kYWxPYmouaWQpXCJcbj5cbiAgQGxldCBoZWFkZXIgPSBtb2RhbE9iai5oZWFkZXI7XG4gIEBpZiAoaGVhZGVyKSB7XG4gICAgQGlmIChpc1RlbXBsYXRlUmVmKGhlYWRlcikpIHtcbiAgICAgIDxzcGFuIHNsb3Q9XCJoZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIiAvPlxuICAgICAgPC9zcGFuPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHNwYW4gc2xvdD1cImhlYWRlclwiPnt7IGhlYWRlciB9fTwvc3Bhbj5cbiAgICB9XG4gIH1cblxuICBAaWYgKCFtb2RhbE9iai5sYXp5IHx8IG1vZGFsT2JqLmlzT3Blbikge1xuICAgIEBsZXQgYm9keSA9IG1vZGFsT2JqLmJvZHk7XG4gICAgQGlmIChib2R5KSB7XG4gICAgICA8c3BhbiBzbG90PVwiYm9keVwiPlxuICAgICAgICBAaWYgKGlzQ29tcG9uZW50Qm9keShib2R5KSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIHRhZUR5bmFtaWNDb21wb25lbnRcbiAgICAgICAgICAgIFtjb21wb25lbnRdPVwiYm9keS5jb21wb25lbnRcIlxuICAgICAgICAgICAgW2lucHV0c109XCJib2R5LmlucHV0c1wiXG4gICAgICAgICAgICBbb3V0cHV0c109XCJib2R5Lm91dHB1dHNcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2UgaWYgKGlzVGVtcGxhdGVSZWYoYm9keSkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvZHlcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICB7eyBib2R5IH19XG4gICAgICAgIH1cbiAgICAgIDwvc3Bhbj5cbiAgICB9XG4gIH1cblxuICBAbGV0IGJ1dHRvbnMgPSBtb2RhbE9iai5idXR0b25zO1xuICBAaWYgKGJ1dHRvbnM/Lmxlbmd0aCkge1xuICAgIDxzcGFuIHNsb3Q9XCJhY3Rpb25zXCIgY2xhc3M9XCJ0ZHMtdS1mbGV4IHRkcy11LWdhcDJcIj5cbiAgICAgIEBmb3IgKGJ1dHRvbiBvZiBidXR0b25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPHRkcy1idXR0b25cbiAgICAgICAgICBbdGV4dF09XCJidXR0b24udGV4dFwiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiYnV0dG9uLnZhcmlhbnQgPz8gJ3ByaW1hcnknXCJcbiAgICAgICAgICBbc2l6ZV09XCJidXR0b24uc2l6ZSA/PyAnbWQnXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkID8/IGZhbHNlXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWRpc21pc3MtbW9kYWxdPVwiYnV0dG9uLmRpc21pc3MgPyAnJyA6IG51bGxcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVCdXR0b25DbGljayhidXR0b24pXCJcbiAgICAgICAgPjwvdGRzLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L3NwYW4+XG4gIH1cbjwvdGRzLW1vZGFsPlxuIl19
@@ -0,0 +1,32 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { ModalService } from '../../modal.service';
4
+ import { ModalComponent } from '../modal/modal.component';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Hosts and renders all active modals.
8
+ *
9
+ * The host listens for close events from each modal instance and
10
+ * forwards them to the modal service, which owns modal lifecycle.
11
+ */
12
+ export class ModalHostComponent {
13
+ modalService = inject(ModalService);
14
+ /**
15
+ * Map of active modals keyed by id.
16
+ */
17
+ modalsSignal = this.modalService.modals;
18
+ /**
19
+ * Handles close events from child modal components.
20
+ * @param id Modal id that emitted the close event.
21
+ */
22
+ handleClosed(id) {
23
+ this.modalService.close(id);
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ModalHostComponent, isStandalone: true, selector: "tae-modal-host", ngImport: i0, template: "@for (modal of modalsSignal().values(); track modal.id) {\n <tae-modal [modal]=\"modal\" (closed)=\"handleClosed($event)\" />\n}\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ModalComponent, selector: "tae-modal", inputs: ["modal"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalHostComponent, decorators: [{
29
+ type: Component,
30
+ args: [{ selector: 'tae-modal-host', imports: [CommonModule, ModalComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (modal of modalsSignal().values(); track modal.id) {\n <tae-modal [modal]=\"modal\" (closed)=\"handleClosed($event)\" />\n}\n", styles: [":host{display:contents}\n"] }]
31
+ }] });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtaG9zdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL21vZGFsL2NvbXBvbmVudHMvbW9kYWwtaG9zdC9tb2RhbC1ob3N0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvY29tcG9uZW50cy9tb2RhbC1ob3N0L21vZGFsLWhvc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRTFEOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLGtCQUFrQjtJQUNaLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFckQ7O09BRUc7SUFDTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFFakQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLEVBQVU7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQzt3R0FkVSxrQkFBa0I7NEZBQWxCLGtCQUFrQiwwRUNsQi9CLHFJQUdBLGtGRFlZLFlBQVksK0JBQUUsY0FBYzs7NEZBRzNCLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxnQkFBZ0IsV0FHakIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLG1CQUN0Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLmNvbXBvbmVudCc7XG5cbi8qKlxuICogSG9zdHMgYW5kIHJlbmRlcnMgYWxsIGFjdGl2ZSBtb2RhbHMuXG4gKlxuICogVGhlIGhvc3QgbGlzdGVucyBmb3IgY2xvc2UgZXZlbnRzIGZyb20gZWFjaCBtb2RhbCBpbnN0YW5jZSBhbmRcbiAqIGZvcndhcmRzIHRoZW0gdG8gdGhlIG1vZGFsIHNlcnZpY2UsIHdoaWNoIG93bnMgbW9kYWwgbGlmZWN5Y2xlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YWUtbW9kYWwtaG9zdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC1ob3N0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kYWwtaG9zdC5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNb2RhbENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbEhvc3RDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgYWN0aXZlIG1vZGFscyBrZXllZCBieSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGFsc1NpZ25hbCA9IHRoaXMubW9kYWxTZXJ2aWNlLm1vZGFscztcblxuICAvKipcbiAgICogSGFuZGxlcyBjbG9zZSBldmVudHMgZnJvbSBjaGlsZCBtb2RhbCBjb21wb25lbnRzLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQgdGhhdCBlbWl0dGVkIHRoZSBjbG9zZSBldmVudC5cbiAgICovXG4gIGhhbmRsZUNsb3NlZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuY2xvc2UoaWQpO1xuICB9XG59XG4iLCJAZm9yIChtb2RhbCBvZiBtb2RhbHNTaWduYWwoKS52YWx1ZXMoKTsgdHJhY2sgbW9kYWwuaWQpIHtcbiAgPHRhZS1tb2RhbCBbbW9kYWxdPVwibW9kYWxcIiAoY2xvc2VkKT1cImhhbmRsZUNsb3NlZCgkZXZlbnQpXCIgLz5cbn1cbiJdfQ==
@@ -0,0 +1,135 @@
1
+ import { DestroyRef, Directive, effect, inject, input, untracked, ViewContainerRef, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Dynamically renders an Angular component and wires its signal inputs/outputs.
5
+ *
6
+ * This directive:
7
+ * - Creates/destroys the component when the type changes.
8
+ * - Applies inputs via `setInput`.
9
+ * - Subscribes to outputs and forwards emitted values to handlers.
10
+ * - Cleans subscriptions and the component instance on destroy.
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <ng-container
15
+ * taeDynamicComponent
16
+ * [component]="MyComponent"
17
+ * [inputs]="{ name: 'John', age: 25 }"
18
+ * [outputs]="{ submitted: (data) => handleSubmit(data) }"
19
+ * />
20
+ * ```
21
+ */
22
+ export class DynamicComponentDirective {
23
+ component = input.required();
24
+ inputs = input();
25
+ outputs = input();
26
+ viewContainer = inject(ViewContainerRef);
27
+ destroyRef = inject(DestroyRef);
28
+ // Current component instance reference managed by this directive.
29
+ componentRef;
30
+ outputSubscriptions = new Set();
31
+ constructor() {
32
+ // Recreate the component whenever the type changes.
33
+ effect(() => {
34
+ const componentType = this.component();
35
+ untracked(() => {
36
+ this.destroyComponent();
37
+ this.createComponent(componentType);
38
+ });
39
+ });
40
+ // Apply new inputs whenever the `inputs` signal changes.
41
+ effect(() => {
42
+ const inputsValue = this.inputs();
43
+ if (inputsValue && this.componentRef) {
44
+ untracked(() => this.applyInputs(inputsValue));
45
+ }
46
+ });
47
+ // Ensure cleanup if the host view is destroyed.
48
+ this.destroyRef.onDestroy(() => this.destroyComponent());
49
+ }
50
+ /**
51
+ * Creates the component and wires initial inputs/outputs.
52
+ * @param componentType Component type to instantiate.
53
+ */
54
+ createComponent(componentType) {
55
+ this.viewContainer.clear();
56
+ this.componentRef = this.viewContainer.createComponent(componentType);
57
+ const inputsValue = this.inputs();
58
+ if (inputsValue) {
59
+ this.applyInputs(inputsValue);
60
+ }
61
+ const outputsValue = this.outputs();
62
+ if (outputsValue) {
63
+ this.subscribeToOutputs(outputsValue);
64
+ }
65
+ this.componentRef.changeDetectorRef.detectChanges();
66
+ }
67
+ /**
68
+ * Applies input values to the component instance using `setInput`.
69
+ * @param inputs Input values keyed by input name.
70
+ */
71
+ applyInputs(inputs) {
72
+ if (!this.componentRef)
73
+ return;
74
+ Object.entries(inputs).forEach(([key, value]) => {
75
+ this.componentRef?.setInput(key, value);
76
+ });
77
+ this.componentRef.changeDetectorRef.markForCheck();
78
+ }
79
+ /**
80
+ * Subscribes to output signal emitters and forwards values to handlers.
81
+ * @param outputs Output handler map keyed by output name.
82
+ */
83
+ subscribeToOutputs(outputs) {
84
+ if (!this.componentRef)
85
+ return;
86
+ // Clear previous subscriptions before wiring new outputs.
87
+ this.clearOutputSubscriptions();
88
+ const instance = this.componentRef.instance;
89
+ Object.entries(outputs).forEach(([key, handler]) => {
90
+ if (typeof handler !== 'function')
91
+ return;
92
+ const output = instance[key];
93
+ // Subscribe to the output signal emitter if present.
94
+ if (this.isOutputEmitterRef(output)) {
95
+ const subscription = output.subscribe((value) => handler(value));
96
+ this.outputSubscriptions.add(subscription);
97
+ }
98
+ });
99
+ }
100
+ /**
101
+ * Clears all output subscriptions.
102
+ */
103
+ clearOutputSubscriptions() {
104
+ this.outputSubscriptions.forEach((sub) => sub.unsubscribe());
105
+ this.outputSubscriptions.clear();
106
+ }
107
+ /**
108
+ * Destroys the dynamic component and cleans subscriptions.
109
+ */
110
+ destroyComponent() {
111
+ this.clearOutputSubscriptions();
112
+ this.componentRef?.destroy();
113
+ this.componentRef = undefined;
114
+ }
115
+ /**
116
+ * Type guard for Angular signal output emitters.
117
+ * @param value Value to test.
118
+ */
119
+ isOutputEmitterRef(value) {
120
+ return (typeof value === 'object' &&
121
+ value !== null &&
122
+ 'subscribe' in value &&
123
+ typeof value['subscribe'] === 'function');
124
+ }
125
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DynamicComponentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
126
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.17", type: DynamicComponentDirective, isStandalone: true, selector: "[taeDynamicComponent]", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null }, outputs: { classPropertyName: "outputs", publicName: "outputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
127
+ }
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DynamicComponentDirective, decorators: [{
129
+ type: Directive,
130
+ args: [{
131
+ selector: '[taeDynamicComponent]',
132
+ standalone: true,
133
+ }]
134
+ }], ctorParameters: () => [] });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jb21wb25lbnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9tb2RhbC9kaXJlY3RpdmVzL2R5bmFtaWMtY29tcG9uZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFJTCxTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDOztBQU12Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBS0gsTUFBTSxPQUFPLHlCQUF5QjtJQUMzQixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO0lBQ3RDLE1BQU0sR0FBRyxLQUFLLEVBQXNCLENBQUM7SUFDckMsT0FBTyxHQUFHLEtBQUssRUFBdUIsQ0FBQztJQUUvQixhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxrRUFBa0U7SUFDMUQsWUFBWSxDQUFtQjtJQUN0QixtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUV4RTtRQUNFLG9EQUFvRDtRQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXZDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1Ys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Q0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCLENBQ3hCLEtBQWM7UUFFZCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixLQUFLLEtBQUssSUFBSTtZQUNkLFdBQVcsSUFBSSxLQUFLO1lBQ3BCLE9BQVEsS0FBaUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxVQUFVLENBQ3RFLENBQUM7SUFDSixDQUFDO3dHQWhJVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFKckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPdXRwdXRFbWl0dGVyUmVmLFxuICBPdXRwdXRSZWZTdWJzY3JpcHRpb24sXG4gIFR5cGUsXG4gIHVudHJhY2tlZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRJbnB1dHMsXG4gIENvbXBvbmVudE91dHB1dHMsXG59IGZyb20gJy4uLy4uL3V0aWxzL2FuZ3VsYXItY29tcG9uZW50LWlvJztcblxuLyoqXG4gKiBEeW5hbWljYWxseSByZW5kZXJzIGFuIEFuZ3VsYXIgY29tcG9uZW50IGFuZCB3aXJlcyBpdHMgc2lnbmFsIGlucHV0cy9vdXRwdXRzLlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlOlxuICogLSBDcmVhdGVzL2Rlc3Ryb3lzIHRoZSBjb21wb25lbnQgd2hlbiB0aGUgdHlwZSBjaGFuZ2VzLlxuICogLSBBcHBsaWVzIGlucHV0cyB2aWEgYHNldElucHV0YC5cbiAqIC0gU3Vic2NyaWJlcyB0byBvdXRwdXRzIGFuZCBmb3J3YXJkcyBlbWl0dGVkIHZhbHVlcyB0byBoYW5kbGVycy5cbiAqIC0gQ2xlYW5zIHN1YnNjcmlwdGlvbnMgYW5kIHRoZSBjb21wb25lbnQgaW5zdGFuY2Ugb24gZGVzdHJveS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPG5nLWNvbnRhaW5lclxuICogICB0YWVEeW5hbWljQ29tcG9uZW50XG4gKiAgIFtjb21wb25lbnRdPVwiTXlDb21wb25lbnRcIlxuICogICBbaW5wdXRzXT1cInsgbmFtZTogJ0pvaG4nLCBhZ2U6IDI1IH1cIlxuICogICBbb3V0cHV0c109XCJ7IHN1Ym1pdHRlZDogKGRhdGEpID0+IGhhbmRsZVN1Ym1pdChkYXRhKSB9XCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RhZUR5bmFtaWNDb21wb25lbnRdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0NvbXBvbmVudERpcmVjdGl2ZTxUPiB7XG4gIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFR5cGU8VD4+KCk7XG4gIHJlYWRvbmx5IGlucHV0cyA9IGlucHV0PENvbXBvbmVudElucHV0czxUPj4oKTtcbiAgcmVhZG9ubHkgb3V0cHV0cyA9IGlucHV0PENvbXBvbmVudE91dHB1dHM8VD4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgLy8gQ3VycmVudCBjb21wb25lbnQgaW5zdGFuY2UgcmVmZXJlbmNlIG1hbmFnZWQgYnkgdGhpcyBkaXJlY3RpdmUuXG4gIHByaXZhdGUgY29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPFQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dFN1YnNjcmlwdGlvbnMgPSBuZXcgU2V0PE91dHB1dFJlZlN1YnNjcmlwdGlvbj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBSZWNyZWF0ZSB0aGUgY29tcG9uZW50IHdoZW5ldmVyIHRoZSB0eXBlIGNoYW5nZXMuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSB0aGlzLmNvbXBvbmVudCgpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb21wb25lbnQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEFwcGx5IG5ldyBpbnB1dHMgd2hlbmV2ZXIgdGhlIGBpbnB1dHNgIHNpZ25hbCBjaGFuZ2VzLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dHNWYWx1ZSA9IHRoaXMuaW5wdXRzKCk7XG5cbiAgICAgIGlmIChpbnB1dHNWYWx1ZSAmJiB0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5hcHBseUlucHV0cyhpbnB1dHNWYWx1ZSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGNsZWFudXAgaWYgdGhlIGhvc3QgdmlldyBpcyBkZXN0cm95ZWQuXG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB0aGlzLmRlc3Ryb3lDb21wb25lbnQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgY29tcG9uZW50IGFuZCB3aXJlcyBpbml0aWFsIGlucHV0cy9vdXRwdXRzLlxuICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSBDb21wb25lbnQgdHlwZSB0byBpbnN0YW50aWF0ZS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IFR5cGU8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG5cbiAgICBjb25zdCBpbnB1dHNWYWx1ZSA9IHRoaXMuaW5wdXRzKCk7XG4gICAgaWYgKGlucHV0c1ZhbHVlKSB7XG4gICAgICB0aGlzLmFwcGx5SW5wdXRzKGlucHV0c1ZhbHVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRzVmFsdWUgPSB0aGlzLm91dHB1dHMoKTtcbiAgICBpZiAob3V0cHV0c1ZhbHVlKSB7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvT3V0cHV0cyhvdXRwdXRzVmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGlucHV0IHZhbHVlcyB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVzaW5nIGBzZXRJbnB1dGAuXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXQgdmFsdWVzIGtleWVkIGJ5IGlucHV0IG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5SW5wdXRzKGlucHV0czogQ29tcG9uZW50SW5wdXRzPFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikgcmV0dXJuO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoaW5wdXRzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5zZXRJbnB1dChrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gb3V0cHV0IHNpZ25hbCBlbWl0dGVycyBhbmQgZm9yd2FyZHMgdmFsdWVzIHRvIGhhbmRsZXJzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBPdXRwdXQgaGFuZGxlciBtYXAga2V5ZWQgYnkgb3V0cHV0IG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvT3V0cHV0cyhvdXRwdXRzOiBDb21wb25lbnRPdXRwdXRzPFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikgcmV0dXJuO1xuXG4gICAgLy8gQ2xlYXIgcHJldmlvdXMgc3Vic2NyaXB0aW9ucyBiZWZvcmUgd2lyaW5nIG5ldyBvdXRwdXRzLlxuICAgIHRoaXMuY2xlYXJPdXRwdXRTdWJzY3JpcHRpb25zKCk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgT2JqZWN0LmVudHJpZXMob3V0cHV0cykuZm9yRWFjaCgoW2tleSwgaGFuZGxlcl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBpbnN0YW5jZVtrZXldO1xuXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gdGhlIG91dHB1dCBzaWduYWwgZW1pdHRlciBpZiBwcmVzZW50LlxuICAgICAgaWYgKHRoaXMuaXNPdXRwdXRFbWl0dGVyUmVmKG91dHB1dCkpIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb3V0cHV0LnN1YnNjcmliZSgodmFsdWU6IHVua25vd24pID0+XG4gICAgICAgICAgaGFuZGxlcih2YWx1ZSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub3V0cHV0U3Vic2NyaXB0aW9ucy5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIG91dHB1dCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhck91dHB1dFN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRwdXRTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMub3V0cHV0U3Vic2NyaXB0aW9ucy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBkeW5hbWljIGNvbXBvbmVudCBhbmQgY2xlYW5zIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGRlc3Ryb3lDb21wb25lbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhck91dHB1dFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgZ3VhcmQgZm9yIEFuZ3VsYXIgc2lnbmFsIG91dHB1dCBlbWl0dGVycy5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHRlc3QuXG4gICAqL1xuICBwcml2YXRlIGlzT3V0cHV0RW1pdHRlclJlZihcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgKTogdmFsdWUgaXMgT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAnc3Vic2NyaWJlJyBpbiB2YWx1ZSAmJlxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ3N1YnNjcmliZSddID09PSAnZnVuY3Rpb24nXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,156 @@
1
+ import { Injectable, inject, signal } from '@angular/core';
2
+ import { MODAL_CONFIG } from './schema/modal.config';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Central registry and lifecycle manager for modal instances.
6
+ *
7
+ * This service creates modals, tracks their state, and coordinates
8
+ * open/close/remove behavior across the application.
9
+ */
10
+ export class ModalService {
11
+ /** Default modal configuration injected via `MODAL_CONFIG`. */
12
+ config = inject(MODAL_CONFIG);
13
+ /** Incrementing counter for modal id generation. */
14
+ id = 0;
15
+ /** Internal store of modals keyed by id. */
16
+ _modals = signal(new Map());
17
+ /** Read-only signal of all registered modals. */
18
+ modals = this._modals.asReadonly();
19
+ /**
20
+ * Creates a new modal instance and registers it.
21
+ * @param options Modal options used to initialize the instance.
22
+ * @returns A ModalRef for controlling the instance.
23
+ */
24
+ create(options = {}) {
25
+ // Create a new id and build the initial modal state.
26
+ const id = `modal-${++this.id}`;
27
+ const modal = this.buildModal(id, undefined, options);
28
+ // Persist to the internal store.
29
+ this.upsertModal(modal);
30
+ return {
31
+ id,
32
+ open: this.open.bind(this, id),
33
+ close: this.close.bind(this, id),
34
+ remove: this.remove.bind(this, id),
35
+ };
36
+ }
37
+ /**
38
+ * Opens a modal by id.
39
+ * @param id Modal id.
40
+ */
41
+ open(id) {
42
+ // Set open state to true if needed.
43
+ this.updateModalState(id, true);
44
+ }
45
+ /**
46
+ * Closes a modal by id.
47
+ * @param id Modal id.
48
+ */
49
+ close(id) {
50
+ const existing = this.getModal(id);
51
+ if (!existing?.isOpen)
52
+ return;
53
+ // Set open state to false and notify callbacks.
54
+ this.updateModalState(id, false);
55
+ existing.onClosed?.();
56
+ console.log('Modal closed:', id);
57
+ // Optionally remove the modal after closing.
58
+ if (existing.removeOnClose) {
59
+ this.remove(id);
60
+ }
61
+ }
62
+ /**
63
+ * Removes a modal from the registry and DOM.
64
+ * Closes the modal first if it is open.
65
+ * @param id Modal id.
66
+ */
67
+ remove(id) {
68
+ const existing = this.getModal(id);
69
+ if (!existing)
70
+ return;
71
+ // Remove from the internal store.
72
+ this._modals.update((modals) => {
73
+ const next = new Map(modals);
74
+ next.delete(id);
75
+ return next;
76
+ });
77
+ // Fire callbacks for cleanup.
78
+ if (existing.isOpen) {
79
+ existing.onClosed?.();
80
+ }
81
+ existing.onRemoved?.();
82
+ console.log('Modal removed:', id);
83
+ }
84
+ /**
85
+ * Closes all open modals.
86
+ */
87
+ closeAll() {
88
+ // Use service close to ensure removeOnClose behavior is honored.
89
+ this.modals().forEach((modal) => this.close(modal.id));
90
+ }
91
+ /**
92
+ * Removes all modals from the registry.
93
+ */
94
+ removeAll() {
95
+ // Use service remove to ensure callbacks are fired.
96
+ this.modals().forEach((modal) => this.remove(modal.id));
97
+ }
98
+ /**
99
+ * Looks up a modal by id.
100
+ * @param id Modal id.
101
+ */
102
+ getModal(id) {
103
+ return this._modals().get(id);
104
+ }
105
+ /**
106
+ * Updates the open/closed state of a modal if it exists.
107
+ * @param id Modal id.
108
+ * @param isOpen Desired open state.
109
+ */
110
+ updateModalState(id, isOpen) {
111
+ const existing = this.getModal(id);
112
+ if (!existing || existing.isOpen === isOpen)
113
+ return;
114
+ // Rebuild the modal with the new open state.
115
+ const updated = this.buildModal(id, existing, {}, isOpen);
116
+ this.upsertModal(updated);
117
+ }
118
+ /**
119
+ * Inserts or replaces a modal in the internal store.
120
+ * @param modal Modal to upsert.
121
+ */
122
+ upsertModal(modal) {
123
+ this._modals.update((modals) => new Map(modals).set(modal.id, modal));
124
+ }
125
+ /**
126
+ * Builds a modal instance by merging defaults, existing state, and options.
127
+ * @param id Modal id.
128
+ * @param existing Existing modal state (if any).
129
+ * @param options New options to apply.
130
+ * @param isOpen Optional override for open state.
131
+ */
132
+ buildModal(id, existing, options, isOpen) {
133
+ // Resolve initial open state from the override, options, existing state, or config.
134
+ const resolvedIsOpen = isOpen ??
135
+ options.startOpen ??
136
+ existing?.startOpen ??
137
+ this.config.startOpen;
138
+ // Merge config defaults, existing values, and new options.
139
+ return {
140
+ ...this.config,
141
+ ...existing,
142
+ ...options,
143
+ id,
144
+ isOpen: resolvedIsOpen,
145
+ };
146
+ }
147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
148
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, providedIn: 'root' });
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, decorators: [{
151
+ type: Injectable,
152
+ args: [{
153
+ providedIn: 'root',
154
+ }]
155
+ }] });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLHVCQUF1QixDQUFDOztBQUdsRTs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLCtEQUErRDtJQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFjLFlBQVksQ0FBQyxDQUFDO0lBRTVELG9EQUFvRDtJQUM1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsNENBQTRDO0lBQzNCLE9BQU8sR0FBRyxNQUFNLENBQXFCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVqRSxpREFBaUQ7SUFDeEMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFNUM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBSSxVQUEyQixFQUFFO1FBQ3JDLHFEQUFxRDtRQUNyRCxNQUFNLEVBQUUsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QixPQUFPO1lBQ0wsRUFBRTtZQUNGLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FB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Q0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFdBQVcsQ0FBQyxLQUFZO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxVQUFVLENBQ2hCLEVBQVUsRUFDVixRQUEyQixFQUMzQixPQUFxQixFQUNyQixNQUFnQjtRQUVoQixvRkFBb0Y7UUFDcEYsTUFBTSxjQUFjLEdBQ2xCLE1BQU07WUFDTixPQUFPLENBQUMsU0FBUztZQUNqQixRQUFRLEVBQUUsU0FBUztZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUV4QiwyREFBMkQ7UUFDM0QsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDZCxHQUFHLFFBQVE7WUFDWCxHQUFHLE9BQU87WUFDVixFQUFFO1lBQ0YsTUFBTSxFQUFFLGNBQWM7U0FDdkIsQ0FBQztJQUNKLENBQUM7d0dBOUpVLFlBQVk7NEdBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi9zY2hlbWEvbW9kYWwtcmVmJztcbmltcG9ydCB7IE1PREFMX0NPTkZJRywgTW9kYWxDb25maWcgfSBmcm9tICcuL3NjaGVtYS9tb2RhbC5jb25maWcnO1xuaW1wb3J0IHsgTW9kYWwsIE1vZGFsT3B0aW9ucyB9IGZyb20gJy4vc2NoZW1hL21vZGFsLm1vZGVsJztcblxuLyoqXG4gKiBDZW50cmFsIHJlZ2lzdHJ5IGFuZCBsaWZlY3ljbGUgbWFuYWdlciBmb3IgbW9kYWwgaW5zdGFuY2VzLlxuICpcbiAqIFRoaXMgc2VydmljZSBjcmVhdGVzIG1vZGFscywgdHJhY2tzIHRoZWlyIHN0YXRlLCBhbmQgY29vcmRpbmF0ZXNcbiAqIG9wZW4vY2xvc2UvcmVtb3ZlIGJlaGF2aW9yIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2Uge1xuICAvKiogRGVmYXVsdCBtb2RhbCBjb25maWd1cmF0aW9uIGluamVjdGVkIHZpYSBgTU9EQUxfQ09ORklHYC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3Q8TW9kYWxDb25maWc+KE1PREFMX0NPTkZJRyk7XG5cbiAgLyoqIEluY3JlbWVudGluZyBjb3VudGVyIGZvciBtb2RhbCBpZCBnZW5lcmF0aW9uLiAqL1xuICBwcml2YXRlIGlkID0gMDtcbiAgLyoqIEludGVybmFsIHN0b3JlIG9mIG1vZGFscyBrZXllZCBieSBpZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kYWxzID0gc2lnbmFsPE1hcDxzdHJpbmcsIE1vZGFsPj4obmV3IE1hcCgpKTtcblxuICAvKiogUmVhZC1vbmx5IHNpZ25hbCBvZiBhbGwgcmVnaXN0ZXJlZCBtb2RhbHMuICovXG4gIHJlYWRvbmx5IG1vZGFscyA9IHRoaXMuX21vZGFscy5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbW9kYWwgaW5zdGFuY2UgYW5kIHJlZ2lzdGVycyBpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgTW9kYWwgb3B0aW9ucyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIE1vZGFsUmVmIGZvciBjb250cm9sbGluZyB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBjcmVhdGU8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBNb2RhbFJlZiB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGlkIGFuZCBidWlsZCB0aGUgaW5pdGlhbCBtb2RhbCBzdGF0ZS5cbiAgICBjb25zdCBpZCA9IGBtb2RhbC0keysrdGhpcy5pZH1gO1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5idWlsZE1vZGFsKGlkLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIC8vIFBlcnNpc3QgdG8gdGhlIGludGVybmFsIHN0b3JlLlxuICAgIHRoaXMudXBzZXJ0TW9kYWwobW9kYWwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgb3BlbjogdGhpcy5vcGVuLmJpbmQodGhpcywgaWQpLFxuICAgICAgY2xvc2U6IHRoaXMuY2xvc2UuYmluZCh0aGlzLCBpZCksXG4gICAgICByZW1vdmU6IHRoaXMucmVtb3ZlLmJpbmQodGhpcywgaWQpLFxuICAgIH0gc2F0aXNmaWVzIE1vZGFsUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgbW9kYWwgYnkgaWQuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICovXG4gIG9wZW4oaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFNldCBvcGVuIHN0YXRlIHRvIHRydWUgaWYgbmVlZGVkLlxuICAgIHRoaXMudXBkYXRlTW9kYWxTdGF0ZShpZCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGEgbW9kYWwgYnkgaWQuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICovXG4gIGNsb3NlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0TW9kYWwoaWQpO1xuICAgIGlmICghZXhpc3Rpbmc/LmlzT3BlbikgcmV0dXJuO1xuXG4gICAgLy8gU2V0IG9wZW4gc3RhdGUgdG8gZmFsc2UgYW5kIG5vdGlmeSBjYWxsYmFja3MuXG4gICAgdGhpcy51cGRhdGVNb2RhbFN0YXRlKGlkLCBmYWxzZSk7XG4gICAgZXhpc3Rpbmcub25DbG9zZWQ/LigpO1xuICAgIGNvbnNvbGUubG9nKCdNb2RhbCBjbG9zZWQ6JywgaWQpO1xuXG4gICAgLy8gT3B0aW9uYWxseSByZW1vdmUgdGhlIG1vZGFsIGFmdGVyIGNsb3NpbmcuXG4gICAgaWYgKGV4aXN0aW5nLnJlbW92ZU9uQ2xvc2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlKGlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG1vZGFsIGZyb20gdGhlIHJlZ2lzdHJ5IGFuZCBET00uXG4gICAqIENsb3NlcyB0aGUgbW9kYWwgZmlyc3QgaWYgaXQgaXMgb3Blbi5cbiAgICogQHBhcmFtIGlkIE1vZGFsIGlkLlxuICAgKi9cbiAgcmVtb3ZlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0TW9kYWwoaWQpO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBmcm9tIHRoZSBpbnRlcm5hbCBzdG9yZS5cbiAgICB0aGlzLl9tb2RhbHMudXBkYXRlKChtb2RhbHMpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKG1vZGFscyk7XG4gICAgICBuZXh0LmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcblxuICAgIC8vIEZpcmUgY2FsbGJhY2tzIGZvciBjbGVhbnVwLlxuICAgIGlmIChleGlzdGluZy5pc09wZW4pIHtcbiAgICAgIGV4aXN0aW5nLm9uQ2xvc2VkPy4oKTtcbiAgICB9XG4gICAgZXhpc3Rpbmcub25SZW1vdmVkPy4oKTtcbiAgICBjb25zb2xlLmxvZygnTW9kYWwgcmVtb3ZlZDonLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBvcGVuIG1vZGFscy5cbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIC8vIFVzZSBzZXJ2aWNlIGNsb3NlIHRvIGVuc3VyZSByZW1vdmVPbkNsb3NlIGJlaGF2aW9yIGlzIGhvbm9yZWQuXG4gICAgdGhpcy5tb2RhbHMoKS5mb3JFYWNoKChtb2RhbCkgPT4gdGhpcy5jbG9zZShtb2RhbC5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG1vZGFscyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICovXG4gIHJlbW92ZUFsbCgpOiB2b2lkIHtcbiAgICAvLyBVc2Ugc2VydmljZSByZW1vdmUgdG8gZW5zdXJlIGNhbGxiYWNrcyBhcmUgZmlyZWQuXG4gICAgdGhpcy5tb2RhbHMoKS5mb3JFYWNoKChtb2RhbCkgPT4gdGhpcy5yZW1vdmUobW9kYWwuaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyB1cCBhIG1vZGFsIGJ5IGlkLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQuXG4gICAqL1xuICBwcml2YXRlIGdldE1vZGFsKGlkOiBzdHJpbmcpOiBNb2RhbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGFscygpLmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgb3Blbi9jbG9zZWQgc3RhdGUgb2YgYSBtb2RhbCBpZiBpdCBleGlzdHMuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICogQHBhcmFtIGlzT3BlbiBEZXNpcmVkIG9wZW4gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU1vZGFsU3RhdGUoaWQ6IHN0cmluZywgaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldE1vZGFsKGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLmlzT3BlbiA9PT0gaXNPcGVuKSByZXR1cm47XG5cbiAgICAvLyBSZWJ1aWxkIHRoZSBtb2RhbCB3aXRoIHRoZSBuZXcgb3BlbiBzdGF0ZS5cbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5idWlsZE1vZGFsKGlkLCBleGlzdGluZywge30sIGlzT3Blbik7XG4gICAgdGhpcy51cHNlcnRNb2RhbCh1cGRhdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIG9yIHJlcGxhY2VzIGEgbW9kYWwgaW4gdGhlIGludGVybmFsIHN0b3JlLlxuICAgKiBAcGFyYW0gbW9kYWwgTW9kYWwgdG8gdXBzZXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSB1cHNlcnRNb2RhbChtb2RhbDogTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbHMudXBkYXRlKChtb2RhbHMpID0+IG5ldyBNYXAobW9kYWxzKS5zZXQobW9kYWwuaWQsIG1vZGFsKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgbW9kYWwgaW5zdGFuY2UgYnkgbWVyZ2luZyBkZWZhdWx0cywgZXhpc3Rpbmcgc3RhdGUsIGFuZCBvcHRpb25zLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQuXG4gICAqIEBwYXJhbSBleGlzdGluZyBFeGlzdGluZyBtb2RhbCBzdGF0ZSAoaWYgYW55KS5cbiAgICogQHBhcmFtIG9wdGlvbnMgTmV3IG9wdGlvbnMgdG8gYXBwbHkuXG4gICAqIEBwYXJhbSBpc09wZW4gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIG9wZW4gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTW9kYWwoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBleGlzdGluZzogTW9kYWwgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogTW9kYWxPcHRpb25zLFxuICAgIGlzT3Blbj86IGJvb2xlYW4sXG4gICk6IE1vZGFsIHtcbiAgICAvLyBSZXNvbHZlIGluaXRpYWwgb3BlbiBzdGF0ZSBmcm9tIHRoZSBvdmVycmlkZSwgb3B0aW9ucywgZXhpc3Rpbmcgc3RhdGUsIG9yIGNvbmZpZy5cbiAgICBjb25zdCByZXNvbHZlZElzT3BlbiA9XG4gICAgICBpc09wZW4gPz9cbiAgICAgIG9wdGlvbnMuc3RhcnRPcGVuID8/XG4gICAgICBleGlzdGluZz8uc3RhcnRPcGVuID8/XG4gICAgICB0aGlzLmNvbmZpZy5zdGFydE9wZW47XG5cbiAgICAvLyBNZXJnZSBjb25maWcgZGVmYXVsdHMsIGV4aXN0aW5nIHZhbHVlcywgYW5kIG5ldyBvcHRpb25zLlxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGlkLFxuICAgICAgaXNPcGVuOiByZXNvbHZlZElzT3BlbixcbiAgICB9O1xuICB9XG59XG4iXX0=