@flakiness/report 0.0.1

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 ADDED
@@ -0,0 +1,45 @@
1
+ Fair Source License, version 0.9
2
+
3
+ Copyright (C) 2023 Degu Labs, Inc.
4
+
5
+ Licensor: Degu Labs, Inc
6
+
7
+ Software: @flakiness/playwright-report
8
+
9
+ Use Limitation: 100 users. Executing the software, modifying the code, or
10
+ accessing a running copy of the software constitutes “use.”
11
+
12
+ License Grant. Licensor hereby grants to each recipient of the
13
+ Software ("you") a non-exclusive, non-transferable, royalty-free and
14
+ fully-paid-up license, under all of the Licensor’s copyright and
15
+ patent rights, to use, copy, distribute, prepare derivative works of,
16
+ publicly perform and display the Software, subject to the Use
17
+ Limitation and the conditions set forth below.
18
+
19
+ Use Limitation. The license granted above allows use by up to the
20
+ number of users per entity set forth above (the "Use Limitation"). For
21
+ determining the number of users, "you" includes all affiliates,
22
+ meaning legal entities controlling, controlled by, or under common
23
+ control with you. If you exceed the Use Limitation, your use is
24
+ subject to payment of Licensor’s then-current list price for licenses.
25
+
26
+ Conditions. Redistribution in source code or other forms must include
27
+ a copy of this license document to be provided in a reasonable
28
+ manner. Any redistribution of the Software is only allowed subject to
29
+ this license.
30
+
31
+ Trademarks. This license does not grant you any right in the
32
+ trademarks, service marks, brand names or logos of Licensor.
33
+
34
+ DISCLAIMER. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OR
35
+ CONDITION, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES
36
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
37
+ NONINFRINGEMENT. LICENSORS HEREBY DISCLAIM ALL LIABILITY, WHETHER IN
38
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
39
+ CONNECTION WITH THE SOFTWARE.
40
+
41
+ Termination. If you violate the terms of this license, your rights
42
+ will terminate automatically and will not be reinstated without the
43
+ prior written consent of Licensor. Any such termination will not
44
+ affect the right of others who may have received copies of the
45
+ Software from you.
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import { uploadPlaywrightJSON } from "./uploadPlaywrightJSONReport.js";
3
+ const USAGE = `npx flakiness [command]`;
4
+ const HELP = `
5
+ Flakiness CLI tool.
6
+
7
+ Usage:
8
+ ${USAGE}
9
+
10
+ Commands:
11
+ upload-playwright-json Upload Playwright Test JSON report to flakiness.io.
12
+
13
+ `.trim();
14
+ const args = process.argv.slice(2);
15
+ if (!args.length) {
16
+ console.error(`Usage: ${USAGE}`);
17
+ process.exit(1);
18
+ }
19
+ if (args[0] === "--help" || args[0] === "-h") {
20
+ console.log(HELP);
21
+ process.exit(0);
22
+ }
23
+ if (args[0] === "upload-playwright-json") {
24
+ await uploadPlaywrightJSON(args.slice(1));
25
+ } else {
26
+ console.error(`Unknown command: ${args[0]}. Use --help to list commands.`);
27
+ process.exit(1);
28
+ }
29
+ //# sourceMappingURL=flakiness.js.map
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ import path from "path";
3
+ import fs from "fs/promises";
4
+ import { PlaywrightJSONReport } from "../playwrightJSONReport.js";
5
+ import { ReportUploader } from "../reportUploader.js";
6
+ import parseArgs from "minimist";
7
+ import { sha256Buffer } from "../utils.js";
8
+ const USAGE = `npx flakiness upload-playwright-json --access-token <token> [--endpoint <url>] <relative-path-to-json>`;
9
+ const HELP = `
10
+ Upload Playwright Test JSON report to the flakiness.io service.
11
+
12
+ Usage:
13
+ ${USAGE}
14
+
15
+ Arguments:
16
+ --access-token A read-write flakiness.io access token.
17
+ --endpoint An endpoint where the service is deployed.
18
+ Defaults to https://flakiness.io
19
+
20
+ Environment variables:
21
+ FLAKINESS_ACCESS_TOKEN A read-write flakiness.io access token.
22
+ FLAKINESS_ENDPOINT An endpoint where the service is deployed.
23
+
24
+ Note: script arguments have priority over environment variables.
25
+ `.trim();
26
+ async function uploadPlaywrightJSON(args) {
27
+ const argv = parseArgs(args, {
28
+ string: ["endpoint", "access-token", "help"],
29
+ alias: {
30
+ h: "help",
31
+ e: "endpoint",
32
+ t: "access-token"
33
+ }
34
+ });
35
+ if (argv["help"] !== void 0) {
36
+ console.log(HELP);
37
+ process.exit(1);
38
+ }
39
+ const flakinessAccessToken = argv["access-token"] ?? process.env.FLAKINESS_ACCESS_TOKEN;
40
+ if (!flakinessAccessToken) {
41
+ console.error("Error: missing access token.");
42
+ console.error(`Usage: ${USAGE}`);
43
+ process.exit(1);
44
+ }
45
+ const flakinessEndpoint = argv["endpoint"] ?? process.env.FLAKINESS_ENDPOINT ?? "https://flakiness.io";
46
+ if (argv._.length === 0) {
47
+ console.error("Error: missing relative file path to the Playwright JSON report.");
48
+ console.error(`Usage: ${USAGE}`);
49
+ process.exit(1);
50
+ }
51
+ const relativePath = argv._[0];
52
+ const fullPath = path.resolve(relativePath);
53
+ if (!await fs.access(fullPath, fs.constants.F_OK).then(() => true).catch(() => false)) {
54
+ console.error(`Error: path ${fullPath} is not accessible`);
55
+ process.exit(1);
56
+ }
57
+ const text = await fs.readFile(fullPath, "utf-8");
58
+ const playwrightJson = JSON.parse(text);
59
+ const reportId = await sha256Buffer(text);
60
+ const { attachments, report, unaccessibleAttachmentPaths } = await PlaywrightJSONReport.parse(reportId, PlaywrightJSONReport.collectMetadata(), playwrightJson, {
61
+ extractAttachments: true
62
+ });
63
+ console.log(reportId);
64
+ for (const unaccessibleAttachment of unaccessibleAttachmentPaths)
65
+ console.warn(`WARN: cannot access attachment ${unaccessibleAttachment}`);
66
+ const uploader = new ReportUploader({
67
+ flakinessAccessToken,
68
+ flakinessEndpoint
69
+ });
70
+ const upload = uploader.createUpload(report, attachments);
71
+ const result = await upload.upload();
72
+ if (!result.success) {
73
+ console.log(`FAILED: ${result.message}`);
74
+ process.exit(1);
75
+ } else {
76
+ console.log(`SUCCESS! ${result.message ?? ""}`);
77
+ }
78
+ }
79
+ export {
80
+ uploadPlaywrightJSON
81
+ };
82
+ //# sourceMappingURL=uploadPlaywrightJSONReport.js.map
@@ -0,0 +1,152 @@
1
+ import { Multimap } from "@flakiness/shared/common/multimap.js";
2
+ import { sha256, sha256Object } from "@flakiness/shared/common/utils.js";
3
+ const ID_SEPARATOR = `388c03a1c6`;
4
+ var FlakinessReport;
5
+ ((FlakinessReport2) => {
6
+ function findTest(report, testPredicate) {
7
+ function visitSuite(suite, parents) {
8
+ for (const test of suite.tests ?? []) {
9
+ if (testPredicate(test, parents))
10
+ return test;
11
+ }
12
+ parents.push(suite);
13
+ for (const childSuite of suite.suites ?? []) {
14
+ const test = visitSuite(childSuite, parents);
15
+ if (test)
16
+ return test;
17
+ }
18
+ parents.pop();
19
+ }
20
+ for (const suite of report.suites) {
21
+ const test = visitSuite(suite, []);
22
+ if (test)
23
+ return test;
24
+ }
25
+ }
26
+ FlakinessReport2.findTest = findTest;
27
+ function visitTests(report, testVisitor) {
28
+ function visitSuite(suite, parents) {
29
+ for (const test of suite.tests ?? [])
30
+ testVisitor(test, parents);
31
+ parents.push(suite);
32
+ for (const childSuite of suite.suites ?? [])
33
+ visitSuite(childSuite, parents);
34
+ parents.pop();
35
+ }
36
+ for (const suite of report.suites)
37
+ visitSuite(suite, []);
38
+ }
39
+ FlakinessReport2.visitTests = visitTests;
40
+ async function visitTestsAsync(report, testVisitor) {
41
+ async function visitSuite(suite, parents) {
42
+ for (const test of suite.tests ?? [])
43
+ await testVisitor(test, parents);
44
+ parents.push(suite);
45
+ for (const childSuite of suite.suites ?? [])
46
+ await visitSuite(childSuite, parents);
47
+ parents.pop();
48
+ }
49
+ for (const suite of report.suites)
50
+ await visitSuite(suite, []);
51
+ }
52
+ FlakinessReport2.visitTestsAsync = visitTestsAsync;
53
+ function dedupeSuitesTestsEnvironments(report) {
54
+ const gEnvs = /* @__PURE__ */ new Map();
55
+ const gSuites = /* @__PURE__ */ new Map();
56
+ const gTests = new Multimap();
57
+ const gSuiteIds = /* @__PURE__ */ new Map();
58
+ const gTestIds = /* @__PURE__ */ new Map();
59
+ const gEnvIds = /* @__PURE__ */ new Map();
60
+ const gSuiteChildren = new Multimap();
61
+ const gSuiteTests = new Multimap();
62
+ for (const env of report.environments) {
63
+ const envId = computeEnvId(env);
64
+ gEnvs.set(envId, env);
65
+ gEnvIds.set(env, envId);
66
+ }
67
+ const envIdToIndex = new Map([...gEnvs].map(([envId], index) => [envId, index]));
68
+ function visitSuite(suite, parentSuiteId) {
69
+ const suiteId = computeSuiteId(suite, parentSuiteId);
70
+ gSuites.set(suiteId, suite);
71
+ gSuiteIds.set(suite, suiteId);
72
+ for (const test of suite.tests ?? []) {
73
+ const testId = computeTestId(test, suiteId);
74
+ gTests.set(testId, test);
75
+ gTestIds.set(test, testId);
76
+ gSuiteTests.set(suiteId, test);
77
+ }
78
+ for (const childSuite of suite.suites ?? []) {
79
+ visitSuite(childSuite, suiteId);
80
+ gSuiteChildren.set(suiteId, childSuite);
81
+ }
82
+ }
83
+ function transformTests(tests) {
84
+ const testIds = new Set(tests.map((test) => gTestIds.get(test)));
85
+ return [...testIds].map((testId) => {
86
+ const tests2 = gTests.getAll(testId);
87
+ const tags = tests2.map((test) => test.tags ?? []).flat();
88
+ return {
89
+ location: tests2[0].location,
90
+ title: tests2[0].title,
91
+ tags: tags.length ? tags : void 0,
92
+ runs: tests2.map((test) => test.runs).flat().map((run) => {
93
+ const env = report.environments[run.environmentIdx];
94
+ const envId = gEnvIds.get(env);
95
+ return {
96
+ ...run,
97
+ environmentIdx: envIdToIndex.get(envId)
98
+ };
99
+ })
100
+ };
101
+ });
102
+ }
103
+ function transformSuites(suites) {
104
+ const suiteIds = new Set(suites.map((suite) => gSuiteIds.get(suite)));
105
+ return [...suiteIds].map((suiteId) => {
106
+ const suite = gSuites.get(suiteId);
107
+ return {
108
+ location: suite.location,
109
+ title: suite.title,
110
+ type: suite.type,
111
+ suites: transformSuites(gSuiteChildren.getAll(suiteId)),
112
+ tests: transformTests(gSuiteTests.getAll(suiteId))
113
+ };
114
+ });
115
+ }
116
+ for (const suite of report.suites)
117
+ visitSuite(suite);
118
+ return {
119
+ ...report,
120
+ environments: [...gEnvs.values()],
121
+ suites: transformSuites(report.suites)
122
+ };
123
+ }
124
+ FlakinessReport2.dedupeSuitesTestsEnvironments = dedupeSuitesTestsEnvironments;
125
+ function computeEnvId(env) {
126
+ return sha256Object(env);
127
+ }
128
+ function computeSuiteId(suite, parentSuiteId) {
129
+ return sha256([
130
+ parentSuiteId ?? "",
131
+ suite.type,
132
+ suite.location.file,
133
+ suite.title
134
+ ]);
135
+ }
136
+ function computeTestId(test, suiteId) {
137
+ return sha256([
138
+ suiteId,
139
+ test.location.file,
140
+ test.title
141
+ ]);
142
+ }
143
+ function computeErrorId(error) {
144
+ return sha256([
145
+ error.message ?? error.value
146
+ ]);
147
+ }
148
+ })(FlakinessReport || (FlakinessReport = {}));
149
+ export {
150
+ FlakinessReport
151
+ };
152
+ //# sourceMappingURL=flakinessReport.js.map
@@ -0,0 +1,49 @@
1
+ import { randomUUID } from "crypto";
2
+ import { getOSInfo, gitCommitInfo, gitFilePath, gitRoot, inferRunUrl, normalizePath, parseDurationMS, parseStringDate } from "./utils.js";
3
+ class FlakinessReporter {
4
+ _config;
5
+ _results = [];
6
+ _unattributedErrors = [];
7
+ constructor(options = {}) {
8
+ console.log(`Flakiness Reporter setup with endpoint set to ${options.endpoint}`);
9
+ }
10
+ onBegin(config, suite) {
11
+ this._config = config;
12
+ }
13
+ onError(error) {
14
+ this._unattributedErrors.push(error);
15
+ }
16
+ onTestBegin(test) {
17
+ }
18
+ onTestEnd(test, result) {
19
+ this._results.push({ test, result });
20
+ }
21
+ async onEnd(result) {
22
+ if (!this._config)
23
+ throw new Error("ERROR: failed to resolve config");
24
+ const commitInfo = gitCommitInfo(this._config.rootDir);
25
+ const osInfo = getOSInfo();
26
+ const gitroot = normalizePath(gitRoot(this._config.rootDir));
27
+ const configPath = this._config.configFile ? gitFilePath(gitroot, normalizePath(this._config.configFile)) : void 0;
28
+ const report = {
29
+ commitId: commitInfo.sha,
30
+ commitDate: parseStringDate(commitInfo.date),
31
+ configPath,
32
+ reportId: randomUUID(),
33
+ url: inferRunUrl(),
34
+ environments: [],
35
+ suites: [],
36
+ opaqueData: this._config,
37
+ //TODO: parse unattributed errors
38
+ unattributedErrors: [],
39
+ duration: parseDurationMS(result.duration),
40
+ startTimestamp: +result.startTime
41
+ };
42
+ console.log(`Finished the run: ${result.status}`);
43
+ }
44
+ }
45
+ var playwright_test_default = FlakinessReporter;
46
+ export {
47
+ playwright_test_default as default
48
+ };
49
+ //# sourceMappingURL=playwright-test.js.map
@@ -0,0 +1,197 @@
1
+ import fs from "fs";
2
+ import { posix as posixPath } from "path";
3
+ import { FlakinessReport } from "./common/flakinessReport.js";
4
+ import { getOSInfo, gitCommitInfo, gitFilePath, gitRoot, inferRunUrl, normalizePath, parseDurationMS, parseStringDate, sha256Buffer, sha256File, stripAnsi } from "./utils.js";
5
+ async function existsAsync(aPath) {
6
+ return fs.promises.stat(aPath).then(() => true).catch((e) => false);
7
+ }
8
+ var PlaywrightJSONReport;
9
+ ((PlaywrightJSONReport2) => {
10
+ function collectMetadata(somePathInsideProject = process.cwd()) {
11
+ const commitInfo = gitCommitInfo(somePathInsideProject);
12
+ const osInfo = getOSInfo();
13
+ const metadata = {
14
+ gitRoot: gitRoot(somePathInsideProject),
15
+ commitId: commitInfo.sha,
16
+ commitDate: commitInfo.date,
17
+ osName: osInfo.name,
18
+ arch: osInfo.arch,
19
+ osVersion: osInfo.version,
20
+ runURL: inferRunUrl()
21
+ };
22
+ return metadata;
23
+ }
24
+ PlaywrightJSONReport2.collectMetadata = collectMetadata;
25
+ async function parse(reportId, metadata, jsonReport, options) {
26
+ const context = {
27
+ projectId2environmentIdx: /* @__PURE__ */ new Map(),
28
+ testBaseDir: normalizePath(jsonReport.config.rootDir),
29
+ gitRoot: normalizePath(metadata.gitRoot),
30
+ attachments: /* @__PURE__ */ new Map(),
31
+ unaccessibleAttachmentPaths: [],
32
+ extractAttachments: options.extractAttachments
33
+ };
34
+ const configPath = jsonReport.config.configFile ? gitFilePath(context.gitRoot, normalizePath(jsonReport.config.configFile)) : void 0;
35
+ const report = {
36
+ commitId: metadata.commitId,
37
+ commitDate: parseStringDate(metadata.commitDate),
38
+ configPath,
39
+ reportId,
40
+ url: metadata.runURL,
41
+ environments: [],
42
+ suites: [],
43
+ opaqueData: jsonReport.config,
44
+ unattributedErrors: jsonReport.errors.map((error) => parseJSONError(context, error)),
45
+ // The report.stats is a releatively new addition to Playwright's JSONReport,
46
+ // so we have to polyfill with some reasonable values when it's missing.
47
+ duration: jsonReport.stats?.duration ? parseDurationMS(jsonReport.stats.duration) : void 0,
48
+ startTimestamp: jsonReport.stats && jsonReport.stats.startTime ? parseStringDate(jsonReport.stats.startTime) : void 0
49
+ };
50
+ for (const project of jsonReport.config.projects) {
51
+ const env = {
52
+ name: project.name,
53
+ systemData: {
54
+ osName: metadata.osName,
55
+ osArch: metadata.arch,
56
+ osVersion: metadata.osVersion
57
+ },
58
+ userSuppliedData: project.metadata,
59
+ opaqueData: {
60
+ project
61
+ }
62
+ };
63
+ context.projectId2environmentIdx.set(project.id, report.environments.length);
64
+ report.environments.push(env);
65
+ }
66
+ report.suites = await Promise.all(jsonReport.suites.map((suite) => parseJSONSuite(context, suite, [])));
67
+ return {
68
+ report: FlakinessReport.dedupeSuitesTestsEnvironments(report),
69
+ attachments: [...context.attachments.values()],
70
+ unaccessibleAttachmentPaths: context.unaccessibleAttachmentPaths
71
+ };
72
+ }
73
+ PlaywrightJSONReport2.parse = parse;
74
+ })(PlaywrightJSONReport || (PlaywrightJSONReport = {}));
75
+ async function parseJSONSuite(context, jsonSuite, titles) {
76
+ let type = "suite";
77
+ if (jsonSuite.column === 0 && jsonSuite.line === 0)
78
+ type = "file";
79
+ else if (!jsonSuite.title)
80
+ type = "anonymous suite";
81
+ const suite = {
82
+ type,
83
+ title: jsonSuite.title,
84
+ location: {
85
+ file: gitFilePath(context.gitRoot, normalizePath(jsonSuite.file)),
86
+ line: jsonSuite.line,
87
+ column: jsonSuite.column
88
+ }
89
+ };
90
+ const shouldUseSuiteTitleToDedupTests = type !== "file";
91
+ if (shouldUseSuiteTitleToDedupTests)
92
+ titles.push(jsonSuite.title);
93
+ if (jsonSuite.suites && jsonSuite.suites.length)
94
+ suite.suites = await Promise.all(jsonSuite.suites.map((suite2) => parseJSONSuite(context, suite2, titles)));
95
+ if (jsonSuite.specs && jsonSuite.specs.length)
96
+ suite.tests = await Promise.all(jsonSuite.specs.map((spec) => parseJSONSpec(context, spec, titles)));
97
+ if (shouldUseSuiteTitleToDedupTests)
98
+ titles.pop();
99
+ return suite;
100
+ }
101
+ async function parseJSONSpec(context, jsonSpec, suiteTitles) {
102
+ const test = {
103
+ title: jsonSpec.title,
104
+ tags: jsonSpec.tags,
105
+ location: {
106
+ file: gitFilePath(context.gitRoot, normalizePath(posixPath.join(context.testBaseDir, normalizePath(jsonSpec.file)))),
107
+ line: jsonSpec.line,
108
+ column: jsonSpec.column
109
+ },
110
+ runs: []
111
+ };
112
+ for (const jsonTest of jsonSpec.tests) {
113
+ const environmentIdx = context.projectId2environmentIdx.get(jsonTest.projectId);
114
+ if (environmentIdx === void 0)
115
+ throw new Error("Inconsistent report - no project for a test found!");
116
+ const testResults = jsonTest.results.filter((result) => result.status !== void 0);
117
+ if (!testResults.length)
118
+ continue;
119
+ const testRun = {
120
+ timeout: parseDurationMS(jsonTest.timeout),
121
+ annotations: jsonTest.annotations,
122
+ environmentIdx,
123
+ expectedStatus: jsonTest.expectedStatus,
124
+ outcome: jsonTest.status,
125
+ attempts: await Promise.all(testResults.map((jsonTestResult) => parseJSONTestResult(context, jsonTestResult)))
126
+ };
127
+ test.runs.push(testRun);
128
+ }
129
+ return test;
130
+ }
131
+ async function parseJSONTestResult(context, jsonTestResult) {
132
+ const attempt = {
133
+ workerIndex: jsonTestResult.workerIndex,
134
+ retry: jsonTestResult.retry,
135
+ status: jsonTestResult.status,
136
+ errors: jsonTestResult.errors && jsonTestResult.errors.length ? jsonTestResult.errors.map((error) => parseJSONError(context, error)) : void 0,
137
+ stdout: jsonTestResult.stdout && jsonTestResult.stdout.length ? jsonTestResult.stdout : void 0,
138
+ stderr: jsonTestResult.stderr && jsonTestResult.stderr.length ? jsonTestResult.stderr : void 0,
139
+ steps: jsonTestResult.steps ? jsonTestResult.steps.map((jsonTestStep) => parseJSONTestStep(context, jsonTestStep)) : void 0,
140
+ startTimestamp: parseStringDate(jsonTestResult.startTime),
141
+ duration: parseDurationMS(jsonTestResult.duration),
142
+ attachments: []
143
+ };
144
+ if (context.extractAttachments) {
145
+ await Promise.all((jsonTestResult.attachments ?? []).map(async (jsonAttachment) => {
146
+ if (jsonAttachment.path && !await existsAsync(jsonAttachment.path)) {
147
+ context.unaccessibleAttachmentPaths.push(jsonAttachment.path);
148
+ return;
149
+ }
150
+ const id = jsonAttachment.path ? await sha256File(jsonAttachment.path) : sha256Buffer(jsonAttachment.body ?? "");
151
+ context.attachments.set(id, {
152
+ contentType: jsonAttachment.contentType,
153
+ id,
154
+ body: jsonAttachment.body,
155
+ path: jsonAttachment.path
156
+ });
157
+ attempt.attachments.push({
158
+ id,
159
+ name: jsonAttachment.name,
160
+ contentType: jsonAttachment.contentType
161
+ });
162
+ }));
163
+ }
164
+ return attempt;
165
+ }
166
+ function parseJSONTestStep(context, jsonStep) {
167
+ const step = {
168
+ // NOTE: jsonStep.duration was -1 in some playwright versions
169
+ duration: parseDurationMS(Math.max(jsonStep.duration, 0)),
170
+ title: jsonStep.title
171
+ };
172
+ if (jsonStep.error)
173
+ step.error = parseJSONError(context, jsonStep.error);
174
+ if (jsonStep.steps)
175
+ step.steps = jsonStep.steps.map((childJSONStep) => parseJSONTestStep(context, childJSONStep));
176
+ return step;
177
+ }
178
+ function parseJSONError(context, error) {
179
+ let location;
180
+ if (error.location) {
181
+ location = {
182
+ file: gitFilePath(context.gitRoot, normalizePath(error.location.file)),
183
+ line: error.location.line,
184
+ column: error.location.column
185
+ };
186
+ }
187
+ return {
188
+ location,
189
+ message: stripAnsi(error.message).split("\n")[0],
190
+ stack: error.stack,
191
+ value: error.value
192
+ };
193
+ }
194
+ export {
195
+ PlaywrightJSONReport
196
+ };
197
+ //# sourceMappingURL=playwrightJSONReport.js.map
@@ -0,0 +1,95 @@
1
+ import fs from "fs";
2
+ import { URL } from "url";
3
+ import { brotliCompressSync } from "zlib";
4
+ import { brotliCompressAsync, httpUtils, retryWithBackoff } from "./utils.js";
5
+ class ReportUploader {
6
+ _options;
7
+ constructor(options) {
8
+ this._options = options;
9
+ }
10
+ createUpload(report, attachments) {
11
+ const upload = new ReportUpload(this._options, report, attachments);
12
+ return upload;
13
+ }
14
+ }
15
+ const HTTP_BACKOFF = [100, 500, 1e3, 5e3, 1e4];
16
+ class ReportUpload {
17
+ _report;
18
+ _attachments;
19
+ _options;
20
+ constructor(options, report, attachments) {
21
+ this._options = options;
22
+ this._report = report;
23
+ this._attachments = attachments;
24
+ }
25
+ async upload(options) {
26
+ const response = await httpUtils.postJSON(new URL("/api/report_v1.startUpload", this._options.flakinessEndpoint).toString(), {
27
+ access_token: this._options.flakinessAccessToken,
28
+ commitDate: new Date(this._report.commitDate),
29
+ commitId: this._report.commitId,
30
+ reportId: this._report.reportId,
31
+ attachmentIds: this._attachments.map((attachment) => attachment.id)
32
+ }, HTTP_BACKOFF).catch((e) => ({ error: e }));
33
+ if (response?.error)
34
+ return { success: false, message: `flakiness.io returned error: ${response.error.message}` };
35
+ if (response?.result?.data?.report_already_exists)
36
+ return { success: true, message: "This report already exists on the service" };
37
+ await Promise.all([
38
+ this._uploadReport(JSON.stringify(this._report), response.result.data.report_upload_url, options?.syncCompression ?? false),
39
+ ...this._attachments.map((attachment) => {
40
+ const uploadURL = response.result.data.attachment_upload_urls[attachment.id];
41
+ if (!uploadURL)
42
+ throw new Error("Internal error: missing upload URL for attachment!");
43
+ return this._uploadAttachment(attachment, uploadURL);
44
+ })
45
+ ]);
46
+ await httpUtils.postJSON(new URL("/api/report_v1.completeUpload", this._options.flakinessEndpoint).toString(), {
47
+ upload_token: response.result.data.upload_token
48
+ }, HTTP_BACKOFF);
49
+ return { success: true };
50
+ }
51
+ async _uploadReport(data, uploadUrl, syncCompression) {
52
+ const compressed = syncCompression ? brotliCompressSync(data) : await brotliCompressAsync(data);
53
+ const headers = {
54
+ "Content-Type": "application/json",
55
+ "Content-Length": Buffer.byteLength(compressed) + "",
56
+ "Content-Encoding": "br"
57
+ };
58
+ await retryWithBackoff(async () => {
59
+ const { request, responseDataPromise } = httpUtils.createRequest({
60
+ url: uploadUrl,
61
+ headers,
62
+ method: "put"
63
+ });
64
+ request.write(compressed);
65
+ request.end();
66
+ await responseDataPromise;
67
+ }, HTTP_BACKOFF);
68
+ }
69
+ async _uploadAttachment(attachment, uploadUrl) {
70
+ const bytesLength = attachment.path ? (await fs.promises.stat(attachment.path)).size : attachment.body ? Buffer.byteLength(attachment.body) : 0;
71
+ const headers = {
72
+ "Content-Type": attachment.contentType,
73
+ "Content-Length": bytesLength + ""
74
+ };
75
+ await retryWithBackoff(async () => {
76
+ const { request, responseDataPromise } = httpUtils.createRequest({
77
+ url: uploadUrl,
78
+ headers,
79
+ method: "put"
80
+ });
81
+ if (attachment.path) {
82
+ fs.createReadStream(attachment.path).pipe(request);
83
+ } else {
84
+ if (attachment.body)
85
+ request.write(attachment.body);
86
+ request.end();
87
+ }
88
+ await responseDataPromise;
89
+ }, HTTP_BACKOFF);
90
+ }
91
+ }
92
+ export {
93
+ ReportUploader
94
+ };
95
+ //# sourceMappingURL=reportUploader.js.map
package/lib/utils.js ADDED
@@ -0,0 +1,221 @@
1
+ import { spawnSync } from "child_process";
2
+ import crypto from "crypto";
3
+ import fs from "fs";
4
+ import http from "http";
5
+ import https from "https";
6
+ import os from "os";
7
+ import { posix as posixPath, win32 as win32Path } from "path";
8
+ import util from "util";
9
+ import zlib from "zlib";
10
+ const gzipAsync = util.promisify(zlib.gzip);
11
+ const gunzipAsync = util.promisify(zlib.gunzip);
12
+ const gunzipSync = zlib.gunzipSync;
13
+ const brotliCompressAsync = util.promisify(zlib.brotliCompress);
14
+ const brotliCompressSync = zlib.brotliCompressSync;
15
+ function sha256File(filePath) {
16
+ return new Promise((resolve, reject) => {
17
+ const hash = crypto.createHash("sha1");
18
+ const stream = fs.createReadStream(filePath);
19
+ stream.on("data", (chunk) => {
20
+ hash.update(chunk);
21
+ });
22
+ stream.on("end", () => {
23
+ resolve(hash.digest("hex"));
24
+ });
25
+ stream.on("error", (err) => {
26
+ reject(err);
27
+ });
28
+ });
29
+ }
30
+ function sha256Buffer(data) {
31
+ const hash = crypto.createHash("sha1");
32
+ hash.update(data);
33
+ return hash.digest("hex");
34
+ }
35
+ async function retryWithBackoff(job, backoff = []) {
36
+ for (const timeout of backoff) {
37
+ try {
38
+ return await job();
39
+ } catch (e) {
40
+ await new Promise((x) => setTimeout(x, timeout));
41
+ }
42
+ }
43
+ await job();
44
+ }
45
+ var httpUtils;
46
+ ((httpUtils2) => {
47
+ function createRequest({ url, method = "get", headers = {} }) {
48
+ let resolve, reject;
49
+ const responseDataPromise = new Promise((a, b) => {
50
+ resolve = a;
51
+ reject = b;
52
+ });
53
+ const protocol = url.startsWith("https") ? https : http;
54
+ const request = protocol.request(url, { method, headers }, (res) => {
55
+ const chunks = [];
56
+ res.on("data", (chunk) => chunks.push(chunk));
57
+ res.on("end", () => {
58
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300)
59
+ resolve(Buffer.concat(chunks));
60
+ else
61
+ reject(new Error(`Request to ${url} failed with ${res.statusCode}`));
62
+ });
63
+ res.on("error", (error) => reject(error));
64
+ });
65
+ request.on("error", reject);
66
+ return { request, responseDataPromise };
67
+ }
68
+ httpUtils2.createRequest = createRequest;
69
+ async function getBuffer(url, backoff) {
70
+ return await retryWithBackoff(async () => {
71
+ const { request, responseDataPromise } = createRequest({ url });
72
+ request.end();
73
+ return await responseDataPromise;
74
+ }, backoff);
75
+ }
76
+ httpUtils2.getBuffer = getBuffer;
77
+ async function getText(url, backoff) {
78
+ const buffer = await getBuffer(url, backoff);
79
+ return buffer.toString("utf-8");
80
+ }
81
+ httpUtils2.getText = getText;
82
+ async function getJSON(url) {
83
+ return JSON.parse(await getText(url));
84
+ }
85
+ httpUtils2.getJSON = getJSON;
86
+ async function postText(url, text, backoff) {
87
+ const headers = {
88
+ "Content-Type": "application/json",
89
+ "Content-Length": Buffer.byteLength(text) + ""
90
+ };
91
+ return await retryWithBackoff(async () => {
92
+ const { request, responseDataPromise } = createRequest({ url, headers, method: "post" });
93
+ request.write(text);
94
+ request.end();
95
+ return await responseDataPromise;
96
+ }, backoff);
97
+ }
98
+ httpUtils2.postText = postText;
99
+ async function postJSON(url, json, backoff) {
100
+ const buffer = await postText(url, JSON.stringify(json), backoff);
101
+ return JSON.parse(buffer.toString("utf-8"));
102
+ }
103
+ httpUtils2.postJSON = postJSON;
104
+ })(httpUtils || (httpUtils = {}));
105
+ const ansiRegex = new RegExp("[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))", "g");
106
+ function stripAnsi(str) {
107
+ return str.replace(ansiRegex, "");
108
+ }
109
+ function shell(command, args, options) {
110
+ try {
111
+ const result = spawnSync(command, args, { encoding: "utf-8", ...options });
112
+ if (result.status !== 0) {
113
+ console.log(result);
114
+ console.log(options);
115
+ return void 0;
116
+ }
117
+ return result.stdout.trim();
118
+ } catch (e) {
119
+ console.log(e);
120
+ return void 0;
121
+ }
122
+ }
123
+ function readLinuxOSRelease() {
124
+ const osReleaseText = fs.readFileSync("/etc/os-release", "utf-8");
125
+ return new Map(osReleaseText.toLowerCase().split("\n").filter((line) => line.includes("=")).map((line) => {
126
+ let [key, value] = line.split("=");
127
+ if (value.startsWith('"') && value.endsWith('"'))
128
+ value = value.substring(1, value.length - 1);
129
+ return [key, value];
130
+ }));
131
+ }
132
+ function osLinuxInfo() {
133
+ const arch = shell(`uname`, [`-m`]);
134
+ const osReleaseMap = readLinuxOSRelease();
135
+ const name = osReleaseMap.get("NAME") ?? shell(`uname`);
136
+ const version = osReleaseMap.get("VERSION_ID");
137
+ return { name, arch, version };
138
+ }
139
+ function osDarwinInfo() {
140
+ const name = "macos";
141
+ const arch = shell(`uname`, [`-m`]);
142
+ const version = shell(`sw_vers`, [`-productVersion`]);
143
+ return { name, arch, version };
144
+ }
145
+ function osWinInfo() {
146
+ const name = "win";
147
+ const arch = process.arch;
148
+ const version = os.release();
149
+ return { name, arch, version };
150
+ }
151
+ function getOSInfo() {
152
+ if (process.platform === "darwin")
153
+ return osDarwinInfo();
154
+ if (process.platform === "win32")
155
+ return osWinInfo();
156
+ return osLinuxInfo();
157
+ }
158
+ function inferRunUrl() {
159
+ if (process.env.GITHUB_REPOSITORY && process.env.GITHUB_RUN_ID)
160
+ return `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`;
161
+ return void 0;
162
+ }
163
+ function parseStringDate(dateString) {
164
+ return +new Date(dateString);
165
+ }
166
+ function gitCommitInfo(gitRepo) {
167
+ const output = shell(`git`, ["show", "-s", '--format="%H %aI"', "HEAD"], {
168
+ cwd: gitRepo,
169
+ encoding: "utf-8"
170
+ });
171
+ const [sha, date] = output.startsWith('"') && output.endsWith('"') ? output.slice(1, -1).split(" ") : output.split(" ");
172
+ return { sha, date };
173
+ }
174
+ function gitRoot(somePathInsideGitRepo) {
175
+ return shell(`git`, ["rev-parse", "--show-toplevel"], {
176
+ cwd: somePathInsideGitRepo,
177
+ encoding: "utf-8"
178
+ });
179
+ }
180
+ const IS_WIN32_PATH = new RegExp("^[a-zA-Z]:\\\\", "i");
181
+ const IS_ALMOST_POSIX_PATH = new RegExp("^[a-zA-Z]:/", "i");
182
+ function normalizePath(aPath) {
183
+ if (IS_WIN32_PATH.test(aPath)) {
184
+ aPath = aPath.split(win32Path.sep).join(posixPath.sep);
185
+ }
186
+ if (IS_ALMOST_POSIX_PATH.test(aPath))
187
+ return "/" + aPath[0] + aPath.substring(2);
188
+ return aPath;
189
+ }
190
+ function gitFilePath(gitRoot2, absolutePath) {
191
+ return posixPath.relative(gitRoot2, absolutePath);
192
+ }
193
+ function parseDurationMS(value) {
194
+ if (isNaN(value))
195
+ throw new Error("Duration cannot be NaN");
196
+ if (value < 0)
197
+ throw new Error(`Duration cannot be less than 0, found ${value}`);
198
+ return value | 0;
199
+ }
200
+ export {
201
+ brotliCompressAsync,
202
+ brotliCompressSync,
203
+ getOSInfo,
204
+ gitCommitInfo,
205
+ gitFilePath,
206
+ gitRoot,
207
+ gunzipAsync,
208
+ gunzipSync,
209
+ gzipAsync,
210
+ httpUtils,
211
+ inferRunUrl,
212
+ normalizePath,
213
+ parseDurationMS,
214
+ parseStringDate,
215
+ retryWithBackoff,
216
+ sha256Buffer,
217
+ sha256File,
218
+ shell,
219
+ stripAnsi
220
+ };
221
+ //# sourceMappingURL=utils.js.map
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@flakiness/report",
3
+ "version": "0.0.1",
4
+ "private": false,
5
+ "bin": {
6
+ "flakiness": "lib/cli/flakiness.js"
7
+ },
8
+ "exports": {
9
+ ".": {
10
+ "import": "./lib/common/flakinessReport.js",
11
+ "require": "./lib/common/flakinessReport.js",
12
+ "types": "./types/src/common/flakinessReport.d.ts"
13
+ },
14
+ "./uploader": {
15
+ "import": "./lib/reportUploader.js",
16
+ "require": "./lib/reportUploader.js",
17
+ "types": "./types/src/reportUploader.d.ts"
18
+ },
19
+ "./playwright": {
20
+ "import": "./lib/playwrightJSONReport.js",
21
+ "require": "./lib/playwrightJSONReport.js",
22
+ "types": "./types/src/playwrightJSONReport.d.ts"
23
+ }
24
+ },
25
+ "type": "module",
26
+ "description": "",
27
+ "types": "./types/index.d.ts",
28
+ "scripts": {
29
+ "test": "echo \"Error: no test specified\" && exit 1"
30
+ },
31
+ "keywords": [],
32
+ "author": "Degu Labs, Inc",
33
+ "license": "Fair Source 100",
34
+ "devDependencies": {
35
+ "@playwright/test": "^1.46.0",
36
+ "@types/minimist": "^1.2.5"
37
+ },
38
+ "dependencies": {
39
+ "@flakiness/shared": "0.0.1",
40
+ "minimist": "^1.2.8"
41
+ }
42
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/playwright-core/types/protocol.d.ts","../../node_modules/playwright-core/types/structs.d.ts","../../node_modules/playwright-core/types/types.d.ts","../../node_modules/playwright-core/index.d.ts","../../node_modules/playwright/types/test.d.ts","../../node_modules/playwright/types/testreporter.d.ts","../../node_modules/@playwright/test/reporter.d.ts","../../shared/types/src/common/multimap.d.ts","../../shared/types/src/common/utils.d.ts","../src/common/flakinessreport.ts","../src/utils.ts","../src/playwright-test.ts","../src/playwrightjsonreport.ts","../src/reportuploader.ts","../../node_modules/@types/minimist/index.d.ts","../src/cli/uploadplaywrightjsonreport.ts","../src/cli/flakiness.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[80],[92],[132],[133,138,168],[134,139,145,146,153,165,176],[134,135,145,153],[136,177],[137,138,146,154],[138,165,173],[139,141,145,153],[132,140],[141,142],[145],[143,145],[132,145],[145,146,147,165,176],[145,146,147,160,165,168],[130,181],[130,141,145,148,153,165,176],[145,146,148,149,153,165,173,176],[148,150,165,173,176],[92,93,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183],[145,151],[152,176,181],[141,145,153,165],[154],[155],[132,156],[92,93,132,133,134,135,136,137,138,139,140,141,142,143,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[158],[159],[145,160,161],[160,162,177,179],[133,145,165,166,167,168],[133,165,167],[165,166],[168],[169],[92,165],[145,171,172],[171,172],[138,153,165,173],[174],[153,175],[133,148,159,176],[138,177],[165,178],[152,179],[180],[133,138,145,147,156,165,176,179,181],[165,182],[77],[75,76,134,145,146,165],[78],[79],[102,106,176],[102,165,176],[97],[99,102,173,176],[153,173],[184],[97,184],[99,102,153,176],[94,95,98,101,133,145,165,176],[102,109],[94,100],[102,123,124],[98,102,133,168,176,184],[133,184],[123,133,184],[96,97,184],[102],[96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129],[102,117],[102,109,110],[100,102,110,111],[101],[94,97,102],[102,106,110,111],[106],[100,102,105,176],[94,99,102,109],[133,165],[97,102,123,133,181,184],[90],[85,87,88,89,147,155],[82,83],[81,84,85,138],[81,84,85,146,155],[84,85,146,176,182],[84,134,138,146,148,150,154,155,177,182]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"abee51ebffafd50c07d76be5848a34abfe4d791b5745ef1e5648718722fab924","impliedFormat":1},{"version":"9e8ca8ed051c2697578c023d9c29d6df689a083561feba5c14aedee895853999","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"15c1c3d7b2e46e0025417ed6d5f03f419e57e6751f87925ca19dc88297053fe6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"af96cef2898366e10da238dfceb66bbf75429895da9ed0c24438f94e479bf589","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"664203d9d5b18e4d9dbc7d7a47dc9360aec8b197efcf45d01f476e3d182e66a1","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"dd710883a1f676968e9f921012cea03f0ac939f82529dd75461fd0ddd2226523","affectsGlobalScope":true,"impliedFormat":1},{"version":"e41379a8e093a56f0e72950ca91ee282af57da28e52fb0b090722e0a4035c243","impliedFormat":1},{"version":"04392f8e190f9e51301f73d17bbb34babd54858c1efc932d2193962f66dabae2","impliedFormat":1},{"version":"91cb45abb1ceb27088d1e387295710a856ff720f0924013b8b8858fd1ba61df7","impliedFormat":99},{"version":"e2e2e068d3122b3058d33aa918d1aac3feda5f3fd6729b3e05ff047344cd75c2","impliedFormat":99},{"version":"a07b7dbe0d98696d6a67f2cdf36e7ea51a367d9be3b075b6d3be7b1aaee3e485","signature":"92a6ad83d6a5f06368501437c13a659fca424648333fe7698f905cea0158d1e3","impliedFormat":99},{"version":"4228bb1d97fb9d295ef607d351fb5e4a58ee93416a0f25a0896637c40dcae0d0","signature":"4543b9d7dfe03d0d9d57b467b2770cef8954cc7445b73348dc96e57d46b1d2b5","impliedFormat":99},{"version":"5f208f08726ac63676b858bae8d78c69e7e14f6a260d5bcea34d1b264d9ceb7e","signature":"2eebaf6bcd7cf3a2eba4b0e63c99f772dfb185ac9914ba01fe8dcdfe8dcb612d","impliedFormat":99},{"version":"c2e571703aad20b43a0d902d71011821b0df34f8860e3caa9f7a21d685274453","signature":"fd8289f59d038bd7f62a5a225564fd2ed4355494d468409d8f551acae443e522","impliedFormat":99},{"version":"fbc9269d6fae427f298d416137f841064628f5f3ddcb3fa37b7674c3639d7093","signature":"eb0f8ec0e2a4a197cc4d765e3dc07f40ad32c0d5c2bf11515ce9e4c98a88042d","impliedFormat":99},{"version":"fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","impliedFormat":1},{"version":"aa8cafd12845a41b49b928dbe2475395d2982f788be4637388f50658750be7d3","signature":"4cefc3e8cc33966f481d2e070c0ef520440cd5281f0d99d2cbc15efb0b0141b5","impliedFormat":99},{"version":"7f27b07e7c309b1d486cd3882b9cc7d1d599c63af1f837d4dc60d6195360f914","signature":"43e818adf60173644896298637f47b01d5819b17eda46eaa32d0c7d64724d012","impliedFormat":99},{"version":"e142fda89ed689ea53d6f2c93693898464c7d29a0ae71c6dc8cdfe5a1d76c775","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"964f307d249df0d7e8eb16d594536c0ac6cc63c8d467edf635d05542821dec8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db3ec8993b7596a4ef47f309c7b25ee2505b519c13050424d9c34701e5973315","impliedFormat":1},{"version":"6a1ebd564896d530364f67b3257c62555b61d60494a73dfe8893274878c6589d","affectsGlobalScope":true,"impliedFormat":1},{"version":"af49b066a76ce26673fe49d1885cc6b44153f1071ed2d952f2a90fccba1095c9","impliedFormat":1},{"version":"f22fd1dc2df53eaf5ce0ff9e0a3326fc66f880d6a652210d50563ae72625455f","impliedFormat":1},{"version":"3ddbdb519e87a7827c4f0c4007013f3628ca0ebb9e2b018cf31e5b2f61c593f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"6d498d4fd8036ea02a4edcae10375854a0eb1df0496cf0b9d692577d3c0fd603","affectsGlobalScope":true,"impliedFormat":1},{"version":"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","impliedFormat":1},{"version":"fd09b892597ab93e7f79745ce725a3aaf6dd005e8db20f0c63a5d10984cba328","impliedFormat":1},{"version":"a3be878ff1e1964ab2dc8e0a3b67087cf838731c7f3d8f603337e7b712fdd558","impliedFormat":1},{"version":"5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","impliedFormat":1},{"version":"9be74296ee565af0c12d7071541fdd23260f53c3da7731fb6361f61150a791f6","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"f501a53b94ba382d9ba396a5c486969a3abc68309828fa67f916035f5d37fe2b","affectsGlobalScope":true,"impliedFormat":1},{"version":"aa658b5d765f630c312ac9202d110bbaf2b82d180376457f0a9d57b42629714a","impliedFormat":1},{"version":"312ac7cbd070107766a9886fd27f9faad997ef57d93fdfb4095df2c618ac8162","impliedFormat":1},{"version":"2e9b4e7f9942af902eb85bae6066d04ef1afee51d61554a62d144df3da7dec94","impliedFormat":1},{"version":"672ad3045f329e94002256f8ed460cfd06173a50c92cde41edaadfacffd16808","impliedFormat":1},{"version":"64da4965d1e0559e134d9c1621ae400279a216f87ed00c4cce4f2c7c78021712","impliedFormat":1},{"version":"2205527b976f4f1844adc46a3f0528729fb68cac70027a5fb13c49ca23593797","impliedFormat":1},{"version":"0166fce1204d520fdfd6b5febb3cda3deee438bcbf8ce9ffeb2b1bcde7155346","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8b13eab85b532285031b06a971fa051bf0175d8fff68065a24a6da9c1c986cf","impliedFormat":1},{"version":"50c382ba1827988c59aa9cc9d046e386d55d70f762e9e352e95ee8cb7337cdb8","impliedFormat":1},{"version":"bb9627ab9d078c79bb5623de4ac8e5d08f806ec9b970962dfc83b3211373690d","impliedFormat":1},{"version":"21d7e87f271e72d02f8d167edc902f90b04525edc7918f00f01dd0bd00599f7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f6abdaf8764ef01a552a958f45e795b5e79153b87ddad3af5264b86d2681b72","affectsGlobalScope":true,"impliedFormat":1},{"version":"a215554477f7629e3dcbc8cde104bec036b78673650272f5ffdc5a2cee399a0a","impliedFormat":1},{"version":"c3497fc242aabfedcd430b5932412f94f157b5906568e737f6a18cc77b36a954","impliedFormat":1},{"version":"cdc1de3b672f9ef03ff15c443aa1b631edca35b6ae6970a7da6400647ff74d95","impliedFormat":1},{"version":"139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","impliedFormat":1},{"version":"bf01fdd3b93cf633b3f7420718457af19c57ab8cbfea49268df60bae2e84d627","impliedFormat":1},{"version":"15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","impliedFormat":1},{"version":"5f461d6f5d9ff474f1121cc3fd86aa3cd67476c701f55c306d323c5112201207","impliedFormat":1},{"version":"65b39cc6b610a4a4aecc321f6efb436f10c0509d686124795b4c36a5e915b89e","impliedFormat":1},{"version":"269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"83fe38aa2243059ea859325c006da3964ead69b773429fe049ebb0426e75424d","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3edb86744e2c19f2c1503849ac7594a5e06024f2451bacae032390f2e20314a","impliedFormat":1},{"version":"e501cbca25bd54f0bcb89c00f092d3cae227e970b93fd76207287fd8110b123d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a3e61347b8f80aa5af532094498bceb0c0b257b25a6aa8ab4880fd6ed57c95a","affectsGlobalScope":true,"impliedFormat":1},{"version":"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","impliedFormat":1},{"version":"950f6810f7c80e0cffefcf1bcc6ade3485c94394720e334c3c2be3c16b6922fb","impliedFormat":1},{"version":"5475df7cfc493a08483c9d7aa61cc04791aecba9d0a2efc213f23c4006d4d3cd","impliedFormat":1},{"version":"000720870b275764c65e9f28ac97cc9e4d9e4a36942d4750ca8603e416e9c57c","impliedFormat":1},{"version":"54412c70bacb9ed547ed6caae8836f712a83ccf58d94466f3387447ec4e82dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"e74e7b0baa7a24f073080091427d36a75836d584b9393e6ac2b1daf1647fe65a","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c48e931a72f6971b5add7fdb1136be1d617f124594e94595f7114af749395e0","impliedFormat":1},{"version":"478eb5c32250678a906d91e0529c70243fc4d75477a08f3da408e2615396f558","impliedFormat":1},{"version":"e686a88c9ee004c8ba12ffc9d674ca3192a4c50ed0ca6bd5b2825c289e2b2bfe","impliedFormat":1},{"version":"0d27932df2fbc3728e78b98892540e24084424ce12d3bd32f62a23cf307f411f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4423fb3d6abe6eefb8d7f79eb2df9510824a216ec1c6feee46718c9b18e6d89f","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"01c47d1c006b3a15b51d89d7764fff7e4fabc4e412b3a61ee5357bd74b822879","impliedFormat":1}],"root":[[84,88],90,91],"options":{"allowJs":true,"checkJs":true,"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"module":199,"outDir":"./","strictBindCallApply":true,"target":99},"referencedMap":[[81,1],[92,2],[93,2],[132,3],[133,4],[134,5],[135,6],[136,7],[137,8],[138,9],[139,10],[140,11],[141,12],[142,12],[144,13],[143,14],[145,15],[146,16],[147,17],[131,18],[148,19],[149,20],[150,21],[184,22],[151,23],[152,24],[153,25],[154,26],[155,27],[156,28],[157,29],[158,30],[159,31],[160,32],[161,32],[162,33],[165,34],[167,35],[166,36],[168,37],[169,38],[170,39],[171,40],[172,41],[173,42],[174,43],[175,44],[176,45],[177,46],[178,47],[179,48],[180,49],[181,50],[182,51],[78,52],[76,52],[77,53],[79,54],[80,55],[109,56],[119,57],[108,56],[129,58],[100,59],[99,60],[128,61],[122,62],[127,63],[102,64],[116,65],[101,66],[125,67],[97,68],[96,69],[126,70],[98,71],[103,72],[107,72],[130,73],[120,74],[111,75],[112,76],[114,77],[110,78],[113,79],[123,61],[105,80],[106,81],[115,82],[95,83],[118,74],[117,72],[124,84],[91,85],[90,86],[84,87],[86,88],[87,89],[88,90],[85,91]],"latestChangedDtsFile":"./src/cli/flakiness.d.ts","version":"5.6.2"}