valtech-components 2.0.729 → 2.0.730
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.
- package/esm2022/lib/services/markdown-article/legal-content.service.mjs +65 -14
- package/esm2022/lib/services/markdown-article/markdown-article-parser.mjs +266 -0
- package/esm2022/lib/services/markdown-article/markdown-article-parser.service.mjs +6 -275
- package/esm2022/lib/services/preferences/index.mjs +3 -0
- package/esm2022/lib/services/preferences/preferences.service.mjs +164 -0
- package/esm2022/lib/services/preferences/preferences.types.mjs +7 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +7 -1
- package/fesm2022/valtech-components.mjs +452 -244
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +1 -1
- package/lib/components/atoms/text/text.component.d.ts +1 -1
- package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
- package/lib/components/organisms/article/article.component.d.ts +3 -3
- package/lib/components/organisms/bottom-nav/bottom-nav.component.d.ts +1 -1
- package/lib/components/organisms/toolbar/toolbar.component.d.ts +1 -1
- package/lib/services/markdown-article/legal-content.service.d.ts +49 -7
- package/lib/services/markdown-article/markdown-article-parser.d.ts +16 -0
- package/lib/services/markdown-article/markdown-article-parser.service.d.ts +3 -22
- package/lib/services/preferences/index.d.ts +2 -0
- package/lib/services/preferences/preferences.service.d.ts +51 -0
- package/lib/services/preferences/preferences.types.d.ts +35 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -1,283 +1,14 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
+
import { parseMarkdownArticle } from './markdown-article-parser';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
|
-
const BOX_DRAWING = /[┌┐└┘├┤┬┴┼─│╔╗╚╝═║]/;
|
|
4
|
-
const CALLOUT_RE = /^>\s*\[!(NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT)\]\s*(.*)$/i;
|
|
5
|
-
const FENCE_RE = /^```([\w-]*)\s*$/;
|
|
6
|
-
const HEADING_RE = /^(#{1,6})\s+(.+)$/;
|
|
7
|
-
const SEPARATOR_RE = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
|
|
8
|
-
const UNORDERED_RE = /^\s*[-*+]\s+(.+)$/;
|
|
9
|
-
const CHECKLIST_RE = /^\s*[-*+]\s+\[([ xX])\]\s+(.+)$/;
|
|
10
|
-
const ORDERED_RE = /^\s*\d+\.\s+(.+)$/;
|
|
11
|
-
const TABLE_DIVIDER_RE = /^\s*\|?[\s:|-]+\|?\s*$/;
|
|
12
|
-
const TABLE_ROW_RE = /^\s*\|(.+)\|\s*$/;
|
|
13
4
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* - Headings (#, ##, ### …) → title / subtitle
|
|
18
|
-
* - Paragraphs → paragraph (with `processLinks` + `allowPartialBold`)
|
|
19
|
-
* - Lists (-, *, 1.) → unordered / ordered list (- [ ] / - [x] for checklist)
|
|
20
|
-
* - Blockquotes (>) → quote, with GitHub callouts `> [!NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT]` mapped to notes
|
|
21
|
-
* - Code fences (```lang) → code
|
|
22
|
-
* - Box-drawing ASCII art (┌┐└┘│─) auto-wrapped as code
|
|
23
|
-
* - Tables → flattened into paragraphs with bold keys
|
|
24
|
-
* - Horizontal rules (---, ***, ___) → separator
|
|
5
|
+
* Angular service wrapper for the pure {@link parseMarkdownArticle} function.
|
|
6
|
+
* Provided in root so it can be injected anywhere. The actual parsing logic lives in
|
|
7
|
+
* `markdown-article-parser.ts` and is also usable from Node scripts (build-time generation).
|
|
25
8
|
*/
|
|
26
9
|
export class MarkdownArticleParserService {
|
|
27
10
|
parse(markdown, config) {
|
|
28
|
-
|
|
29
|
-
const elements = [];
|
|
30
|
-
let i = 0;
|
|
31
|
-
while (i < lines.length) {
|
|
32
|
-
const line = lines[i];
|
|
33
|
-
if (line.trim() === '') {
|
|
34
|
-
i++;
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
// Fenced code block
|
|
38
|
-
const fence = line.match(FENCE_RE);
|
|
39
|
-
if (fence) {
|
|
40
|
-
const lang = fence[1] || undefined;
|
|
41
|
-
const body = [];
|
|
42
|
-
i++;
|
|
43
|
-
while (i < lines.length && !FENCE_RE.test(lines[i])) {
|
|
44
|
-
body.push(lines[i]);
|
|
45
|
-
i++;
|
|
46
|
-
}
|
|
47
|
-
i++; // skip closing fence
|
|
48
|
-
elements.push({
|
|
49
|
-
type: 'code',
|
|
50
|
-
props: { code: body.join('\n'), language: lang, theme: 'dark' },
|
|
51
|
-
});
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
// ASCII box-drawing art → treat as code block
|
|
55
|
-
if (BOX_DRAWING.test(line)) {
|
|
56
|
-
const body = [];
|
|
57
|
-
while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {
|
|
58
|
-
body.push(lines[i]);
|
|
59
|
-
i++;
|
|
60
|
-
}
|
|
61
|
-
// Trim trailing blank lines from the block
|
|
62
|
-
while (body.length && body[body.length - 1].trim() === '')
|
|
63
|
-
body.pop();
|
|
64
|
-
elements.push({
|
|
65
|
-
type: 'code',
|
|
66
|
-
props: { code: body.join('\n'), language: 'text', theme: 'dark' },
|
|
67
|
-
});
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
// Separator
|
|
71
|
-
if (SEPARATOR_RE.test(line)) {
|
|
72
|
-
elements.push({ type: 'separator', props: { style: 'line' } });
|
|
73
|
-
i++;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
// Heading
|
|
77
|
-
const heading = line.match(HEADING_RE);
|
|
78
|
-
if (heading) {
|
|
79
|
-
elements.push(this.makeHeading(heading[1].length, heading[2].trim()));
|
|
80
|
-
i++;
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
// Callout / blockquote (consume contiguous `>` lines)
|
|
84
|
-
if (line.startsWith('>')) {
|
|
85
|
-
const block = [];
|
|
86
|
-
while (i < lines.length && lines[i].startsWith('>')) {
|
|
87
|
-
block.push(lines[i]);
|
|
88
|
-
i++;
|
|
89
|
-
}
|
|
90
|
-
elements.push(this.makeQuoteOrCallout(block));
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
// Table (consume contiguous `|` lines)
|
|
94
|
-
if (TABLE_ROW_RE.test(line)) {
|
|
95
|
-
const rows = [];
|
|
96
|
-
while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {
|
|
97
|
-
rows.push(lines[i]);
|
|
98
|
-
i++;
|
|
99
|
-
}
|
|
100
|
-
elements.push(...this.makeTable(rows));
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
// List (checklist / unordered / ordered) — consume contiguous lines
|
|
104
|
-
if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {
|
|
105
|
-
const listType = CHECKLIST_RE.test(line)
|
|
106
|
-
? 'checklist'
|
|
107
|
-
: ORDERED_RE.test(line)
|
|
108
|
-
? 'ordered'
|
|
109
|
-
: 'unordered';
|
|
110
|
-
const items = [];
|
|
111
|
-
while (i < lines.length && lines[i].trim() !== '') {
|
|
112
|
-
const cur = lines[i];
|
|
113
|
-
const check = cur.match(CHECKLIST_RE);
|
|
114
|
-
const unord = cur.match(UNORDERED_RE);
|
|
115
|
-
const ord = cur.match(ORDERED_RE);
|
|
116
|
-
if (check)
|
|
117
|
-
items.push({ text: check[2].trim() });
|
|
118
|
-
else if (ord && listType === 'ordered')
|
|
119
|
-
items.push({ text: ord[1].trim() });
|
|
120
|
-
else if (unord && listType !== 'ordered')
|
|
121
|
-
items.push({ text: unord[1].trim() });
|
|
122
|
-
else
|
|
123
|
-
break;
|
|
124
|
-
i++;
|
|
125
|
-
}
|
|
126
|
-
elements.push({ type: 'list', props: { items, listType } });
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
// Paragraph — consume contiguous non-empty lines that aren't a special block
|
|
130
|
-
const paragraph = [];
|
|
131
|
-
while (i < lines.length && lines[i].trim() !== '' && !this.startsNewBlock(lines[i])) {
|
|
132
|
-
paragraph.push(lines[i]);
|
|
133
|
-
i++;
|
|
134
|
-
}
|
|
135
|
-
const text = paragraph.join(' ').trim();
|
|
136
|
-
if (text) {
|
|
137
|
-
elements.push({
|
|
138
|
-
type: 'paragraph',
|
|
139
|
-
props: {
|
|
140
|
-
content: text,
|
|
141
|
-
size: 'medium',
|
|
142
|
-
color: 'dark',
|
|
143
|
-
bold: false,
|
|
144
|
-
processLinks: true,
|
|
145
|
-
allowPartialBold: true,
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return {
|
|
151
|
-
elements,
|
|
152
|
-
maxWidth: '900px',
|
|
153
|
-
centered: true,
|
|
154
|
-
theme: 'auto',
|
|
155
|
-
...config,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
normalize(md) {
|
|
159
|
-
return md.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
160
|
-
}
|
|
161
|
-
startsNewBlock(line) {
|
|
162
|
-
return (HEADING_RE.test(line) ||
|
|
163
|
-
FENCE_RE.test(line) ||
|
|
164
|
-
SEPARATOR_RE.test(line) ||
|
|
165
|
-
TABLE_ROW_RE.test(line) ||
|
|
166
|
-
UNORDERED_RE.test(line) ||
|
|
167
|
-
ORDERED_RE.test(line) ||
|
|
168
|
-
CHECKLIST_RE.test(line) ||
|
|
169
|
-
line.startsWith('>') ||
|
|
170
|
-
BOX_DRAWING.test(line));
|
|
171
|
-
}
|
|
172
|
-
makeHeading(level, content) {
|
|
173
|
-
if (level === 1) {
|
|
174
|
-
return {
|
|
175
|
-
type: 'title',
|
|
176
|
-
props: { content, size: 'xlarge', color: 'dark', bold: true },
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
const size = level === 2 ? 'large' : level === 3 ? 'medium' : 'small';
|
|
180
|
-
return {
|
|
181
|
-
type: 'subtitle',
|
|
182
|
-
props: { content, size, color: 'dark', bold: true },
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
makeQuoteOrCallout(block) {
|
|
186
|
-
const first = block[0];
|
|
187
|
-
const callout = first.match(CALLOUT_RE);
|
|
188
|
-
const lines = block.map(l => l.replace(/^>\s?/, ''));
|
|
189
|
-
if (callout) {
|
|
190
|
-
const type = callout[1].toUpperCase();
|
|
191
|
-
const firstLineRest = callout[2] || '';
|
|
192
|
-
const rest = lines.slice(1).join(' ').trim();
|
|
193
|
-
const text = [firstLineRest, rest].filter(Boolean).join(' ').trim();
|
|
194
|
-
return this.makeNote(type, text);
|
|
195
|
-
}
|
|
196
|
-
const text = lines.join(' ').trim();
|
|
197
|
-
return {
|
|
198
|
-
type: 'quote',
|
|
199
|
-
props: {
|
|
200
|
-
content: text,
|
|
201
|
-
size: 'medium',
|
|
202
|
-
color: 'medium',
|
|
203
|
-
bold: false,
|
|
204
|
-
showQuoteMark: true,
|
|
205
|
-
alignment: 'left',
|
|
206
|
-
},
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
makeNote(kind, text) {
|
|
210
|
-
const map = {
|
|
211
|
-
NOTE: { color: 'primary', prefix: 'Nota' },
|
|
212
|
-
TIP: { color: 'success', prefix: 'Tip' },
|
|
213
|
-
INFO: { color: 'tertiary', prefix: 'Info' },
|
|
214
|
-
IMPORTANT: { color: 'warning', prefix: 'Importante' },
|
|
215
|
-
WARNING: { color: 'warning', prefix: 'Atención' },
|
|
216
|
-
CAUTION: { color: 'danger', prefix: 'Precaución' },
|
|
217
|
-
};
|
|
218
|
-
const cfg = map[kind];
|
|
219
|
-
return {
|
|
220
|
-
type: 'note',
|
|
221
|
-
props: {
|
|
222
|
-
text,
|
|
223
|
-
prefix: `${cfg.prefix}:`,
|
|
224
|
-
color: cfg.color,
|
|
225
|
-
textColor: 'dark',
|
|
226
|
-
size: 'medium',
|
|
227
|
-
rounded: true,
|
|
228
|
-
},
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Tables are flattened into a header subtitle (if present) followed by one paragraph per
|
|
233
|
-
* data row using `**col[0]:** col[1] · **col[2]:** col[3] …` format. val-article has no
|
|
234
|
-
* native table element so this preserves the information without breaking the layout.
|
|
235
|
-
*/
|
|
236
|
-
makeTable(rows) {
|
|
237
|
-
const parsed = rows
|
|
238
|
-
.filter(r => !TABLE_DIVIDER_RE.test(r))
|
|
239
|
-
.map(r => r
|
|
240
|
-
.trim()
|
|
241
|
-
.replace(/^\|/, '')
|
|
242
|
-
.replace(/\|$/, '')
|
|
243
|
-
.split('|')
|
|
244
|
-
.map(c => c.trim()));
|
|
245
|
-
if (parsed.length === 0)
|
|
246
|
-
return [];
|
|
247
|
-
const header = parsed[0];
|
|
248
|
-
const dataRows = parsed.slice(1);
|
|
249
|
-
if (dataRows.length === 0) {
|
|
250
|
-
return [
|
|
251
|
-
{
|
|
252
|
-
type: 'paragraph',
|
|
253
|
-
props: {
|
|
254
|
-
content: header.join(' · '),
|
|
255
|
-
size: 'medium',
|
|
256
|
-
color: 'dark',
|
|
257
|
-
bold: false,
|
|
258
|
-
processLinks: true,
|
|
259
|
-
allowPartialBold: true,
|
|
260
|
-
},
|
|
261
|
-
},
|
|
262
|
-
];
|
|
263
|
-
}
|
|
264
|
-
return dataRows.map(row => {
|
|
265
|
-
const pairs = row.map((cell, idx) => {
|
|
266
|
-
const key = header[idx] ?? '';
|
|
267
|
-
return key ? `**${key}:** ${cell}` : cell;
|
|
268
|
-
});
|
|
269
|
-
return {
|
|
270
|
-
type: 'paragraph',
|
|
271
|
-
props: {
|
|
272
|
-
content: pairs.join(' · '),
|
|
273
|
-
size: 'medium',
|
|
274
|
-
color: 'dark',
|
|
275
|
-
bold: false,
|
|
276
|
-
processLinks: true,
|
|
277
|
-
allowPartialBold: true,
|
|
278
|
-
},
|
|
279
|
-
};
|
|
280
|
-
});
|
|
11
|
+
return parseMarkdownArticle(markdown, config);
|
|
281
12
|
}
|
|
282
13
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
283
14
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, providedIn: 'root' }); }
|
|
@@ -286,4 +17,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
286
17
|
type: Injectable,
|
|
287
18
|
args: [{ providedIn: 'root' }]
|
|
288
19
|
}] });
|
|
289
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tYXJ0aWNsZS1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvbWFya2Rvd24tYXJ0aWNsZS9tYXJrZG93bi1hcnRpY2xlLXBhcnNlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBWTNDLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHLDhEQUE4RCxDQUFDO0FBQ2xGLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDO0FBQ3ZDLE1BQU0sWUFBWSxHQUFHLGdDQUFnQyxDQUFDO0FBQ3RELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDO0FBQ3pDLE1BQU0sWUFBWSxHQUFHLGlDQUFpQyxDQUFDO0FBQ3ZELE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7QUFDbEQsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7QUFFeEM7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsTUFBTSxPQUFPLDRCQUE0QjtJQUN2QyxLQUFLLENBQUMsUUFBZ0IsRUFBRSxNQUFpQztRQUN2RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBcUIsRUFBRSxDQUFDO1FBRXRDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEIsSUFBSSxJQUFJLENB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QyxLQUFLLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxJQUFJLEVBQUUsV0FBVztnQkFDakIsS0FBSyxFQUFFO29CQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDMUIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLE1BQU07b0JBQ2IsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsWUFBWSxFQUFFLElBQUk7b0JBQ2xCLGdCQUFnQixFQUFFLElBQUk7aUJBQ3ZCO2FBQ2dCLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFSVSw0QkFBNEI7bUhBQTVCLDRCQUE0QixjQURmLE1BQU07OzRGQUNuQiw0QkFBNEI7a0JBRHhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXJ0aWNsZUVsZW1lbnQsXG4gIEFydGljbGVMaXN0RWxlbWVudCxcbiAgQXJ0aWNsZU1ldGFkYXRhLFxuICBBcnRpY2xlTm90ZUVsZW1lbnQsXG4gIEFydGljbGVTdWJ0aXRsZUVsZW1lbnQsXG4gIEFydGljbGVUaXRsZUVsZW1lbnQsXG59IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvb3JnYW5pc21zL2FydGljbGUvdHlwZXMnO1xuXG50eXBlIENhbGxvdXRUeXBlID0gJ05PVEUnIHwgJ1RJUCcgfCAnSU5GTycgfCAnV0FSTklORycgfCAnQ0FVVElPTicgfCAnSU1QT1JUQU5UJztcblxuY29uc3QgQk9YX0RSQVdJTkcgPSAvW+KUjOKUkOKUlOKUmOKUnOKUpOKUrOKUtOKUvOKUgOKUguKVlOKVl+KVmuKVneKVkOKVkV0vO1xuY29uc3QgQ0FMTE9VVF9SRSA9IC9ePlxccypcXFshKE5PVEV8VElQfElORk98V0FSTklOR3xDQVVUSU9OfElNUE9SVEFOVClcXF1cXHMqKC4qKSQvaTtcbmNvbnN0IEZFTkNFX1JFID0gL15gYGAoW1xcdy1dKilcXHMqJC87XG5jb25zdCBIRUFESU5HX1JFID0gL14oI3sxLDZ9KVxccysoLispJC87XG5jb25zdCBTRVBBUkFUT1JfUkUgPSAvXlxccyooPzotezMsfXxcXCp7Myx9fF97Myx9KVxccyokLztcbmNvbnN0IFVOT1JERVJFRF9SRSA9IC9eXFxzKlstKitdXFxzKyguKykkLztcbmNvbnN0IENIRUNLTElTVF9SRSA9IC9eXFxzKlstKitdXFxzK1xcWyhbIHhYXSlcXF1cXHMrKC4rKSQvO1xuY29uc3QgT1JERVJFRF9SRSA9IC9eXFxzKlxcZCtcXC5cXHMrKC4rKSQvO1xuY29uc3QgVEFCTEVfRElWSURFUl9SRSA9IC9eXFxzKlxcfD9bXFxzOnwtXStcXHw/XFxzKiQvO1xuY29uc3QgVEFCTEVfUk9XX1JFID0gL15cXHMqXFx8KC4rKVxcfFxccyokLztcblxuLyoqXG4gKiBDb252ZXJ0cyBNYXJrZG93biBkb2N1bWVudHMgaW50byBBcnRpY2xlTWV0YWRhdGEgZm9yIHRoZSB2YWwtYXJ0aWNsZSBvcmdhbmlzbS5cbiAqXG4gKiBTdXBwb3J0ZWQgc3ludGF4OlxuICogLSBIZWFkaW5ncyAoIywgIyMsICMjIyDigKYpIOKGkiB0aXRsZSAvIHN1YnRpdGxlXG4gKiAtIFBhcmFncmFwaHMg4oaSIHBhcmFncmFwaCAod2l0aCBgcHJvY2Vzc0xpbmtzYCArIGBhbGxvd1BhcnRpYWxCb2xkYClcbiAqIC0gTGlzdHMgKC0sICosIDEuKSDihpIgdW5vcmRlcmVkIC8gb3JkZXJlZCBsaXN0ICgtIFsgXSAvIC0gW3hdIGZvciBjaGVja2xpc3QpXG4gKiAtIEJsb2NrcXVvdGVzICg+KSDihpIgcXVvdGUsIHdpdGggR2l0SHViIGNhbGxvdXRzIGA+IFshTk9URXxUSVB8SU5GT3xXQVJOSU5HfENBVVRJT058SU1QT1JUQU5UXWAgbWFwcGVkIHRvIG5vdGVzXG4gKiAtIENvZGUgZmVuY2VzIChgYGBsYW5nKSDihpIgY29kZVxuICogLSBCb3gtZHJhd2luZyBBU0NJSSBhcnQgKOKUjOKUkOKUlOKUmOKUguKUgCkgYXV0by13cmFwcGVkIGFzIGNvZGVcbiAqIC0gVGFibGVzIOKGkiBmbGF0dGVuZWQgaW50byBwYXJhZ3JhcGhzIHdpdGggYm9sZCBrZXlzXG4gKiAtIEhvcml6b250YWwgcnVsZXMgKC0tLSwgKioqLCBfX18pIOKGkiBzZXBhcmF0b3JcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBNYXJrZG93bkFydGljbGVQYXJzZXJTZXJ2aWNlIHtcbiAgcGFyc2UobWFya2Rvd246IHN0cmluZywgY29uZmlnPzogUGFydGlhbDxBcnRpY2xlTWV0YWRhdGE+KTogQXJ0aWNsZU1ldGFkYXRhIHtcbiAgICBjb25zdCBsaW5lcyA9IHRoaXMubm9ybWFsaXplKG1hcmtkb3duKS5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgZWxlbWVudHM6IEFydGljbGVFbGVtZW50W10gPSBbXTtcblxuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGxpbmVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuXG4gICAgICBpZiAobGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEZlbmNlZCBjb2RlIGJsb2NrXG4gICAgICBjb25zdCBmZW5jZSA9IGxpbmUubWF0Y2goRkVOQ0VfUkUpO1xuICAgICAgaWYgKGZlbmNlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBmZW5jZVsxXSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGJvZHk6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGkrKztcbiAgICAgICAgd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGggJiYgIUZFTkNFX1JFLnRlc3QobGluZXNbaV0pKSB7XG4gICAgICAgICAgYm9keS5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgaSsrOyAvLyBza2lwIGNsb3NpbmcgZmVuY2VcbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICAgIHByb3BzOiB7IGNvZGU6IGJvZHkuam9pbignXFxuJyksIGxhbmd1YWdlOiBsYW5nLCB0aGVtZTogJ2RhcmsnIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQVNDSUkgYm94LWRyYXdpbmcgYXJ0IOKGkiB0cmVhdCBhcyBjb2RlIGJsb2NrXG4gICAgICBpZiAoQk9YX0RSQVdJTkcudGVzdChsaW5lKSkge1xuICAgICAgICBjb25zdCBib2R5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB3aGlsZSAoaSA8IGxpbmVzLmxlbmd0aCAmJiAobGluZXNbaV0udHJpbSgpID09PSAnJyB8fCBCT1hfRFJBV0lORy50ZXN0KGxpbmVzW2ldKSkpIHtcbiAgICAgICAgICBib2R5LnB1c2gobGluZXNbaV0pO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmltIHRyYWlsaW5nIGJsYW5rIGxpbmVzIGZyb20gdGhlIGJsb2NrXG4gICAgICAgIHdoaWxlIChib2R5Lmxlbmd0aCAmJiBib2R5W2JvZHkubGVuZ3RoIC0gMV0udHJpbSgpID09PSAnJykgYm9keS5wb3AoKTtcbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICAgIHByb3BzOiB7IGNvZGU6IGJvZHkuam9pbignXFxuJyksIGxhbmd1YWdlOiAndGV4dCcsIHRoZW1lOiAnZGFyaycgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXBhcmF0b3JcbiAgICAgIGlmIChTRVBBUkFUT1JfUkUudGVzdChsaW5lKSkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKHsgdHlwZTogJ3NlcGFyYXRvcicsIHByb3BzOiB7IHN0eWxlOiAnbGluZScgfSB9KTtcbiAgICAgICAgaSsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGVhZGluZ1xuICAgICAgY29uc3QgaGVhZGluZyA9IGxpbmUubWF0Y2goSEVBRElOR19SRSk7XG4gICAgICBpZiAoaGVhZGluZykge1xuICAgICAgICBlbGVtZW50cy5wdXNoKHRoaXMubWFrZUhlYWRpbmcoaGVhZGluZ1sxXS5sZW5ndGgsIGhlYWRpbmdbMl0udHJpbSgpKSk7XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGxvdXQgLyBibG9ja3F1b3RlIChjb25zdW1lIGNvbnRpZ3VvdXMgYD5gIGxpbmVzKVxuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB3aGlsZSAoaSA8IGxpbmVzLmxlbmd0aCAmJiBsaW5lc1tpXS5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgICAgICBibG9jay5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLm1ha2VRdW90ZU9yQ2FsbG91dChibG9jaykpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGFibGUgKGNvbnN1bWUgY29udGlndW91cyBgfGAgbGluZXMpXG4gICAgICBpZiAoVEFCTEVfUk9XX1JFLnRlc3QobGluZSkpIHtcbiAgICAgICAgY29uc3Qgcm93czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGggJiYgVEFCTEVfUk9XX1JFLnRlc3QobGluZXNbaV0pKSB7XG4gICAgICAgICAgcm93cy5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaCguLi50aGlzLm1ha2VUYWJsZShyb3dzKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0IChjaGVja2xpc3QgLyB1bm9yZGVyZWQgLyBvcmRlcmVkKSDigJQgY29uc3VtZSBjb250aWd1b3VzIGxpbmVzXG4gICAgICBpZiAoQ0hFQ0tMSVNUX1JFLnRlc3QobGluZSkgfHwgVU5PUkRFUkVEX1JFLnRlc3QobGluZSkgfHwgT1JERVJFRF9SRS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGNvbnN0IGxpc3RUeXBlOiAnY2hlY2tsaXN0JyB8ICd1bm9yZGVyZWQnIHwgJ29yZGVyZWQnID0gQ0hFQ0tMSVNUX1JFLnRlc3QobGluZSlcbiAgICAgICAgICA/ICdjaGVja2xpc3QnXG4gICAgICAgICAgOiBPUkRFUkVEX1JFLnRlc3QobGluZSlcbiAgICAgICAgICAgID8gJ29yZGVyZWQnXG4gICAgICAgICAgICA6ICd1bm9yZGVyZWQnO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zOiBBcnRpY2xlTGlzdEVsZW1lbnRbJ3Byb3BzJ11bJ2l0ZW1zJ10gPSBbXTtcbiAgICAgICAgd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaV0udHJpbSgpICE9PSAnJykge1xuICAgICAgICAgIGNvbnN0IGN1ciA9IGxpbmVzW2ldO1xuICAgICAgICAgIGNvbnN0IGNoZWNrID0gY3VyLm1hdGNoKENIRUNLTElTVF9SRSk7XG4gICAgICAgICAgY29uc3QgdW5vcmQgPSBjdXIubWF0Y2goVU5PUkRFUkVEX1JFKTtcbiAgICAgICAgICBjb25zdCBvcmQgPSBjdXIubWF0Y2goT1JERVJFRF9SRSk7XG4gICAgICAgICAgaWYgKGNoZWNrKSBpdGVtcy5wdXNoKHsgdGV4dDogY2hlY2tbMl0udHJpbSgpIH0pO1xuICAgICAgICAgIGVsc2UgaWYgKG9yZCAmJiBsaXN0VHlwZSA9PT0gJ29yZGVyZWQnKSBpdGVtcy5wdXNoKHsgdGV4dDogb3JkWzFdLnRyaW0oKSB9KTtcbiAgICAgICAgICBlbHNlIGlmICh1bm9yZCAmJiBsaXN0VHlwZSAhPT0gJ29yZGVyZWQnKSBpdGVtcy5wdXNoKHsgdGV4dDogdW5vcmRbMV0udHJpbSgpIH0pO1xuICAgICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2goeyB0eXBlOiAnbGlzdCcsIHByb3BzOiB7IGl0ZW1zLCBsaXN0VHlwZSB9IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyYWdyYXBoIOKAlCBjb25zdW1lIGNvbnRpZ3VvdXMgbm9uLWVtcHR5IGxpbmVzIHRoYXQgYXJlbid0IGEgc3BlY2lhbCBibG9ja1xuICAgICAgY29uc3QgcGFyYWdyYXBoOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaV0udHJpbSgpICE9PSAnJyAmJiAhdGhpcy5zdGFydHNOZXdCbG9jayhsaW5lc1tpXSkpIHtcbiAgICAgICAgcGFyYWdyYXBoLnB1c2gobGluZXNbaV0pO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICBjb25zdCB0ZXh0ID0gcGFyYWdyYXBoLmpvaW4oJyAnKS50cmltKCk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY29udGVudDogdGV4dCxcbiAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dQYXJ0aWFsQm9sZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHMsXG4gICAgICBtYXhXaWR0aDogJzkwMHB4JyxcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgdGhlbWU6ICdhdXRvJyxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemUobWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1kLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJykucmVwbGFjZSgvXFxyL2csICdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRzTmV3QmxvY2sobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIEhFQURJTkdfUkUudGVzdChsaW5lKSB8fFxuICAgICAgRkVOQ0VfUkUudGVzdChsaW5lKSB8fFxuICAgICAgU0VQQVJBVE9SX1JFLnRlc3QobGluZSkgfHxcbiAgICAgIFRBQkxFX1JPV19SRS50ZXN0KGxpbmUpIHx8XG4gICAgICBVTk9SREVSRURfUkUudGVzdChsaW5lKSB8fFxuICAgICAgT1JERVJFRF9SRS50ZXN0KGxpbmUpIHx8XG4gICAgICBDSEVDS0xJU1RfUkUudGVzdChsaW5lKSB8fFxuICAgICAgbGluZS5zdGFydHNXaXRoKCc+JykgfHxcbiAgICAgIEJPWF9EUkFXSU5HLnRlc3QobGluZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlSGVhZGluZyhcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGNvbnRlbnQ6IHN0cmluZ1xuICApOiBBcnRpY2xlVGl0bGVFbGVtZW50IHwgQXJ0aWNsZVN1YnRpdGxlRWxlbWVudCB7XG4gICAgaWYgKGxldmVsID09PSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAndGl0bGUnLFxuICAgICAgICBwcm9wczogeyBjb250ZW50LCBzaXplOiAneGxhcmdlJywgY29sb3I6ICdkYXJrJywgYm9sZDogdHJ1ZSB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZTogJ2xhcmdlJyB8ICdtZWRpdW0nIHwgJ3NtYWxsJyA9XG4gICAgICBsZXZlbCA9PT0gMiA/ICdsYXJnZScgOiBsZXZlbCA9PT0gMyA/ICdtZWRpdW0nIDogJ3NtYWxsJztcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3N1YnRpdGxlJyxcbiAgICAgIHByb3BzOiB7IGNvbnRlbnQsIHNpemUsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlUXVvdGVPckNhbGxvdXQoYmxvY2s6IHN0cmluZ1tdKTogQXJ0aWNsZUVsZW1lbnQge1xuICAgIGNvbnN0IGZpcnN0ID0gYmxvY2tbMF07XG4gICAgY29uc3QgY2FsbG91dCA9IGZpcnN0Lm1hdGNoKENBTExPVVRfUkUpO1xuICAgIGNvbnN0IGxpbmVzID0gYmxvY2subWFwKGwgPT4gbC5yZXBsYWNlKC9ePlxccz8vLCAnJykpO1xuXG4gICAgaWYgKGNhbGxvdXQpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBjYWxsb3V0WzFdLnRvVXBwZXJDYXNlKCkgYXMgQ2FsbG91dFR5cGU7XG4gICAgICBjb25zdCBmaXJzdExpbmVSZXN0ID0gY2FsbG91dFsyXSB8fCAnJztcbiAgICAgIGNvbnN0IHJlc3QgPSBsaW5lcy5zbGljZSgxKS5qb2luKCcgJykudHJpbSgpO1xuICAgICAgY29uc3QgdGV4dCA9IFtmaXJzdExpbmVSZXN0LCByZXN0XS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpLnRyaW0oKTtcbiAgICAgIHJldHVybiB0aGlzLm1ha2VOb3RlKHR5cGUsIHRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHQgPSBsaW5lcy5qb2luKCcgJykudHJpbSgpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAncXVvdGUnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgY29udGVudDogdGV4dCxcbiAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgIGNvbG9yOiAnbWVkaXVtJyxcbiAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgIHNob3dRdW90ZU1hcms6IHRydWUsXG4gICAgICAgIGFsaWdubWVudDogJ2xlZnQnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlTm90ZShraW5kOiBDYWxsb3V0VHlwZSwgdGV4dDogc3RyaW5nKTogQXJ0aWNsZU5vdGVFbGVtZW50IHtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxcbiAgICAgIENhbGxvdXRUeXBlLFxuICAgICAgeyBjb2xvcjogQXJ0aWNsZU5vdGVFbGVtZW50Wydwcm9wcyddWydjb2xvciddOyBwcmVmaXg6IHN0cmluZyB9XG4gICAgPiA9IHtcbiAgICAgIE5PVEU6IHsgY29sb3I6ICdwcmltYXJ5JywgcHJlZml4OiAnTm90YScgfSxcbiAgICAgIFRJUDogeyBjb2xvcjogJ3N1Y2Nlc3MnLCBwcmVmaXg6ICdUaXAnIH0sXG4gICAgICBJTkZPOiB7IGNvbG9yOiAndGVydGlhcnknLCBwcmVmaXg6ICdJbmZvJyB9LFxuICAgICAgSU1QT1JUQU5UOiB7IGNvbG9yOiAnd2FybmluZycsIHByZWZpeDogJ0ltcG9ydGFudGUnIH0sXG4gICAgICBXQVJOSU5HOiB7IGNvbG9yOiAnd2FybmluZycsIHByZWZpeDogJ0F0ZW5jacOzbicgfSxcbiAgICAgIENBVVRJT046IHsgY29sb3I6ICdkYW5nZXInLCBwcmVmaXg6ICdQcmVjYXVjacOzbicgfSxcbiAgICB9O1xuICAgIGNvbnN0IGNmZyA9IG1hcFtraW5kXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ25vdGUnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgdGV4dCxcbiAgICAgICAgcHJlZml4OiBgJHtjZmcucHJlZml4fTpgLFxuICAgICAgICBjb2xvcjogY2ZnLmNvbG9yLFxuICAgICAgICB0ZXh0Q29sb3I6ICdkYXJrJyxcbiAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgIHJvdW5kZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGFibGVzIGFyZSBmbGF0dGVuZWQgaW50byBhIGhlYWRlciBzdWJ0aXRsZSAoaWYgcHJlc2VudCkgZm9sbG93ZWQgYnkgb25lIHBhcmFncmFwaCBwZXJcbiAgICogZGF0YSByb3cgdXNpbmcgYCoqY29sWzBdOioqIGNvbFsxXSDCtyAqKmNvbFsyXToqKiBjb2xbM10g4oCmYCBmb3JtYXQuIHZhbC1hcnRpY2xlIGhhcyBub1xuICAgKiBuYXRpdmUgdGFibGUgZWxlbWVudCBzbyB0aGlzIHByZXNlcnZlcyB0aGUgaW5mb3JtYXRpb24gd2l0aG91dCBicmVha2luZyB0aGUgbGF5b3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBtYWtlVGFibGUocm93czogc3RyaW5nW10pOiBBcnRpY2xlRWxlbWVudFtdIHtcbiAgICBjb25zdCBwYXJzZWQgPSByb3dzXG4gICAgICAuZmlsdGVyKHIgPT4gIVRBQkxFX0RJVklERVJfUkUudGVzdChyKSlcbiAgICAgIC5tYXAociA9PlxuICAgICAgICByXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5yZXBsYWNlKC9eXFx8LywgJycpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcfCQvLCAnJylcbiAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgIC5tYXAoYyA9PiBjLnRyaW0oKSlcbiAgICAgICk7XG4gICAgaWYgKHBhcnNlZC5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IGhlYWRlciA9IHBhcnNlZFswXTtcbiAgICBjb25zdCBkYXRhUm93cyA9IHBhcnNlZC5zbGljZSgxKTtcbiAgICBpZiAoZGF0YVJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhcmFncmFwaCcsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGhlYWRlci5qb2luKCcgwrcgJyksXG4gICAgICAgICAgICBzaXplOiAnbWVkaXVtJyxcbiAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93UGFydGlhbEJvbGQ6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFSb3dzLm1hcChyb3cgPT4ge1xuICAgICAgY29uc3QgcGFpcnMgPSByb3cubWFwKChjZWxsLCBpZHgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVyW2lkeF0gPz8gJyc7XG4gICAgICAgIHJldHVybiBrZXkgPyBgKioke2tleX06KiogJHtjZWxsfWAgOiBjZWxsO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBjb250ZW50OiBwYWlycy5qb2luKCcgwrcgJyksXG4gICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICBwcm9jZXNzTGlua3M6IHRydWUsXG4gICAgICAgICAgYWxsb3dQYXJ0aWFsQm9sZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgQXJ0aWNsZUVsZW1lbnQ7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tYXJ0aWNsZS1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvbWFya2Rvd24tYXJ0aWNsZS9tYXJrZG93bi1hcnRpY2xlLXBhcnNlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBRWpFOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLEtBQUssQ0FBQyxRQUFnQixFQUFFLE1BQWlDO1FBQ3ZELE9BQU8sb0JBQW9CLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7K0dBSFUsNEJBQTRCO21IQUE1Qiw0QkFBNEIsY0FEZixNQUFNOzs0RkFDbkIsNEJBQTRCO2tCQUR4QyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFydGljbGVNZXRhZGF0YSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvb3JnYW5pc21zL2FydGljbGUvdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VNYXJrZG93bkFydGljbGUgfSBmcm9tICcuL21hcmtkb3duLWFydGljbGUtcGFyc2VyJztcblxuLyoqXG4gKiBBbmd1bGFyIHNlcnZpY2Ugd3JhcHBlciBmb3IgdGhlIHB1cmUge0BsaW5rIHBhcnNlTWFya2Rvd25BcnRpY2xlfSBmdW5jdGlvbi5cbiAqIFByb3ZpZGVkIGluIHJvb3Qgc28gaXQgY2FuIGJlIGluamVjdGVkIGFueXdoZXJlLiBUaGUgYWN0dWFsIHBhcnNpbmcgbG9naWMgbGl2ZXMgaW5cbiAqIGBtYXJrZG93bi1hcnRpY2xlLXBhcnNlci50c2AgYW5kIGlzIGFsc28gdXNhYmxlIGZyb20gTm9kZSBzY3JpcHRzIChidWlsZC10aW1lIGdlbmVyYXRpb24pLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE1hcmtkb3duQXJ0aWNsZVBhcnNlclNlcnZpY2Uge1xuICBwYXJzZShtYXJrZG93bjogc3RyaW5nLCBjb25maWc/OiBQYXJ0aWFsPEFydGljbGVNZXRhZGF0YT4pOiBBcnRpY2xlTWV0YWRhdGEge1xuICAgIHJldHVybiBwYXJzZU1hcmtkb3duQXJ0aWNsZShtYXJrZG93biwgY29uZmlnKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './preferences.service';
|
|
2
|
+
export * from './preferences.types';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3ByZWZlcmVuY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcHJlZmVyZW5jZXMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3ByZWZlcmVuY2VzLnR5cGVzJztcbiJdfQ==
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { DestroyRef, Inject, Injectable, Optional, effect, inject, signal } from '@angular/core';
|
|
2
|
+
import { firstValueFrom } from 'rxjs';
|
|
3
|
+
import { VALTECH_AUTH_CONFIG } from '../auth/config';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../firebase/firestore.service";
|
|
6
|
+
import * as i2 from "../auth/auth.service";
|
|
7
|
+
import * as i3 from "@angular/common/http";
|
|
8
|
+
import * as i4 from "../theme.service";
|
|
9
|
+
import * as i5 from "../i18n/i18n.service";
|
|
10
|
+
/**
|
|
11
|
+
* PreferencesService — preferencias del user en el doc canónico Firestore
|
|
12
|
+
* `/apps/{appId}/users/{uid}/preferences/main`.
|
|
13
|
+
*
|
|
14
|
+
* Read reactivo (signals) via listener Firestore.
|
|
15
|
+
* Write via `PUT /v2/auth/preferences` (cliente NUNCA escribe Firestore directo —
|
|
16
|
+
* ver memoria `feedback_no_direct_firestore_writes`).
|
|
17
|
+
*
|
|
18
|
+
* Side-effects automáticos:
|
|
19
|
+
* - Cuando `theme()` cambia → `ThemeService.Theme = ...`
|
|
20
|
+
* - Cuando `language()` cambia → `I18nService.setLanguage(...)`
|
|
21
|
+
*
|
|
22
|
+
* Auto-bind al user actual via `AuthService.user()`. Sin user (logout) → unbind.
|
|
23
|
+
*/
|
|
24
|
+
export class PreferencesService {
|
|
25
|
+
constructor(config, firestore, auth, http, themeService, i18n) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.firestore = firestore;
|
|
28
|
+
this.auth = auth;
|
|
29
|
+
this.http = http;
|
|
30
|
+
this.themeService = themeService;
|
|
31
|
+
this.i18n = i18n;
|
|
32
|
+
this._theme = signal('auto');
|
|
33
|
+
this._language = signal('es');
|
|
34
|
+
this._notificationsMaster = signal(true);
|
|
35
|
+
/** `true` después del primer snapshot Firestore. Antes, defaults sin side-effects. */
|
|
36
|
+
this._synced = signal(false);
|
|
37
|
+
this.theme = this._theme.asReadonly();
|
|
38
|
+
this.language = this._language.asReadonly();
|
|
39
|
+
this.notificationsMaster = this._notificationsMaster.asReadonly();
|
|
40
|
+
this.synced = this._synced.asReadonly();
|
|
41
|
+
const destroyRef = inject(DestroyRef);
|
|
42
|
+
destroyRef.onDestroy(() => this.unbind());
|
|
43
|
+
// Auto-bind al user actual. effect() corre en injection context (constructor OK).
|
|
44
|
+
effect(() => {
|
|
45
|
+
const user = this.auth.user();
|
|
46
|
+
if (user?.userId) {
|
|
47
|
+
this.bindToUser(user.userId);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.unbind();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// Side-effect: aplicar theme local cuando llega snapshot real.
|
|
54
|
+
effect(() => {
|
|
55
|
+
if (!this._synced())
|
|
56
|
+
return;
|
|
57
|
+
const t = this._theme();
|
|
58
|
+
if (this.themeService) {
|
|
59
|
+
this.themeService.Theme = t;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// Side-effect: aplicar language local cuando llega snapshot real.
|
|
63
|
+
effect(() => {
|
|
64
|
+
if (!this._synced())
|
|
65
|
+
return;
|
|
66
|
+
const l = this._language();
|
|
67
|
+
if (this.i18n && this.i18n.lang() !== l) {
|
|
68
|
+
this.i18n.setLanguage(l);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** Actualiza preferencias via backend. Optimistic UI: aplica local, revierte si falla. */
|
|
73
|
+
async update(partial) {
|
|
74
|
+
const url = `${this.config.apiUrl}/v2/auth/preferences`;
|
|
75
|
+
const prev = {
|
|
76
|
+
theme: this._theme(),
|
|
77
|
+
language: this._language(),
|
|
78
|
+
master: this._notificationsMaster(),
|
|
79
|
+
};
|
|
80
|
+
if (partial.theme)
|
|
81
|
+
this._theme.set(partial.theme);
|
|
82
|
+
if (partial.language)
|
|
83
|
+
this._language.set(partial.language);
|
|
84
|
+
if (partial.notifications && typeof partial.notifications.master === 'boolean') {
|
|
85
|
+
this._notificationsMaster.set(partial.notifications.master);
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const res = await firstValueFrom(this.http.put(url, partial));
|
|
89
|
+
// El listener Firestore es la fuente final, pero alinear ya con la
|
|
90
|
+
// respuesta del backend acelera UX (especialmente si el listener
|
|
91
|
+
// tarda en propagar).
|
|
92
|
+
if (res.theme)
|
|
93
|
+
this._theme.set(res.theme);
|
|
94
|
+
if (res.language)
|
|
95
|
+
this._language.set(res.language);
|
|
96
|
+
if (typeof res.notifications?.master === 'boolean') {
|
|
97
|
+
this._notificationsMaster.set(res.notifications.master);
|
|
98
|
+
}
|
|
99
|
+
return res;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
// Revert optimistic.
|
|
103
|
+
this._theme.set(prev.theme);
|
|
104
|
+
this._language.set(prev.language);
|
|
105
|
+
this._notificationsMaster.set(prev.master);
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
setTheme(theme) {
|
|
110
|
+
return this.update({ theme });
|
|
111
|
+
}
|
|
112
|
+
setLanguage(language) {
|
|
113
|
+
return this.update({ language });
|
|
114
|
+
}
|
|
115
|
+
setNotificationsMaster(enabled) {
|
|
116
|
+
return this.update({ notifications: { master: enabled } });
|
|
117
|
+
}
|
|
118
|
+
bindToUser(userId) {
|
|
119
|
+
if (this.currentUserId === userId && this.subscription)
|
|
120
|
+
return;
|
|
121
|
+
this.unbind();
|
|
122
|
+
this.currentUserId = userId;
|
|
123
|
+
// FirestoreService.docChanges prefija automáticamente `apps/{appId}/`
|
|
124
|
+
// cuando `config.appId` está seteado en ValtechAuthConfig.
|
|
125
|
+
this.subscription = this.firestore
|
|
126
|
+
.docChanges(`users/${userId}/preferences`, 'main')
|
|
127
|
+
.subscribe(doc => {
|
|
128
|
+
if (!doc) {
|
|
129
|
+
// Doc no existe aún (user nuevo, sin primer sync). Mantenemos
|
|
130
|
+
// defaults locales pero NO marcamos synced — los side-effects no
|
|
131
|
+
// pisan el theme/lang locales con valores arbitrarios.
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (doc.theme)
|
|
135
|
+
this._theme.set(doc.theme);
|
|
136
|
+
if (doc.language)
|
|
137
|
+
this._language.set(doc.language);
|
|
138
|
+
if (doc.notifications && typeof doc.notifications.master === 'boolean') {
|
|
139
|
+
this._notificationsMaster.set(doc.notifications.master);
|
|
140
|
+
}
|
|
141
|
+
this._synced.set(true);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
unbind() {
|
|
145
|
+
this.subscription?.unsubscribe();
|
|
146
|
+
this.subscription = undefined;
|
|
147
|
+
this.currentUserId = undefined;
|
|
148
|
+
this._synced.set(false);
|
|
149
|
+
}
|
|
150
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1.FirestoreService }, { token: i2.AuthService }, { token: i3.HttpClient }, { token: i4.ThemeService, optional: true }, { token: i5.I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
151
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesService, providedIn: 'root' }); }
|
|
152
|
+
}
|
|
153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesService, decorators: [{
|
|
154
|
+
type: Injectable,
|
|
155
|
+
args: [{ providedIn: 'root' }]
|
|
156
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
157
|
+
type: Inject,
|
|
158
|
+
args: [VALTECH_AUTH_CONFIG]
|
|
159
|
+
}] }, { type: i1.FirestoreService }, { type: i2.AuthService }, { type: i3.HttpClient }, { type: i4.ThemeService, decorators: [{
|
|
160
|
+
type: Optional
|
|
161
|
+
}] }, { type: i5.I18nService, decorators: [{
|
|
162
|
+
type: Optional
|
|
163
|
+
}] }] });
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyZW5jZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpHLE9BQU8sRUFBZ0IsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBY3JEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBZTdCLFlBQ3VDLE1BQXlCLEVBQ3RELFNBQTJCLEVBQzNCLElBQWlCLEVBQ2pCLElBQWdCLEVBQ0osWUFBaUMsRUFDakMsSUFBd0I7UUFMUCxXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUN0RCxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDSixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsU0FBSSxHQUFKLElBQUksQ0FBb0I7UUFwQjdCLFdBQU0sR0FBRyxNQUFNLENBQW1CLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLGNBQVMsR0FBRyxNQUFNLENBQXNCLElBQUksQ0FBQyxDQUFDO1FBQzlDLHlCQUFvQixHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUM5RCxzRkFBc0Y7UUFDckUsWUFBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUV6QyxVQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxhQUFRLEdBQUcsSUFBSSxDQUFD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Q0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDOytHQXBJVSxrQkFBa0Isa0JBZ0JuQixtQkFBbUI7bUhBaEJsQixrQkFBa0IsY0FETCxNQUFNOzs0RkFDbkIsa0JBQWtCO2tCQUQ5QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBaUI3QixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBSTFCLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBlZmZlY3QsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFZBTFRFQ0hfQVVUSF9DT05GSUcgfSBmcm9tICcuLi9hdXRoL2NvbmZpZyc7XG5pbXBvcnQgeyBWYWx0ZWNoQXV0aENvbmZpZyB9IGZyb20gJy4uL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgRmlyZXN0b3JlU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlL2ZpcmVzdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5MYW5nIH0gZnJvbSAnLi4vaTE4bi90eXBlcyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uL2kxOG4vaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFRoZW1lT3B0aW9uLCBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFByZWZlcmVuY2VzRG9jdW1lbnQsXG4gIFByZWZlcmVuY2VzTGFuZ3VhZ2UsXG4gIFByZWZlcmVuY2VzVGhlbWUsXG4gIFByZWZlcmVuY2VzVXBkYXRlLFxuICBQcmVmZXJlbmNlc1VwZGF0ZVJlc3BvbnNlLFxufSBmcm9tICcuL3ByZWZlcmVuY2VzLnR5cGVzJztcblxuLyoqXG4gKiBQcmVmZXJlbmNlc1NlcnZpY2Ug4oCUIHByZWZlcmVuY2lhcyBkZWwgdXNlciBlbiBlbCBkb2MgY2Fuw7NuaWNvIEZpcmVzdG9yZVxuICogYC9hcHBzL3thcHBJZH0vdXNlcnMve3VpZH0vcHJlZmVyZW5jZXMvbWFpbmAuXG4gKlxuICogUmVhZCByZWFjdGl2byAoc2lnbmFscykgdmlhIGxpc3RlbmVyIEZpcmVzdG9yZS5cbiAqIFdyaXRlIHZpYSBgUFVUIC92Mi9hdXRoL3ByZWZlcmVuY2VzYCAoY2xpZW50ZSBOVU5DQSBlc2NyaWJlIEZpcmVzdG9yZSBkaXJlY3RvIOKAlFxuICogdmVyIG1lbW9yaWEgYGZlZWRiYWNrX25vX2RpcmVjdF9maXJlc3RvcmVfd3JpdGVzYCkuXG4gKlxuICogU2lkZS1lZmZlY3RzIGF1dG9tw6F0aWNvczpcbiAqIC0gQ3VhbmRvIGB0aGVtZSgpYCBjYW1iaWEg4oaSIGBUaGVtZVNlcnZpY2UuVGhlbWUgPSAuLi5gXG4gKiAtIEN1YW5kbyBgbGFuZ3VhZ2UoKWAgY2FtYmlhIOKGkiBgSTE4blNlcnZpY2Uuc2V0TGFuZ3VhZ2UoLi4uKWBcbiAqXG4gKiBBdXRvLWJpbmQgYWwgdXNlciBhY3R1YWwgdmlhIGBBdXRoU2VydmljZS51c2VyKClgLiBTaW4gdXNlciAobG9nb3V0KSDihpIgdW5iaW5kLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFByZWZlcmVuY2VzU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lID0gc2lnbmFsPFByZWZlcmVuY2VzVGhlbWU+KCdhdXRvJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhbmd1YWdlID0gc2lnbmFsPFByZWZlcmVuY2VzTGFuZ3VhZ2U+KCdlcycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ub3RpZmljYXRpb25zTWFzdGVyID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICAvKiogYHRydWVgIGRlc3B1w6lzIGRlbCBwcmltZXIgc25hcHNob3QgRmlyZXN0b3JlLiBBbnRlcywgZGVmYXVsdHMgc2luIHNpZGUtZWZmZWN0cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfc3luY2VkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSB0aGVtZSA9IHRoaXMuX3RoZW1lLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2UgPSB0aGlzLl9sYW5ndWFnZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnNNYXN0ZXIgPSB0aGlzLl9ub3RpZmljYXRpb25zTWFzdGVyLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgc3luY2VkID0gdGhpcy5fc3luY2VkLmFzUmVhZG9ubHkoKTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcklkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVkFMVEVDSF9BVVRIX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hBdXRoQ29uZmlnLFxuICAgIHByaXZhdGUgZmlyZXN0b3JlOiBGaXJlc3RvcmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UgfCBudWxsXG4gICkge1xuICAgIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gdGhpcy51bmJpbmQoKSk7XG5cbiAgICAvLyBBdXRvLWJpbmQgYWwgdXNlciBhY3R1YWwuIGVmZmVjdCgpIGNvcnJlIGVuIGluamVjdGlvbiBjb250ZXh0IChjb25zdHJ1Y3RvciBPSykuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGgudXNlcigpO1xuICAgICAgaWYgKHVzZXI/LnVzZXJJZCkge1xuICAgICAgICB0aGlzLmJpbmRUb1VzZXIodXNlci51c2VySWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNpZGUtZWZmZWN0OiBhcGxpY2FyIHRoZW1lIGxvY2FsIGN1YW5kbyBsbGVnYSBzbmFwc2hvdCByZWFsLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3N5bmNlZCgpKSByZXR1cm47XG4gICAgICBjb25zdCB0ID0gdGhpcy5fdGhlbWUoKTtcbiAgICAgIGlmICh0aGlzLnRoZW1lU2VydmljZSkge1xuICAgICAgICB0aGlzLnRoZW1lU2VydmljZS5UaGVtZSA9IHQgYXMgVGhlbWVPcHRpb247XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTaWRlLWVmZmVjdDogYXBsaWNhciBsYW5ndWFnZSBsb2NhbCBjdWFuZG8gbGxlZ2Egc25hcHNob3QgcmVhbC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9zeW5jZWQoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgbCA9IHRoaXMuX2xhbmd1YWdlKCk7XG4gICAgICBpZiAodGhpcy5pMThuICYmIHRoaXMuaTE4bi5sYW5nKCkgIT09IGwpIHtcbiAgICAgICAgdGhpcy5pMThuLnNldExhbmd1YWdlKGwgYXMgSTE4bkxhbmcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEFjdHVhbGl6YSBwcmVmZXJlbmNpYXMgdmlhIGJhY2tlbmQuIE9wdGltaXN0aWMgVUk6IGFwbGljYSBsb2NhbCwgcmV2aWVydGUgc2kgZmFsbGEuICovXG4gIGFzeW5jIHVwZGF0ZShwYXJ0aWFsOiBQcmVmZXJlbmNlc1VwZGF0ZSk6IFByb21pc2U8UHJlZmVyZW5jZXNVcGRhdGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29uZmlnLmFwaVVybH0vdjIvYXV0aC9wcmVmZXJlbmNlc2A7XG5cbiAgICBjb25zdCBwcmV2ID0ge1xuICAgICAgdGhlbWU6IHRoaXMuX3RoZW1lKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5fbGFuZ3VhZ2UoKSxcbiAgICAgIG1hc3RlcjogdGhpcy5fbm90aWZpY2F0aW9uc01hc3RlcigpLFxuICAgIH07XG5cbiAgICBpZiAocGFydGlhbC50aGVtZSkgdGhpcy5fdGhlbWUuc2V0KHBhcnRpYWwudGhlbWUpO1xuICAgIGlmIChwYXJ0aWFsLmxhbmd1YWdlKSB0aGlzLl9sYW5ndWFnZS5zZXQocGFydGlhbC5sYW5ndWFnZSk7XG4gICAgaWYgKHBhcnRpYWwubm90aWZpY2F0aW9ucyAmJiB0eXBlb2YgcGFydGlhbC5ub3RpZmljYXRpb25zLm1hc3RlciA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25zTWFzdGVyLnNldChwYXJ0aWFsLm5vdGlmaWNhdGlvbnMubWFzdGVyKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnB1dDxQcmVmZXJlbmNlc1VwZGF0ZVJlc3BvbnNlPih1cmwsIHBhcnRpYWwpKTtcbiAgICAgIC8vIEVsIGxpc3RlbmVyIEZpcmVzdG9yZSBlcyBsYSBmdWVudGUgZmluYWwsIHBlcm8gYWxpbmVhciB5YSBjb24gbGFcbiAgICAgIC8vIHJlc3B1ZXN0YSBkZWwgYmFja2VuZCBhY2VsZXJhIFVYIChlc3BlY2lhbG1lbnRlIHNpIGVsIGxpc3RlbmVyXG4gICAgICAvLyB0YXJkYSBlbiBwcm9wYWdhcikuXG4gICAgICBpZiAocmVzLnRoZW1lKSB0aGlzLl90aGVtZS5zZXQocmVzLnRoZW1lIGFzIFByZWZlcmVuY2VzVGhlbWUpO1xuICAgICAgaWYgKHJlcy5sYW5ndWFnZSkgdGhpcy5fbGFuZ3VhZ2Uuc2V0KHJlcy5sYW5ndWFnZSBhcyBQcmVmZXJlbmNlc0xhbmd1YWdlKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzLm5vdGlmaWNhdGlvbnM/Lm1hc3RlciA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnNNYXN0ZXIuc2V0KHJlcy5ub3RpZmljYXRpb25zLm1hc3Rlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gUmV2ZXJ0IG9wdGltaXN0aWMuXG4gICAgICB0aGlzLl90aGVtZS5zZXQocHJldi50aGVtZSk7XG4gICAgICB0aGlzLl9sYW5ndWFnZS5zZXQocHJldi5sYW5ndWFnZSk7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25zTWFzdGVyLnNldChwcmV2Lm1hc3Rlcik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgc2V0VGhlbWUodGhlbWU6IFByZWZlcmVuY2VzVGhlbWUpOiBQcm9taXNlPFByZWZlcmVuY2VzVXBkYXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGUoeyB0aGVtZSB9KTtcbiAgfVxuXG4gIHNldExhbmd1YWdlKGxhbmd1YWdlOiBQcmVmZXJlbmNlc0xhbmd1YWdlKTogUHJvbWlzZTxQcmVmZXJlbmNlc1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlKHsgbGFuZ3VhZ2UgfSk7XG4gIH1cblxuICBzZXROb3RpZmljYXRpb25zTWFzdGVyKGVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPFByZWZlcmVuY2VzVXBkYXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGUoeyBub3RpZmljYXRpb25zOiB7IG1hc3RlcjogZW5hYmxlZCB9IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kVG9Vc2VyKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFVzZXJJZCA9PT0gdXNlcklkICYmIHRoaXMuc3Vic2NyaXB0aW9uKSByZXR1cm47XG4gICAgdGhpcy51bmJpbmQoKTtcbiAgICB0aGlzLmN1cnJlbnRVc2VySWQgPSB1c2VySWQ7XG4gICAgLy8gRmlyZXN0b3JlU2VydmljZS5kb2NDaGFuZ2VzIHByZWZpamEgYXV0b23DoXRpY2FtZW50ZSBgYXBwcy97YXBwSWR9L2BcbiAgICAvLyBjdWFuZG8gYGNvbmZpZy5hcHBJZGAgZXN0w6Egc2V0ZWFkbyBlbiBWYWx0ZWNoQXV0aENvbmZpZy5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuZmlyZXN0b3JlXG4gICAgICAuZG9jQ2hhbmdlczxQcmVmZXJlbmNlc0RvY3VtZW50ICYgeyBpZD86IHN0cmluZyB9PihgdXNlcnMvJHt1c2VySWR9L3ByZWZlcmVuY2VzYCwgJ21haW4nKVxuICAgICAgLnN1YnNjcmliZShkb2MgPT4ge1xuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgIC8vIERvYyBubyBleGlzdGUgYcO6biAodXNlciBudWV2bywgc2luIHByaW1lciBzeW5jKS4gTWFudGVuZW1vc1xuICAgICAgICAgIC8vIGRlZmF1bHRzIGxvY2FsZXMgcGVybyBOTyBtYXJjYW1vcyBzeW5jZWQg4oCUIGxvcyBzaWRlLWVmZmVjdHMgbm9cbiAgICAgICAgICAvLyBwaXNhbiBlbCB0aGVtZS9sYW5nIGxvY2FsZXMgY29uIHZhbG9yZXMgYXJiaXRyYXJpb3MuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb2MudGhlbWUpIHRoaXMuX3RoZW1lLnNldChkb2MudGhlbWUpO1xuICAgICAgICBpZiAoZG9jLmxhbmd1YWdlKSB0aGlzLl9sYW5ndWFnZS5zZXQoZG9jLmxhbmd1YWdlKTtcbiAgICAgICAgaWYgKGRvYy5ub3RpZmljYXRpb25zICYmIHR5cGVvZiBkb2Mubm90aWZpY2F0aW9ucy5tYXN0ZXIgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnNNYXN0ZXIuc2V0KGRvYy5ub3RpZmljYXRpb25zLm1hc3Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3luY2VkLnNldCh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmJpbmQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXJyZW50VXNlcklkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N5bmNlZC5zZXQoZmFsc2UpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preferences types — Fase 1 schema simple (theme + language + notifications.master).
|
|
3
|
+
* Doc canónico: /apps/{appId}/users/{uid}/preferences/main
|
|
4
|
+
* Cliente NUNCA escribe directo — todas las mutaciones via PUT /v2/auth/preferences.
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyZW5jZXMudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByZWZlcmVuY2VzIHR5cGVzIOKAlCBGYXNlIDEgc2NoZW1hIHNpbXBsZSAodGhlbWUgKyBsYW5ndWFnZSArIG5vdGlmaWNhdGlvbnMubWFzdGVyKS5cbiAqIERvYyBjYW7Ds25pY286IC9hcHBzL3thcHBJZH0vdXNlcnMve3VpZH0vcHJlZmVyZW5jZXMvbWFpblxuICogQ2xpZW50ZSBOVU5DQSBlc2NyaWJlIGRpcmVjdG8g4oCUIHRvZGFzIGxhcyBtdXRhY2lvbmVzIHZpYSBQVVQgL3YyL2F1dGgvcHJlZmVyZW5jZXMuXG4gKi9cblxuZXhwb3J0IHR5cGUgUHJlZmVyZW5jZXNUaGVtZSA9ICdsaWdodCcgfCAnZGFyaycgfCAnYXV0byc7XG5leHBvcnQgdHlwZSBQcmVmZXJlbmNlc0xhbmd1YWdlID0gJ2VzJyB8ICdlbicgfCAncHQnO1xuXG4vKiogRm9ybWEgZGVsIGRvYyB0YWwgY29tbyBsbyBlc2NyaWJlIGVsIGJhY2tlbmQgKEFkbWluIFNESykuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZWZlcmVuY2VzRG9jdW1lbnQge1xuICB0aGVtZT86IFByZWZlcmVuY2VzVGhlbWU7XG4gIGxhbmd1YWdlPzogUHJlZmVyZW5jZXNMYW5ndWFnZTtcbiAgbm90aWZpY2F0aW9ucz86IHtcbiAgICBtYXN0ZXI/OiBib29sZWFuO1xuICB9O1xuICAvKiogc2VydmVyVGltZXN0YW1wIGVzY3JpdG8gcG9yIGVsIGJhY2tlbmQgZW4gY2FkYSBzeW5jLiAqL1xuICBzeW5jZWRBdD86IHVua25vd247XG59XG5cbi8qKiBQYXlsb2FkIGFjZXB0YWRvIHBvciBgUFVUIC92Mi9hdXRoL3ByZWZlcmVuY2VzYCDigJQgcGFydGlhbCB1cGRhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZWZlcmVuY2VzVXBkYXRlIHtcbiAgdGhlbWU/OiBQcmVmZXJlbmNlc1RoZW1lO1xuICBsYW5ndWFnZT86IFByZWZlcmVuY2VzTGFuZ3VhZ2U7XG4gIG5vdGlmaWNhdGlvbnM/OiB7XG4gICAgbWFzdGVyPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuLyoqIFJlc3BvbnNlIGRlbCBiYWNrZW5kIHRyYXMgZWwgUFVULiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVmZXJlbmNlc1VwZGF0ZVJlc3BvbnNlIHtcbiAgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgdGhlbWU6IFByZWZlcmVuY2VzVGhlbWUgfCAnJztcbiAgbGFuZ3VhZ2U6IFByZWZlcmVuY2VzTGFuZ3VhZ2UgfCAnJztcbiAgbm90aWZpY2F0aW9uczogeyBtYXN0ZXI/OiBib29sZWFuIH07XG4gIHVwZGF0ZWQ6IGJvb2xlYW47XG59XG4iXX0=
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Current version of valtech-components.
|
|
3
3
|
* This is automatically updated during the publish process.
|
|
4
4
|
*/
|
|
5
|
-
export const VERSION = '2.0.
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export const VERSION = '2.0.730';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC43MzAnO1xuIl19
|