datadog-frontend-toolkit 1.0.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.
- package/LICENSE +21 -0
- package/README.md +486 -0
- package/dist/cjs/context/ContextManager.js +197 -0
- package/dist/cjs/context/ContextManager.js.map +1 -0
- package/dist/cjs/core/BootstrapGuard.js +81 -0
- package/dist/cjs/core/BootstrapGuard.js.map +1 -0
- package/dist/cjs/core/ConfigManager.js +133 -0
- package/dist/cjs/core/ConfigManager.js.map +1 -0
- package/dist/cjs/core/ObservabilitySDK.js +355 -0
- package/dist/cjs/core/ObservabilitySDK.js.map +1 -0
- package/dist/cjs/errors/ErrorBoundary.js +187 -0
- package/dist/cjs/errors/ErrorBoundary.js.map +1 -0
- package/dist/cjs/index.js +110 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logger/LoggerService.js +256 -0
- package/dist/cjs/logger/LoggerService.js.map +1 -0
- package/dist/cjs/logs/LogsManager.js +112 -0
- package/dist/cjs/logs/LogsManager.js.map +1 -0
- package/dist/cjs/network/NetworkInterceptor.js +185 -0
- package/dist/cjs/network/NetworkInterceptor.js.map +1 -0
- package/dist/cjs/performance/PerformanceMonitor.js +290 -0
- package/dist/cjs/performance/PerformanceMonitor.js.map +1 -0
- package/dist/cjs/resources/ResourceProvisioner.js +210 -0
- package/dist/cjs/resources/ResourceProvisioner.js.map +1 -0
- package/dist/cjs/resources/templates/dashboard.js +333 -0
- package/dist/cjs/resources/templates/dashboard.js.map +1 -0
- package/dist/cjs/resources/templates/monitors.js +120 -0
- package/dist/cjs/resources/templates/monitors.js.map +1 -0
- package/dist/cjs/resources/templates/slos.js +79 -0
- package/dist/cjs/resources/templates/slos.js.map +1 -0
- package/dist/cjs/rum/RumManager.js +164 -0
- package/dist/cjs/rum/RumManager.js.map +1 -0
- package/dist/cjs/types/config.js +13 -0
- package/dist/cjs/types/config.js.map +1 -0
- package/dist/cjs/types/events.js +26 -0
- package/dist/cjs/types/events.js.map +1 -0
- package/dist/cjs/types/index.js +20 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/logger.js +13 -0
- package/dist/cjs/types/logger.js.map +1 -0
- package/dist/cjs/utils/EventEmitter.js +49 -0
- package/dist/cjs/utils/EventEmitter.js.map +1 -0
- package/dist/cjs/utils/fingerprint.js +48 -0
- package/dist/cjs/utils/fingerprint.js.map +1 -0
- package/dist/cjs/utils/retry.js +35 -0
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/cjs/utils/sanitizer.js +106 -0
- package/dist/cjs/utils/sanitizer.js.map +1 -0
- package/dist/cjs/utils/storage.js +99 -0
- package/dist/cjs/utils/storage.js.map +1 -0
- package/dist/cli/commands/setup.js +178 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/status.js +103 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompt.js +140 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/esm/context/ContextManager.js +193 -0
- package/dist/esm/context/ContextManager.js.map +1 -0
- package/dist/esm/core/BootstrapGuard.js +77 -0
- package/dist/esm/core/BootstrapGuard.js.map +1 -0
- package/dist/esm/core/ConfigManager.js +129 -0
- package/dist/esm/core/ConfigManager.js.map +1 -0
- package/dist/esm/core/ObservabilitySDK.js +351 -0
- package/dist/esm/core/ObservabilitySDK.js.map +1 -0
- package/dist/esm/errors/ErrorBoundary.js +183 -0
- package/dist/esm/errors/ErrorBoundary.js.map +1 -0
- package/dist/esm/index.js +87 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger/LoggerService.js +251 -0
- package/dist/esm/logger/LoggerService.js.map +1 -0
- package/dist/esm/logs/LogsManager.js +108 -0
- package/dist/esm/logs/LogsManager.js.map +1 -0
- package/dist/esm/network/NetworkInterceptor.js +181 -0
- package/dist/esm/network/NetworkInterceptor.js.map +1 -0
- package/dist/esm/performance/PerformanceMonitor.js +286 -0
- package/dist/esm/performance/PerformanceMonitor.js.map +1 -0
- package/dist/esm/resources/ResourceProvisioner.js +206 -0
- package/dist/esm/resources/ResourceProvisioner.js.map +1 -0
- package/dist/esm/resources/templates/dashboard.js +330 -0
- package/dist/esm/resources/templates/dashboard.js.map +1 -0
- package/dist/esm/resources/templates/monitors.js +117 -0
- package/dist/esm/resources/templates/monitors.js.map +1 -0
- package/dist/esm/resources/templates/slos.js +76 -0
- package/dist/esm/resources/templates/slos.js.map +1 -0
- package/dist/esm/rum/RumManager.js +160 -0
- package/dist/esm/rum/RumManager.js.map +1 -0
- package/dist/esm/types/config.js +10 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/events.js +23 -0
- package/dist/esm/types/events.js.map +1 -0
- package/dist/esm/types/index.js +4 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/logger.js +10 -0
- package/dist/esm/types/logger.js.map +1 -0
- package/dist/esm/utils/EventEmitter.js +45 -0
- package/dist/esm/utils/EventEmitter.js.map +1 -0
- package/dist/esm/utils/fingerprint.js +44 -0
- package/dist/esm/utils/fingerprint.js.map +1 -0
- package/dist/esm/utils/retry.js +32 -0
- package/dist/esm/utils/retry.js.map +1 -0
- package/dist/esm/utils/sanitizer.js +102 -0
- package/dist/esm/utils/sanitizer.js.map +1 -0
- package/dist/esm/utils/storage.js +95 -0
- package/dist/esm/utils/storage.js.map +1 -0
- package/dist/resources/ResourceProvisioner.js +207 -0
- package/dist/resources/ResourceProvisioner.js.map +1 -0
- package/dist/resources/templates/dashboard.js +333 -0
- package/dist/resources/templates/dashboard.js.map +1 -0
- package/dist/resources/templates/monitors.js +120 -0
- package/dist/resources/templates/monitors.js.map +1 -0
- package/dist/resources/templates/slos.js +79 -0
- package/dist/resources/templates/slos.js.map +1 -0
- package/dist/types/config.js +13 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context/ContextManager.d.ts +63 -0
- package/dist/types/context/ContextManager.d.ts.map +1 -0
- package/dist/types/core/BootstrapGuard.d.ts +46 -0
- package/dist/types/core/BootstrapGuard.d.ts.map +1 -0
- package/dist/types/core/ConfigManager.d.ts +13 -0
- package/dist/types/core/ConfigManager.d.ts.map +1 -0
- package/dist/types/core/ObservabilitySDK.d.ts +141 -0
- package/dist/types/core/ObservabilitySDK.d.ts.map +1 -0
- package/dist/types/errors/ErrorBoundary.d.ts +55 -0
- package/dist/types/errors/ErrorBoundary.d.ts.map +1 -0
- package/dist/types/events.js +26 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +75 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +20 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logger/LoggerService.d.ts +104 -0
- package/dist/types/logger/LoggerService.d.ts.map +1 -0
- package/dist/types/logger.js +13 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/logs/LogsManager.d.ts +41 -0
- package/dist/types/logs/LogsManager.d.ts.map +1 -0
- package/dist/types/network/NetworkInterceptor.d.ts +35 -0
- package/dist/types/network/NetworkInterceptor.d.ts.map +1 -0
- package/dist/types/performance/PerformanceMonitor.d.ts +44 -0
- package/dist/types/performance/PerformanceMonitor.d.ts.map +1 -0
- package/dist/types/resources/ResourceProvisioner.d.ts +46 -0
- package/dist/types/resources/ResourceProvisioner.d.ts.map +1 -0
- package/dist/types/resources/templates/dashboard.d.ts +6 -0
- package/dist/types/resources/templates/dashboard.d.ts.map +1 -0
- package/dist/types/resources/templates/monitors.d.ts +11 -0
- package/dist/types/resources/templates/monitors.d.ts.map +1 -0
- package/dist/types/resources/templates/slos.d.ts +18 -0
- package/dist/types/resources/templates/slos.d.ts.map +1 -0
- package/dist/types/rum/RumManager.d.ts +70 -0
- package/dist/types/rum/RumManager.d.ts.map +1 -0
- package/dist/types/types/config.d.ts +271 -0
- package/dist/types/types/config.d.ts.map +1 -0
- package/dist/types/types/events.d.ts +71 -0
- package/dist/types/types/events.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +4 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/logger.d.ts +102 -0
- package/dist/types/types/logger.d.ts.map +1 -0
- package/dist/types/utils/EventEmitter.d.ts +14 -0
- package/dist/types/utils/EventEmitter.d.ts.map +1 -0
- package/dist/types/utils/fingerprint.d.ts +10 -0
- package/dist/types/utils/fingerprint.d.ts.map +1 -0
- package/dist/types/utils/retry.d.ts +9 -0
- package/dist/types/utils/retry.d.ts.map +1 -0
- package/dist/types/utils/sanitizer.d.ts +14 -0
- package/dist/types/utils/sanitizer.d.ts.map +1 -0
- package/dist/types/utils/storage.d.ts +17 -0
- package/dist/types/utils/storage.d.ts.map +1 -0
- package/dist/utils/retry.js +35 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { SDKEvent } from '../types/events';
|
|
2
|
+
/** Thresholds based on Google's Web Vitals recommendations */
|
|
3
|
+
const THRESHOLDS = {
|
|
4
|
+
LCP: { good: 2500, poor: 4000 },
|
|
5
|
+
FID: { good: 100, poor: 300 },
|
|
6
|
+
CLS: { good: 0.1, poor: 0.25 },
|
|
7
|
+
INP: { good: 200, poor: 500 },
|
|
8
|
+
FCP: { good: 1800, poor: 3000 },
|
|
9
|
+
TTFB: { good: 800, poor: 1800 },
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Monitors Web Vitals, Long Tasks, and custom performance marks.
|
|
13
|
+
* Uses the PerformanceObserver API for non-intrusive monitoring.
|
|
14
|
+
* Reports metrics to both Datadog RUM and the logger for visibility.
|
|
15
|
+
*
|
|
16
|
+
* Follows the Observer pattern to collect performance entries.
|
|
17
|
+
*/
|
|
18
|
+
export class PerformanceMonitor {
|
|
19
|
+
config;
|
|
20
|
+
logger;
|
|
21
|
+
rumManager;
|
|
22
|
+
emitter;
|
|
23
|
+
observers = [];
|
|
24
|
+
started = false;
|
|
25
|
+
constructor(config, logger, rumManager, emitter) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.rumManager = rumManager;
|
|
29
|
+
this.emitter = emitter;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Starts all configured performance observers.
|
|
33
|
+
*/
|
|
34
|
+
start() {
|
|
35
|
+
if (this.started || typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (this.config.performance.webVitals) {
|
|
39
|
+
this.observeWebVitals();
|
|
40
|
+
}
|
|
41
|
+
if (this.config.performance.longTasks) {
|
|
42
|
+
this.observeLongTasks();
|
|
43
|
+
}
|
|
44
|
+
if (this.config.performance.resourceTiming) {
|
|
45
|
+
this.observeResources();
|
|
46
|
+
}
|
|
47
|
+
this.collectNavigationTiming();
|
|
48
|
+
this.started = true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Records a custom performance mark.
|
|
52
|
+
*/
|
|
53
|
+
mark(name) {
|
|
54
|
+
if (typeof performance !== 'undefined') {
|
|
55
|
+
performance.mark(`dd_toolkit_${name}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Measures time between two marks.
|
|
60
|
+
*/
|
|
61
|
+
measure(name, startMark, endMark) {
|
|
62
|
+
if (typeof performance === 'undefined')
|
|
63
|
+
return undefined;
|
|
64
|
+
try {
|
|
65
|
+
const prefixedStart = `dd_toolkit_${startMark}`;
|
|
66
|
+
const prefixedEnd = endMark ? `dd_toolkit_${endMark}` : undefined;
|
|
67
|
+
if (prefixedEnd) {
|
|
68
|
+
performance.measure(name, prefixedStart, prefixedEnd);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
performance.measure(name, prefixedStart);
|
|
72
|
+
}
|
|
73
|
+
const entries = performance.getEntriesByName(name, 'measure');
|
|
74
|
+
const entry = entries[entries.length - 1];
|
|
75
|
+
if (entry) {
|
|
76
|
+
const duration = Math.round(entry.duration);
|
|
77
|
+
this.rumManager.addTiming(name, duration);
|
|
78
|
+
this.logger.debug(`Performance measure: ${name}`, { duration_ms: duration });
|
|
79
|
+
return duration;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Mark not found or measurement failed
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Stops all performance observers.
|
|
89
|
+
*/
|
|
90
|
+
stop() {
|
|
91
|
+
for (const observer of this.observers) {
|
|
92
|
+
try {
|
|
93
|
+
observer.disconnect();
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Observer might already be disconnected
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.observers = [];
|
|
100
|
+
this.started = false;
|
|
101
|
+
}
|
|
102
|
+
observeWebVitals() {
|
|
103
|
+
// Largest Contentful Paint
|
|
104
|
+
if (this.config.performance.largestContentfulPaint) {
|
|
105
|
+
this.safeObserve('largest-contentful-paint', (entries) => {
|
|
106
|
+
const lastEntry = entries[entries.length - 1];
|
|
107
|
+
if (lastEntry) {
|
|
108
|
+
this.reportMetric({
|
|
109
|
+
name: 'LCP',
|
|
110
|
+
value: lastEntry.startTime,
|
|
111
|
+
rating: this.rate(lastEntry.startTime, THRESHOLDS.LCP),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// First Input Delay
|
|
117
|
+
if (this.config.performance.firstInputDelay) {
|
|
118
|
+
this.safeObserve('first-input', (entries) => {
|
|
119
|
+
const entry = entries[0];
|
|
120
|
+
if (entry) {
|
|
121
|
+
const fid = entry.processingStart - entry.startTime;
|
|
122
|
+
this.reportMetric({
|
|
123
|
+
name: 'FID',
|
|
124
|
+
value: fid,
|
|
125
|
+
rating: this.rate(fid, THRESHOLDS.FID),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
// Cumulative Layout Shift
|
|
131
|
+
if (this.config.performance.cumulativeLayoutShift) {
|
|
132
|
+
let clsValue = 0;
|
|
133
|
+
this.safeObserve('layout-shift', (entries) => {
|
|
134
|
+
for (const entry of entries) {
|
|
135
|
+
const lsEntry = entry;
|
|
136
|
+
if (!lsEntry.hadRecentInput && lsEntry.value) {
|
|
137
|
+
clsValue += lsEntry.value;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
this.reportMetric({
|
|
141
|
+
name: 'CLS',
|
|
142
|
+
value: clsValue,
|
|
143
|
+
rating: this.rate(clsValue, THRESHOLDS.CLS),
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Interaction to Next Paint
|
|
148
|
+
if (this.config.performance.interactionToNextPaint) {
|
|
149
|
+
this.safeObserve('event', (entries) => {
|
|
150
|
+
let maxDuration = 0;
|
|
151
|
+
for (const entry of entries) {
|
|
152
|
+
if (entry.duration > maxDuration) {
|
|
153
|
+
maxDuration = entry.duration;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (maxDuration > 0) {
|
|
157
|
+
this.reportMetric({
|
|
158
|
+
name: 'INP',
|
|
159
|
+
value: maxDuration,
|
|
160
|
+
rating: this.rate(maxDuration, THRESHOLDS.INP),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}, { durationThreshold: 40 });
|
|
164
|
+
}
|
|
165
|
+
// First Contentful Paint
|
|
166
|
+
this.safeObserve('paint', (entries) => {
|
|
167
|
+
const fcp = entries.find((e) => e.name === 'first-contentful-paint');
|
|
168
|
+
if (fcp) {
|
|
169
|
+
this.reportMetric({
|
|
170
|
+
name: 'FCP',
|
|
171
|
+
value: fcp.startTime,
|
|
172
|
+
rating: this.rate(fcp.startTime, THRESHOLDS.FCP),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
observeLongTasks() {
|
|
178
|
+
this.safeObserve('longtask', (entries) => {
|
|
179
|
+
for (const entry of entries) {
|
|
180
|
+
if (entry.duration >= this.config.performance.longTaskThreshold) {
|
|
181
|
+
this.logger.warn('Long task detected', {
|
|
182
|
+
duration_ms: Math.round(entry.duration),
|
|
183
|
+
name: entry.name,
|
|
184
|
+
startTime: Math.round(entry.startTime),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
observeResources() {
|
|
191
|
+
this.safeObserve('resource', (entries) => {
|
|
192
|
+
for (const entry of entries) {
|
|
193
|
+
const resource = entry;
|
|
194
|
+
if (resource.duration > 5000) {
|
|
195
|
+
this.logger.warn('Slow resource detected', {
|
|
196
|
+
name: resource.name,
|
|
197
|
+
duration_ms: Math.round(resource.duration),
|
|
198
|
+
type: resource.initiatorType,
|
|
199
|
+
size: resource.transferSize,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
collectNavigationTiming() {
|
|
206
|
+
if (typeof window === 'undefined')
|
|
207
|
+
return;
|
|
208
|
+
// Defer to ensure navigation timing is available
|
|
209
|
+
const onLoad = () => {
|
|
210
|
+
setTimeout(() => {
|
|
211
|
+
const entries = performance.getEntriesByType('navigation');
|
|
212
|
+
const nav = entries[0];
|
|
213
|
+
if (nav) {
|
|
214
|
+
this.reportMetric({
|
|
215
|
+
name: 'TTFB',
|
|
216
|
+
value: nav.responseStart,
|
|
217
|
+
rating: this.rate(nav.responseStart, THRESHOLDS.TTFB),
|
|
218
|
+
navigationType: nav.type,
|
|
219
|
+
});
|
|
220
|
+
this.logger.debug('Navigation timing', {
|
|
221
|
+
dns_ms: Math.round(nav.domainLookupEnd - nav.domainLookupStart),
|
|
222
|
+
tcp_ms: Math.round(nav.connectEnd - nav.connectStart),
|
|
223
|
+
ttfb_ms: Math.round(nav.responseStart),
|
|
224
|
+
dom_interactive_ms: Math.round(nav.domInteractive),
|
|
225
|
+
dom_complete_ms: Math.round(nav.domComplete),
|
|
226
|
+
load_ms: Math.round(nav.loadEventEnd),
|
|
227
|
+
transfer_size: nav.transferSize,
|
|
228
|
+
type: nav.type,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}, 0);
|
|
232
|
+
};
|
|
233
|
+
if (document.readyState === 'complete') {
|
|
234
|
+
onLoad();
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
window.addEventListener('load', onLoad, { once: true });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
safeObserve(type, callback, options) {
|
|
241
|
+
try {
|
|
242
|
+
if (!PerformanceObserver.supportedEntryTypes?.includes(type)) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const observer = new PerformanceObserver((list) => {
|
|
246
|
+
callback(list.getEntries());
|
|
247
|
+
});
|
|
248
|
+
observer.observe({ type, buffered: true, ...options });
|
|
249
|
+
this.observers.push(observer);
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Observer type not supported in this browser
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
reportMetric(metric) {
|
|
256
|
+
this.rumManager.addTiming(metric.name, Math.round(metric.value));
|
|
257
|
+
const payload = {
|
|
258
|
+
type: SDKEvent.PERFORMANCE_ENTRY,
|
|
259
|
+
timestamp: Date.now(),
|
|
260
|
+
data: metric,
|
|
261
|
+
};
|
|
262
|
+
this.emitter.emit(SDKEvent.PERFORMANCE_ENTRY, payload);
|
|
263
|
+
if (metric.rating === 'poor') {
|
|
264
|
+
this.logger.warn(`Poor ${metric.name} detected`, {
|
|
265
|
+
metric: metric.name,
|
|
266
|
+
value: metric.value,
|
|
267
|
+
rating: metric.rating,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
this.logger.debug(`Web Vital: ${metric.name}`, {
|
|
272
|
+
metric: metric.name,
|
|
273
|
+
value: metric.value,
|
|
274
|
+
rating: metric.rating,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
rate(value, thresholds) {
|
|
279
|
+
if (value <= thresholds.good)
|
|
280
|
+
return 'good';
|
|
281
|
+
if (value <= thresholds.poor)
|
|
282
|
+
return 'needs-improvement';
|
|
283
|
+
return 'poor';
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=PerformanceMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerformanceMonitor.js","sourceRoot":"","sources":["../../../src/performance/PerformanceMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { buildDashboardPayload } from './templates/dashboard';
|
|
2
|
+
import { buildMonitorTemplates } from './templates/monitors';
|
|
3
|
+
import { buildSloTemplates } from './templates/slos';
|
|
4
|
+
import { withRetry } from '../utils/retry';
|
|
5
|
+
const MANAGED_TAG = 'managed:datadog-frontend-toolkit';
|
|
6
|
+
/**
|
|
7
|
+
* Provisions Datadog resources (dashboards, monitors, SLOs) via the Datadog API.
|
|
8
|
+
*
|
|
9
|
+
* **IMPORTANT:** This class uses Datadog API/App keys and must NEVER run in the browser.
|
|
10
|
+
* It is designed for CLI or server-side use only.
|
|
11
|
+
*
|
|
12
|
+
* Follows the Template Method pattern — each resource type has a standard
|
|
13
|
+
* create/check/skip flow.
|
|
14
|
+
*/
|
|
15
|
+
export class ResourceProvisioner {
|
|
16
|
+
apiKey;
|
|
17
|
+
appKey;
|
|
18
|
+
baseUrl;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.apiKey = config.apiKey;
|
|
21
|
+
this.appKey = config.appKey;
|
|
22
|
+
this.baseUrl = `https://api.${config.site || 'datadoghq.com'}/api`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Provisions all configured resources for a service.
|
|
26
|
+
* Checks for existing resources to avoid duplicates.
|
|
27
|
+
*/
|
|
28
|
+
async provision(service, env, config) {
|
|
29
|
+
const result = {
|
|
30
|
+
dashboards: [],
|
|
31
|
+
monitors: [],
|
|
32
|
+
slos: [],
|
|
33
|
+
errors: [],
|
|
34
|
+
};
|
|
35
|
+
// Dashboards
|
|
36
|
+
if (config.dashboards !== false) {
|
|
37
|
+
try {
|
|
38
|
+
const dashboard = await this.provisionDashboard(service, env, config.team);
|
|
39
|
+
if (dashboard)
|
|
40
|
+
result.dashboards.push(dashboard);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
result.errors.push(`Dashboard: ${err instanceof Error ? err.message : String(err)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Monitors
|
|
47
|
+
if (config.monitors !== false) {
|
|
48
|
+
try {
|
|
49
|
+
const monitors = await this.provisionMonitors(service, env, config);
|
|
50
|
+
result.monitors.push(...monitors);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
result.errors.push(`Monitors: ${err instanceof Error ? err.message : String(err)}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// SLOs
|
|
57
|
+
if (config.slos !== false) {
|
|
58
|
+
try {
|
|
59
|
+
const slos = await this.provisionSlos(service, env, config.team);
|
|
60
|
+
result.slos.push(...slos);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
result.errors.push(`SLOs: ${err instanceof Error ? err.message : String(err)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
async provisionDashboard(service, env, team) {
|
|
69
|
+
// Check if dashboard already exists
|
|
70
|
+
const existing = await this.findExistingDashboard(service, env);
|
|
71
|
+
if (existing) {
|
|
72
|
+
return existing;
|
|
73
|
+
}
|
|
74
|
+
const payload = buildDashboardPayload(service, env, team);
|
|
75
|
+
const response = await this.apiRequest('POST', '/v1/dashboard', payload);
|
|
76
|
+
return {
|
|
77
|
+
id: response.id,
|
|
78
|
+
title: response.title,
|
|
79
|
+
url: response.url,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async provisionMonitors(service, env, config) {
|
|
83
|
+
const templates = buildMonitorTemplates(service, env, config.notificationChannels, config.team);
|
|
84
|
+
const results = [];
|
|
85
|
+
for (const template of templates) {
|
|
86
|
+
const existing = await this.findExistingMonitor(template.name);
|
|
87
|
+
if (existing) {
|
|
88
|
+
results.push(existing);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const response = await this.apiRequest('POST', '/v1/monitor', {
|
|
92
|
+
name: template.name,
|
|
93
|
+
type: template.type,
|
|
94
|
+
query: template.query,
|
|
95
|
+
message: template.message,
|
|
96
|
+
tags: template.tags,
|
|
97
|
+
options: template.options,
|
|
98
|
+
});
|
|
99
|
+
results.push({ id: response.id, name: response.name });
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
async provisionSlos(service, env, team) {
|
|
104
|
+
const templates = buildSloTemplates(service, env, team);
|
|
105
|
+
const results = [];
|
|
106
|
+
for (const template of templates) {
|
|
107
|
+
const existing = await this.findExistingSlo(template.name);
|
|
108
|
+
if (existing) {
|
|
109
|
+
results.push(existing);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const response = await this.apiRequest('POST', '/v1/slo', {
|
|
113
|
+
name: template.name,
|
|
114
|
+
description: template.description,
|
|
115
|
+
type: template.type,
|
|
116
|
+
query: template.query,
|
|
117
|
+
thresholds: template.thresholds,
|
|
118
|
+
tags: template.tags,
|
|
119
|
+
});
|
|
120
|
+
const responseData = response.data;
|
|
121
|
+
results.push({
|
|
122
|
+
id: (responseData?.[0]?.id ?? response.id),
|
|
123
|
+
name: template.name,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return results;
|
|
127
|
+
}
|
|
128
|
+
async findExistingDashboard(service, env) {
|
|
129
|
+
try {
|
|
130
|
+
const response = await this.apiRequest('GET', '/v1/dashboard');
|
|
131
|
+
const dashboards = (response.dashboards || []);
|
|
132
|
+
const existing = dashboards.find((d) => typeof d.title === 'string' &&
|
|
133
|
+
d.title.includes(`[Auto] ${service}`) &&
|
|
134
|
+
d.title.includes(env));
|
|
135
|
+
if (existing) {
|
|
136
|
+
return {
|
|
137
|
+
id: existing.id,
|
|
138
|
+
title: existing.title,
|
|
139
|
+
url: `https://app.datadoghq.com/dashboard/${existing.id}`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// If search fails, proceed with creation
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
async findExistingMonitor(name) {
|
|
149
|
+
try {
|
|
150
|
+
const response = await this.apiRequest('GET', `/v1/monitor?tag=${encodeURIComponent(MANAGED_TAG)}`);
|
|
151
|
+
const monitors = Array.isArray(response) ? response : [];
|
|
152
|
+
const existing = monitors.find((m) => m.name === name);
|
|
153
|
+
if (existing) {
|
|
154
|
+
return { id: existing.id, name: existing.name };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// If search fails, proceed with creation
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
async findExistingSlo(name) {
|
|
163
|
+
try {
|
|
164
|
+
const response = await this.apiRequest('GET', `/v1/slo?tags_query=${encodeURIComponent(MANAGED_TAG)}`);
|
|
165
|
+
const slos = (response.data || []);
|
|
166
|
+
const existing = slos.find((s) => s.name === name);
|
|
167
|
+
if (existing) {
|
|
168
|
+
return { id: existing.id, name: existing.name };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// If search fails, proceed with creation
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
async apiRequest(method, path, body) {
|
|
177
|
+
return withRetry(async () => {
|
|
178
|
+
const url = `${this.baseUrl}${path}`;
|
|
179
|
+
const headers = {
|
|
180
|
+
'Content-Type': 'application/json',
|
|
181
|
+
'DD-API-KEY': this.apiKey,
|
|
182
|
+
'DD-APPLICATION-KEY': this.appKey,
|
|
183
|
+
};
|
|
184
|
+
const options = { method, headers };
|
|
185
|
+
if (body && method !== 'GET') {
|
|
186
|
+
options.body = JSON.stringify(body);
|
|
187
|
+
}
|
|
188
|
+
const response = await fetch(url, options);
|
|
189
|
+
if (!response.ok) {
|
|
190
|
+
const errorBody = await response.text();
|
|
191
|
+
throw new Error(`Datadog API error ${response.status}: ${errorBody}`);
|
|
192
|
+
}
|
|
193
|
+
return (await response.json());
|
|
194
|
+
}, {
|
|
195
|
+
maxAttempts: 3,
|
|
196
|
+
shouldRetry: (error, _attempt) => {
|
|
197
|
+
if (error instanceof Error && error.message.includes('429'))
|
|
198
|
+
return true;
|
|
199
|
+
if (error instanceof Error && error.message.includes('5'))
|
|
200
|
+
return true;
|
|
201
|
+
return false;
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=ResourceProvisioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceProvisioner.js","sourceRoot":"","sources":["../../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAS3C,MAAM,WAAW,GAAG,kCAAkC,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,OAAO,mBAAmB;IACb,MAAM,CAAS;IACf,MAAM,CAAS;IACf,OAAO,CAAS;IAEjC,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,eAAe,MAAM,CAAC,IAAI,IAAI,eAAe,MAAM,CAAC;IACrE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,OAAe,EACf,GAAW,EACX,MAA0B;QAE1B,MAAM,MAAM,GAAuB;YACjC,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,aAAa;QACb,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3E,IAAI,SAAS;oBAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBACpE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAED,OAAO;QACP,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,OAAe,EACf,GAAW,EACX,IAAa;QAEb,oCAAoC;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChE,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QACzE,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAY;YACzB,KAAK,EAAE,QAAQ,CAAC,KAAe;YAC/B,GAAG,EAAE,QAAQ,CAAC,GAAa;SAC5B,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,OAAe,EACf,GAAW,EACX,MAA0B;QAE1B,MAAM,SAAS,GAAG,qBAAqB,CACrC,OAAO,EACP,GAAG,EACH,MAAM,CAAC,oBAAoB,EAC3B,MAAM,CAAC,IAAI,CACZ,CAAC;QAEF,MAAM,OAAO,GAAmC,EAAE,CAAC;QAEnD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE;gBAC5D,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAc,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,OAAe,EACf,GAAW,EACX,IAAa;QAEb,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,OAAO,GAAmC,EAAE,CAAC;QAEnD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE;gBACxD,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAkD,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAW;gBACpD,IAAI,EAAE,QAAQ,CAAC,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,OAAe,EACf,GAAW;QAEX,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAmC,CAAC;YAEjF,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAC9B,CAAC,CAA0B,EAAE,EAAE,CAC7B,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;gBAC3B,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,OAAO,EAAE,CAAC;gBACrC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CACxB,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,EAAE,EAAE,QAAQ,CAAC,EAAY;oBACzB,KAAK,EAAE,QAAQ,CAAC,KAAe;oBAC/B,GAAG,EAAE,uCAAuC,QAAQ,CAAC,EAAE,EAAE;iBAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,IAAY;QAEZ,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CACpC,KAAK,EACL,mBAAmB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CACrD,CAAC;YAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAC5B,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAChD,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAc,EAAE,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,IAAY;QAEZ,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CACpC,KAAK,EACL,sBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CACxD,CAAC;YAEF,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAmC,CAAC;YACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAChD,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAc,EAAE,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;YACrC,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,IAAI,CAAC,MAAM;gBACzB,oBAAoB,EAAE,IAAI,CAAC,MAAM;aAClC,CAAC;YAEF,MAAM,OAAO,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACjD,IAAI,IAAI,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAE3C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,qBAAqB,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CACrD,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC5D,CAAC,EACD;YACE,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC/B,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACzE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACvE,OAAO,KAAK,CAAC;YACf,CAAC;SACF,CACF,CAAC;IACJ,CAAC;CACF"}
|