@mecanizou/telemetry-hub 1.0.1 → 1.0.2
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/CHANGELOG.md +14 -0
- package/dist/core/__tests__/logger-types.test.d.ts +1 -0
- package/dist/core/__tests__/logger-types.test.js +325 -0
- package/dist/core/__tests__/logger.test.d.ts +1 -0
- package/dist/core/__tests__/logger.test.js +337 -0
- package/dist/core/__tests__/tracer.test.d.ts +1 -0
- package/dist/core/__tests__/tracer.test.js +330 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.js +4 -2
- package/dist/core/logger-types.js +3 -0
- package/dist/core/logger.d.ts +1 -1
- package/dist/core/logger.js +1 -1
- package/dist/core/tracer-types.d.ts +50 -0
- package/dist/core/tracer-types.js +3 -0
- package/dist/core/tracer.d.ts +10 -0
- package/dist/core/tracer.js +114 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +4 -2
- package/dist/sst/__tests__/telemetry.test.d.ts +1 -0
- package/dist/sst/__tests__/telemetry.test.js +138 -0
- package/dist/sst/index.js +1 -1
- package/dist/sst/middy/index.js +1 -1
- package/dist/sst/middy/middleware.d.ts +1 -1
- package/dist/sst/middy/middleware.js +54 -69
- package/dist/sst/telemetry.d.ts +2 -1
- package/dist/sst/telemetry.js +12 -2
- package/dist/telemetry/sst/middy/middleware.d.ts +1 -1
- package/dist/telemetry/sst/middy/middleware.js +4 -4
- package/dist/tsed/__tests__/config.test.d.ts +1 -0
- package/dist/tsed/__tests__/config.test.js +146 -0
- package/dist/tsed/__tests__/service.test.d.ts +1 -0
- package/dist/tsed/__tests__/service.test.js +63 -0
- package/dist/tsed/config.d.ts +6 -0
- package/dist/tsed/config.js +65 -12
- package/dist/tsed/index.d.ts +1 -0
- package/dist/tsed/index.js +2 -1
- package/dist/tsed/log-telemetry.js +125 -10
- package/dist/tsed/service.d.ts +2 -0
- package/dist/tsed/service.js +20 -1
- package/dist/tsed/sync-log-record-processor.js +1 -1
- package/package.json +1 -1
- package/dist/check-if-is-working.d.ts +0 -1
- package/dist/check-if-is-working.js +0 -8
- package/dist/core/types.js +0 -3
- package/dist/services/index.d.ts +0 -1
- package/dist/services/index.js +0 -18
- package/dist/services/telemetry/config.d.ts +0 -20
- package/dist/services/telemetry/config.js +0 -113
- package/dist/services/telemetry/external-service.d.ts +0 -20
- package/dist/services/telemetry/external-service.js +0 -69
- package/dist/services/telemetry/index.d.ts +0 -3
- package/dist/services/telemetry/index.js +0 -20
- package/dist/services/telemetry/sync-log-record-processor.d.ts +0 -11
- package/dist/services/telemetry/sync-log-record-processor.js +0 -74
- package/dist/telemetry.d.ts +0 -1
- package/dist/telemetry.js +0 -81
- /package/dist/core/{types.d.ts → logger-types.d.ts} +0 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const vitest_1 = require("vitest");
|
|
13
|
+
const logger_1 = require("../logger");
|
|
14
|
+
const api_logs_1 = require("@opentelemetry/api-logs");
|
|
15
|
+
(0, vitest_1.describe)('StandardLogger', () => {
|
|
16
|
+
let mockLogger;
|
|
17
|
+
let standardLogger;
|
|
18
|
+
(0, vitest_1.beforeEach)(() => {
|
|
19
|
+
mockLogger = {
|
|
20
|
+
emit: vitest_1.vi.fn(),
|
|
21
|
+
};
|
|
22
|
+
standardLogger = new logger_1.StandardLogger(mockLogger, 'test-service');
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.describe)('logError', () => {
|
|
25
|
+
(0, vitest_1.it)('deve emitir log com severity ERROR', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
26
|
+
const errorData = {
|
|
27
|
+
message: 'Test error message',
|
|
28
|
+
serviceName: 'test-service',
|
|
29
|
+
environment: 'test',
|
|
30
|
+
};
|
|
31
|
+
yield standardLogger.logError(errorData);
|
|
32
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
33
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
34
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.ERROR);
|
|
35
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('ERROR');
|
|
36
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Test error message');
|
|
37
|
+
}));
|
|
38
|
+
(0, vitest_1.it)('deve incluir informações do erro quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
39
|
+
const error = new Error('Custom error');
|
|
40
|
+
const errorData = {
|
|
41
|
+
message: 'Error occurred',
|
|
42
|
+
error,
|
|
43
|
+
serviceName: 'test-service',
|
|
44
|
+
environment: 'production',
|
|
45
|
+
};
|
|
46
|
+
yield standardLogger.logError(errorData);
|
|
47
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
48
|
+
(0, vitest_1.expect)(emittedLog.attributes['error.type']).toBe('Error');
|
|
49
|
+
(0, vitest_1.expect)(emittedLog.attributes['error.message']).toBe('Custom error');
|
|
50
|
+
(0, vitest_1.expect)(emittedLog.attributes['error.stack']).toBeDefined();
|
|
51
|
+
}));
|
|
52
|
+
(0, vitest_1.it)('deve incluir contexto HTTP quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const errorData = {
|
|
54
|
+
message: 'HTTP error',
|
|
55
|
+
serviceName: 'test-service',
|
|
56
|
+
environment: 'production',
|
|
57
|
+
http: {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
url: '/api/test',
|
|
60
|
+
endpoint: '/api/test',
|
|
61
|
+
statusCode: 500,
|
|
62
|
+
headers: { 'content-type': 'application/json' },
|
|
63
|
+
body: { test: 'data' },
|
|
64
|
+
params: { id: '123' },
|
|
65
|
+
query: { filter: 'active' },
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
yield standardLogger.logError(errorData);
|
|
69
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
70
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
|
|
71
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.url']).toBe('/api/test');
|
|
72
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
|
|
73
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBe(500);
|
|
74
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.headers']).toBe(JSON.stringify({ 'content-type': 'application/json' }));
|
|
75
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.body']).toBe(JSON.stringify({ test: 'data' }));
|
|
76
|
+
}));
|
|
77
|
+
(0, vitest_1.it)('deve incluir informações de usuário quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
78
|
+
const errorData = {
|
|
79
|
+
message: 'User error',
|
|
80
|
+
serviceName: 'test-service',
|
|
81
|
+
environment: 'production',
|
|
82
|
+
user: {
|
|
83
|
+
accountUserUid: 'user-123',
|
|
84
|
+
accountUid: 'account-456',
|
|
85
|
+
applicationUid: 'app-789',
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
yield standardLogger.logError(errorData);
|
|
89
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
90
|
+
(0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
|
|
91
|
+
(0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBe('account-456');
|
|
92
|
+
(0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBe('app-789');
|
|
93
|
+
}));
|
|
94
|
+
(0, vitest_1.it)('deve incluir informações de execução quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
95
|
+
const errorData = {
|
|
96
|
+
message: 'Execution error',
|
|
97
|
+
serviceName: 'test-service',
|
|
98
|
+
environment: 'production',
|
|
99
|
+
execution: {
|
|
100
|
+
requestId: 'req-123',
|
|
101
|
+
awsRequestId: 'aws-456',
|
|
102
|
+
functionName: 'testFunction',
|
|
103
|
+
invocationId: 'inv-789',
|
|
104
|
+
controller: 'TestController',
|
|
105
|
+
controllerMethod: 'testMethod',
|
|
106
|
+
origin: 'mobile',
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
yield standardLogger.logError(errorData);
|
|
110
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
111
|
+
(0, vitest_1.expect)(emittedLog.attributes['request.id']).toBe('req-123');
|
|
112
|
+
(0, vitest_1.expect)(emittedLog.attributes['aws.request.id']).toBe('aws-456');
|
|
113
|
+
(0, vitest_1.expect)(emittedLog.attributes['faas.name']).toBe('testFunction');
|
|
114
|
+
(0, vitest_1.expect)(emittedLog.attributes['faas.invocation_id']).toBe('inv-789');
|
|
115
|
+
(0, vitest_1.expect)(emittedLog.attributes['controller.name']).toBe('TestController');
|
|
116
|
+
(0, vitest_1.expect)(emittedLog.attributes['controller.method']).toBe('testMethod');
|
|
117
|
+
(0, vitest_1.expect)(emittedLog.attributes['origin']).toBe('mobile');
|
|
118
|
+
}));
|
|
119
|
+
(0, vitest_1.it)('deve incluir métricas de performance quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
120
|
+
const errorData = {
|
|
121
|
+
message: 'Performance error',
|
|
122
|
+
serviceName: 'test-service',
|
|
123
|
+
environment: 'production',
|
|
124
|
+
performance: {
|
|
125
|
+
durationMs: 1500,
|
|
126
|
+
success: false,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
yield standardLogger.logError(errorData);
|
|
130
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
131
|
+
(0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(1500);
|
|
132
|
+
(0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(false);
|
|
133
|
+
}));
|
|
134
|
+
(0, vitest_1.it)('deve incluir contexto adicional quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
135
|
+
const errorData = {
|
|
136
|
+
message: 'Context error',
|
|
137
|
+
serviceName: 'test-service',
|
|
138
|
+
environment: 'production',
|
|
139
|
+
context: {
|
|
140
|
+
additionalInfo: 'some data',
|
|
141
|
+
nested: { value: 123 },
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
yield standardLogger.logError(errorData);
|
|
145
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
146
|
+
(0, vitest_1.expect)(emittedLog.attributes['context']).toBe(JSON.stringify({ additionalInfo: 'some data', nested: { value: 123 } }));
|
|
147
|
+
}));
|
|
148
|
+
(0, vitest_1.it)('deve usar serviceName padrão quando não fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
149
|
+
const errorData = {
|
|
150
|
+
message: 'Default service error',
|
|
151
|
+
serviceName: '',
|
|
152
|
+
environment: 'production',
|
|
153
|
+
};
|
|
154
|
+
yield standardLogger.logError(errorData);
|
|
155
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
156
|
+
(0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('test-service');
|
|
157
|
+
}));
|
|
158
|
+
(0, vitest_1.it)('deve adicionar timestamp automaticamente', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
159
|
+
const errorData = {
|
|
160
|
+
message: 'Timestamp test',
|
|
161
|
+
serviceName: 'test-service',
|
|
162
|
+
environment: 'production',
|
|
163
|
+
};
|
|
164
|
+
yield standardLogger.logError(errorData);
|
|
165
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
166
|
+
(0, vitest_1.expect)(emittedLog.attributes['timestamp']).toBeDefined();
|
|
167
|
+
(0, vitest_1.expect)(emittedLog.attributes['timestamp']).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
|
|
168
|
+
}));
|
|
169
|
+
(0, vitest_1.it)('deve filtrar valores undefined e null dos atributos', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
170
|
+
const errorData = {
|
|
171
|
+
message: 'Filter test',
|
|
172
|
+
serviceName: 'test-service',
|
|
173
|
+
environment: 'production',
|
|
174
|
+
user: {
|
|
175
|
+
accountUserUid: 'user-123',
|
|
176
|
+
accountUid: undefined,
|
|
177
|
+
applicationUid: undefined,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
yield standardLogger.logError(errorData);
|
|
181
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
182
|
+
(0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
|
|
183
|
+
(0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBeUndefined();
|
|
184
|
+
(0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBeUndefined();
|
|
185
|
+
}));
|
|
186
|
+
});
|
|
187
|
+
(0, vitest_1.describe)('logInfo', () => {
|
|
188
|
+
(0, vitest_1.it)('deve emitir log com severity INFO', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
189
|
+
const infoData = {
|
|
190
|
+
message: 'Info message',
|
|
191
|
+
serviceName: 'test-service',
|
|
192
|
+
environment: 'production',
|
|
193
|
+
};
|
|
194
|
+
yield standardLogger.logInfo(infoData);
|
|
195
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
196
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
197
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.INFO);
|
|
198
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('INFO');
|
|
199
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Info message');
|
|
200
|
+
}));
|
|
201
|
+
(0, vitest_1.it)('deve incluir dados de performance em log de sucesso', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
202
|
+
const infoData = {
|
|
203
|
+
message: 'Request completed',
|
|
204
|
+
serviceName: 'test-service',
|
|
205
|
+
environment: 'production',
|
|
206
|
+
performance: {
|
|
207
|
+
durationMs: 250,
|
|
208
|
+
success: true,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
yield standardLogger.logInfo(infoData);
|
|
212
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
213
|
+
(0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(250);
|
|
214
|
+
(0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(true);
|
|
215
|
+
}));
|
|
216
|
+
});
|
|
217
|
+
(0, vitest_1.describe)('logWarn', () => {
|
|
218
|
+
(0, vitest_1.it)('deve emitir log com severity WARN', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
219
|
+
const warnData = {
|
|
220
|
+
message: 'Warning message',
|
|
221
|
+
serviceName: 'test-service',
|
|
222
|
+
environment: 'production',
|
|
223
|
+
};
|
|
224
|
+
yield standardLogger.logWarn(warnData);
|
|
225
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
226
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
227
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.WARN);
|
|
228
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('WARN');
|
|
229
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Warning message');
|
|
230
|
+
}));
|
|
231
|
+
});
|
|
232
|
+
(0, vitest_1.describe)('logDebug', () => {
|
|
233
|
+
(0, vitest_1.it)('deve emitir log com severity DEBUG', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
234
|
+
const debugData = {
|
|
235
|
+
message: 'Debug message',
|
|
236
|
+
serviceName: 'test-service',
|
|
237
|
+
environment: 'development',
|
|
238
|
+
};
|
|
239
|
+
yield standardLogger.logDebug(debugData);
|
|
240
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
241
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
242
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.DEBUG);
|
|
243
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('DEBUG');
|
|
244
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Debug message');
|
|
245
|
+
}));
|
|
246
|
+
});
|
|
247
|
+
(0, vitest_1.describe)('buildAttributes', () => {
|
|
248
|
+
(0, vitest_1.it)('deve construir atributos completos com todos os campos', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
249
|
+
const fullData = {
|
|
250
|
+
message: 'Complete log',
|
|
251
|
+
serviceName: 'complete-service',
|
|
252
|
+
environment: 'production',
|
|
253
|
+
error: new Error('Test error'),
|
|
254
|
+
http: {
|
|
255
|
+
method: 'GET',
|
|
256
|
+
url: '/api/users',
|
|
257
|
+
endpoint: '/api/users',
|
|
258
|
+
statusCode: 200,
|
|
259
|
+
},
|
|
260
|
+
user: {
|
|
261
|
+
accountUserUid: 'user-abc',
|
|
262
|
+
accountUid: 'account-xyz',
|
|
263
|
+
applicationUid: 'app-123',
|
|
264
|
+
},
|
|
265
|
+
execution: {
|
|
266
|
+
requestId: 'req-001',
|
|
267
|
+
awsRequestId: 'aws-002',
|
|
268
|
+
functionName: 'getUsers',
|
|
269
|
+
invocationId: 'inv-003',
|
|
270
|
+
controller: 'UserController',
|
|
271
|
+
controllerMethod: 'getAll',
|
|
272
|
+
origin: 'web',
|
|
273
|
+
},
|
|
274
|
+
performance: {
|
|
275
|
+
durationMs: 300,
|
|
276
|
+
success: true,
|
|
277
|
+
},
|
|
278
|
+
context: {
|
|
279
|
+
custom: 'data',
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
yield standardLogger.logInfo(fullData);
|
|
283
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
284
|
+
const attrs = emittedLog.attributes;
|
|
285
|
+
(0, vitest_1.expect)(attrs['service.name']).toBe('complete-service');
|
|
286
|
+
(0, vitest_1.expect)(attrs['deployment.environment.name']).toBe('production');
|
|
287
|
+
(0, vitest_1.expect)(attrs['error.type']).toBe('Error');
|
|
288
|
+
(0, vitest_1.expect)(attrs['http.method']).toBe('GET');
|
|
289
|
+
(0, vitest_1.expect)(attrs['accountUser.uid']).toBe('user-abc');
|
|
290
|
+
(0, vitest_1.expect)(attrs['request.id']).toBe('req-001');
|
|
291
|
+
(0, vitest_1.expect)(attrs['duration.ms']).toBe(300);
|
|
292
|
+
(0, vitest_1.expect)(attrs['context']).toBe(JSON.stringify({ custom: 'data' }));
|
|
293
|
+
}));
|
|
294
|
+
(0, vitest_1.it)('deve lidar com campos HTTP parciais', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
295
|
+
const partialHttpData = {
|
|
296
|
+
message: 'Partial HTTP',
|
|
297
|
+
serviceName: 'test-service',
|
|
298
|
+
environment: 'production',
|
|
299
|
+
http: {
|
|
300
|
+
method: 'POST',
|
|
301
|
+
endpoint: '/api/test',
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
yield standardLogger.logInfo(partialHttpData);
|
|
305
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
306
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
|
|
307
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
|
|
308
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.url']).toBeUndefined();
|
|
309
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBeUndefined();
|
|
310
|
+
}));
|
|
311
|
+
});
|
|
312
|
+
(0, vitest_1.describe)('construtor', () => {
|
|
313
|
+
(0, vitest_1.it)('deve aceitar serviceName padrão personalizado', () => {
|
|
314
|
+
const customLogger = new logger_1.StandardLogger(mockLogger, 'custom-service');
|
|
315
|
+
const logData = {
|
|
316
|
+
message: 'Test',
|
|
317
|
+
serviceName: '',
|
|
318
|
+
environment: 'test',
|
|
319
|
+
};
|
|
320
|
+
customLogger.logInfo(logData);
|
|
321
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
322
|
+
(0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('custom-service');
|
|
323
|
+
});
|
|
324
|
+
(0, vitest_1.it)('deve usar "unknown-service" como padrão quando não especificado', () => {
|
|
325
|
+
const defaultLogger = new logger_1.StandardLogger(mockLogger);
|
|
326
|
+
const logData = {
|
|
327
|
+
message: 'Test',
|
|
328
|
+
serviceName: '',
|
|
329
|
+
environment: 'test',
|
|
330
|
+
};
|
|
331
|
+
defaultLogger.logInfo(logData);
|
|
332
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
333
|
+
(0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('unknown-service');
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9fX3Rlc3RzX18vbG9nZ2VyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBOEQ7QUFDOUQsc0NBQTJDO0FBQzNDLHNEQUF5RDtBQUV6RCxJQUFBLGlCQUFRLEVBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLElBQUksVUFBZSxDQUFDO0lBQ3BCLElBQUksY0FBOEIsQ0FBQztJQUVuQyxJQUFBLG1CQUFVLEVBQUMsR0FBRyxFQUFFO1FBQ2QsVUFBVSxHQUFHO1lBQ1gsSUFBSSxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBQ0YsY0FBYyxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGlCQUFRLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUN4QixJQUFBLFdBQUUsRUFBQyxvQ0FBb0MsRUFBRSxHQUFTLEVBQUU7WUFDbEQsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxvQkFBb0I7Z0JBQzdCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBYyxDQUFDLEtB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QUFhLEdBQUcsSUFBSSx1QkFBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sT0FBTyxHQUFHO2dCQUNkLE9BQU8sRUFBRSxNQUFNO2dCQUNmLFdBQVcsRUFBRSxFQUFFO2dCQUNmLFdBQVcsRUFBRSxNQUFNO2FBQ3BCLENBQUM7WUFFRixhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRS9CLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGl0LCBleHBlY3QsIHZpLCBiZWZvcmVFYWNoIH0gZnJvbSAndml0ZXN0JztcclxuaW1wb3J0IHsgU3RhbmRhcmRMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xyXG5pbXBvcnQgeyBTZXZlcml0eU51bWJlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzJztcclxuXHJcbmRlc2NyaWJlKCdTdGFuZGFyZExvZ2dlcicsICgpID0+IHtcclxuICBsZXQgbW9ja0xvZ2dlcjogYW55O1xyXG4gIGxldCBzdGFuZGFyZExvZ2dlcjogU3RhbmRhcmRMb2dnZXI7XHJcblxyXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xyXG4gICAgbW9ja0xvZ2dlciA9IHtcclxuICAgICAgZW1pdDogdmkuZm4oKSxcclxuICAgIH07XHJcbiAgICBzdGFuZGFyZExvZ2dlciA9IG5ldyBTdGFuZGFyZExvZ2dlcihtb2NrTG9nZ2VyLCAndGVzdC1zZXJ2aWNlJyk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dFcnJvcicsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGVtaXRpciBsb2cgY29tIHNldmVyaXR5IEVSUk9SJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1Rlc3QgZXJyb3IgbWVzc2FnZScsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAndGVzdCcsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tMb2dnZXIuZW1pdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5TnVtYmVyKS50b0JlKFNldmVyaXR5TnVtYmVyLkVSUk9SKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdFUlJPUicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdUZXN0IGVycm9yIG1lc3NhZ2UnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgaW5mb3JtYcOnw7VlcyBkbyBlcnJvIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdDdXN0b20gZXJyb3InKTtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdFcnJvciBvY2N1cnJlZCcsXHJcbiAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci50eXBlJ10pLnRvQmUoJ0Vycm9yJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2Vycm9yLm1lc3NhZ2UnXSkudG9CZSgnQ3VzdG9tIGVycm9yJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2Vycm9yLnN0YWNrJ10pLnRvQmVEZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGNvbnRleHRvIEhUVFAgcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdIVFRQIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgIHVybDogJy9hcGkvdGVzdCcsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvdGVzdCcsXHJcbiAgICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXHJcbiAgICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcclxuICAgICAgICAgIGJvZHk6IHsgdGVzdDogJ2RhdGEnIH0sXHJcbiAgICAgICAgICBwYXJhbXM6IHsgaWQ6ICcxMjMnIH0sXHJcbiAgICAgICAgICBxdWVyeTogeyBmaWx0ZXI6ICdhY3RpdmUnIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAubWV0aG9kJ10pLnRvQmUoJ1BPU1QnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC51cmwnXSkudG9CZSgnL2FwaS90ZXN0Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuZW5kcG9pbnQnXSkudG9CZSgnL2FwaS90ZXN0Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuc3RhdHVzX2NvZGUnXSkudG9CZSg1MDApO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLmhlYWRlcnMnXSkudG9CZShcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSlcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5ib2R5J10pLnRvQmUoXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyB0ZXN0OiAnZGF0YScgfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgaW5mb3JtYcOnw7VlcyBkZSB1c3XDoXJpbyBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1VzZXIgZXJyb3InLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogJ2FjY291bnQtNDU2JyxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiAnYXBwLTc4OScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2FjY291bnRVc2VyLnVpZCddKS50b0JlKCd1c2VyLTEyMycpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50LnVpZCddKS50b0JlKCdhY2NvdW50LTQ1NicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhcHBsaWNhdGlvbi51aWQnXSkudG9CZSgnYXBwLTc4OScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBpbmZvcm1hw6fDtWVzIGRlIGV4ZWN1w6fDo28gcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdFeGVjdXRpb24gZXJyb3InLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIGV4ZWN1dGlvbjoge1xyXG4gICAgICAgICAgcmVxdWVzdElkOiAncmVxLTEyMycsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICdhd3MtNDU2JyxcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Rlc3RGdW5jdGlvbicsXHJcbiAgICAgICAgICBpbnZvY2F0aW9uSWQ6ICdpbnYtNzg5JyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6ICdUZXN0Q29udHJvbGxlcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiAndGVzdE1ldGhvZCcsXHJcbiAgICAgICAgICBvcmlnaW46ICdtb2JpbGUnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydyZXF1ZXN0LmlkJ10pLnRvQmUoJ3JlcS0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYXdzLnJlcXVlc3QuaWQnXSkudG9CZSgnYXdzLTQ1NicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydmYWFzLm5hbWUnXSkudG9CZSgndGVzdEZ1bmN0aW9uJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2ZhYXMuaW52b2NhdGlvbl9pZCddKS50b0JlKCdpbnYtNzg5Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2NvbnRyb2xsZXIubmFtZSddKS50b0JlKCdUZXN0Q29udHJvbGxlcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydjb250cm9sbGVyLm1ldGhvZCddKS50b0JlKCd0ZXN0TWV0aG9kJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ29yaWdpbiddKS50b0JlKCdtb2JpbGUnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgbcOpdHJpY2FzIGRlIHBlcmZvcm1hbmNlIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnUGVyZm9ybWFuY2UgZXJyb3InLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHBlcmZvcm1hbmNlOiB7XHJcbiAgICAgICAgICBkdXJhdGlvbk1zOiAxNTAwLFxyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2R1cmF0aW9uLm1zJ10pLnRvQmUoMTUwMCk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2V4ZWN1dGlvbi5zdWNjZXNzJ10pLnRvQmUoZmFsc2UpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBjb250ZXh0byBhZGljaW9uYWwgcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdDb250ZXh0IGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsSW5mbzogJ3NvbWUgZGF0YScsXHJcbiAgICAgICAgICBuZXN0ZWQ6IHsgdmFsdWU6IDEyMyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydjb250ZXh0J10pLnRvQmUoXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBhZGRpdGlvbmFsSW5mbzogJ3NvbWUgZGF0YScsIG5lc3RlZDogeyB2YWx1ZTogMTIzIH0gfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIHVzYXIgc2VydmljZU5hbWUgcGFkcsOjbyBxdWFuZG8gbsOjbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRGVmYXVsdCBzZXJ2aWNlIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsIC8vIEVtcHR5IHN0cmluZyBwYXJhIHRlc3RhciBmYWxsYmFja1xyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgndGVzdC1zZXJ2aWNlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBhZGljaW9uYXIgdGltZXN0YW1wIGF1dG9tYXRpY2FtZW50ZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUaW1lc3RhbXAgdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWyd0aW1lc3RhbXAnXSkudG9CZURlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sndGltZXN0YW1wJ10pLnRvTWF0Y2goXHJcbiAgICAgICAgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHszfVokL1xyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgZmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZCBlIG51bGwgZG9zIGF0cmlidXRvcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdGaWx0ZXIgdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgdXNlcjoge1xyXG4gICAgICAgICAgYWNjb3VudFVzZXJVaWQ6ICd1c2VyLTEyMycsXHJcbiAgICAgICAgICBhY2NvdW50VWlkOiB1bmRlZmluZWQgYXMgYW55LFxyXG4gICAgICAgICAgYXBwbGljYXRpb25VaWQ6IHVuZGVmaW5lZCBhcyBhbnksXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2FjY291bnRVc2VyLnVpZCddKS50b0JlKCd1c2VyLTEyMycpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50LnVpZCddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2FwcGxpY2F0aW9uLnVpZCddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2xvZ0luZm8nLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBJTkZPJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBpbmZvRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnSW5mbyBtZXNzYWdlJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0luZm8oaW5mb0RhdGEpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tMb2dnZXIuZW1pdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5TnVtYmVyKS50b0JlKFNldmVyaXR5TnVtYmVyLklORk8pO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eVRleHQpLnRvQmUoJ0lORk8nKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYm9keSkudG9CZSgnSW5mbyBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGRhZG9zIGRlIHBlcmZvcm1hbmNlIGVtIGxvZyBkZSBzdWNlc3NvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBpbmZvRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnUmVxdWVzdCBjb21wbGV0ZWQnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHBlcmZvcm1hbmNlOiB7XHJcbiAgICAgICAgICBkdXJhdGlvbk1zOiAyNTAsXHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGluZm9EYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZHVyYXRpb24ubXMnXSkudG9CZSgyNTApO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydleGVjdXRpb24uc3VjY2VzcyddKS50b0JlKHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dXYXJuJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgZW1pdGlyIGxvZyBjb20gc2V2ZXJpdHkgV0FSTicsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3Qgd2FybkRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1dhcm5pbmcgbWVzc2FnZScsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dXYXJuKHdhcm5EYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5XQVJOKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdXQVJOJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmJvZHkpLnRvQmUoJ1dhcm5pbmcgbWVzc2FnZScpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dEZWJ1ZycsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGVtaXRpciBsb2cgY29tIHNldmVyaXR5IERFQlVHJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkZWJ1Z0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0RlYnVnIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0RlYnVnKGRlYnVnRGF0YSk7XHJcblxyXG4gICAgICBleHBlY3QobW9ja0xvZ2dlci5lbWl0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlOdW1iZXIpLnRvQmUoU2V2ZXJpdHlOdW1iZXIuREVCVUcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eVRleHQpLnRvQmUoJ0RFQlVHJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmJvZHkpLnRvQmUoJ0RlYnVnIG1lc3NhZ2UnKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnYnVpbGRBdHRyaWJ1dGVzJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgY29uc3RydWlyIGF0cmlidXRvcyBjb21wbGV0b3MgY29tIHRvZG9zIG9zIGNhbXBvcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZnVsbERhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0NvbXBsZXRlIGxvZycsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdjb21wbGV0ZS1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3IoJ1Rlc3QgZXJyb3InKSxcclxuICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgdXJsOiAnL2FwaS91c2VycycsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvdXNlcnMnLFxyXG4gICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXNlcjoge1xyXG4gICAgICAgICAgYWNjb3VudFVzZXJVaWQ6ICd1c2VyLWFiYycsXHJcbiAgICAgICAgICBhY2NvdW50VWlkOiAnYWNjb3VudC14eXonLFxyXG4gICAgICAgICAgYXBwbGljYXRpb25VaWQ6ICdhcHAtMTIzJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGV4ZWN1dGlvbjoge1xyXG4gICAgICAgICAgcmVxdWVzdElkOiAncmVxLTAwMScsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICdhd3MtMDAyJyxcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2dldFVzZXJzJyxcclxuICAgICAgICAgIGludm9jYXRpb25JZDogJ2ludi0wMDMnLFxyXG4gICAgICAgICAgY29udHJvbGxlcjogJ1VzZXJDb250cm9sbGVyJyxcclxuICAgICAgICAgIGNvbnRyb2xsZXJNZXRob2Q6ICdnZXRBbGwnLFxyXG4gICAgICAgICAgb3JpZ2luOiAnd2ViJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBlcmZvcm1hbmNlOiB7XHJcbiAgICAgICAgICBkdXJhdGlvbk1zOiAzMDAsXHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgY3VzdG9tOiAnZGF0YScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0luZm8oZnVsbERhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBjb25zdCBhdHRycyA9IGVtaXR0ZWRMb2cuYXR0cmlidXRlcztcclxuXHJcbiAgICAgIC8vIFZlcmlmaWNhciB0b2RvcyBvcyBjYW1wb3NcclxuICAgICAgZXhwZWN0KGF0dHJzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgnY29tcGxldGUtc2VydmljZScpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSddKS50b0JlKCdwcm9kdWN0aW9uJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyc1snZXJyb3IudHlwZSddKS50b0JlKCdFcnJvcicpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2h0dHAubWV0aG9kJ10pLnRvQmUoJ0dFVCcpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2FjY291bnRVc2VyLnVpZCddKS50b0JlKCd1c2VyLWFiYycpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ3JlcXVlc3QuaWQnXSkudG9CZSgncmVxLTAwMScpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2R1cmF0aW9uLm1zJ10pLnRvQmUoMzAwKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydjb250ZXh0J10pLnRvQmUoSlNPTi5zdHJpbmdpZnkoeyBjdXN0b206ICdkYXRhJyB9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBsaWRhciBjb20gY2FtcG9zIEhUVFAgcGFyY2lhaXMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcnRpYWxIdHRwRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnUGFydGlhbCBIVFRQJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgIGVuZHBvaW50OiAnL2FwaS90ZXN0JyxcclxuICAgICAgICAgIC8vIHVybCwgc3RhdHVzQ29kZSwgaGVhZGVycywgZXRjIG7Do28gZm9ybmVjaWRvc1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKHBhcnRpYWxIdHRwRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAubWV0aG9kJ10pLnRvQmUoJ1BPU1QnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5lbmRwb2ludCddKS50b0JlKCcvYXBpL3Rlc3QnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC51cmwnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLnN0YXR1c19jb2RlJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnY29uc3RydXRvcicsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGFjZWl0YXIgc2VydmljZU5hbWUgcGFkcsOjbyBwZXJzb25hbGl6YWRvJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXN0b21Mb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIobW9ja0xvZ2dlciwgJ2N1c3RvbS1zZXJ2aWNlJyk7XHJcbiAgICAgIGNvbnN0IGxvZ0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1Rlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Rlc3QnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY3VzdG9tTG9nZ2VyLmxvZ0luZm8obG9nRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ3NlcnZpY2UubmFtZSddKS50b0JlKCdjdXN0b20tc2VydmljZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgdXNhciBcInVua25vd24tc2VydmljZVwiIGNvbW8gcGFkcsOjbyBxdWFuZG8gbsOjbyBlc3BlY2lmaWNhZG8nLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRMb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIobW9ja0xvZ2dlcik7XHJcbiAgICAgIGNvbnN0IGxvZ0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1Rlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Rlc3QnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgZGVmYXVsdExvZ2dlci5sb2dJbmZvKGxvZ0RhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgndW5rbm93bi1zZXJ2aWNlJyk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufSk7XHJcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|