@tsi-developpement/tsi-shared-ui 1.9.13 → 1.10.0

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 (25) hide show
  1. package/esm2022/lib/functions/currency-state.functions.mjs +203 -0
  2. package/esm2022/lib/pipes/tsi-currency.pipe.mjs +17 -19
  3. package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +3 -3
  4. package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +49 -28
  5. package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +46 -28
  6. package/esm2022/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.mjs +37 -10
  7. package/esm2022/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.mjs +33 -40
  8. package/esm2022/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.mjs +3 -3
  9. package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +3 -3
  10. package/esm2022/lib/tsi-components/poc/locale-poc/locale-poc.component.mjs +68 -36
  11. package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +1 -1
  12. package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +1 -1
  13. package/esm2022/lib/tsi-components/tsi-search-box/tsi-search-box.component.mjs +1 -1
  14. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +595 -319
  15. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
  16. package/lib/consts/app-providers.d.ts +1 -1
  17. package/lib/functions/currency-state.functions.d.ts +80 -0
  18. package/lib/pipes/tsi-currency.pipe.d.ts +6 -4
  19. package/lib/providers/shared-ui-tsi.provider.d.ts +1 -1
  20. package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +15 -10
  21. package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +13 -10
  22. package/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.d.ts +16 -6
  23. package/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.d.ts +12 -13
  24. package/lib/tsi-components/poc/locale-poc/locale-poc.component.d.ts +39 -21
  25. package/package.json +1 -1
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Internal currency-state resolution shared by the four currency components
3
+ * (Tsi-Currency-Other-Input/Display, Tsi-Currency-Societe-Input/Display).
4
+ *
5
+ * This module is intentionally NOT re-exported from `functions/index.ts`, so it
6
+ * is an internal implementation detail and not part of the library public API.
7
+ *
8
+ * A currency "state" combines two independent checks:
9
+ * 1. Is the currency code a recognized ISO-4217 code?
10
+ * 2. Does the value carry more decimal places than the currency supports?
11
+ * The result drives a two-tier visual state in the components:
12
+ * - `error` → invalid/missing code, or (inputs) a value that exceeds the
13
+ * currency's decimals and therefore cannot be safely edited;
14
+ * - `warning` → (displays) a value that exceeds the currency's decimals, shown
15
+ * raw so no precision is hidden.
16
+ */
17
+ /**
18
+ * i18n keys resolved by the host app's `LocalizePipe`. Centralized here so the
19
+ * components and the backend translation files (FR/EN/AR) stay in sync.
20
+ */
21
+ export const CurrencyStateKeys = {
22
+ noCurrencySupplied: 'sharedUi-currency-error-noCurrencySupplied',
23
+ invalidCurrencySupplied: 'sharedUi-currency-error-invalidCurrencySupplied',
24
+ valueExceedsDecimalsError: 'sharedUi-currency-error-valueExceedsDecimals',
25
+ valueExceedsDecimalsWarning: 'sharedUi-currency-warning-valueExceedsDecimals',
26
+ };
27
+ /**
28
+ * Placeholders replaced when building a message, so the currency and the decimal
29
+ * figures are named inline. Translations must include the tokens they need
30
+ * (see the FR/EN/AR translation files):
31
+ * - `{devise}` → the currency code
32
+ * - `{decimals}` → the value's decimal-place count (mismatch messages only)
33
+ * - `{allowed}` → the decimals the currency allows (mismatch messages only)
34
+ */
35
+ export const CurrencyPlaceholder = '{devise}';
36
+ export const ValueDecimalsPlaceholder = '{decimals}';
37
+ export const AllowedDecimalsPlaceholder = '{allowed}';
38
+ /**
39
+ * English fallbacks used when a translation key is missing, so a raw key slug is
40
+ * never displayed to the user. Currency-referencing messages embed the
41
+ * placeholders above.
42
+ */
43
+ const Fallbacks = {
44
+ [CurrencyStateKeys.noCurrencySupplied]: 'No currency provided',
45
+ [CurrencyStateKeys.invalidCurrencySupplied]: `Unrecognized currency: ${CurrencyPlaceholder}`,
46
+ [CurrencyStateKeys.valueExceedsDecimalsError]: `This amount has ${ValueDecimalsPlaceholder} decimals but the ${CurrencyPlaceholder} currency allows only ${AllowedDecimalsPlaceholder} — it cannot be edited`,
47
+ [CurrencyStateKeys.valueExceedsDecimalsWarning]: `This amount has ${ValueDecimalsPlaceholder} decimals but the ${CurrencyPlaceholder} currency allows only ${AllowedDecimalsPlaceholder}`,
48
+ };
49
+ const WELL_FORMED_CODE = /^[A-Z]{3}$/;
50
+ /**
51
+ * Memoized set of ISO-4217 codes the runtime recognizes, via
52
+ * `Intl.supportedValuesOf('currency')`. Returns `null` on runtimes that do not
53
+ * support the API, so callers can fall back to a well-formedness check.
54
+ */
55
+ let _supportedCurrencies;
56
+ function getSupportedCurrencies() {
57
+ if (_supportedCurrencies !== undefined) {
58
+ return _supportedCurrencies;
59
+ }
60
+ const intl = Intl;
61
+ if (typeof intl.supportedValuesOf === 'function') {
62
+ try {
63
+ _supportedCurrencies = new Set(intl.supportedValuesOf('currency'));
64
+ }
65
+ catch {
66
+ _supportedCurrencies = null;
67
+ }
68
+ }
69
+ else {
70
+ _supportedCurrencies = null;
71
+ }
72
+ return _supportedCurrencies;
73
+ }
74
+ /**
75
+ * Returns `true` when `code` is a recognized ISO-4217 currency code.
76
+ *
77
+ * Prefers the exact `Intl.supportedValuesOf('currency')` list; on older runtimes
78
+ * falls back to a 3-letter well-formedness check plus `Intl.NumberFormat`.
79
+ * Case-insensitive (the code is upper-cased before checking).
80
+ */
81
+ export function isValidCurrency(code) {
82
+ if (!code) {
83
+ return false;
84
+ }
85
+ const normalized = code.toUpperCase();
86
+ const supported = getSupportedCurrencies();
87
+ if (supported) {
88
+ return supported.has(normalized);
89
+ }
90
+ if (!WELL_FORMED_CODE.test(normalized)) {
91
+ return false;
92
+ }
93
+ try {
94
+ // eslint-disable-next-line no-new
95
+ new Intl.NumberFormat('en', { style: 'currency', currency: normalized });
96
+ return true;
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ /** Number of fraction digits the given currency supports (ISO/locale default). */
103
+ function getCurrencyDecimals(code, locale) {
104
+ try {
105
+ return new Intl.NumberFormat(locale, { style: 'currency', currency: code })
106
+ .resolvedOptions().maximumFractionDigits ?? 2;
107
+ }
108
+ catch {
109
+ return 2;
110
+ }
111
+ }
112
+ /**
113
+ * Counts the number of decimal places carried by a finite number, using its
114
+ * shortest round-trip string representation (handles exponential notation).
115
+ */
116
+ function countDecimals(value) {
117
+ if (!Number.isFinite(value)) {
118
+ return 0;
119
+ }
120
+ const str = Math.abs(value).toString();
121
+ if (str.indexOf('e-') !== -1) {
122
+ const [mantissa, exponent] = str.split('e-');
123
+ const mantissaDecimals = mantissa.includes('.') ? mantissa.split('.')[1].length : 0;
124
+ return mantissaDecimals + Number(exponent);
125
+ }
126
+ const dotIndex = str.indexOf('.');
127
+ return dotIndex === -1 ? 0 : str.length - dotIndex - 1;
128
+ }
129
+ /**
130
+ * Resolves the display state for a (currency code, value) pair.
131
+ *
132
+ * @param code ISO-4217 currency code supplied to the component.
133
+ * @param value the monetary value being shown/edited.
134
+ * @param locale locale used to derive the currency's fraction digits.
135
+ * @param mismatchSeverity severity applied when the value exceeds the currency's
136
+ * decimals: `'error'` for inputs (renders read-only),
137
+ * `'warning'` for displays (renders the raw value).
138
+ */
139
+ export function resolveCurrencyState(code, value, locale, mismatchSeverity) {
140
+ if (!code) {
141
+ return {
142
+ severity: 'error',
143
+ isValid: false,
144
+ tooltipKey: CurrencyStateKeys.noCurrencySupplied,
145
+ isoDecimals: -1,
146
+ };
147
+ }
148
+ const normalized = code.toUpperCase();
149
+ if (!isValidCurrency(normalized)) {
150
+ return {
151
+ severity: 'error',
152
+ isValid: false,
153
+ tooltipKey: CurrencyStateKeys.invalidCurrencySupplied,
154
+ isoDecimals: -1,
155
+ currencyCode: normalized,
156
+ };
157
+ }
158
+ const isoDecimals = getCurrencyDecimals(normalized, locale);
159
+ if (value != null && Number.isFinite(value)) {
160
+ const valueDecimals = countDecimals(value);
161
+ if (valueDecimals > isoDecimals) {
162
+ return {
163
+ severity: mismatchSeverity,
164
+ isValid: true,
165
+ tooltipKey: mismatchSeverity === 'warning'
166
+ ? CurrencyStateKeys.valueExceedsDecimalsWarning
167
+ : CurrencyStateKeys.valueExceedsDecimalsError,
168
+ isoDecimals,
169
+ valueDecimals,
170
+ currencyCode: normalized,
171
+ };
172
+ }
173
+ }
174
+ return {
175
+ severity: 'ok',
176
+ isValid: true,
177
+ tooltipKey: '',
178
+ isoDecimals,
179
+ currencyCode: normalized,
180
+ };
181
+ }
182
+ /**
183
+ * Builds the tooltip message for a resolved state using the supplied `translate`
184
+ * callback (typically `LocalizePipe.transform`). Falls back to a built-in
185
+ * English message when the key resolves to itself (missing translation), so a
186
+ * raw key slug is never shown. Any {@link CurrencyPlaceholder} token in the
187
+ * message is replaced with the currency code, so the offending currency is named
188
+ * inline.
189
+ */
190
+ export function localizeCurrencyState(state, translate) {
191
+ if (state.severity === 'ok' || !state.tooltipKey) {
192
+ return '';
193
+ }
194
+ const translated = translate(state.tooltipKey);
195
+ const message = !translated || translated === state.tooltipKey
196
+ ? (Fallbacks[state.tooltipKey] ?? '')
197
+ : translated;
198
+ return message
199
+ .split(CurrencyPlaceholder).join(state.currencyCode ?? '')
200
+ .split(ValueDecimalsPlaceholder).join(state.valueDecimals != null ? String(state.valueDecimals) : '')
201
+ .split(AllowedDecimalsPlaceholder).join(state.isoDecimals >= 0 ? String(state.isoDecimals) : '');
202
+ }
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktc3RhdGUuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL2Z1bmN0aW9ucy9jdXJyZW5jeS1zdGF0ZS5mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0Isa0JBQWtCLEVBQUUsNENBQTRDO0lBQ2hFLHVCQUF1QixFQUFFLGlEQUFpRDtJQUMxRSx5QkFBeUIsRUFBRSw4Q0FBOEM7SUFDekUsMkJBQTJCLEVBQUUsZ0RBQWdEO0NBQ3JFLENBQUM7QUFFWDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFlBQVksQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxXQUFXLENBQUM7QUFFdEQ7Ozs7R0FJRztBQUNILE1BQU0sU0FBUyxHQUEyQjtJQUN4QyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLEVBQUUsc0JBQXNCO0lBQzlELENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsRUFBRSwwQkFBMEIsbUJBQW1CLEVBQUU7SUFDNUYsQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUIsQ0FBQyxFQUMzQyxtQkFBbUIsd0JBQXdCLHFCQUFxQixtQkFBbUIseUJBQXlCLDBCQUEwQix3QkFBd0I7SUFDaEssQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxFQUM3QyxtQkFBbUIsd0JBQXdCLHFCQUFxQixtQkFBbUIseUJBQXlCLDBCQUEwQixFQUFFO0NBQzNJLENBQUM7QUFtQkYsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILElBQUksb0JB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QUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDcEcsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEludGVybmFsIGN1cnJlbmN5LXN0YXRlIHJlc29sdXRpb24gc2hhcmVkIGJ5IHRoZSBmb3VyIGN1cnJlbmN5IGNvbXBvbmVudHNcclxuICogKFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dC9EaXNwbGF5LCBUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dC9EaXNwbGF5KS5cclxuICpcclxuICogVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseSBOT1QgcmUtZXhwb3J0ZWQgZnJvbSBgZnVuY3Rpb25zL2luZGV4LnRzYCwgc28gaXRcclxuICogaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIGFuZCBub3QgcGFydCBvZiB0aGUgbGlicmFyeSBwdWJsaWMgQVBJLlxyXG4gKlxyXG4gKiBBIGN1cnJlbmN5IFwic3RhdGVcIiBjb21iaW5lcyB0d28gaW5kZXBlbmRlbnQgY2hlY2tzOlxyXG4gKiAgMS4gSXMgdGhlIGN1cnJlbmN5IGNvZGUgYSByZWNvZ25pemVkIElTTy00MjE3IGNvZGU/XHJcbiAqICAyLiBEb2VzIHRoZSB2YWx1ZSBjYXJyeSBtb3JlIGRlY2ltYWwgcGxhY2VzIHRoYW4gdGhlIGN1cnJlbmN5IHN1cHBvcnRzP1xyXG4gKiBUaGUgcmVzdWx0IGRyaXZlcyBhIHR3by10aWVyIHZpc3VhbCBzdGF0ZSBpbiB0aGUgY29tcG9uZW50czpcclxuICogIC0gYGVycm9yYCAgIOKGkiBpbnZhbGlkL21pc3NpbmcgY29kZSwgb3IgKGlucHV0cykgYSB2YWx1ZSB0aGF0IGV4Y2VlZHMgdGhlXHJcbiAqICAgICAgICAgICAgICAgIGN1cnJlbmN5J3MgZGVjaW1hbHMgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZDtcclxuICogIC0gYHdhcm5pbmdgIOKGkiAoZGlzcGxheXMpIGEgdmFsdWUgdGhhdCBleGNlZWRzIHRoZSBjdXJyZW5jeSdzIGRlY2ltYWxzLCBzaG93blxyXG4gKiAgICAgICAgICAgICAgICByYXcgc28gbm8gcHJlY2lzaW9uIGlzIGhpZGRlbi5cclxuICovXHJcblxyXG4vKipcclxuICogaTE4biBrZXlzIHJlc29sdmVkIGJ5IHRoZSBob3N0IGFwcCdzIGBMb2NhbGl6ZVBpcGVgLiBDZW50cmFsaXplZCBoZXJlIHNvIHRoZVxyXG4gKiBjb21wb25lbnRzIGFuZCB0aGUgYmFja2VuZCB0cmFuc2xhdGlvbiBmaWxlcyAoRlIvRU4vQVIpIHN0YXkgaW4gc3luYy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBDdXJyZW5jeVN0YXRlS2V5cyA9IHtcclxuICBub0N1cnJlbmN5U3VwcGxpZWQ6ICdzaGFyZWRVaS1jdXJyZW5jeS1lcnJvci1ub0N1cnJlbmN5U3VwcGxpZWQnLFxyXG4gIGludmFsaWRDdXJyZW5jeVN1cHBsaWVkOiAnc2hhcmVkVWktY3VycmVuY3ktZXJyb3ItaW52YWxpZEN1cnJlbmN5U3VwcGxpZWQnLFxyXG4gIHZhbHVlRXhjZWVkc0RlY2ltYWxzRXJyb3I6ICdzaGFyZWRVaS1jdXJyZW5jeS1lcnJvci12YWx1ZUV4Y2VlZHNEZWNpbWFscycsXHJcbiAgdmFsdWVFeGNlZWRzRGVjaW1hbHNXYXJuaW5nOiAnc2hhcmVkVWktY3VycmVuY3ktd2FybmluZy12YWx1ZUV4Y2VlZHNEZWNpbWFscycsXHJcbn0gYXMgY29uc3Q7XHJcblxyXG4vKipcclxuICogUGxhY2Vob2xkZXJzIHJlcGxhY2VkIHdoZW4gYnVpbGRpbmcgYSBtZXNzYWdlLCBzbyB0aGUgY3VycmVuY3kgYW5kIHRoZSBkZWNpbWFsXHJcbiAqIGZpZ3VyZXMgYXJlIG5hbWVkIGlubGluZS4gVHJhbnNsYXRpb25zIG11c3QgaW5jbHVkZSB0aGUgdG9rZW5zIHRoZXkgbmVlZFxyXG4gKiAoc2VlIHRoZSBGUi9FTi9BUiB0cmFuc2xhdGlvbiBmaWxlcyk6XHJcbiAqICAtIGB7ZGV2aXNlfWAgICDihpIgdGhlIGN1cnJlbmN5IGNvZGVcclxuICogIC0gYHtkZWNpbWFsc31gIOKGkiB0aGUgdmFsdWUncyBkZWNpbWFsLXBsYWNlIGNvdW50IChtaXNtYXRjaCBtZXNzYWdlcyBvbmx5KVxyXG4gKiAgLSBge2FsbG93ZWR9YCAg4oaSIHRoZSBkZWNpbWFscyB0aGUgY3VycmVuY3kgYWxsb3dzIChtaXNtYXRjaCBtZXNzYWdlcyBvbmx5KVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1cnJlbmN5UGxhY2Vob2xkZXIgPSAne2RldmlzZX0nO1xyXG5leHBvcnQgY29uc3QgVmFsdWVEZWNpbWFsc1BsYWNlaG9sZGVyID0gJ3tkZWNpbWFsc30nO1xyXG5leHBvcnQgY29uc3QgQWxsb3dlZERlY2ltYWxzUGxhY2Vob2xkZXIgPSAne2FsbG93ZWR9JztcclxuXHJcbi8qKlxyXG4gKiBFbmdsaXNoIGZhbGxiYWNrcyB1c2VkIHdoZW4gYSB0cmFuc2xhdGlvbiBrZXkgaXMgbWlzc2luZywgc28gYSByYXcga2V5IHNsdWcgaXNcclxuICogbmV2ZXIgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBDdXJyZW5jeS1yZWZlcmVuY2luZyBtZXNzYWdlcyBlbWJlZCB0aGVcclxuICogcGxhY2Vob2xkZXJzIGFib3ZlLlxyXG4gKi9cclxuY29uc3QgRmFsbGJhY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gIFtDdXJyZW5jeVN0YXRlS2V5cy5ub0N1cnJlbmN5U3VwcGxpZWRdOiAnTm8gY3VycmVuY3kgcHJvdmlkZWQnLFxyXG4gIFtDdXJyZW5jeVN0YXRlS2V5cy5pbnZhbGlkQ3VycmVuY3lTdXBwbGllZF06IGBVbnJlY29nbml6ZWQgY3VycmVuY3k6ICR7Q3VycmVuY3lQbGFjZWhvbGRlcn1gLFxyXG4gIFtDdXJyZW5jeVN0YXRlS2V5cy52YWx1ZUV4Y2VlZHNEZWNpbWFsc0Vycm9yXTpcclxuICAgIGBUaGlzIGFtb3VudCBoYXMgJHtWYWx1ZURlY2ltYWxzUGxhY2Vob2xkZXJ9IGRlY2ltYWxzIGJ1dCB0aGUgJHtDdXJyZW5jeVBsYWNlaG9sZGVyfSBjdXJyZW5jeSBhbGxvd3Mgb25seSAke0FsbG93ZWREZWNpbWFsc1BsYWNlaG9sZGVyfSDigJQgaXQgY2Fubm90IGJlIGVkaXRlZGAsXHJcbiAgW0N1cnJlbmN5U3RhdGVLZXlzLnZhbHVlRXhjZWVkc0RlY2ltYWxzV2FybmluZ106XHJcbiAgICBgVGhpcyBhbW91bnQgaGFzICR7VmFsdWVEZWNpbWFsc1BsYWNlaG9sZGVyfSBkZWNpbWFscyBidXQgdGhlICR7Q3VycmVuY3lQbGFjZWhvbGRlcn0gY3VycmVuY3kgYWxsb3dzIG9ubHkgJHtBbGxvd2VkRGVjaW1hbHNQbGFjZWhvbGRlcn1gLFxyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgQ3VycmVuY3lTdGF0ZVNldmVyaXR5ID0gJ29rJyB8ICdlcnJvcicgfCAnd2FybmluZyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbmN5U3RhdGUge1xyXG4gIC8qKiBPdmVyYWxsIHNldmVyaXR5IG9mIHRoZSBjdXJyZW50IChjb2RlLCB2YWx1ZSkgcGFpci4gKi9cclxuICBzZXZlcml0eTogQ3VycmVuY3lTdGF0ZVNldmVyaXR5O1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBjdXJyZW5jeSBjb2RlIGl0c2VsZiBpcyBhIHJlY29nbml6ZWQgSVNPLTQyMTcgY29kZS4gKi9cclxuICBpc1ZhbGlkOiBib29sZWFuO1xyXG4gIC8qKiBUcmFuc2xhdGlvbiBrZXkgZm9yIHRoZSB0b29sdGlwIG1lc3NhZ2UgKGVtcHR5IHdoZW4gc2V2ZXJpdHkgPT09ICdvaycpLiAqL1xyXG4gIHRvb2x0aXBLZXk6IHN0cmluZztcclxuICAvKiogRnJhY3Rpb24gZGlnaXRzIHRoZSBjdXJyZW5jeSBzdXBwb3J0cyAoSVNPL2xvY2FsZSBkZWZhdWx0KTsgLTEgaWYgdW5rbm93bi4gKi9cclxuICBpc29EZWNpbWFsczogbnVtYmVyO1xyXG4gIC8qKiBEZWNpbWFsIHBsYWNlcyB0aGUgdmFsdWUgY2Fycmllczsgc2V0IG9ubHkgb24gYSBkZWNpbWFscyBtaXNtYXRjaC4gKi9cclxuICB2YWx1ZURlY2ltYWxzPzogbnVtYmVyO1xyXG4gIC8qKiBOb3JtYWxpemVkICh1cHBlci1jYXNlZCkgY3VycmVuY3kgY29kZSwgd2hlbiBvbmUgd2FzIHN1cHBsaWVkLiAqL1xyXG4gIGN1cnJlbmN5Q29kZT86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgV0VMTF9GT1JNRURfQ09ERSA9IC9eW0EtWl17M30kLztcclxuXHJcbi8qKlxyXG4gKiBNZW1vaXplZCBzZXQgb2YgSVNPLTQyMTcgY29kZXMgdGhlIHJ1bnRpbWUgcmVjb2duaXplcywgdmlhXHJcbiAqIGBJbnRsLnN1cHBvcnRlZFZhbHVlc09mKCdjdXJyZW5jeScpYC4gUmV0dXJucyBgbnVsbGAgb24gcnVudGltZXMgdGhhdCBkbyBub3RcclxuICogc3VwcG9ydCB0aGUgQVBJLCBzbyBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gYSB3ZWxsLWZvcm1lZG5lc3MgY2hlY2suXHJcbiAqL1xyXG5sZXQgX3N1cHBvcnRlZEN1cnJlbmNpZXM6IFNldDxzdHJpbmc+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuZnVuY3Rpb24gZ2V0U3VwcG9ydGVkQ3VycmVuY2llcygpOiBTZXQ8c3RyaW5nPiB8IG51bGwge1xyXG4gIGlmIChfc3VwcG9ydGVkQ3VycmVuY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gX3N1cHBvcnRlZEN1cnJlbmNpZXM7XHJcbiAgfVxyXG4gIGNvbnN0IGludGwgPSBJbnRsIGFzIHVua25vd24gYXMgeyBzdXBwb3J0ZWRWYWx1ZXNPZj86IChrZXk6IHN0cmluZykgPT4gc3RyaW5nW10gfTtcclxuICBpZiAodHlwZW9mIGludGwuc3VwcG9ydGVkVmFsdWVzT2YgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIF9zdXBwb3J0ZWRDdXJyZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KGludGwuc3VwcG9ydGVkVmFsdWVzT2YoJ2N1cnJlbmN5JykpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIF9zdXBwb3J0ZWRDdXJyZW5jaWVzID0gbnVsbDtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgX3N1cHBvcnRlZEN1cnJlbmNpZXMgPSBudWxsO1xyXG4gIH1cclxuICByZXR1cm4gX3N1cHBvcnRlZEN1cnJlbmNpZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGBjb2RlYCBpcyBhIHJlY29nbml6ZWQgSVNPLTQyMTcgY3VycmVuY3kgY29kZS5cclxuICpcclxuICogUHJlZmVycyB0aGUgZXhhY3QgYEludGwuc3VwcG9ydGVkVmFsdWVzT2YoJ2N1cnJlbmN5JylgIGxpc3Q7IG9uIG9sZGVyIHJ1bnRpbWVzXHJcbiAqIGZhbGxzIGJhY2sgdG8gYSAzLWxldHRlciB3ZWxsLWZvcm1lZG5lc3MgY2hlY2sgcGx1cyBgSW50bC5OdW1iZXJGb3JtYXRgLlxyXG4gKiBDYXNlLWluc2Vuc2l0aXZlICh0aGUgY29kZSBpcyB1cHBlci1jYXNlZCBiZWZvcmUgY2hlY2tpbmcpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDdXJyZW5jeShjb2RlPzogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgaWYgKCFjb2RlKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBjb2RlLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gIGNvbnN0IHN1cHBvcnRlZCA9IGdldFN1cHBvcnRlZEN1cnJlbmNpZXMoKTtcclxuICBpZiAoc3VwcG9ydGVkKSB7XHJcbiAgICByZXR1cm4gc3VwcG9ydGVkLmhhcyhub3JtYWxpemVkKTtcclxuICB9XHJcblxyXG4gIGlmICghV0VMTF9GT1JNRURfQ09ERS50ZXN0KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XHJcbiAgICBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ2VuJywgeyBzdHlsZTogJ2N1cnJlbmN5JywgY3VycmVuY3k6IG5vcm1hbGl6ZWQgfSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBOdW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRoZSBnaXZlbiBjdXJyZW5jeSBzdXBwb3J0cyAoSVNPL2xvY2FsZSBkZWZhdWx0KS4gKi9cclxuZnVuY3Rpb24gZ2V0Q3VycmVuY3lEZWNpbWFscyhjb2RlOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5OiBjb2RlIH0pXHJcbiAgICAgIC5yZXNvbHZlZE9wdGlvbnMoKS5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPz8gMjtcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiAyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGNhcnJpZWQgYnkgYSBmaW5pdGUgbnVtYmVyLCB1c2luZyBpdHNcclxuICogc2hvcnRlc3Qgcm91bmQtdHJpcCBzdHJpbmcgcmVwcmVzZW50YXRpb24gKGhhbmRsZXMgZXhwb25lbnRpYWwgbm90YXRpb24pLlxyXG4gKi9cclxuZnVuY3Rpb24gY291bnREZWNpbWFscyh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICBjb25zdCBzdHIgPSBNYXRoLmFicyh2YWx1ZSkudG9TdHJpbmcoKTtcclxuICBpZiAoc3RyLmluZGV4T2YoJ2UtJykgIT09IC0xKSB7XHJcbiAgICBjb25zdCBbbWFudGlzc2EsIGV4cG9uZW50XSA9IHN0ci5zcGxpdCgnZS0nKTtcclxuICAgIGNvbnN0IG1hbnRpc3NhRGVjaW1hbHMgPSBtYW50aXNzYS5pbmNsdWRlcygnLicpID8gbWFudGlzc2Euc3BsaXQoJy4nKVsxXS5sZW5ndGggOiAwO1xyXG4gICAgcmV0dXJuIG1hbnRpc3NhRGVjaW1hbHMgKyBOdW1iZXIoZXhwb25lbnQpO1xyXG4gIH1cclxuICBjb25zdCBkb3RJbmRleCA9IHN0ci5pbmRleE9mKCcuJyk7XHJcbiAgcmV0dXJuIGRvdEluZGV4ID09PSAtMSA/IDAgOiBzdHIubGVuZ3RoIC0gZG90SW5kZXggLSAxO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZXMgdGhlIGRpc3BsYXkgc3RhdGUgZm9yIGEgKGN1cnJlbmN5IGNvZGUsIHZhbHVlKSBwYWlyLlxyXG4gKlxyXG4gKiBAcGFyYW0gY29kZSAgICAgICAgICAgICBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIHN1cHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXHJcbiAqIEBwYXJhbSB2YWx1ZSAgICAgICAgICAgIHRoZSBtb25ldGFyeSB2YWx1ZSBiZWluZyBzaG93bi9lZGl0ZWQuXHJcbiAqIEBwYXJhbSBsb2NhbGUgICAgICAgICAgIGxvY2FsZSB1c2VkIHRvIGRlcml2ZSB0aGUgY3VycmVuY3kncyBmcmFjdGlvbiBkaWdpdHMuXHJcbiAqIEBwYXJhbSBtaXNtYXRjaFNldmVyaXR5IHNldmVyaXR5IGFwcGxpZWQgd2hlbiB0aGUgdmFsdWUgZXhjZWVkcyB0aGUgY3VycmVuY3knc1xyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsczogYCdlcnJvcidgIGZvciBpbnB1dHMgKHJlbmRlcnMgcmVhZC1vbmx5KSxcclxuICogICAgICAgICAgICAgICAgICAgICAgICAgYCd3YXJuaW5nJ2AgZm9yIGRpc3BsYXlzIChyZW5kZXJzIHRoZSByYXcgdmFsdWUpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDdXJyZW5jeVN0YXRlKFxyXG4gIGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICB2YWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICBsb2NhbGU6IHN0cmluZyxcclxuICBtaXNtYXRjaFNldmVyaXR5OiAnZXJyb3InIHwgJ3dhcm5pbmcnXHJcbik6IEN1cnJlbmN5U3RhdGUge1xyXG4gIGlmICghY29kZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXHJcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgICB0b29sdGlwS2V5OiBDdXJyZW5jeVN0YXRlS2V5cy5ub0N1cnJlbmN5U3VwcGxpZWQsXHJcbiAgICAgIGlzb0RlY2ltYWxzOiAtMSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBub3JtYWxpemVkID0gY29kZS50b1VwcGVyQ2FzZSgpO1xyXG4gIGlmICghaXNWYWxpZEN1cnJlbmN5KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgaXNWYWxpZDogZmFsc2UsXHJcbiAgICAgIHRvb2x0aXBLZXk6IEN1cnJlbmN5U3RhdGVLZXlzLmludmFsaWRDdXJyZW5jeVN1cHBsaWVkLFxyXG4gICAgICBpc29EZWNpbWFsczogLTEsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogbm9ybWFsaXplZCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBpc29EZWNpbWFscyA9IGdldEN1cnJlbmN5RGVjaW1hbHMobm9ybWFsaXplZCwgbG9jYWxlKTtcclxuICBpZiAodmFsdWUgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XHJcbiAgICBjb25zdCB2YWx1ZURlY2ltYWxzID0gY291bnREZWNpbWFscyh2YWx1ZSk7XHJcbiAgICBpZiAodmFsdWVEZWNpbWFscyA+IGlzb0RlY2ltYWxzKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc2V2ZXJpdHk6IG1pc21hdGNoU2V2ZXJpdHksXHJcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcclxuICAgICAgICB0b29sdGlwS2V5OiBtaXNtYXRjaFNldmVyaXR5ID09PSAnd2FybmluZydcclxuICAgICAgICAgID8gQ3VycmVuY3lTdGF0ZUtleXMudmFsdWVFeGNlZWRzRGVjaW1hbHNXYXJuaW5nXHJcbiAgICAgICAgICA6IEN1cnJlbmN5U3RhdGVLZXlzLnZhbHVlRXhjZWVkc0RlY2ltYWxzRXJyb3IsXHJcbiAgICAgICAgaXNvRGVjaW1hbHMsXHJcbiAgICAgICAgdmFsdWVEZWNpbWFscyxcclxuICAgICAgICBjdXJyZW5jeUNvZGU6IG5vcm1hbGl6ZWQsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2V2ZXJpdHk6ICdvaycsXHJcbiAgICBpc1ZhbGlkOiB0cnVlLFxyXG4gICAgdG9vbHRpcEtleTogJycsXHJcbiAgICBpc29EZWNpbWFscyxcclxuICAgIGN1cnJlbmN5Q29kZTogbm9ybWFsaXplZCxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHRoZSB0b29sdGlwIG1lc3NhZ2UgZm9yIGEgcmVzb2x2ZWQgc3RhdGUgdXNpbmcgdGhlIHN1cHBsaWVkIGB0cmFuc2xhdGVgXHJcbiAqIGNhbGxiYWNrICh0eXBpY2FsbHkgYExvY2FsaXplUGlwZS50cmFuc2Zvcm1gKS4gRmFsbHMgYmFjayB0byBhIGJ1aWx0LWluXHJcbiAqIEVuZ2xpc2ggbWVzc2FnZSB3aGVuIHRoZSBrZXkgcmVzb2x2ZXMgdG8gaXRzZWxmIChtaXNzaW5nIHRyYW5zbGF0aW9uKSwgc28gYVxyXG4gKiByYXcga2V5IHNsdWcgaXMgbmV2ZXIgc2hvd24uIEFueSB7QGxpbmsgQ3VycmVuY3lQbGFjZWhvbGRlcn0gdG9rZW4gaW4gdGhlXHJcbiAqIG1lc3NhZ2UgaXMgcmVwbGFjZWQgd2l0aCB0aGUgY3VycmVuY3kgY29kZSwgc28gdGhlIG9mZmVuZGluZyBjdXJyZW5jeSBpcyBuYW1lZFxyXG4gKiBpbmxpbmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxpemVDdXJyZW5jeVN0YXRlKFxyXG4gIHN0YXRlOiBDdXJyZW5jeVN0YXRlLFxyXG4gIHRyYW5zbGF0ZTogKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcclxuKTogc3RyaW5nIHtcclxuICBpZiAoc3RhdGUuc2V2ZXJpdHkgPT09ICdvaycgfHwgIXN0YXRlLnRvb2x0aXBLZXkpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGNvbnN0IHRyYW5zbGF0ZWQgPSB0cmFuc2xhdGUoc3RhdGUudG9vbHRpcEtleSk7XHJcbiAgY29uc3QgbWVzc2FnZSA9ICF0cmFuc2xhdGVkIHx8IHRyYW5zbGF0ZWQgPT09IHN0YXRlLnRvb2x0aXBLZXlcclxuICAgID8gKEZhbGxiYWNrc1tzdGF0ZS50b29sdGlwS2V5XSA/PyAnJylcclxuICAgIDogdHJhbnNsYXRlZDtcclxuXHJcbiAgcmV0dXJuIG1lc3NhZ2VcclxuICAgIC5zcGxpdChDdXJyZW5jeVBsYWNlaG9sZGVyKS5qb2luKHN0YXRlLmN1cnJlbmN5Q29kZSA/PyAnJylcclxuICAgIC5zcGxpdChWYWx1ZURlY2ltYWxzUGxhY2Vob2xkZXIpLmpvaW4oc3RhdGUudmFsdWVEZWNpbWFscyAhPSBudWxsID8gU3RyaW5nKHN0YXRlLnZhbHVlRGVjaW1hbHMpIDogJycpXHJcbiAgICAuc3BsaXQoQWxsb3dlZERlY2ltYWxzUGxhY2Vob2xkZXIpLmpvaW4oc3RhdGUuaXNvRGVjaW1hbHMgPj0gMCA/IFN0cmluZyhzdGF0ZS5pc29EZWNpbWFscykgOiAnJyk7XHJcbn1cclxuIl19
@@ -1,29 +1,27 @@
1
- import { Pipe } from '@angular/core';
2
- import { locals } from '../consts/locals.const';
1
+ import { CurrencyPipe } from '@angular/common';
2
+ import { inject, Pipe } from '@angular/core';
3
+ import { LocalizationService } from '../services/localization/localization.service';
3
4
  import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
5
  export class TsiCurrencyPipe {
6
- constructor(currencyPipe) {
7
- this.currencyPipe = currencyPipe;
6
+ // Ctor
7
+ constructor() {
8
+ // Local props
9
+ this._display = 'symbol';
10
+ // DI
11
+ this._localizationService = inject(LocalizationService);
12
+ this._currencyPipe = inject(CurrencyPipe);
13
+ this._locale = this._localizationService.locale;
8
14
  }
9
- transform(value, currencyCode, display = 'symbol', digitsInfo = '', locale = 'en-US') {
10
- let formattedValue = this.currencyPipe.transform(value, currencyCode, display, digitsInfo, locale);
11
- if (locale != locals.arabicLocal) {
12
- return formattedValue;
13
- }
14
- if (!formattedValue)
15
- return null;
16
- const currencySymbol = formattedValue.match(/[^0-9,.]/g)?.join('') || '';
17
- formattedValue = formattedValue.replace(currencySymbol, '');
18
- return `${formattedValue} ${currencySymbol}`;
15
+ transform(value, currencyCode) {
16
+ return this._currencyPipe.transform(value, currencyCode, this._display, undefined, this._locale);
19
17
  }
20
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, deps: [{ token: i1.CurrencyPipe }], target: i0.ɵɵFactoryTarget.Pipe }); }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
21
19
  static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, name: "tsiCurrency" }); }
22
20
  }
23
21
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, decorators: [{
24
22
  type: Pipe,
25
23
  args: [{
26
- name: 'tsiCurrency',
24
+ name: 'tsiCurrency'
27
25
  }]
28
- }], ctorParameters: () => [{ type: i1.CurrencyPipe }] });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWN1cnJlbmN5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvcGlwZXMvdHNpLWN1cnJlbmN5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFLaEQsTUFBTSxPQUFPLGVBQWU7SUFFMUIsWUFBb0IsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7SUFBSSxDQUFDO0lBRW5ELFNBQVMsQ0FDUCxLQUF5QixFQUN6QixZQUFvQixFQUNwQixVQUF3RCxRQUFRLEVBQ2hFLGFBQXFCLEVBQUUsRUFDdkIsU0FBaUIsT0FBTztRQUV4QixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDOUMsS0FBSyxFQUNMLFlBQVksRUFDWixPQUFPLEVBQ1AsVUFBVSxFQUNWLE1BQU0sQ0FDUCxDQUFDO1FBRUYsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWpDLE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFNUQsT0FBTyxHQUFHLGNBQWMsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUMvQyxDQUFDOytHQTdCVSxlQUFlOzZHQUFmLGVBQWU7OzRGQUFmLGVBQWU7a0JBSDNCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGFBQWE7aUJBQ3BCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBsb2NhbHMgfSBmcm9tICcuLi9jb25zdHMvbG9jYWxzLmNvbnN0JztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAndHNpQ3VycmVuY3knLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpQ3VycmVuY3lQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSkgeyB9XHJcblxyXG4gIHRyYW5zZm9ybShcclxuICAgIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsXHJcbiAgICBjdXJyZW5jeUNvZGU6IHN0cmluZyxcclxuICAgIGRpc3BsYXk6ICdjb2RlJyB8ICdzeW1ib2wnIHwgJ3N5bWJvbC1uYXJyb3cnIHwgc3RyaW5nID0gJ3N5bWJvbCcsXHJcbiAgICBkaWdpdHNJbmZvOiBzdHJpbmcgPSAnJyxcclxuICAgIGxvY2FsZTogc3RyaW5nID0gJ2VuLVVTJ1xyXG4gICk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgbGV0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgY3VycmVuY3lDb2RlLFxyXG4gICAgICBkaXNwbGF5LFxyXG4gICAgICBkaWdpdHNJbmZvLFxyXG4gICAgICBsb2NhbGVcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGxvY2FsZSAhPSBsb2NhbHMuYXJhYmljTG9jYWwpIHtcclxuICAgICAgcmV0dXJuIGZvcm1hdHRlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZm9ybWF0dGVkVmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbmN5U3ltYm9sID0gZm9ybWF0dGVkVmFsdWUubWF0Y2goL1teMC05LC5dL2cpPy5qb2luKCcnKSB8fCAnJztcclxuICAgIGZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWUucmVwbGFjZShjdXJyZW5jeVN5bWJvbCwgJycpO1xyXG5cclxuICAgIHJldHVybiBgJHtmb3JtYXR0ZWRWYWx1ZX0gJHtjdXJyZW5jeVN5bWJvbH1gO1xyXG4gIH1cclxufVxyXG4iXX0=
26
+ }], ctorParameters: () => [] });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWN1cnJlbmN5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvcGlwZXMvdHNpLWN1cnJlbmN5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUU1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7QUFLcEYsTUFBTSxPQUFPLGVBQWU7SUFTMUIsT0FBTztJQUNQO1FBVEEsY0FBYztRQUNHLGFBQVEsR0FBVyxRQUFRLENBQUM7UUFHN0MsS0FBSztRQUNHLHlCQUFvQixHQUF3QixNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN4RSxrQkFBYSxHQUFpQixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFLekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0lBQ2xELENBQUM7SUFFRCxTQUFTLENBQUMsS0FBeUIsRUFBRSxZQUFvQjtRQUN2RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25HLENBQUM7K0dBakJVLGVBQWU7NkdBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFIM0IsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsYUFBYTtpQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBpbmplY3QsIFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTG9jYWxlQ29kZSB9IGZyb20gJy4uL2VudW1zL0xhbmd1YWdlJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsaXphdGlvbi9sb2NhbGl6YXRpb24uc2VydmljZSc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ3RzaUN1cnJlbmN5J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpQ3VycmVuY3lQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgLy8gTG9jYWwgcHJvcHNcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNwbGF5OiBzdHJpbmcgPSAnc3ltYm9sJztcclxuICBwcml2YXRlIF9sb2NhbGU6IExvY2FsZUNvZGU7XHJcblxyXG4gIC8vIERJXHJcbiAgcHJpdmF0ZSBfbG9jYWxpemF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSA9IGluamVjdChMb2NhbGl6YXRpb25TZXJ2aWNlKTtcclxuICBwcml2YXRlIF9jdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSA9IGluamVjdChDdXJyZW5jeVBpcGUpO1xyXG5cclxuICAvLyBDdG9yXHJcbiAgY29uc3RydWN0b3IoKVxyXG4gIHtcclxuICAgIHRoaXMuX2xvY2FsZSA9IHRoaXMuX2xvY2FsaXphdGlvblNlcnZpY2UubG9jYWxlO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGN1cnJlbmN5Q29kZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgY3VycmVuY3lDb2RlLCB0aGlzLl9kaXNwbGF5LCB1bmRlZmluZWQsIHRoaXMuX2xvY2FsZSk7XHJcbiAgfVxyXG59Il19