@elastic/synthetics 1.0.0-beta.2 → 1.0.0-beta.22
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 +235 -0
- package/NOTICE.txt +250 -0
- package/README.md +2 -1
- package/dist/cli.js +87 -56
- package/dist/cli.js.map +1 -1
- package/dist/common_types.d.ts +116 -14
- package/dist/common_types.d.ts.map +1 -1
- package/dist/config.d.ts +2 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -5
- package/dist/config.js.map +1 -1
- package/dist/core/browser-service.js +5 -5
- package/dist/core/browser-service.js.map +1 -1
- package/dist/core/expect.d.ts +177 -0
- package/dist/core/expect.d.ts.map +1 -0
- package/dist/core/expect.js +33 -0
- package/dist/core/expect.js.map +1 -0
- package/dist/core/gatherer.d.ts +4 -7
- package/dist/core/gatherer.d.ts.map +1 -1
- package/dist/core/gatherer.js +39 -12
- package/dist/core/gatherer.js.map +1 -1
- package/dist/core/index.d.ts +5 -5
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/logger.d.ts +0 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +3 -16
- package/dist/core/logger.js.map +1 -1
- package/dist/core/runner.d.ts +54 -45
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +181 -71
- package/dist/core/runner.js.map +1 -1
- package/dist/dsl/journey.d.ts +13 -4
- package/dist/dsl/journey.d.ts.map +1 -1
- package/dist/dsl/journey.js +40 -1
- package/dist/dsl/journey.js.map +1 -1
- package/dist/formatter/javascript.d.ts +73 -0
- package/dist/formatter/javascript.d.ts.map +1 -0
- package/dist/formatter/javascript.js +274 -0
- package/dist/formatter/javascript.js.map +1 -0
- package/dist/helpers.d.ts +33 -12
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +108 -54
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/parse_args.d.ts +5 -2
- package/dist/parse_args.d.ts.map +1 -1
- package/dist/parse_args.js +59 -16
- package/dist/parse_args.js.map +1 -1
- package/dist/plugins/browser-console.d.ts +5 -8
- package/dist/plugins/browser-console.d.ts.map +1 -1
- package/dist/plugins/browser-console.js +27 -8
- package/dist/plugins/browser-console.js.map +1 -1
- package/dist/plugins/network.d.ts +23 -20
- package/dist/plugins/network.d.ts.map +1 -1
- package/dist/plugins/network.js +149 -124
- package/dist/plugins/network.js.map +1 -1
- package/dist/plugins/performance.d.ts +5 -5
- package/dist/plugins/performance.d.ts.map +1 -1
- package/dist/plugins/performance.js +5 -5
- package/dist/plugins/performance.js.map +1 -1
- package/dist/plugins/plugin-manager.d.ts +11 -11
- package/dist/plugins/plugin-manager.d.ts.map +1 -1
- package/dist/plugins/plugin-manager.js +40 -24
- package/dist/plugins/plugin-manager.js.map +1 -1
- package/dist/plugins/tracing.d.ts +10 -25
- package/dist/plugins/tracing.d.ts.map +1 -1
- package/dist/plugins/tracing.js +40 -26
- package/dist/plugins/tracing.js.map +1 -1
- package/dist/reporters/base.d.ts +0 -1
- package/dist/reporters/base.d.ts.map +1 -1
- package/dist/reporters/base.js +34 -32
- package/dist/reporters/base.js.map +1 -1
- package/dist/reporters/json.d.ts +46 -59
- package/dist/reporters/json.d.ts.map +1 -1
- package/dist/reporters/json.js +188 -70
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/junit.d.ts.map +1 -1
- package/dist/reporters/junit.js +7 -7
- package/dist/reporters/junit.js.map +1 -1
- package/dist/sdk/lh-trace-processor.d.ts +304 -0
- package/dist/sdk/lh-trace-processor.d.ts.map +1 -0
- package/dist/sdk/lh-trace-processor.js +832 -0
- package/dist/sdk/lh-trace-processor.js.map +1 -0
- package/dist/sdk/trace-metrics.d.ts +61 -0
- package/dist/sdk/trace-metrics.d.ts.map +1 -0
- package/dist/sdk/trace-metrics.js +252 -0
- package/dist/sdk/trace-metrics.js.map +1 -0
- package/dist/sdk/trace-processor.d.ts +106 -0
- package/dist/sdk/trace-processor.d.ts.map +1 -0
- package/dist/sdk/trace-processor.js +74 -0
- package/dist/sdk/trace-processor.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1575
- package/package.json +27 -16
- package/src/cli.ts +68 -45
- package/src/common_types.ts +138 -14
- package/src/config.ts +2 -5
- package/src/core/expect.ts +187 -0
- package/src/core/gatherer.ts +48 -24
- package/src/core/index.ts +6 -6
- package/src/core/logger.ts +1 -12
- package/src/core/runner.ts +259 -112
- package/src/dsl/journey.ts +28 -6
- package/src/formatter/javascript.ts +330 -0
- package/src/helpers.ts +114 -24
- package/src/index.ts +7 -6
- package/src/parse_args.ts +97 -22
- package/src/plugins/browser-console.ts +30 -13
- package/src/plugins/network.ts +175 -159
- package/src/plugins/performance.ts +7 -7
- package/src/plugins/plugin-manager.ts +47 -36
- package/src/plugins/tracing.ts +43 -54
- package/src/reporters/base.ts +29 -23
- package/src/reporters/json.ts +259 -80
- package/src/reporters/junit.ts +1 -1
- package/src/sdk/lh-trace-processor.ts +1033 -0
- package/src/sdk/trace-metrics.ts +287 -0
- package/src/sdk/trace-processor.ts +147 -0
|
@@ -22,35 +22,20 @@
|
|
|
22
22
|
* THE SOFTWARE.
|
|
23
23
|
*
|
|
24
24
|
*/
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
* https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU
|
|
30
|
-
*/
|
|
31
|
-
declare type TraceEvent = {
|
|
32
|
-
name: string;
|
|
33
|
-
cat: string;
|
|
34
|
-
pid: number;
|
|
35
|
-
tid: number;
|
|
36
|
-
ph?: string;
|
|
37
|
-
args?: {
|
|
38
|
-
snapshot: string;
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Platform specific monotonic non decreasing clock time
|
|
42
|
-
* https://source.chromium.org/chromium/chromium/src/+/master:base/time/time.h;l=936;bpv=0;bpt=0
|
|
43
|
-
*/
|
|
44
|
-
ts: number;
|
|
25
|
+
import { Driver, PluginOutput } from '../common_types';
|
|
26
|
+
export declare type TraceOptions = {
|
|
27
|
+
filmstrips?: boolean;
|
|
28
|
+
trace?: boolean;
|
|
45
29
|
};
|
|
46
|
-
export declare function filterFilmstrips(traceEvents: Array<TraceEvent>): Array<FilmStrip>;
|
|
47
30
|
/**
|
|
48
|
-
* Custom Tracer that
|
|
31
|
+
* Custom Tracer that listenes for events from specified categories
|
|
49
32
|
* https://chromedevtools.github.io/devtools-protocol/tot/Tracing/
|
|
50
33
|
*/
|
|
51
34
|
export declare class Tracing {
|
|
52
|
-
|
|
53
|
-
|
|
35
|
+
private driver;
|
|
36
|
+
private options;
|
|
37
|
+
constructor(driver: Driver, options: TraceOptions);
|
|
38
|
+
start(): Promise<void>;
|
|
39
|
+
stop(): Promise<Partial<PluginOutput>>;
|
|
54
40
|
}
|
|
55
|
-
export {};
|
|
56
41
|
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/plugins/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/plugins/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIvD,oBAAY,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,qBAAa,OAAO;IACN,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,OAAO;gBAA/B,MAAM,EAAE,MAAM,EAAU,OAAO,EAAE,YAAY;IAE3D,KAAK;IAkCL,IAAI;CA0BX"}
|
package/dist/plugins/tracing.js
CHANGED
|
@@ -24,48 +24,53 @@
|
|
|
24
24
|
*
|
|
25
25
|
*/
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
-
exports.Tracing =
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
const events = traceEvents.filter(event => {
|
|
31
|
-
const { args, cat, name } = event;
|
|
32
|
-
return (name === 'Screenshot' &&
|
|
33
|
-
cat === 'disabled-by-default-devtools.screenshot' &&
|
|
34
|
-
(args === null || args === void 0 ? void 0 : args.snapshot));
|
|
35
|
-
});
|
|
36
|
-
return events.map(event => ({
|
|
37
|
-
snapshot: event.args.snapshot,
|
|
38
|
-
ts: event.ts,
|
|
39
|
-
startTime: helpers_1.convertTraceTimestamp(event.ts),
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
exports.filterFilmstrips = filterFilmstrips;
|
|
27
|
+
exports.Tracing = void 0;
|
|
28
|
+
const trace_metrics_1 = require("../sdk/trace-metrics");
|
|
29
|
+
const trace_processor_1 = require("../sdk/trace-processor");
|
|
43
30
|
/**
|
|
44
|
-
* Custom Tracer that
|
|
31
|
+
* Custom Tracer that listenes for events from specified categories
|
|
45
32
|
* https://chromedevtools.github.io/devtools-protocol/tot/Tracing/
|
|
46
33
|
*/
|
|
47
34
|
class Tracing {
|
|
48
|
-
|
|
35
|
+
constructor(driver, options) {
|
|
36
|
+
this.driver = driver;
|
|
37
|
+
this.options = options;
|
|
38
|
+
}
|
|
39
|
+
async start() {
|
|
49
40
|
const includedCategories = [
|
|
50
41
|
// exclude all default categories
|
|
51
42
|
'-*',
|
|
52
|
-
// capture screenshots
|
|
53
|
-
'disabled-by-default-devtools.screenshot',
|
|
54
43
|
];
|
|
55
|
-
|
|
44
|
+
if (this.options.filmstrips) {
|
|
45
|
+
// capture screenshots - up to 450 max for each trace (https://goo.gl/rBfhn4)
|
|
46
|
+
includedCategories.push('disabled-by-default-devtools.screenshot');
|
|
47
|
+
}
|
|
48
|
+
if (this.options.trace) {
|
|
49
|
+
includedCategories.push(
|
|
50
|
+
// Used instead of 'toplevel' in Chrome 71+
|
|
51
|
+
'disabled-by-default-lighthouse',
|
|
52
|
+
// Cumulative Layout Shift metric
|
|
53
|
+
'loading',
|
|
54
|
+
// UserTiming marks/measures
|
|
55
|
+
'blink.user_timing',
|
|
56
|
+
// Most of the events we need are from these two categories
|
|
57
|
+
// Includes FCP, LCP, Main thread frames, process, etc.
|
|
58
|
+
'devtools.timeline', 'disabled-by-default-devtools.timeline');
|
|
59
|
+
}
|
|
60
|
+
await this.driver.client.send('Tracing.start', {
|
|
56
61
|
/**
|
|
57
62
|
* Using `ReportEvents` makes gathering trace events
|
|
58
63
|
* much faster as opposed to using `ReturnAsStream` mode
|
|
59
64
|
*/
|
|
60
65
|
transferMode: 'ReportEvents',
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
},
|
|
66
|
+
categories: includedCategories.join(','),
|
|
67
|
+
options: 'sampling-frequency=10000', // 1000 is default
|
|
64
68
|
});
|
|
65
69
|
}
|
|
66
|
-
async stop(
|
|
70
|
+
async stop() {
|
|
67
71
|
const events = [];
|
|
68
72
|
const collectListener = payload => events.push(...payload.value);
|
|
73
|
+
const { client } = this.driver;
|
|
69
74
|
client.on('Tracing.dataCollected', collectListener);
|
|
70
75
|
const [traceEvents] = await Promise.all([
|
|
71
76
|
new Promise(resolve => client.once('Tracing.tracingComplete', () => {
|
|
@@ -74,7 +79,16 @@ class Tracing {
|
|
|
74
79
|
})),
|
|
75
80
|
client.send('Tracing.end'),
|
|
76
81
|
]);
|
|
77
|
-
|
|
82
|
+
const output = {};
|
|
83
|
+
if (this.options.filmstrips) {
|
|
84
|
+
output.filmstrips = trace_metrics_1.Filmstrips.compute(traceEvents);
|
|
85
|
+
}
|
|
86
|
+
if (this.options.trace) {
|
|
87
|
+
Object.assign(output, {
|
|
88
|
+
...trace_processor_1.TraceProcessor.computeTrace(traceEvents),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return output;
|
|
78
92
|
}
|
|
79
93
|
}
|
|
80
94
|
exports.Tracing = Tracing;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/plugins/tracing.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/plugins/tracing.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;AAGH,wDAAkD;AAClD,4DAAoE;AAOpE;;;GAGG;AACH,MAAa,OAAO;IAClB,YAAoB,MAAc,EAAU,OAAqB;QAA7C,WAAM,GAAN,MAAM,CAAQ;QAAU,YAAO,GAAP,OAAO,CAAc;IAAG,CAAC;IAErE,KAAK,CAAC,KAAK;QACT,MAAM,kBAAkB,GAAG;YACzB,iCAAiC;YACjC,IAAI;SACL,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3B,6EAA6E;YAC7E,kBAAkB,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;SACpE;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;YACtB,kBAAkB,CAAC,IAAI;YACrB,2CAA2C;YAC3C,gCAAgC;YAChC,iCAAiC;YACjC,SAAS;YACT,4BAA4B;YAC5B,mBAAmB;YACnB,2DAA2D;YAC3D,uDAAuD;YACvD,mBAAmB,EACnB,uCAAuC,CACxC,CAAC;SACH;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAC7C;;;eAGG;YACH,YAAY,EAAE,cAAc;YAC5B,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;YACxC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB;SACxD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;QAEpD,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CACpB,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;gBAC1C,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;gBACrD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CACH;YACD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;SAC3B,CAAC,CAAC;QACH,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3B,MAAM,CAAC,UAAU,GAAG,0BAAU,CAAC,OAAO,CAAC,WAAgC,CAAC,CAAC;SAC1E;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;YACtB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;gBACpB,GAAG,gCAAc,CAAC,YAAY,CAAC,WAAgC,CAAC;aACjE,CAAC,CAAC;SACJ;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA/DD,0BA+DC"}
|
package/dist/reporters/base.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/reporters/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,MAAM,MAAM,gBAAgB,CAAC;AAQpC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAyB7C,MAAM,CAAC,OAAO,OAAO,YAAY;IAIZ,MAAM,EAAE,MAAM;IAHjC,MAAM,EAAE,SAAS,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;gBAEQ,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/reporters/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,MAAM,MAAM,gBAAgB,CAAC;AAQpC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAyB7C,MAAM,CAAC,OAAO,OAAO,YAAY;IAIZ,MAAM,EAAE,MAAM;IAHjC,MAAM,EAAE,SAAS,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;gBAEQ,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IAiBhE,kBAAkB;IAqDlB,KAAK,CAAC,OAAO,KAAA;CAMd"}
|
package/dist/reporters/base.js
CHANGED
|
@@ -32,21 +32,21 @@ const colors_1 = require("kleur/colors");
|
|
|
32
32
|
const helpers_1 = require("../helpers");
|
|
33
33
|
function renderError(error) {
|
|
34
34
|
let output = '';
|
|
35
|
-
const outer = helpers_1.indent('');
|
|
36
|
-
const inner = helpers_1.indent(outer);
|
|
35
|
+
const outer = (0, helpers_1.indent)('');
|
|
36
|
+
const inner = (0, helpers_1.indent)(outer);
|
|
37
37
|
const container = outer + '---\n';
|
|
38
38
|
output += container;
|
|
39
39
|
let stack = error.stack;
|
|
40
40
|
if (stack) {
|
|
41
41
|
output += inner + 'stack: |-\n';
|
|
42
|
-
stack = helpers_1.rewriteErrorStack(stack, helpers_1.findPWLogsIndexes(stack));
|
|
42
|
+
stack = (0, helpers_1.rewriteErrorStack)(stack, (0, helpers_1.findPWLogsIndexes)(stack));
|
|
43
43
|
const lines = String(stack).split('\n');
|
|
44
44
|
for (const line of lines) {
|
|
45
45
|
output += inner + ' ' + line + '\n';
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
output += container;
|
|
49
|
-
return colors_1.red(output);
|
|
49
|
+
return (0, colors_1.red)(output);
|
|
50
50
|
}
|
|
51
51
|
function renderDuration(durationMs) {
|
|
52
52
|
return parseInt(durationMs);
|
|
@@ -55,28 +55,17 @@ class BaseReporter {
|
|
|
55
55
|
constructor(runner, options = {}) {
|
|
56
56
|
this.runner = runner;
|
|
57
57
|
this.fd = options.fd || process.stdout.fd;
|
|
58
|
-
|
|
58
|
+
/**
|
|
59
|
+
* minLength is set to 1 byte to make sure we flush the
|
|
60
|
+
* content even if its the last byte on the stream buffer
|
|
61
|
+
* before destroying the pipe with underlying file descriptor
|
|
62
|
+
*/
|
|
63
|
+
this.stream = new sonic_boom_1.default({ fd: this.fd, sync: true, minLength: 1 });
|
|
64
|
+
// flushSync is used here to make sure all the data from the underlying
|
|
65
|
+
// SonicBoom stream buffer is completely written to the fd before closing
|
|
66
|
+
// the process
|
|
67
|
+
this.runner.on('end', () => this.stream.flushSync());
|
|
59
68
|
this._registerListeners();
|
|
60
|
-
this.runner.on('end', () => this.close());
|
|
61
|
-
}
|
|
62
|
-
close() {
|
|
63
|
-
if (this.fd <= 2) {
|
|
64
|
-
/**
|
|
65
|
-
* For stdout/stderr we destroy stream once data is written and run
|
|
66
|
-
* it as the last listener giving enough room for
|
|
67
|
-
* other reporters to write to stream
|
|
68
|
-
*/
|
|
69
|
-
setImmediate(() => this.stream.end());
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
/**
|
|
73
|
-
* If the user has passed a custom FD we don't close the FD, but we do flush it
|
|
74
|
-
* to give them more control. This is important because FDs should only be closed
|
|
75
|
-
* once, and the primary use case for custom FDs is being called by heartbeat, which
|
|
76
|
-
* closes the FD after the process exits
|
|
77
|
-
*/
|
|
78
|
-
this.stream.flush();
|
|
79
|
-
}
|
|
80
69
|
}
|
|
81
70
|
_registerListeners() {
|
|
82
71
|
const result = {
|
|
@@ -89,22 +78,35 @@ class BaseReporter {
|
|
|
89
78
|
});
|
|
90
79
|
this.runner.on('step:end', ({ step, start, end, error, status }) => {
|
|
91
80
|
const message = `${helpers_1.symbols[status]} Step: '${step.name}' ${status} (${renderDuration((end - start) * 1000)} ms)`;
|
|
92
|
-
this.write(helpers_1.indent(message));
|
|
81
|
+
this.write((0, helpers_1.indent)(message));
|
|
93
82
|
error && this.write(renderError(error));
|
|
94
83
|
result[status]++;
|
|
95
84
|
});
|
|
85
|
+
this.runner.on('journey:end', ({ error }) => {
|
|
86
|
+
const { failed, succeeded, skipped } = result;
|
|
87
|
+
const total = failed + succeeded + skipped;
|
|
88
|
+
/**
|
|
89
|
+
* Render the error on the terminal only when no steps could
|
|
90
|
+
* be executed which means the error happened in one of the hooks
|
|
91
|
+
*/
|
|
92
|
+
if (total === 0 && error) {
|
|
93
|
+
this.write(renderError(error));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
96
|
this.runner.on('end', () => {
|
|
97
97
|
const { failed, succeeded, skipped } = result;
|
|
98
98
|
const total = failed + succeeded + skipped;
|
|
99
|
+
let message = '\n';
|
|
99
100
|
if (total === 0) {
|
|
100
|
-
|
|
101
|
+
message = 'No tests found!';
|
|
102
|
+
message += ` (${renderDuration((0, helpers_1.now)())} ms) \n`;
|
|
103
|
+
this.write(message);
|
|
101
104
|
return;
|
|
102
105
|
}
|
|
103
|
-
|
|
104
|
-
message +=
|
|
105
|
-
message +=
|
|
106
|
-
message +=
|
|
107
|
-
message += ` (${renderDuration(helpers_1.now())} ms) \n`;
|
|
106
|
+
message += succeeded > 0 ? (0, colors_1.green)(` ${succeeded} passed`) : '';
|
|
107
|
+
message += failed > 0 ? (0, colors_1.red)(` ${failed} failed`) : '';
|
|
108
|
+
message += skipped > 0 ? (0, colors_1.cyan)(` ${skipped} skipped`) : '';
|
|
109
|
+
message += ` (${renderDuration((0, helpers_1.now)())} ms) \n`;
|
|
108
110
|
this.write(message);
|
|
109
111
|
});
|
|
110
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/reporters/base.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;AAEH,4DAAmC;AACnC,yCAAgD;AAEhD,wCAMoB;AAGpB,SAAS,WAAW,CAAC,KAAK;IACxB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,KAAK,GAAG,gBAAM,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/reporters/base.ts"],"names":[],"mappings":"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"}
|
package/dist/reporters/json.d.ts
CHANGED
|
@@ -22,36 +22,57 @@
|
|
|
22
22
|
* THE SOFTWARE.
|
|
23
23
|
*
|
|
24
24
|
*/
|
|
25
|
+
/// <reference types="node" />
|
|
25
26
|
import BaseReporter from './base';
|
|
26
27
|
import { Journey, Step } from '../dsl';
|
|
27
|
-
import { NetworkInfo, StatusValue } from '../common_types';
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
declare type OutputType = 'synthetics/metadata' | 'journey/register' | 'journey/start' | 'step/screenshot' | 'step/end' | 'journey/network_info' | 'journey/filmstrips' | 'journey/browserconsole' | 'journey/end';
|
|
28
|
+
import { NetworkInfo, NetworkConditions, TraceOutput, StatusValue, PerfMetrics, Params, Screenshot } from '../common_types';
|
|
29
|
+
import { PageMetrics } from '../plugins';
|
|
30
|
+
declare type OutputType = 'synthetics/metadata' | 'journey/register' | 'journey/start' | 'screenshot/block' | 'step/screenshot_ref' | 'step/screenshot' | 'step/metrics' | 'step/filmstrips' | 'step/end' | 'journey/network_info' | 'journey/browserconsole' | 'journey/end';
|
|
31
31
|
declare type Payload = {
|
|
32
32
|
source?: string;
|
|
33
33
|
start?: number;
|
|
34
34
|
end?: number;
|
|
35
35
|
url?: string;
|
|
36
|
-
status?: StatusValue
|
|
37
|
-
|
|
38
|
-
params?:
|
|
36
|
+
status?: StatusValue;
|
|
37
|
+
pagemetrics?: PageMetrics;
|
|
38
|
+
params?: Params;
|
|
39
39
|
type?: OutputType;
|
|
40
40
|
text?: string;
|
|
41
41
|
index?: number;
|
|
42
|
+
network_conditions?: NetworkConditions;
|
|
42
43
|
};
|
|
43
44
|
declare type OutputFields = {
|
|
44
45
|
type: OutputType;
|
|
46
|
+
_id?: string;
|
|
45
47
|
journey?: Journey;
|
|
46
48
|
timestamp?: number;
|
|
47
49
|
url?: string;
|
|
48
|
-
step?: Partial<Step
|
|
50
|
+
step?: Partial<Step> & {
|
|
51
|
+
duration?: {
|
|
52
|
+
us: number;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
49
55
|
error?: Error;
|
|
50
56
|
root_fields?: Record<string, unknown>;
|
|
51
|
-
payload?: Payload
|
|
57
|
+
payload?: Payload;
|
|
52
58
|
blob?: string;
|
|
53
59
|
blob_mime?: string;
|
|
54
60
|
};
|
|
61
|
+
declare type ScreenshotBlob = {
|
|
62
|
+
blob: string;
|
|
63
|
+
id: string;
|
|
64
|
+
};
|
|
65
|
+
declare type ScreenshotReference = {
|
|
66
|
+
width: number;
|
|
67
|
+
height: number;
|
|
68
|
+
blocks: Array<{
|
|
69
|
+
hash: string;
|
|
70
|
+
top: number;
|
|
71
|
+
left: number;
|
|
72
|
+
width: number;
|
|
73
|
+
height: number;
|
|
74
|
+
}>;
|
|
75
|
+
};
|
|
55
76
|
export declare function formatNetworkFields(network: NetworkInfo): {
|
|
56
77
|
ecs: {
|
|
57
78
|
url: string;
|
|
@@ -62,57 +83,10 @@ export declare function formatNetworkFields(network: NetworkInfo): {
|
|
|
62
83
|
};
|
|
63
84
|
http: {
|
|
64
85
|
version: number;
|
|
65
|
-
request:
|
|
66
|
-
|
|
67
|
-
bytes: number;
|
|
68
|
-
content: string;
|
|
69
|
-
};
|
|
70
|
-
referrer: string;
|
|
71
|
-
url: string;
|
|
72
|
-
urlFragment?: string;
|
|
73
|
-
method: string;
|
|
74
|
-
headers: Protocol.Network.Headers;
|
|
75
|
-
postData?: string;
|
|
76
|
-
hasPostData?: boolean;
|
|
77
|
-
postDataEntries?: Protocol.Network.PostDataEntry[];
|
|
78
|
-
mixedContentType?: Protocol.Security.MixedContentType;
|
|
79
|
-
initialPriority: Protocol.Network.ResourcePriority;
|
|
80
|
-
referrerPolicy: "unsafe-url" | "no-referrer-when-downgrade" | "no-referrer" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin";
|
|
81
|
-
isLinkPreload?: boolean;
|
|
82
|
-
trustTokenParams?: Protocol.Network.TrustTokenParams;
|
|
83
|
-
};
|
|
84
|
-
response: {
|
|
85
|
-
body: {
|
|
86
|
-
bytes: number;
|
|
87
|
-
};
|
|
88
|
-
status_code: number;
|
|
89
|
-
url: string;
|
|
90
|
-
status: number;
|
|
91
|
-
statusText: string;
|
|
92
|
-
headers: Protocol.Network.Headers;
|
|
93
|
-
headersText?: string;
|
|
94
|
-
mimeType: string;
|
|
95
|
-
requestHeaders?: Protocol.Network.Headers;
|
|
96
|
-
requestHeadersText?: string;
|
|
97
|
-
connectionReused: boolean;
|
|
98
|
-
connectionId: number;
|
|
99
|
-
remoteIPAddress?: string;
|
|
100
|
-
remotePort?: number;
|
|
101
|
-
fromDiskCache?: boolean;
|
|
102
|
-
fromServiceWorker?: boolean;
|
|
103
|
-
fromPrefetchCache?: boolean;
|
|
104
|
-
encodedDataLength: number;
|
|
105
|
-
timing?: Protocol.Network.ResourceTiming;
|
|
106
|
-
serviceWorkerResponseSource?: Protocol.Network.ServiceWorkerResponseSource;
|
|
107
|
-
responseTime?: number;
|
|
108
|
-
cacheStorageCacheName?: string;
|
|
109
|
-
protocol?: string;
|
|
110
|
-
securityState: Protocol.Security.SecurityState;
|
|
111
|
-
securityDetails?: Protocol.Network.SecurityDetails;
|
|
112
|
-
};
|
|
86
|
+
request: import("../common_types").Request;
|
|
87
|
+
response: import("../common_types").Response;
|
|
113
88
|
};
|
|
114
89
|
tls: {
|
|
115
|
-
cipher: string;
|
|
116
90
|
server: {
|
|
117
91
|
x509: {
|
|
118
92
|
issuer: {
|
|
@@ -131,9 +105,22 @@ export declare function formatNetworkFields(network: NetworkInfo): {
|
|
|
131
105
|
};
|
|
132
106
|
payload: Partial<NetworkInfo>;
|
|
133
107
|
};
|
|
108
|
+
export declare function getScreenshotBlocks(screenshot: Buffer): Promise<{
|
|
109
|
+
blocks: ScreenshotBlob[];
|
|
110
|
+
reference: ScreenshotReference;
|
|
111
|
+
blob_mime: string;
|
|
112
|
+
}>;
|
|
113
|
+
/**
|
|
114
|
+
* Get all the screenshots from the cached screenshot location
|
|
115
|
+
* at the end of each journey and construct equally sized blocks out
|
|
116
|
+
* of the individual screenshot image.
|
|
117
|
+
*/
|
|
118
|
+
export declare function gatherScreenshots(screenshotsPath: string, callback: (data: Screenshot) => Promise<void>): Promise<void>;
|
|
134
119
|
export default class JSONReporter extends BaseReporter {
|
|
135
120
|
_registerListeners(): void;
|
|
136
|
-
|
|
121
|
+
writeScreenshotBlocks(journey: Journey, screenshot: Screenshot): Promise<void>;
|
|
122
|
+
writeMetrics(journey: Journey, step: Step, type: string, events: Array<TraceOutput> | PerfMetrics): void;
|
|
123
|
+
writeJSON({ _id, journey, type, timestamp, step, root_fields, error, payload, blob, blob_mime, url, }: OutputFields): void;
|
|
137
124
|
}
|
|
138
125
|
export {};
|
|
139
126
|
//# sourceMappingURL=json.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"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"}
|