@alwaysmeticulous/cli 2.304.0 → 2.306.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/command-utils/common-options.d.ts +5 -0
- package/dist/command-utils/common-options.d.ts.map +1 -1
- package/dist/command-utils/common-options.js +6 -4
- package/dist/command-utils/common-options.js.map +1 -1
- package/dist/command-utils/detect-upload-mode.js +1 -4
- package/dist/command-utils/detect-upload-mode.js.map +1 -1
- package/dist/command-utils/detect-upload-mode.spec.js +1 -4
- package/dist/command-utils/detect-upload-mode.spec.js.map +1 -1
- package/dist/command-utils/download-session.utils.js +1 -4
- package/dist/command-utils/download-session.utils.js.map +1 -1
- package/dist/command-utils/json-args.d.ts +14 -0
- package/dist/command-utils/json-args.d.ts.map +1 -0
- package/dist/command-utils/json-args.js +37 -0
- package/dist/command-utils/json-args.js.map +1 -0
- package/dist/command-utils/json-args.spec.d.ts +2 -0
- package/dist/command-utils/json-args.spec.d.ts.map +1 -0
- package/dist/command-utils/json-args.spec.js +34 -0
- package/dist/command-utils/json-args.spec.js.map +1 -0
- package/dist/command-utils/parse-container-env.js +1 -4
- package/dist/command-utils/parse-container-env.js.map +1 -1
- package/dist/command-utils/parse-rewrites.js +1 -4
- package/dist/command-utils/parse-rewrites.js.map +1 -1
- package/dist/command-utils/print-json.d.ts +7 -0
- package/dist/command-utils/print-json.d.ts.map +1 -0
- package/dist/command-utils/print-json.js +13 -0
- package/dist/command-utils/print-json.js.map +1 -0
- package/dist/command-utils/sentry.utils.js +1 -4
- package/dist/command-utils/sentry.utils.js.map +1 -1
- package/dist/commands/agent/build-git-options.js +1 -4
- package/dist/commands/agent/build-git-options.js.map +1 -1
- package/dist/commands/agent/build-git-options.spec.js +1 -4
- package/dist/commands/agent/build-git-options.spec.js.map +1 -1
- package/dist/commands/agent/index.d.ts.map +1 -1
- package/dist/commands/agent/index.js +10 -6
- package/dist/commands/agent/index.js.map +1 -1
- package/dist/commands/agent/js-coverage-diff.command.d.ts.map +1 -1
- package/dist/commands/agent/js-coverage-diff.command.js +25 -35
- package/dist/commands/agent/js-coverage-diff.command.js.map +1 -1
- package/dist/commands/agent/js-coverage.command.d.ts +3 -0
- package/dist/commands/agent/js-coverage.command.d.ts.map +1 -1
- package/dist/commands/agent/js-coverage.command.js +80 -45
- package/dist/commands/agent/js-coverage.command.js.map +1 -1
- package/dist/commands/agent/js-coverage.command.spec.js +47 -4
- package/dist/commands/agent/js-coverage.command.spec.js.map +1 -1
- package/dist/commands/agent/screenshot-dom-diff.command.d.ts +1 -0
- package/dist/commands/agent/screenshot-dom-diff.command.d.ts.map +1 -1
- package/dist/commands/agent/screenshot-dom-diff.command.js +25 -20
- package/dist/commands/agent/screenshot-dom-diff.command.js.map +1 -1
- package/dist/commands/agent/screenshot-image-files.command.d.ts +1 -0
- package/dist/commands/agent/screenshot-image-files.command.d.ts.map +1 -1
- package/dist/commands/agent/screenshot-image-files.command.js +17 -7
- package/dist/commands/agent/screenshot-image-files.command.js.map +1 -1
- package/dist/commands/agent/screenshot-image.command.d.ts +1 -0
- package/dist/commands/agent/screenshot-image.command.d.ts.map +1 -1
- package/dist/commands/agent/screenshot-image.command.js +8 -6
- package/dist/commands/agent/screenshot-image.command.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.command.d.ts +1 -0
- package/dist/commands/agent/test-run-diffs.command.d.ts.map +1 -1
- package/dist/commands/agent/test-run-diffs.command.js +62 -31
- package/dist/commands/agent/test-run-diffs.command.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.command.spec.d.ts +2 -0
- package/dist/commands/agent/test-run-diffs.command.spec.d.ts.map +1 -0
- package/dist/commands/agent/test-run-diffs.command.spec.js +146 -0
- package/dist/commands/agent/test-run-diffs.command.spec.js.map +1 -0
- package/dist/commands/agent/test-run-diffs.utils.d.ts +7 -0
- package/dist/commands/agent/test-run-diffs.utils.d.ts.map +1 -1
- package/dist/commands/agent/test-run-diffs.utils.js +47 -5
- package/dist/commands/agent/test-run-diffs.utils.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.utils.spec.js +144 -4
- package/dist/commands/agent/test-run-diffs.utils.spec.js.map +1 -1
- package/dist/commands/agent/test-run-for-commit.command.d.ts.map +1 -1
- package/dist/commands/agent/test-run-for-commit.command.js +11 -16
- package/dist/commands/agent/test-run-for-commit.command.js.map +1 -1
- package/dist/commands/agent/timeline.command.d.ts +1 -0
- package/dist/commands/agent/timeline.command.d.ts.map +1 -1
- package/dist/commands/agent/timeline.command.js +20 -9
- package/dist/commands/agent/timeline.command.js.map +1 -1
- package/dist/commands/agent/timeline.command.spec.d.ts +2 -0
- package/dist/commands/agent/timeline.command.spec.d.ts.map +1 -0
- package/dist/commands/agent/timeline.command.spec.js +74 -0
- package/dist/commands/agent/timeline.command.spec.js.map +1 -0
- package/dist/commands/agent/trigger-test-run.command.d.ts.map +1 -1
- package/dist/commands/agent/trigger-test-run.command.js +6 -13
- package/dist/commands/agent/trigger-test-run.command.js.map +1 -1
- package/dist/commands/agent/trigger-test-run.command.spec.js +1 -4
- package/dist/commands/agent/trigger-test-run.command.spec.js.map +1 -1
- package/dist/commands/agent/upload-build.command.d.ts.map +1 -1
- package/dist/commands/agent/upload-build.command.js +9 -12
- package/dist/commands/agent/upload-build.command.js.map +1 -1
- package/dist/commands/all-commands.d.ts +38 -0
- package/dist/commands/all-commands.d.ts.map +1 -0
- package/dist/commands/all-commands.js +62 -0
- package/dist/commands/all-commands.js.map +1 -0
- package/dist/commands/auth/__tests__/list-projects.command.spec.js +21 -14
- package/dist/commands/auth/__tests__/list-projects.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/login.command.spec.js +8 -9
- package/dist/commands/auth/__tests__/login.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/logout.command.spec.js +3 -10
- package/dist/commands/auth/__tests__/logout.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/whoami.command.spec.js +61 -23
- package/dist/commands/auth/__tests__/whoami.command.spec.js.map +1 -1
- package/dist/commands/auth/index.js +1 -4
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/list-projects.command.d.ts.map +1 -1
- package/dist/commands/auth/list-projects.command.js +14 -15
- package/dist/commands/auth/list-projects.command.js.map +1 -1
- package/dist/commands/auth/login.command.d.ts.map +1 -1
- package/dist/commands/auth/login.command.js +3 -7
- package/dist/commands/auth/login.command.js.map +1 -1
- package/dist/commands/auth/logout.command.d.ts +1 -5
- package/dist/commands/auth/logout.command.d.ts.map +1 -1
- package/dist/commands/auth/logout.command.js +3 -11
- package/dist/commands/auth/logout.command.js.map +1 -1
- package/dist/commands/auth/set-project.command.d.ts.map +1 -1
- package/dist/commands/auth/set-project.command.js +2 -6
- package/dist/commands/auth/set-project.command.js.map +1 -1
- package/dist/commands/auth/unset-project.command.js +4 -7
- package/dist/commands/auth/unset-project.command.js.map +1 -1
- package/dist/commands/auth/whoami.command.d.ts +5 -1
- package/dist/commands/auth/whoami.command.d.ts.map +1 -1
- package/dist/commands/auth/whoami.command.js +70 -33
- package/dist/commands/auth/whoami.command.js.map +1 -1
- package/dist/commands/ci/deprecated-trigger-options.js +1 -4
- package/dist/commands/ci/deprecated-trigger-options.js.map +1 -1
- package/dist/commands/ci/index.js +1 -4
- package/dist/commands/ci/index.js.map +1 -1
- package/dist/commands/ci/prepare.command.d.ts.map +1 -1
- package/dist/commands/ci/prepare.command.js +2 -4
- package/dist/commands/ci/prepare.command.js.map +1 -1
- package/dist/commands/ci/resolve-git-options.js +1 -4
- package/dist/commands/ci/resolve-git-options.js.map +1 -1
- package/dist/commands/ci/run-local.command.d.ts.map +1 -1
- package/dist/commands/ci/run-local.command.js +5 -6
- package/dist/commands/ci/run-local.command.js.map +1 -1
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js +1 -4
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js.map +1 -1
- package/dist/commands/ci/run.command.d.ts.map +1 -1
- package/dist/commands/ci/run.command.js +2 -4
- package/dist/commands/ci/run.command.js.map +1 -1
- package/dist/commands/ci/start-tunnel.command.d.ts.map +1 -1
- package/dist/commands/ci/start-tunnel.command.js +3 -4
- package/dist/commands/ci/start-tunnel.command.js.map +1 -1
- package/dist/commands/ci/trigger-test-run.core.js +1 -4
- package/dist/commands/ci/trigger-test-run.core.js.map +1 -1
- package/dist/commands/ci/trigger-test-run.types.js +1 -4
- package/dist/commands/ci/trigger-test-run.types.js.map +1 -1
- package/dist/commands/ci/upload-asset-chunk.command.js +1 -4
- package/dist/commands/ci/upload-asset-chunk.command.js.map +1 -1
- package/dist/commands/ci/upload-assets.command.d.ts +1 -0
- package/dist/commands/ci/upload-assets.command.d.ts.map +1 -1
- package/dist/commands/ci/upload-assets.command.js +2 -4
- package/dist/commands/ci/upload-assets.command.js.map +1 -1
- package/dist/commands/ci/upload-container.command.d.ts +1 -0
- package/dist/commands/ci/upload-container.command.d.ts.map +1 -1
- package/dist/commands/ci/upload-container.command.js +2 -4
- package/dist/commands/ci/upload-container.command.js.map +1 -1
- package/dist/commands/debug/clean-workspaces.js +1 -4
- package/dist/commands/debug/clean-workspaces.js.map +1 -1
- package/dist/commands/debug/index.d.ts.map +1 -1
- package/dist/commands/debug/index.js +38 -37
- package/dist/commands/debug/index.js.map +1 -1
- package/dist/commands/debug/present-workspace.js +1 -4
- package/dist/commands/debug/present-workspace.js.map +1 -1
- package/dist/commands/debug/project-worktree.js +1 -4
- package/dist/commands/debug/project-worktree.js.map +1 -1
- package/dist/commands/deprecated-aliases.js +1 -4
- package/dist/commands/deprecated-aliases.js.map +1 -1
- package/dist/commands/download/index.js +1 -4
- package/dist/commands/download/index.js.map +1 -1
- package/dist/commands/download/replay.command.js +1 -4
- package/dist/commands/download/replay.command.js.map +1 -1
- package/dist/commands/download/session.command.js +1 -4
- package/dist/commands/download/session.command.js.map +1 -1
- package/dist/commands/download/test-run.command.js +1 -4
- package/dist/commands/download/test-run.command.js.map +1 -1
- package/dist/commands/local/get-edited-files.utils.js +1 -4
- package/dist/commands/local/get-edited-files.utils.js.map +1 -1
- package/dist/commands/local/get-edited-files.utils.spec.js +1 -4
- package/dist/commands/local/get-edited-files.utils.spec.js.map +1 -1
- package/dist/commands/local/index.js +1 -4
- package/dist/commands/local/index.js.map +1 -1
- package/dist/commands/local/relevant-sessions.command.js +1 -4
- package/dist/commands/local/relevant-sessions.command.js.map +1 -1
- package/dist/commands/project/index.js +1 -4
- package/dist/commands/project/index.js.map +1 -1
- package/dist/commands/project/show.command.js +1 -4
- package/dist/commands/project/show.command.js.map +1 -1
- package/dist/commands/project/upload-source.command.js +1 -4
- package/dist/commands/project/upload-source.command.js.map +1 -1
- package/dist/commands/record/__tests__/login.command.spec.js +1 -4
- package/dist/commands/record/__tests__/login.command.spec.js.map +1 -1
- package/dist/commands/record/__tests__/session.command.spec.js +1 -4
- package/dist/commands/record/__tests__/session.command.spec.js.map +1 -1
- package/dist/commands/record/index.js +1 -4
- package/dist/commands/record/index.js.map +1 -1
- package/dist/commands/record/login.command.js +1 -4
- package/dist/commands/record/login.command.js.map +1 -1
- package/dist/commands/record/session.command.js +1 -4
- package/dist/commands/record/session.command.js.map +1 -1
- package/dist/commands/replay-debugger.ui.js +1 -4
- package/dist/commands/replay-debugger.ui.js.map +1 -1
- package/dist/commands/replay.command.d.ts.map +1 -1
- package/dist/commands/replay.command.js +2 -4
- package/dist/commands/replay.command.js.map +1 -1
- package/dist/commands/schema.command.d.ts +53 -0
- package/dist/commands/schema.command.d.ts.map +1 -1
- package/dist/commands/schema.command.js +231 -108
- package/dist/commands/schema.command.js.map +1 -1
- package/dist/commands/schema.command.spec.d.ts +2 -0
- package/dist/commands/schema.command.spec.d.ts.map +1 -0
- package/dist/commands/schema.command.spec.js +195 -0
- package/dist/commands/schema.command.spec.js.map +1 -0
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +59 -50
- package/dist/main.js.map +1 -1
- package/dist/utils/__tests__/handle-auth-failure.spec.js +1 -4
- package/dist/utils/__tests__/handle-auth-failure.spec.js.map +1 -1
- package/dist/utils/__tests__/resolve-project-identifier.spec.js +1 -4
- package/dist/utils/__tests__/resolve-project-identifier.spec.js.map +1 -1
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js +1 -4
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js.map +1 -1
- package/dist/utils/__tests__/select-project.spec.js +5 -14
- package/dist/utils/__tests__/select-project.spec.js.map +1 -1
- package/dist/utils/cli-user-error.js +1 -4
- package/dist/utils/cli-user-error.js.map +1 -1
- package/dist/utils/constants.js +1 -4
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/environment.utils.js +1 -4
- package/dist/utils/environment.utils.js.map +1 -1
- package/dist/utils/format-coverage-ranges.js +1 -4
- package/dist/utils/format-coverage-ranges.js.map +1 -1
- package/dist/utils/handle-auth-failure.js +1 -4
- package/dist/utils/handle-auth-failure.js.map +1 -1
- package/dist/utils/out-of-date-client-error.js +1 -4
- package/dist/utils/out-of-date-client-error.js.map +1 -1
- package/dist/utils/resolve-project-identifier.js +1 -4
- package/dist/utils/resolve-project-identifier.js.map +1 -1
- package/dist/utils/resolve-test-run-from-commit.js +1 -4
- package/dist/utils/resolve-test-run-from-commit.js.map +1 -1
- package/dist/utils/select-project.d.ts +1 -3
- package/dist/utils/select-project.d.ts.map +1 -1
- package/dist/utils/select-project.js +5 -7
- package/dist/utils/select-project.js.map +1 -1
- package/package.json +12 -11
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b55a7a0b-21e0-5b58-ac60-a3df3aed838e")}catch(e){}}();
|
|
3
|
-
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
3
|
exports.imageFilesCommand = void 0;
|
|
6
4
|
const promises_1 = require("fs/promises");
|
|
@@ -8,6 +6,7 @@ const path_1 = require("path");
|
|
|
8
6
|
const client_1 = require("@alwaysmeticulous/client");
|
|
9
7
|
const common_1 = require("@alwaysmeticulous/common");
|
|
10
8
|
const downloading_helpers_1 = require("@alwaysmeticulous/downloading-helpers");
|
|
9
|
+
const print_json_1 = require("../../command-utils/print-json");
|
|
11
10
|
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
12
11
|
const AGENT_IMAGES_SUBDIR = "agent-images";
|
|
13
12
|
const MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
@@ -40,7 +39,7 @@ const downloadImage = async (dir, fileName, url) => {
|
|
|
40
39
|
await (0, downloading_helpers_1.downloadFile)(url, filePath);
|
|
41
40
|
return filePath;
|
|
42
41
|
};
|
|
43
|
-
const handler = async ({ apiToken, replayDiffId, screenshotName, }) => {
|
|
42
|
+
const handler = async ({ apiToken, replayDiffId, screenshotName, json, }) => {
|
|
44
43
|
(0, common_1.initLogger)();
|
|
45
44
|
const client = await (0, client_1.createClientWithOAuth)({
|
|
46
45
|
apiToken,
|
|
@@ -50,7 +49,6 @@ const handler = async ({ apiToken, replayDiffId, screenshotName, }) => {
|
|
|
50
49
|
const dir = getAgentImagesDir();
|
|
51
50
|
await (0, promises_1.mkdir)(dir, { recursive: true });
|
|
52
51
|
await cleanupOldImages(dir);
|
|
53
|
-
console.log(`outcome: ${urls.outcome}`);
|
|
54
52
|
const downloads = [];
|
|
55
53
|
if (urls.screenshot) {
|
|
56
54
|
downloads.push({ label: "screenshot", url: urls.screenshot });
|
|
@@ -66,14 +64,27 @@ const handler = async ({ apiToken, replayDiffId, screenshotName, }) => {
|
|
|
66
64
|
}
|
|
67
65
|
const timestamp = Date.now();
|
|
68
66
|
const prefix = `${timestamp}_${replayDiffId}_${screenshotName}`;
|
|
67
|
+
// Print the outcome up-front (non-JSON) so it's visible even if a download
|
|
68
|
+
// below fails; the JSON path emits it as part of the single object instead.
|
|
69
|
+
if (!json) {
|
|
70
|
+
console.log(`outcome: ${urls.outcome}`);
|
|
71
|
+
}
|
|
69
72
|
const results = await Promise.all(downloads.map(({ label, url }) => downloadImage(dir, `${prefix}_${label}.png`, url)));
|
|
73
|
+
if (json) {
|
|
74
|
+
const output = { outcome: urls.outcome };
|
|
75
|
+
for (let i = 0; i < downloads.length; i++) {
|
|
76
|
+
output[downloads[i].label] = results[i];
|
|
77
|
+
}
|
|
78
|
+
(0, print_json_1.printJson)(output);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
70
81
|
for (let i = 0; i < downloads.length; i++) {
|
|
71
82
|
console.log(`${downloads[i].label}: ${results[i]}`);
|
|
72
83
|
}
|
|
73
84
|
};
|
|
74
85
|
exports.imageFilesCommand = {
|
|
75
86
|
command: "image-files",
|
|
76
|
-
describe: "Download screenshot images for a replay diff screenshot to local files under ~/.meticulous/agent-images",
|
|
87
|
+
describe: "Download screenshot images for a replay diff screenshot to local files under ~/.meticulous/agent-images. Outputs an outcome line then a 'label: filepath' line per downloaded image (or JSON with --json).",
|
|
77
88
|
builder: {
|
|
78
89
|
apiToken: { string: true, description: "Meticulous API token" },
|
|
79
90
|
replayDiffId: {
|
|
@@ -89,5 +100,4 @@ exports.imageFilesCommand = {
|
|
|
89
100
|
},
|
|
90
101
|
handler: (0, sentry_utils_1.wrapHandler)(handler),
|
|
91
102
|
};
|
|
92
|
-
//# sourceMappingURL=screenshot-image-files.command.js.map
|
|
93
|
-
//# debugId=b55a7a0b-21e0-5b58-ac60-a3df3aed838e
|
|
103
|
+
//# sourceMappingURL=screenshot-image-files.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot-image-files.command.js","sources":["../../../src/commands/agent/screenshot-image-files.command.ts"],"
|
|
1
|
+
{"version":3,"file":"screenshot-image-files.command.js","sourceRoot":"","sources":["../../../src/commands/agent/screenshot-image-files.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot-image.command.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/screenshot-image.command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"screenshot-image.command.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/screenshot-image.command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,UAAU,OAAO;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;CACf;AAoCD,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAkB5D,CAAC"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0430a2f6-2749-5a65-9906-809b7acf6d83")}catch(e){}}();
|
|
3
|
-
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
3
|
exports.imageUrlsCommand = void 0;
|
|
6
4
|
const client_1 = require("@alwaysmeticulous/client");
|
|
7
5
|
const common_1 = require("@alwaysmeticulous/common");
|
|
6
|
+
const print_json_1 = require("../../command-utils/print-json");
|
|
8
7
|
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
9
|
-
const handler = async ({ apiToken, replayDiffId, screenshotName, }) => {
|
|
8
|
+
const handler = async ({ apiToken, replayDiffId, screenshotName, json, }) => {
|
|
10
9
|
(0, common_1.initLogger)();
|
|
11
10
|
const client = await (0, client_1.createClientWithOAuth)({
|
|
12
11
|
apiToken,
|
|
13
12
|
enableOAuthLogin: true,
|
|
14
13
|
});
|
|
15
14
|
const urls = await (0, client_1.getScreenshotUrls)(client, replayDiffId, screenshotName);
|
|
15
|
+
if (json) {
|
|
16
|
+
(0, print_json_1.printJson)(urls);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
16
19
|
console.log(`outcome: ${urls.outcome}`);
|
|
17
20
|
if (urls.screenshot) {
|
|
18
21
|
console.log(`screenshot: ${urls.screenshot}`);
|
|
@@ -29,7 +32,7 @@ const handler = async ({ apiToken, replayDiffId, screenshotName, }) => {
|
|
|
29
32
|
};
|
|
30
33
|
exports.imageUrlsCommand = {
|
|
31
34
|
command: "image-urls",
|
|
32
|
-
describe: "Get screenshot image URLs for a replay diff screenshot",
|
|
35
|
+
describe: "Get screenshot image URLs for a replay diff screenshot. Outputs an outcome line then screenshot/before/after/diffImage URL lines (or JSON with --json).",
|
|
33
36
|
builder: {
|
|
34
37
|
apiToken: { string: true, description: "Meticulous API token" },
|
|
35
38
|
replayDiffId: {
|
|
@@ -45,5 +48,4 @@ exports.imageUrlsCommand = {
|
|
|
45
48
|
},
|
|
46
49
|
handler: (0, sentry_utils_1.wrapHandler)(handler),
|
|
47
50
|
};
|
|
48
|
-
//# sourceMappingURL=screenshot-image.command.js.map
|
|
49
|
-
//# debugId=0430a2f6-2749-5a65-9906-809b7acf6d83
|
|
51
|
+
//# sourceMappingURL=screenshot-image.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot-image.command.js","sources":["../../../src/commands/agent/screenshot-image.command.ts"],"
|
|
1
|
+
{"version":3,"file":"screenshot-image.command.js","sourceRoot":"","sources":["../../../src/commands/agent/screenshot-image.command.ts"],"names":[],"mappings":";;;AAAA,qDAGkC;AAClC,qDAAsD;AAEtD,+DAA2D;AAC3D,mEAA+D;AAS/D,MAAM,OAAO,GAAG,KAAK,EAAE,EACrB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,IAAI,GACI,EAAiB,EAAE;IAC3B,IAAA,mBAAU,GAAE,CAAC;IACb,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAqB,EAAC;QACzC,QAAQ;QACR,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,IAAA,0BAAiB,EAAC,MAAM,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IAE3E,IAAI,IAAI,EAAE,CAAC;QACT,IAAA,sBAAS,EAAC,IAAI,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC,CAAC;AAEW,QAAA,gBAAgB,GAAoC;IAC/D,OAAO,EAAE,YAAY;IACrB,QAAQ,EACN,yJAAyJ;IAC3J,OAAO,EAAE;QACP,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE;QAC/D,YAAY,EAAE;YACZ,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,oBAAoB;YACjC,YAAY,EAAE,IAAI;SACnB;QACD,cAAc,EAAE;YACd,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,uDAAuD;YACpE,YAAY,EAAE,IAAI;SACnB;KACF;IACD,OAAO,EAAE,IAAA,0BAAW,EAAC,OAAO,CAAC;CAC9B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-run-diffs.command.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/test-run-diffs.command.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"test-run-diffs.command.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/test-run-diffs.command.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAiB3C,UAAU,OAAO;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,4BAA4B,EAAE,OAAO,CAAC;IACtC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf;AA+LD,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAqD/D,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3f2d4806-c07a-5b11-81a1-b22cc1229f10")}catch(e){}}();
|
|
3
|
-
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
3
|
exports.testRunDiffsCommand = void 0;
|
|
6
4
|
const client_1 = require("@alwaysmeticulous/client");
|
|
7
5
|
const common_1 = require("@alwaysmeticulous/common");
|
|
6
|
+
const print_json_1 = require("../../command-utils/print-json");
|
|
8
7
|
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
9
8
|
const cli_user_error_1 = require("../../utils/cli-user-error");
|
|
10
9
|
const resolve_test_run_from_commit_1 = require("../../utils/resolve-test-run-from-commit");
|
|
@@ -12,7 +11,7 @@ const test_run_diffs_utils_1 = require("./test-run-diffs.utils");
|
|
|
12
11
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
13
12
|
/** Give up polling the diffs summary after this long, rather than forever. */
|
|
14
13
|
const SUMMARY_POLL_TIMEOUT_MS = 10 * 60_000;
|
|
15
|
-
const handler = async ({ apiToken, testRunId, commitSha, dontWaitForTestRunToComplete, includeReplayIds, includeDomDiffIds, includeAllDiffs, includeMatches, orderByReplayDiffs, }) => {
|
|
14
|
+
const handler = async ({ apiToken, testRunId, commitSha, dontWaitForTestRunToComplete, includeReplayIds, includeDomDiffIds, includeAllDiffs, includeMatches, orderByReplayDiffs, json, }) => {
|
|
16
15
|
if (testRunId != null && commitSha != null) {
|
|
17
16
|
throw new cli_user_error_1.CliUserError("Pass either --testRunId or --commitSha, not both.");
|
|
18
17
|
}
|
|
@@ -37,11 +36,31 @@ const handler = async ({ apiToken, testRunId, commitSha, dontWaitForTestRunToCom
|
|
|
37
36
|
resolvedTestRunId = run.testRunId;
|
|
38
37
|
status = run.status;
|
|
39
38
|
}
|
|
39
|
+
// --includeMatches implies --includeAllDiffs (matches are never part of the
|
|
40
|
+
// selected subset, so they only make sense alongside the full set). Use the
|
|
41
|
+
// effective value for both the request and the isSelected column. Computed
|
|
42
|
+
// up-front so the header can be emitted even on the in-progress short-circuit.
|
|
43
|
+
const allDiffs = (0, test_run_diffs_utils_1.resolveIncludeAllDiffs)({ includeAllDiffs, includeMatches });
|
|
44
|
+
const columns = {
|
|
45
|
+
orderByReplayDiffs,
|
|
46
|
+
includeDomDiffIds,
|
|
47
|
+
includeAllDiffs: allDiffs,
|
|
48
|
+
includeReplayIds,
|
|
49
|
+
};
|
|
40
50
|
// Diffs are only meaningful once the run has finished with a verdict
|
|
41
51
|
// (Success/Failure). Block until it finishes (default) or, with
|
|
42
52
|
// --dontWaitForTestRunToComplete, report the in-progress run and stop.
|
|
43
53
|
const finishedStatus = await (0, resolve_test_run_from_commit_1.ensureTestRunFinished)(client, resolvedTestRunId, status, { dontWait: dontWaitForTestRunToComplete });
|
|
44
54
|
if (finishedStatus == null) {
|
|
55
|
+
// Keep stdout's shape stable: an unfinished run has no diffs yet, so emit the
|
|
56
|
+
// empty JSON array / a header-only TSV (matching a finished run with zero
|
|
57
|
+
// diffs) rather than nothing — the notice went to stderr.
|
|
58
|
+
if (json) {
|
|
59
|
+
console.log("[]");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log((0, test_run_diffs_utils_1.buildDiffsSummaryHeader)(columns).join("\t"));
|
|
63
|
+
}
|
|
45
64
|
return;
|
|
46
65
|
}
|
|
47
66
|
// Reject session-pool bases (Partial, which never finish on their own and
|
|
@@ -51,10 +70,6 @@ const handler = async ({ apiToken, testRunId, commitSha, dontWaitForTestRunToCom
|
|
|
51
70
|
});
|
|
52
71
|
const t0 = performance.now();
|
|
53
72
|
(0, common_1.logProgress)(`Fetching diffs summary for test run ${resolvedTestRunId}...`);
|
|
54
|
-
// --includeMatches implies --includeAllDiffs (matches are never part of the
|
|
55
|
-
// selected subset, so they only make sense alongside the full set). Use the
|
|
56
|
-
// effective value for both the request and the isSelected column.
|
|
57
|
-
const allDiffs = (0, test_run_diffs_utils_1.resolveIncludeAllDiffs)({ includeAllDiffs, includeMatches });
|
|
58
73
|
const diffsSummaryOptions = {
|
|
59
74
|
includeReplayIds,
|
|
60
75
|
includeDomDiffIds,
|
|
@@ -63,13 +78,35 @@ const handler = async ({ apiToken, testRunId, commitSha, dontWaitForTestRunToCom
|
|
|
63
78
|
orderByReplayDiffs,
|
|
64
79
|
};
|
|
65
80
|
let response = await (0, client_1.getTestRunDiffsSummary)(client, resolvedTestRunId, diffsSummaryOptions);
|
|
81
|
+
// A cold start finding the last computation already `failed` retriggers
|
|
82
|
+
// once, up front — before the poll deadline below is computed, so the fresh
|
|
83
|
+
// run always gets the full timeout. This is a one-shot decision made only
|
|
84
|
+
// here, not inside the poll loop: once we're polling, a `failed` result is
|
|
85
|
+
// reported and the command exits, it never retriggers again.
|
|
86
|
+
if (response.status === "failed") {
|
|
87
|
+
(0, common_1.logProgress)(`Diffs computation failed for test run ${resolvedTestRunId}; retriggering...`);
|
|
88
|
+
response = await (0, client_1.getTestRunDiffsSummary)(client, resolvedTestRunId, {
|
|
89
|
+
...diffsSummaryOptions,
|
|
90
|
+
retrigger: true,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
66
93
|
// Poll until complete (or give up after the timeout, rather than forever).
|
|
67
94
|
// A single line when we start waiting — no per-poll output.
|
|
68
95
|
const summaryDeadline = performance.now() + SUMMARY_POLL_TIMEOUT_MS;
|
|
69
96
|
if (response.status === "pending" || response.status === "processing") {
|
|
70
97
|
(0, common_1.logProgress)(`Waiting for diff results for test run ${resolvedTestRunId}...`);
|
|
71
98
|
}
|
|
72
|
-
while (response.status
|
|
99
|
+
while (response.status !== "complete") {
|
|
100
|
+
if (response.status === "failed") {
|
|
101
|
+
const reasonSuffix = response.reason != null ? ` (${response.reason})` : "";
|
|
102
|
+
(0, common_1.logNotice)(`Diffs summary computation failed${reasonSuffix} for test run ${resolvedTestRunId}. ` +
|
|
103
|
+
`Something may have gone wrong — try again later.`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
if (response.status !== "pending" && response.status !== "processing") {
|
|
107
|
+
(0, common_1.logNotice)(`Error: unexpected status "${String(response.status)}"`);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
73
110
|
if (performance.now() >= summaryDeadline) {
|
|
74
111
|
(0, common_1.logNotice)(`Diffs summary for test run ${resolvedTestRunId} did not complete within 10 minutes ` +
|
|
75
112
|
`(status: ${response.status}). Something may have gone wrong — try again later.`);
|
|
@@ -78,38 +115,33 @@ const handler = async ({ apiToken, testRunId, commitSha, dontWaitForTestRunToCom
|
|
|
78
115
|
await sleep(2000);
|
|
79
116
|
response = await (0, client_1.getTestRunDiffsSummary)(client, resolvedTestRunId, diffsSummaryOptions);
|
|
80
117
|
}
|
|
81
|
-
if (response.status !== "complete") {
|
|
82
|
-
(0, common_1.logNotice)(`Error: unexpected status "${response.status}"`);
|
|
83
|
-
process.exit(1);
|
|
84
|
-
}
|
|
85
118
|
const data = response.data ?? [];
|
|
86
|
-
if (data.length === 0) {
|
|
87
|
-
(0, common_1.logNotice)(`Test run ${resolvedTestRunId} does not have diffs.`);
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
119
|
// The backend sets `index` to the priority rank by default, or the
|
|
91
120
|
// within-replay position (with `total`) when orderByReplayDiffs is set.
|
|
92
121
|
const rows = (0, test_run_diffs_utils_1.flattenDiffRows)(data, orderByReplayDiffs);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (row.screenshot.userVisibleOutcome === "difference") {
|
|
103
|
-
totalDiffScreenshots++;
|
|
122
|
+
if (json) {
|
|
123
|
+
(0, print_json_1.printJson)((0, test_run_diffs_utils_1.buildDiffsSummaryJson)(data, columns));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Always emit the TSV header so a zero-diff run is a header with no rows (the
|
|
127
|
+
// same shape as the in-progress short-circuit above), never empty stdout.
|
|
128
|
+
console.log((0, test_run_diffs_utils_1.buildDiffsSummaryHeader)(columns).join("\t"));
|
|
129
|
+
for (const row of rows) {
|
|
130
|
+
console.log((0, test_run_diffs_utils_1.formatDiffRow)(row, columns).join("\t"));
|
|
104
131
|
}
|
|
105
|
-
console.log((0, test_run_diffs_utils_1.formatDiffRow)(row, columns).join("\t"));
|
|
106
132
|
}
|
|
133
|
+
// Summaries on stderr regardless of --json (which only changes stdout).
|
|
134
|
+
if (data.length === 0) {
|
|
135
|
+
(0, common_1.logNotice)(`Test run ${resolvedTestRunId} does not have diffs.`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const totalDiffScreenshots = rows.filter((row) => row.screenshot.userVisibleOutcome === "difference").length;
|
|
107
139
|
const tEnd = performance.now();
|
|
108
140
|
(0, common_1.logNotice)(`${data.length} replay diff(s), ${totalDiffScreenshots} screenshot diff(s), total ${((tEnd - t0) / 1000).toFixed(1)}s`);
|
|
109
141
|
};
|
|
110
142
|
exports.testRunDiffsCommand = {
|
|
111
143
|
command: "test-run-diffs",
|
|
112
|
-
describe: "List replay diffs for a test run with
|
|
144
|
+
describe: "List replay diffs for a test run. Outputs TSV, one row per screenshot: replayDiffId, screenshotName, outcome, mismatch (plus optional columns depending on flags), or the same data with --json (nested by replay diff under --orderByReplayDiffs).",
|
|
113
145
|
builder: {
|
|
114
146
|
apiToken: { string: true, description: "Meticulous API token" },
|
|
115
147
|
testRunId: {
|
|
@@ -153,5 +185,4 @@ exports.testRunDiffsCommand = {
|
|
|
153
185
|
},
|
|
154
186
|
handler: (0, sentry_utils_1.wrapHandler)(handler),
|
|
155
187
|
};
|
|
156
|
-
//# sourceMappingURL=test-run-diffs.command.js.map
|
|
157
|
-
//# debugId=3f2d4806-c07a-5b11-81a1-b22cc1229f10
|
|
188
|
+
//# sourceMappingURL=test-run-diffs.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-run-diffs.command.js","sources":["../../../src/commands/agent/test-run-diffs.command.ts"],"
|
|
1
|
+
{"version":3,"file":"test-run-diffs.command.js","sourceRoot":"","sources":["../../../src/commands/agent/test-run-diffs.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-run-diffs.command.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/test-run-diffs.command.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_run_diffs_command_1 = require("./test-run-diffs.command");
|
|
5
|
+
// Make wrapHandler a passthrough so handler errors propagate directly to tests
|
|
6
|
+
// rather than being swallowed by process.exit().
|
|
7
|
+
vitest_1.vi.mock("../../command-utils/sentry.utils", () => ({
|
|
8
|
+
wrapHandler: (fn) => fn,
|
|
9
|
+
}));
|
|
10
|
+
const mocks = vitest_1.vi.hoisted(() => ({
|
|
11
|
+
createClientWithOAuth: vitest_1.vi.fn(),
|
|
12
|
+
resolveApiTokenWithOAuth: vitest_1.vi.fn(),
|
|
13
|
+
getTestRun: vitest_1.vi.fn(),
|
|
14
|
+
getTestRunDiffsSummary: vitest_1.vi.fn(),
|
|
15
|
+
ensureTestRunFinished: vitest_1.vi.fn(),
|
|
16
|
+
assertTestRunComplete: vitest_1.vi.fn(),
|
|
17
|
+
resolveTestRunForCommitOrThrow: vitest_1.vi.fn(),
|
|
18
|
+
logNotice: vitest_1.vi.fn(),
|
|
19
|
+
logProgress: vitest_1.vi.fn(),
|
|
20
|
+
}));
|
|
21
|
+
vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
|
|
22
|
+
createClientWithOAuth: mocks.createClientWithOAuth,
|
|
23
|
+
resolveApiTokenWithOAuth: mocks.resolveApiTokenWithOAuth,
|
|
24
|
+
getTestRun: mocks.getTestRun,
|
|
25
|
+
getTestRunDiffsSummary: mocks.getTestRunDiffsSummary,
|
|
26
|
+
}));
|
|
27
|
+
vitest_1.vi.mock("@alwaysmeticulous/common", () => ({
|
|
28
|
+
logNotice: mocks.logNotice,
|
|
29
|
+
logProgress: mocks.logProgress,
|
|
30
|
+
}));
|
|
31
|
+
vitest_1.vi.mock("../../utils/resolve-test-run-from-commit", () => ({
|
|
32
|
+
ensureTestRunFinished: mocks.ensureTestRunFinished,
|
|
33
|
+
assertTestRunComplete: mocks.assertTestRunComplete,
|
|
34
|
+
resolveTestRunForCommitOrThrow: mocks.resolveTestRunForCommitOrThrow,
|
|
35
|
+
}));
|
|
36
|
+
class ProcessExitError extends Error {
|
|
37
|
+
code;
|
|
38
|
+
constructor(code) {
|
|
39
|
+
super(`process.exit(${code})`);
|
|
40
|
+
this.code = code;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const runHandler = () => test_run_diffs_command_1.testRunDiffsCommand.handler({
|
|
44
|
+
apiToken: undefined,
|
|
45
|
+
testRunId: "tr-1",
|
|
46
|
+
commitSha: undefined,
|
|
47
|
+
dontWaitForTestRunToComplete: false,
|
|
48
|
+
includeReplayIds: false,
|
|
49
|
+
includeDomDiffIds: false,
|
|
50
|
+
includeAllDiffs: false,
|
|
51
|
+
includeMatches: false,
|
|
52
|
+
orderByReplayDiffs: false,
|
|
53
|
+
json: false,
|
|
54
|
+
});
|
|
55
|
+
let logSpy;
|
|
56
|
+
let exitSpy;
|
|
57
|
+
(0, vitest_1.describe)("test-run-diffs command polling", () => {
|
|
58
|
+
(0, vitest_1.beforeEach)(() => {
|
|
59
|
+
vitest_1.vi.clearAllMocks();
|
|
60
|
+
mocks.createClientWithOAuth.mockResolvedValue({});
|
|
61
|
+
mocks.resolveApiTokenWithOAuth.mockResolvedValue("token");
|
|
62
|
+
mocks.getTestRun.mockResolvedValue({ status: "Success" });
|
|
63
|
+
mocks.ensureTestRunFinished.mockResolvedValue("Success");
|
|
64
|
+
mocks.assertTestRunComplete.mockReturnValue(undefined);
|
|
65
|
+
logSpy = vitest_1.vi.spyOn(console, "log").mockImplementation(() => { });
|
|
66
|
+
exitSpy = vitest_1.vi.spyOn(process, "exit").mockImplementation(((code) => {
|
|
67
|
+
throw new ProcessExitError(code);
|
|
68
|
+
}));
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.afterEach)(() => {
|
|
71
|
+
logSpy.mockRestore();
|
|
72
|
+
exitSpy.mockRestore();
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)("retriggers once up front when the run starts out failed, then reports success", async () => {
|
|
75
|
+
mocks.getTestRunDiffsSummary
|
|
76
|
+
.mockResolvedValueOnce({ status: "failed", reason: "TIMED_OUT" }) // cold-start check
|
|
77
|
+
.mockResolvedValueOnce({ status: "pending" }) // the retrigger call
|
|
78
|
+
.mockResolvedValueOnce({ status: "complete", data: [] }); // first poll
|
|
79
|
+
vitest_1.vi.useFakeTimers();
|
|
80
|
+
const handlerPromise = runHandler();
|
|
81
|
+
await vitest_1.vi.advanceTimersByTimeAsync(2_000);
|
|
82
|
+
await handlerPromise;
|
|
83
|
+
vitest_1.vi.useRealTimers();
|
|
84
|
+
(0, vitest_1.expect)(exitSpy).not.toHaveBeenCalled();
|
|
85
|
+
(0, vitest_1.expect)(mocks.getTestRunDiffsSummary).toHaveBeenCalledTimes(3);
|
|
86
|
+
(0, vitest_1.expect)(mocks.getTestRunDiffsSummary).toHaveBeenNthCalledWith(2, vitest_1.expect.anything(), "tr-1", vitest_1.expect.objectContaining({ retrigger: true }));
|
|
87
|
+
// The poll after retriggering carries no retrigger param of its own.
|
|
88
|
+
(0, vitest_1.expect)(mocks.getTestRunDiffsSummary).toHaveBeenNthCalledWith(3, vitest_1.expect.anything(), "tr-1", vitest_1.expect.not.objectContaining({ retrigger: true }));
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)("does not retrigger a second time if the freshly retriggered run also fails", async () => {
|
|
91
|
+
mocks.getTestRunDiffsSummary
|
|
92
|
+
.mockResolvedValueOnce({ status: "failed", reason: "TIMED_OUT" }) // cold-start check
|
|
93
|
+
.mockResolvedValueOnce({ status: "pending" }) // the retrigger call
|
|
94
|
+
.mockResolvedValueOnce({ status: "failed", reason: "FAILED" }); // first poll fails too
|
|
95
|
+
vitest_1.vi.useFakeTimers();
|
|
96
|
+
const handlerRejection = (0, vitest_1.expect)(runHandler()).rejects.toThrow(ProcessExitError);
|
|
97
|
+
await vitest_1.vi.advanceTimersByTimeAsync(2_000);
|
|
98
|
+
await handlerRejection;
|
|
99
|
+
vitest_1.vi.useRealTimers();
|
|
100
|
+
(0, vitest_1.expect)(exitSpy).toHaveBeenCalledWith(1);
|
|
101
|
+
(0, vitest_1.expect)(mocks.logNotice).toHaveBeenCalledWith(vitest_1.expect.stringContaining("failed (FAILED)"));
|
|
102
|
+
// Exactly one retrigger for the whole invocation: the initial cold-start
|
|
103
|
+
// check plus the one retrigger call, nothing more.
|
|
104
|
+
(0, vitest_1.expect)(mocks.getTestRunDiffsSummary).toHaveBeenCalledTimes(3);
|
|
105
|
+
});
|
|
106
|
+
(0, vitest_1.it)("does not retrigger when the run isn't already failed", async () => {
|
|
107
|
+
mocks.getTestRunDiffsSummary.mockResolvedValue({
|
|
108
|
+
status: "complete",
|
|
109
|
+
data: [],
|
|
110
|
+
});
|
|
111
|
+
await runHandler();
|
|
112
|
+
(0, vitest_1.expect)(mocks.getTestRunDiffsSummary).toHaveBeenCalledTimes(1);
|
|
113
|
+
(0, vitest_1.expect)(mocks.getTestRunDiffsSummary).not.toHaveBeenCalledWith(vitest_1.expect.anything(), vitest_1.expect.anything(), vitest_1.expect.objectContaining({ retrigger: true }));
|
|
114
|
+
});
|
|
115
|
+
(0, vitest_1.it)("exits 1 immediately on an unrecognized status", async () => {
|
|
116
|
+
mocks.getTestRunDiffsSummary.mockResolvedValue({
|
|
117
|
+
status: "unexpected_bogus_status",
|
|
118
|
+
});
|
|
119
|
+
await (0, vitest_1.expect)(runHandler()).rejects.toThrow(ProcessExitError);
|
|
120
|
+
(0, vitest_1.expect)(exitSpy).toHaveBeenCalledWith(1);
|
|
121
|
+
(0, vitest_1.expect)(mocks.logNotice).toHaveBeenCalledWith(vitest_1.expect.stringContaining('unexpected status "unexpected_bogus_status"'));
|
|
122
|
+
});
|
|
123
|
+
(0, vitest_1.it)("exits 1 once the 10-minute deadline passes while still pending", async () => {
|
|
124
|
+
mocks.getTestRunDiffsSummary.mockResolvedValue({ status: "pending" });
|
|
125
|
+
const nowSpy = vitest_1.vi
|
|
126
|
+
.spyOn(performance, "now")
|
|
127
|
+
.mockReturnValueOnce(0) // t0
|
|
128
|
+
.mockReturnValueOnce(0) // summaryDeadline base
|
|
129
|
+
.mockReturnValueOnce(999_999_999); // deadline check inside the loop
|
|
130
|
+
await (0, vitest_1.expect)(runHandler()).rejects.toThrow(ProcessExitError);
|
|
131
|
+
(0, vitest_1.expect)(exitSpy).toHaveBeenCalledWith(1);
|
|
132
|
+
(0, vitest_1.expect)(mocks.logNotice).toHaveBeenCalledWith(vitest_1.expect.stringContaining("did not complete within 10 minutes"));
|
|
133
|
+
nowSpy.mockRestore();
|
|
134
|
+
});
|
|
135
|
+
(0, vitest_1.it)("prints TSV output once the computation completes", async () => {
|
|
136
|
+
mocks.getTestRunDiffsSummary.mockResolvedValue({
|
|
137
|
+
status: "complete",
|
|
138
|
+
data: [],
|
|
139
|
+
});
|
|
140
|
+
await runHandler();
|
|
141
|
+
(0, vitest_1.expect)(exitSpy).not.toHaveBeenCalled();
|
|
142
|
+
const stdout = logSpy.mock.calls.flat().join("\n");
|
|
143
|
+
(0, vitest_1.expect)(stdout.split("\n")[0]).toContain("replayDiffId");
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=test-run-diffs.command.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-run-diffs.command.spec.js","sourceRoot":"","sources":["../../../src/commands/agent/test-run-diffs.command.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,13 @@ export declare const flattenDiffRows: (data: DiffsSummaryReplayDiff[], orderByRe
|
|
|
39
39
|
* by default rows are already in priority order, so the index is omitted.
|
|
40
40
|
*/
|
|
41
41
|
export declare const buildDiffsSummaryHeader: (columns: DiffsSummaryColumns) => string[];
|
|
42
|
+
/**
|
|
43
|
+
* Builds the JSON equivalent of the TSV, gated by the same columns. By default
|
|
44
|
+
* it's a flat array (one object per screenshot, in the same priority order as
|
|
45
|
+
* the TSV). With orderByReplayDiffs it nests one level — an array of replay
|
|
46
|
+
* diffs, each with its screenshots grouped underneath (index/total then apply).
|
|
47
|
+
*/
|
|
48
|
+
export declare const buildDiffsSummaryJson: (data: DiffsSummaryReplayDiff[], columns: DiffsSummaryColumns) => unknown[];
|
|
42
49
|
/** Formats a single row's fields, gated by the same columns as the header. */
|
|
43
50
|
export declare const formatDiffRow: ({ replayDiff, screenshot }: DiffRow, columns: DiffsSummaryColumns) => (string | number)[];
|
|
44
51
|
//# sourceMappingURL=test-run-diffs.utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-run-diffs.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/test-run-diffs.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAElC,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,sBAAsB,CAAC;IACnC,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAED,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iCAAiC;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB,2CAA2C;IAC3C,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAKD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,yCAGhC;IACD,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB,KAAG,OAA4C,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,SACpB,sBAAsB,EAAE,sBACV,OAAO,KAC1B,OAAO,EAQT,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,YACzB,mBAAmB,KAC3B,MAAM,EAQR,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,aAAa,+BACI,OAAO,WAC1B,mBAAmB,KAC3B,CAAC,MAAM,GAAG,MAAM,CAAC,EAcnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"test-run-diffs.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/test-run-diffs.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAElC,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,sBAAsB,CAAC;IACnC,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAED,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iCAAiC;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB,2CAA2C;IAC3C,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAKD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,yCAGhC;IACD,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB,KAAG,OAA4C,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,SACpB,sBAAsB,EAAE,sBACV,OAAO,KAC1B,OAAO,EAQT,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,YACzB,mBAAmB,KAC3B,MAAM,EAQR,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,SAC1B,sBAAsB,EAAE,WACrB,mBAAmB,KAC3B,OAAO,EA2BT,CAAC;AAoBF,8EAA8E;AAC9E,eAAO,MAAM,aAAa,+BACI,OAAO,WAC1B,mBAAmB,KAC3B,CAAC,MAAM,GAAG,MAAM,CAAC,EAcnB,CAAC"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="745a03e3-8218-5e27-8e96-123d2cacb50e")}catch(e){}}();
|
|
3
|
-
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.formatDiffRow = exports.buildDiffsSummaryHeader = exports.flattenDiffRows = exports.resolveIncludeAllDiffs = void 0;
|
|
3
|
+
exports.formatDiffRow = exports.buildDiffsSummaryJson = exports.buildDiffsSummaryHeader = exports.flattenDiffRows = exports.resolveIncludeAllDiffs = void 0;
|
|
6
4
|
const fmtMismatch = (v) => v != null ? v.toFixed(5) : "";
|
|
7
5
|
/**
|
|
8
6
|
* --includeMatches implies --includeAllDiffs: matches are never part of the
|
|
@@ -43,6 +41,51 @@ const buildDiffsSummaryHeader = (columns) => {
|
|
|
43
41
|
return fields;
|
|
44
42
|
};
|
|
45
43
|
exports.buildDiffsSummaryHeader = buildDiffsSummaryHeader;
|
|
44
|
+
/**
|
|
45
|
+
* Builds the JSON equivalent of the TSV, gated by the same columns. By default
|
|
46
|
+
* it's a flat array (one object per screenshot, in the same priority order as
|
|
47
|
+
* the TSV). With orderByReplayDiffs it nests one level — an array of replay
|
|
48
|
+
* diffs, each with its screenshots grouped underneath (index/total then apply).
|
|
49
|
+
*/
|
|
50
|
+
const buildDiffsSummaryJson = (data, columns) => {
|
|
51
|
+
if (columns.orderByReplayDiffs) {
|
|
52
|
+
return data.map((replayDiff) => ({
|
|
53
|
+
replayDiffId: replayDiff.replayDiffId,
|
|
54
|
+
...(columns.includeReplayIds
|
|
55
|
+
? {
|
|
56
|
+
baseReplayId: replayDiff.baseReplayId ?? null,
|
|
57
|
+
headReplayId: replayDiff.headReplayId ?? null,
|
|
58
|
+
}
|
|
59
|
+
: {}),
|
|
60
|
+
screenshots: replayDiff.screenshots.map((screenshot) => screenshotToJson(screenshot, columns)),
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
return (0, exports.flattenDiffRows)(data, columns.orderByReplayDiffs).map(({ replayDiff, screenshot }) => ({
|
|
64
|
+
replayDiffId: replayDiff.replayDiffId,
|
|
65
|
+
...screenshotToJson(screenshot, columns),
|
|
66
|
+
...(columns.includeReplayIds
|
|
67
|
+
? {
|
|
68
|
+
baseReplayId: replayDiff.baseReplayId ?? null,
|
|
69
|
+
headReplayId: replayDiff.headReplayId ?? null,
|
|
70
|
+
}
|
|
71
|
+
: {}),
|
|
72
|
+
}));
|
|
73
|
+
};
|
|
74
|
+
exports.buildDiffsSummaryJson = buildDiffsSummaryJson;
|
|
75
|
+
const screenshotToJson = (screenshot, columns) => ({
|
|
76
|
+
screenshotName: screenshot.screenshotName,
|
|
77
|
+
...(columns.orderByReplayDiffs
|
|
78
|
+
? { index: screenshot.index, total: screenshot.total ?? null }
|
|
79
|
+
: {}),
|
|
80
|
+
outcome: screenshot.outcome,
|
|
81
|
+
mismatch: screenshot.mismatchFraction ?? null,
|
|
82
|
+
...(columns.includeDomDiffIds
|
|
83
|
+
? { domDiffIds: screenshot.domDiffIds ?? null }
|
|
84
|
+
: {}),
|
|
85
|
+
...(columns.includeAllDiffs
|
|
86
|
+
? { isSelected: screenshot.isSelected ?? false }
|
|
87
|
+
: {}),
|
|
88
|
+
});
|
|
46
89
|
/** Formats a single row's fields, gated by the same columns as the header. */
|
|
47
90
|
const formatDiffRow = ({ replayDiff, screenshot }, columns) => {
|
|
48
91
|
const fields = [
|
|
@@ -61,5 +104,4 @@ const formatDiffRow = ({ replayDiff, screenshot }, columns) => {
|
|
|
61
104
|
return fields;
|
|
62
105
|
};
|
|
63
106
|
exports.formatDiffRow = formatDiffRow;
|
|
64
|
-
//# sourceMappingURL=test-run-diffs.utils.js.map
|
|
65
|
-
//# debugId=745a03e3-8218-5e27-8e96-123d2cacb50e
|
|
107
|
+
//# sourceMappingURL=test-run-diffs.utils.js.map
|