@alwaysmeticulous/downloading-helpers 2.280.0 → 2.282.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/file-downloads/__tests__/replay-log-text-files.spec.d.ts +1 -0
- package/dist/file-downloads/__tests__/replay-log-text-files.spec.js +91 -0
- package/dist/file-downloads/__tests__/replay-log-text-files.spec.js.map +1 -0
- package/dist/file-downloads/replay-log-text-files.d.ts +10 -0
- package/dist/file-downloads/replay-log-text-files.js +89 -0
- package/dist/file-downloads/replay-log-text-files.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/scripts/__tests__/replays.spec.d.ts +1 -0
- package/dist/scripts/__tests__/replays.spec.js +105 -0
- package/dist/scripts/__tests__/replays.spec.js.map +1 -0
- package/dist/scripts/replays.d.ts +22 -1
- package/dist/scripts/replays.js +41 -20
- package/dist/scripts/replays.js.map +1 -1
- package/package.json +18 -19
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
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]="bc2ffa54-201f-57fe-8754-905957d1b76a")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const vitest_1 = require("vitest");
|
|
9
|
+
const replay_log_text_files_1 = require("../replay-log-text-files");
|
|
10
|
+
(0, vitest_1.describe)("ensureReplayLogTextFiles", () => {
|
|
11
|
+
let replayDir;
|
|
12
|
+
(0, vitest_1.beforeEach)(() => {
|
|
13
|
+
replayDir = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), "met-ensure-log-txt-"));
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.afterEach)(() => {
|
|
16
|
+
(0, fs_1.rmSync)(replayDir, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
const writeNdjson = (entries) => {
|
|
19
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(replayDir, "logs.ndjson"), entries.map((e) => JSON.stringify(e)).join("\n"));
|
|
20
|
+
};
|
|
21
|
+
(0, vitest_1.it)("is a no-op when logs.ndjson is missing", async () => {
|
|
22
|
+
await (0, replay_log_text_files_1.ensureReplayLogTextFiles)(replayDir);
|
|
23
|
+
(0, vitest_1.expect)((0, fs_1.existsSync)((0, path_1.join)(replayDir, "logs.concise.txt"))).toBe(false);
|
|
24
|
+
(0, vitest_1.expect)((0, fs_1.existsSync)((0, path_1.join)(replayDir, "logs.deterministic.txt"))).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.it)("writes both text files when only logs.ndjson is present", async () => {
|
|
27
|
+
writeNdjson([
|
|
28
|
+
{ type: "virtual-time-change", virtualTime: 100 },
|
|
29
|
+
{
|
|
30
|
+
type: "console",
|
|
31
|
+
source: "application",
|
|
32
|
+
stackTraceId: "abc",
|
|
33
|
+
message: "hello",
|
|
34
|
+
realTime: 5,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: "console",
|
|
38
|
+
source: "browser",
|
|
39
|
+
stackTraceId: "def",
|
|
40
|
+
message: "[non-deterministic] timestamp=123",
|
|
41
|
+
realTime: 10,
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
await (0, replay_log_text_files_1.ensureReplayLogTextFiles)(replayDir);
|
|
45
|
+
const concise = (0, fs_1.readFileSync)((0, path_1.join)(replayDir, "logs.concise.txt"), "utf8");
|
|
46
|
+
const deterministic = (0, fs_1.readFileSync)((0, path_1.join)(replayDir, "logs.deterministic.txt"), "utf8");
|
|
47
|
+
// Concise keeps both messages (no [non-deterministic] filter).
|
|
48
|
+
(0, vitest_1.expect)(concise).toContain("[application]");
|
|
49
|
+
(0, vitest_1.expect)(concise).toContain("hello");
|
|
50
|
+
(0, vitest_1.expect)(concise).toContain("[non-deterministic] timestamp=123");
|
|
51
|
+
// Deterministic strips real-time and skips [non-deterministic] lines.
|
|
52
|
+
(0, vitest_1.expect)(deterministic).toContain("hello");
|
|
53
|
+
(0, vitest_1.expect)(deterministic).not.toContain("[non-deterministic]");
|
|
54
|
+
(0, vitest_1.expect)(deterministic).not.toMatch(/real:/);
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)("is a no-op when both text files already exist (idempotent)", async () => {
|
|
57
|
+
writeNdjson([
|
|
58
|
+
{
|
|
59
|
+
type: "console",
|
|
60
|
+
source: "browser",
|
|
61
|
+
stackTraceId: "abc",
|
|
62
|
+
message: "fresh",
|
|
63
|
+
realTime: 1,
|
|
64
|
+
},
|
|
65
|
+
]);
|
|
66
|
+
const conciseSentinel = "previously-rendered-concise";
|
|
67
|
+
const deterministicSentinel = "previously-rendered-deterministic";
|
|
68
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(replayDir, "logs.concise.txt"), conciseSentinel);
|
|
69
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(replayDir, "logs.deterministic.txt"), deterministicSentinel);
|
|
70
|
+
await (0, replay_log_text_files_1.ensureReplayLogTextFiles)(replayDir);
|
|
71
|
+
(0, vitest_1.expect)((0, fs_1.readFileSync)((0, path_1.join)(replayDir, "logs.concise.txt"), "utf8")).toBe(conciseSentinel);
|
|
72
|
+
(0, vitest_1.expect)((0, fs_1.readFileSync)((0, path_1.join)(replayDir, "logs.deterministic.txt"), "utf8")).toBe(deterministicSentinel);
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)("regenerates both files when only one exists", async () => {
|
|
75
|
+
writeNdjson([
|
|
76
|
+
{
|
|
77
|
+
type: "console",
|
|
78
|
+
source: "browser",
|
|
79
|
+
stackTraceId: "abc",
|
|
80
|
+
message: "regenerate",
|
|
81
|
+
realTime: 1,
|
|
82
|
+
},
|
|
83
|
+
]);
|
|
84
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(replayDir, "logs.concise.txt"), "stale");
|
|
85
|
+
await (0, replay_log_text_files_1.ensureReplayLogTextFiles)(replayDir);
|
|
86
|
+
(0, vitest_1.expect)((0, fs_1.readFileSync)((0, path_1.join)(replayDir, "logs.concise.txt"), "utf8")).toContain("regenerate");
|
|
87
|
+
(0, vitest_1.expect)((0, fs_1.readFileSync)((0, path_1.join)(replayDir, "logs.deterministic.txt"), "utf8")).toContain("regenerate");
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=replay-log-text-files.spec.js.map
|
|
91
|
+
//# debugId=bc2ffa54-201f-57fe-8754-905957d1b76a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-log-text-files.spec.js","sources":["../../../src/file-downloads/__tests__/replay-log-text-files.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"bc2ffa54-201f-57fe-8754-905957d1b76a"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotently writes `logs.concise.txt` and `logs.deterministic.txt` next to
|
|
3
|
+
* `logs.ndjson` in the given replay directory.
|
|
4
|
+
*
|
|
5
|
+
* - No-op if `logs.ndjson` is missing (older replays may not have it).
|
|
6
|
+
* - No-op if both text files already exist.
|
|
7
|
+
* - Errors during transformation are logged but not thrown — the .txt files
|
|
8
|
+
* are convenience artifacts; missing them shouldn't fail the download.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ensureReplayLogTextFiles: (replayDir: string) => Promise<void>;
|
|
@@ -0,0 +1,89 @@
|
|
|
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]="552e945d-1437-5627-a7ab-66a6ecd434ba")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.ensureReplayLogTextFiles = void 0;
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const common_1 = require("@alwaysmeticulous/common");
|
|
9
|
+
const LOGS_NDJSON = "logs.ndjson";
|
|
10
|
+
const LOGS_CONCISE = "logs.concise.txt";
|
|
11
|
+
const LOGS_DETERMINISTIC = "logs.deterministic.txt";
|
|
12
|
+
const fileExists = async (path) => {
|
|
13
|
+
return (0, promises_1.access)(path)
|
|
14
|
+
.then(() => true)
|
|
15
|
+
.catch(() => false);
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Idempotently writes `logs.concise.txt` and `logs.deterministic.txt` next to
|
|
19
|
+
* `logs.ndjson` in the given replay directory.
|
|
20
|
+
*
|
|
21
|
+
* - No-op if `logs.ndjson` is missing (older replays may not have it).
|
|
22
|
+
* - No-op if both text files already exist.
|
|
23
|
+
* - Errors during transformation are logged but not thrown — the .txt files
|
|
24
|
+
* are convenience artifacts; missing them shouldn't fail the download.
|
|
25
|
+
*/
|
|
26
|
+
const ensureReplayLogTextFiles = async (replayDir) => {
|
|
27
|
+
const logger = (0, common_1.initLogger)();
|
|
28
|
+
const ndjsonPath = (0, path_1.join)(replayDir, LOGS_NDJSON);
|
|
29
|
+
if (!(await fileExists(ndjsonPath))) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const concisePath = (0, path_1.join)(replayDir, LOGS_CONCISE);
|
|
33
|
+
const deterministicPath = (0, path_1.join)(replayDir, LOGS_DETERMINISTIC);
|
|
34
|
+
if ((await fileExists(concisePath)) &&
|
|
35
|
+
(await fileExists(deterministicPath))) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const logs = (await (0, promises_1.readFile)(ndjsonPath, "utf8"))
|
|
40
|
+
.split("\n")
|
|
41
|
+
.filter((line) => line !== "")
|
|
42
|
+
.map((line) => JSON.parse(line));
|
|
43
|
+
await (0, promises_1.writeFile)(concisePath, formatConciseLogs(logs));
|
|
44
|
+
await (0, promises_1.writeFile)(deterministicPath, formatDeterministicLogs(logs));
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
logger.error(`Error generating concise/deterministic log files in ${replayDir}`, err);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
exports.ensureReplayLogTextFiles = ensureReplayLogTextFiles;
|
|
51
|
+
const formatConciseLogs = (logs) => {
|
|
52
|
+
let virtualTime = 0;
|
|
53
|
+
const lines = logs.map((log) => {
|
|
54
|
+
if (log.type === "virtual-time-change") {
|
|
55
|
+
virtualTime = log.virtualTime;
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
const commonPostfix = `${log.repetitionCount ? " [x" + log.repetitionCount + "]" : ""} ${log.message}`;
|
|
59
|
+
if (log.source === "application") {
|
|
60
|
+
return `[trace-id: ${log.stackTraceId}] [virtual: ${virtualTime}ms] [application]${commonPostfix}`;
|
|
61
|
+
}
|
|
62
|
+
return `[trace-id: ${log.stackTraceId}] [virtual: ${virtualTime}ms, real: ${log.realTime}ms]${commonPostfix}`;
|
|
63
|
+
});
|
|
64
|
+
return lines.join("\n");
|
|
65
|
+
};
|
|
66
|
+
const formatDeterministicLogs = (logs) => {
|
|
67
|
+
let virtualTime = 0;
|
|
68
|
+
const lines = logs.flatMap((log) => {
|
|
69
|
+
if (log.type === "virtual-time-change") {
|
|
70
|
+
virtualTime = log.virtualTime;
|
|
71
|
+
return [""];
|
|
72
|
+
}
|
|
73
|
+
if (log.message.includes("[non-deterministic]")) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
// Event ids are unstable so filter them out to minimize noise
|
|
77
|
+
const message = log.message.startsWith("Executing event")
|
|
78
|
+
? log.message.replace(/"id": ?\d+/g, '"id": "<non-deterministic>"')
|
|
79
|
+
: log.message;
|
|
80
|
+
const commonPostfix = `${log.repetitionCount ? " [x" + log.repetitionCount + "]" : ""} ${message}`;
|
|
81
|
+
if (log.source === "application") {
|
|
82
|
+
return [`[virtual: ${virtualTime}ms] [application]${commonPostfix}`];
|
|
83
|
+
}
|
|
84
|
+
return [`[virtual: ${virtualTime}ms]${commonPostfix}`];
|
|
85
|
+
});
|
|
86
|
+
return lines.join("\n");
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=replay-log-text-files.js.map
|
|
89
|
+
//# debugId=552e945d-1437-5627-a7ab-66a6ecd434ba
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-log-text-files.js","sources":["../../src/file-downloads/replay-log-text-files.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"552e945d-1437-5627-a7ab-66a6ecd434ba"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export { sanitizeFilename } from "./file-downloads/local-data.utils";
|
|
2
2
|
export { downloadAppContainerLogs } from "./file-downloads/app-container-logs";
|
|
3
|
-
export { getOrFetchReplay, getOrFetchReplayArchive, DownloadScope } from "./scripts/replays";
|
|
3
|
+
export { getOrFetchReplay, getOrFetchReplayArchive, DownloadScope, ReplayFileType, ReplayArchiveOptions, } from "./scripts/replays";
|
|
4
4
|
export { getOrFetchRecordedSession, getOrFetchRecordedSessionData, writeManifest, writeStructuredSessionData, type SessionsManifest, type WriteStructuredSessionOptions, } from "./file-downloads/sessions";
|
|
5
5
|
export { getOrFetchTestRunData, type TestRunDownloadScope, DOWNLOAD_SCOPES as TEST_RUN_DOWNLOAD_SCOPES, } from "./file-downloads/test-runs";
|
|
6
6
|
export { fetchAsset, checkIfAssetsOutdated } from "./scripts/replay-assets";
|
|
7
|
+
export { ensureReplayLogTextFiles } from "./file-downloads/replay-log-text-files";
|
|
7
8
|
export { downloadFile, downloadAndExtractFile, streamDownloadAndExtractTar, streamDownloadAndExtractTarGz, type StreamDownloadAndExtractTarOptions, streamDownloadAndInflateTar, type StreamDownloadAndInflateTarOptions, } from "./file-downloads/download-file";
|
|
8
9
|
export { getReplayDir } from "./scripts/replays";
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
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]="
|
|
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]="d33e44d5-607e-5d7a-9951-439743bd4917")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.getReplayDir = exports.streamDownloadAndInflateTar = exports.streamDownloadAndExtractTarGz = exports.streamDownloadAndExtractTar = exports.downloadAndExtractFile = exports.downloadFile = exports.checkIfAssetsOutdated = exports.fetchAsset = exports.TEST_RUN_DOWNLOAD_SCOPES = exports.getOrFetchTestRunData = exports.writeStructuredSessionData = exports.writeManifest = exports.getOrFetchRecordedSessionData = exports.getOrFetchRecordedSession = exports.getOrFetchReplayArchive = exports.getOrFetchReplay = exports.downloadAppContainerLogs = exports.sanitizeFilename = void 0;
|
|
5
|
+
exports.getReplayDir = exports.streamDownloadAndInflateTar = exports.streamDownloadAndExtractTarGz = exports.streamDownloadAndExtractTar = exports.downloadAndExtractFile = exports.downloadFile = exports.ensureReplayLogTextFiles = exports.checkIfAssetsOutdated = exports.fetchAsset = exports.TEST_RUN_DOWNLOAD_SCOPES = exports.getOrFetchTestRunData = exports.writeStructuredSessionData = exports.writeManifest = exports.getOrFetchRecordedSessionData = exports.getOrFetchRecordedSession = exports.getOrFetchReplayArchive = exports.getOrFetchReplay = exports.downloadAppContainerLogs = exports.sanitizeFilename = void 0;
|
|
6
6
|
var local_data_utils_1 = require("./file-downloads/local-data.utils");
|
|
7
7
|
Object.defineProperty(exports, "sanitizeFilename", { enumerable: true, get: function () { return local_data_utils_1.sanitizeFilename; } });
|
|
8
8
|
var app_container_logs_1 = require("./file-downloads/app-container-logs");
|
|
@@ -21,6 +21,8 @@ Object.defineProperty(exports, "TEST_RUN_DOWNLOAD_SCOPES", { enumerable: true, g
|
|
|
21
21
|
var replay_assets_1 = require("./scripts/replay-assets");
|
|
22
22
|
Object.defineProperty(exports, "fetchAsset", { enumerable: true, get: function () { return replay_assets_1.fetchAsset; } });
|
|
23
23
|
Object.defineProperty(exports, "checkIfAssetsOutdated", { enumerable: true, get: function () { return replay_assets_1.checkIfAssetsOutdated; } });
|
|
24
|
+
var replay_log_text_files_1 = require("./file-downloads/replay-log-text-files");
|
|
25
|
+
Object.defineProperty(exports, "ensureReplayLogTextFiles", { enumerable: true, get: function () { return replay_log_text_files_1.ensureReplayLogTextFiles; } });
|
|
24
26
|
var download_file_1 = require("./file-downloads/download-file");
|
|
25
27
|
Object.defineProperty(exports, "downloadFile", { enumerable: true, get: function () { return download_file_1.downloadFile; } });
|
|
26
28
|
Object.defineProperty(exports, "downloadAndExtractFile", { enumerable: true, get: function () { return download_file_1.downloadAndExtractFile; } });
|
|
@@ -30,4 +32,4 @@ Object.defineProperty(exports, "streamDownloadAndInflateTar", { enumerable: true
|
|
|
30
32
|
var replays_2 = require("./scripts/replays");
|
|
31
33
|
Object.defineProperty(exports, "getReplayDir", { enumerable: true, get: function () { return replays_2.getReplayDir; } });
|
|
32
34
|
//# sourceMappingURL=index.js.map
|
|
33
|
-
//# debugId=
|
|
35
|
+
//# debugId=d33e44d5-607e-5d7a-9951-439743bd4917
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,sEAAqE;AAA5D,oHAAA,gBAAgB,OAAA;AACzB,0EAA+E;AAAtE,8HAAA,wBAAwB,OAAA;AACjC,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,sEAAqE;AAA5D,oHAAA,gBAAgB,OAAA;AACzB,0EAA+E;AAAtE,8HAAA,wBAAwB,OAAA;AACjC,6CAM2B;AALzB,2GAAA,gBAAgB,OAAA;AAChB,kHAAA,uBAAuB,OAAA;AAKzB,sDAOmC;AANjC,qHAAA,yBAAyB,OAAA;AACzB,yHAAA,6BAA6B,OAAA;AAC7B,yGAAA,aAAa,OAAA;AACb,sHAAA,0BAA0B,OAAA;AAI5B,wDAIoC;AAHlC,kHAAA,qBAAqB,OAAA;AAErB,qHAAA,eAAe,OAA4B;AAE7C,yDAA4E;AAAnE,2GAAA,UAAU,OAAA;AAAE,sHAAA,qBAAqB,OAAA;AAC1C,gFAAkF;AAAzE,iIAAA,wBAAwB,OAAA;AACjC,gEAQwC;AAPtC,6GAAA,YAAY,OAAA;AACZ,uHAAA,sBAAsB,OAAA;AACtB,4HAAA,2BAA2B,OAAA;AAC3B,8HAAA,6BAA6B,OAAA;AAE7B,4HAAA,2BAA2B,OAAA;AAG7B,6CAAiD;AAAxC,uGAAA,YAAY,OAAA","debugId":"d33e44d5-607e-5d7a-9951-439743bd4917"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
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]="dfdd4cfe-a90d-539e-bc61-cc545c2c0917")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const client_1 = require("@alwaysmeticulous/client");
|
|
10
|
+
const common_1 = require("@alwaysmeticulous/common");
|
|
11
|
+
const vitest_1 = require("vitest");
|
|
12
|
+
const download_file_1 = require("../../file-downloads/download-file");
|
|
13
|
+
const replays_1 = require("../replays");
|
|
14
|
+
// `vi.mock` calls are auto-hoisted above the imports above; the order matches
|
|
15
|
+
// the project's `import/order` rule.
|
|
16
|
+
vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
|
|
17
|
+
getReplay: vitest_1.vi.fn(async () => ({ version: "v3" })),
|
|
18
|
+
getReplayV3DownloadUrls: vitest_1.vi.fn(async () => buildDownloadUrls()),
|
|
19
|
+
}));
|
|
20
|
+
vitest_1.vi.mock("../../file-downloads/download-file", () => ({
|
|
21
|
+
downloadFile: vitest_1.vi.fn(async () => undefined),
|
|
22
|
+
downloadAndExtractFile: vitest_1.vi.fn(async () => undefined),
|
|
23
|
+
}));
|
|
24
|
+
const REPLAY_ID = "replay-123";
|
|
25
|
+
// Minimal v3 download URL fixture covering the file types this PR cares about.
|
|
26
|
+
const buildDownloadUrls = () => ({
|
|
27
|
+
// Plain `rest` keys (downloaded via downloadAndExtractFile into <key>).
|
|
28
|
+
timeline: { signedUrl: "https://example/timeline", filePath: "timeline" },
|
|
29
|
+
metadata: { signedUrl: "https://example/metadata", filePath: "metadata" },
|
|
30
|
+
playbackData: {
|
|
31
|
+
signedUrl: "https://example/playbackData",
|
|
32
|
+
filePath: "playbackData",
|
|
33
|
+
},
|
|
34
|
+
rawCoverage: {
|
|
35
|
+
signedUrl: "https://example/rawCoverage",
|
|
36
|
+
filePath: "rawCoverage",
|
|
37
|
+
},
|
|
38
|
+
// Special-cased keys (each handled in its own branch).
|
|
39
|
+
screenshots: {},
|
|
40
|
+
diffs: {},
|
|
41
|
+
snapshottedAssets: null,
|
|
42
|
+
rawPerScreenshotCssCoverage: null,
|
|
43
|
+
rawPerScreenshotJsCoverage: null,
|
|
44
|
+
mappedPerScreenshotJsCoverage: null,
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.describe)("getOrFetchReplayArchive — excludeFileTypes", () => {
|
|
47
|
+
let dataDir;
|
|
48
|
+
(0, vitest_1.beforeEach)(() => {
|
|
49
|
+
dataDir = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), "met-replays-spec-"));
|
|
50
|
+
vitest_1.vi.clearAllMocks();
|
|
51
|
+
client_1.getReplay.mockResolvedValue({ version: "v3" });
|
|
52
|
+
client_1.getReplayV3DownloadUrls.mockResolvedValue(buildDownloadUrls());
|
|
53
|
+
download_file_1.downloadFile.mockResolvedValue(undefined);
|
|
54
|
+
download_file_1.downloadAndExtractFile.mockResolvedValue(undefined);
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.afterEach)(() => {
|
|
57
|
+
(0, fs_1.rmSync)(dataDir, { recursive: true, force: true });
|
|
58
|
+
});
|
|
59
|
+
const replayDir = () => (0, path_1.join)(dataDir, "replays", REPLAY_ID);
|
|
60
|
+
const markerPath = () => (0, path_1.join)(replayDir(), "previously-downloaded.txt");
|
|
61
|
+
const run = (excludeFileTypes) => (0, common_1.runWithLocalDataDir)(dataDir, () => (0, replays_1.getOrFetchReplayArchive)({}, REPLAY_ID, "everything", false, excludeFileTypes ? { excludeFileTypes } : {}));
|
|
62
|
+
(0, vitest_1.it)("writes the cache marker when no exclusions are set", async () => {
|
|
63
|
+
await run();
|
|
64
|
+
(0, vitest_1.expect)((0, fs_1.existsSync)(markerPath())).toBe(true);
|
|
65
|
+
(0, vitest_1.expect)((0, fs_1.readFileSync)(markerPath(), "utf8")).toBe("everything");
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)("does NOT write the cache marker when exclusions are set", async () => {
|
|
68
|
+
await run(new Set(["playbackData", "rawCoverage"]));
|
|
69
|
+
(0, vitest_1.expect)((0, fs_1.existsSync)(markerPath())).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.it)("skips downloading excluded file types but still downloads the rest", async () => {
|
|
72
|
+
await run(new Set(["playbackData", "rawCoverage"]));
|
|
73
|
+
const downloadedKeys = download_file_1.downloadAndExtractFile.mock.calls.map((call) => call[0]);
|
|
74
|
+
(0, vitest_1.expect)(downloadedKeys).toEqual(vitest_1.expect.arrayContaining([
|
|
75
|
+
"https://example/timeline",
|
|
76
|
+
"https://example/metadata",
|
|
77
|
+
]));
|
|
78
|
+
(0, vitest_1.expect)(downloadedKeys).not.toContain("https://example/playbackData");
|
|
79
|
+
(0, vitest_1.expect)(downloadedKeys).not.toContain("https://example/rawCoverage");
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)("hits the cache short-circuit when the marker says 'everything' and no exclusions are set", async () => {
|
|
82
|
+
// Pre-seed the marker as if a prior unfiltered run completed.
|
|
83
|
+
await (0, promises_1.mkdir)(replayDir(), { recursive: true });
|
|
84
|
+
await (0, promises_1.writeFile)(markerPath(), "everything", "utf-8");
|
|
85
|
+
await run();
|
|
86
|
+
(0, vitest_1.expect)(client_1.getReplay).not.toHaveBeenCalled();
|
|
87
|
+
(0, vitest_1.expect)(client_1.getReplayV3DownloadUrls).not.toHaveBeenCalled();
|
|
88
|
+
(0, vitest_1.expect)(download_file_1.downloadAndExtractFile).not.toHaveBeenCalled();
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)("bypasses the cache short-circuit when exclusions are set, even if the marker says 'everything'", async () => {
|
|
91
|
+
await (0, promises_1.mkdir)(replayDir(), { recursive: true });
|
|
92
|
+
await (0, promises_1.writeFile)(markerPath(), "everything", "utf-8");
|
|
93
|
+
await run(new Set(["playbackData"]));
|
|
94
|
+
// Short-circuit was bypassed: we re-fetched URLs and re-downloaded the
|
|
95
|
+
// non-excluded files.
|
|
96
|
+
(0, vitest_1.expect)(client_1.getReplayV3DownloadUrls).toHaveBeenCalledTimes(1);
|
|
97
|
+
const downloadedKeys = download_file_1.downloadAndExtractFile.mock.calls.map((call) => call[0]);
|
|
98
|
+
(0, vitest_1.expect)(downloadedKeys).toContain("https://example/timeline");
|
|
99
|
+
(0, vitest_1.expect)(downloadedKeys).not.toContain("https://example/playbackData");
|
|
100
|
+
// Marker is preserved (not overwritten) — we read but didn't rewrite it.
|
|
101
|
+
(0, vitest_1.expect)((0, fs_1.readFileSync)(markerPath(), "utf8")).toBe("everything");
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=replays.spec.js.map
|
|
105
|
+
//# debugId=dfdd4cfe-a90d-539e-bc61-cc545c2c0917
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replays.spec.js","sources":["../../../src/scripts/__tests__/replays.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"dfdd4cfe-a90d-539e-bc61-cc545c2c0917"}
|
|
@@ -12,7 +12,28 @@ export declare const getOrFetchReplay: (client: MeticulousClient, replayId: stri
|
|
|
12
12
|
*/
|
|
13
13
|
declare const DOWNLOAD_SCOPES: readonly ["everything", "screenshots-only", "timeline-only", "post-test-run-processing-files-only"];
|
|
14
14
|
export type DownloadScope = (typeof DOWNLOAD_SCOPES)[number];
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Known file-type keys returned by the v3 download-urls endpoint. The server
|
|
17
|
+
* is the source of truth and may include additional keys; this union covers
|
|
18
|
+
* the ones the SDK references explicitly plus the common excludable
|
|
19
|
+
* artifacts. Used to give callers compile-time safety on `excludeFileTypes`
|
|
20
|
+
* so a typo (e.g. `playbackdata`) is caught at the type level rather than
|
|
21
|
+
* silently failing at runtime.
|
|
22
|
+
*/
|
|
23
|
+
export type ReplayFileType = "screenshots" | "diffs" | "snapshottedAssets" | "rawCoverage" | "rawPerScreenshotCssCoverage" | "rawPerScreenshotJsCoverage" | "mappedCoverage" | "mappedPerScreenshotJsCoverage" | "playbackData" | "timeline" | "metadata" | "accuracy" | "stackTraces" | "cookies" | "launchBrowserAndReplayParams" | "logs";
|
|
24
|
+
export interface ReplayArchiveOptions {
|
|
25
|
+
/**
|
|
26
|
+
* File-type keys to skip during download (e.g. `playbackData`, `rawCoverage`,
|
|
27
|
+
* `diffs`). Useful when the caller knows it will not need certain artifacts
|
|
28
|
+
* and wants to avoid the bandwidth/time cost of fetching them.
|
|
29
|
+
*
|
|
30
|
+
* When set, the cross-tool replay cache is bypassed: the cache short-circuit
|
|
31
|
+
* is skipped and the `previously-downloaded.txt` marker is not written, so
|
|
32
|
+
* subsequent unfiltered callers will re-download into the cache.
|
|
33
|
+
*/
|
|
34
|
+
excludeFileTypes?: ReadonlySet<ReplayFileType>;
|
|
35
|
+
}
|
|
36
|
+
export declare const getOrFetchReplayArchive: (client: MeticulousClient, replayId: string, downloadScope?: DownloadScope, formatJsonFiles?: boolean, options?: ReplayArchiveOptions) => Promise<{
|
|
16
37
|
fileName: string;
|
|
17
38
|
}>;
|
|
18
39
|
export declare const getReplayDir: (replayId: string) => string;
|
package/dist/scripts/replays.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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]="
|
|
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]="4d9da59a-0607-59a2-b98c-3d2bd95d2b99")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -61,8 +61,10 @@ const shouldDownloadFile = (fileType, downloadScope) => {
|
|
|
61
61
|
return DOWNLOAD_SCOPE_TO_FILES_TO_DOWNLOAD[downloadScope].test(fileType);
|
|
62
62
|
};
|
|
63
63
|
const REPLAY_PREVIOUSLY_DOWNLOADED_FILE_NAME = "previously-downloaded.txt";
|
|
64
|
-
const getOrFetchReplayArchive = async (client, replayId, downloadScope = "everything", formatJsonFiles = false) => {
|
|
64
|
+
const getOrFetchReplayArchive = async (client, replayId, downloadScope = "everything", formatJsonFiles = false, options = {}) => {
|
|
65
65
|
const logger = (0, common_1.initLogger)();
|
|
66
|
+
const { excludeFileTypes } = options;
|
|
67
|
+
const hasExcludes = excludeFileTypes != null && excludeFileTypes.size > 0;
|
|
66
68
|
const replayDir = (0, exports.getReplayDir)(replayId);
|
|
67
69
|
await (0, promises_1.mkdir)(replayDir, { recursive: true });
|
|
68
70
|
const releaseLock = await (0, local_data_utils_1.waitToAcquireLockOnDirectory)(replayDir);
|
|
@@ -72,17 +74,21 @@ const getOrFetchReplayArchive = async (client, replayId, downloadScope = "everyt
|
|
|
72
74
|
// to avoid downloading the same thing twice. This is particularly important because
|
|
73
75
|
// a concurrent process might be using the previously downloaded data, so we don't
|
|
74
76
|
// want to overwrite it while it's being read.
|
|
77
|
+
//
|
|
78
|
+
// When `excludeFileTypes` is set we skip the cache short-circuit so that callers
|
|
79
|
+
// always get a fresh fetch with the requested exclusions applied.
|
|
75
80
|
let previouslyDownloadedScope = undefined;
|
|
76
81
|
if (await (0, local_data_utils_1.fileExists)(previouslyDownloadedFile)) {
|
|
77
82
|
const fileContents = (await (0, promises_1.readFile)(previouslyDownloadedFile, "utf-8")).trim();
|
|
78
83
|
if (DOWNLOAD_SCOPES.includes(fileContents)) {
|
|
79
84
|
previouslyDownloadedScope = fileContents;
|
|
80
|
-
if (
|
|
81
|
-
previouslyDownloadedScope ===
|
|
85
|
+
if (!hasExcludes &&
|
|
86
|
+
(previouslyDownloadedScope === downloadScope ||
|
|
87
|
+
previouslyDownloadedScope === "everything")) {
|
|
82
88
|
logger.debug(`Replay archive already downloaded at ${replayDir}`);
|
|
83
89
|
return { fileName: replayDir };
|
|
84
90
|
}
|
|
85
|
-
else {
|
|
91
|
+
else if (!hasExcludes) {
|
|
86
92
|
// Instead of trying to reason about how to combine the two scopes, let's bump
|
|
87
93
|
// to downloading everything which is guaranteed to be a superset.
|
|
88
94
|
logger.debug(`Replay archive is partially downloaded at ${replayDir}, will now download everything`);
|
|
@@ -95,12 +101,20 @@ const getOrFetchReplayArchive = async (client, replayId, downloadScope = "everyt
|
|
|
95
101
|
}
|
|
96
102
|
const replay = await (0, client_1.getReplay)(client, replayId);
|
|
97
103
|
if (replay.version === "v3") {
|
|
98
|
-
await downloadReplayV3Files(client, replayId, replayDir, downloadScope, formatJsonFiles, previouslyDownloadedScope
|
|
104
|
+
await downloadReplayV3Files(client, replayId, replayDir, downloadScope, formatJsonFiles, previouslyDownloadedScope,
|
|
105
|
+
// Widen to `ReadonlySet<string>` at the boundary: `ReplayFileType` is
|
|
106
|
+
// for caller-side typo safety, but internally we check against
|
|
107
|
+
// arbitrary keys returned by the server.
|
|
108
|
+
excludeFileTypes);
|
|
99
109
|
}
|
|
100
110
|
else {
|
|
101
111
|
throw new Error(`Error: Unknown replay version "${replay.version}". This may be an invalid replay`);
|
|
102
112
|
}
|
|
103
|
-
|
|
113
|
+
// Don't write the cache marker when excludes are set; the cache directory
|
|
114
|
+
// would otherwise look complete to future unfiltered callers.
|
|
115
|
+
if (!hasExcludes) {
|
|
116
|
+
await (0, promises_1.writeFile)(previouslyDownloadedFile, downloadScope, "utf-8");
|
|
117
|
+
}
|
|
104
118
|
logger.debug(`Extracted replay archive in ${replayDir}`);
|
|
105
119
|
return { fileName: replayDir };
|
|
106
120
|
}
|
|
@@ -109,14 +123,16 @@ const getOrFetchReplayArchive = async (client, replayId, downloadScope = "everyt
|
|
|
109
123
|
}
|
|
110
124
|
};
|
|
111
125
|
exports.getOrFetchReplayArchive = getOrFetchReplayArchive;
|
|
112
|
-
const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope, formatJsonFiles, previouslyDownloadedScope) => {
|
|
126
|
+
const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope, formatJsonFiles, previouslyDownloadedScope, excludeFileTypes) => {
|
|
113
127
|
const downloadUrls = await (0, client_1.getReplayV3DownloadUrls)(client, replayId);
|
|
114
128
|
if (!downloadUrls) {
|
|
115
129
|
throw new Error("Error: Could not retrieve replay download URLs. This may be an invalid replay");
|
|
116
130
|
}
|
|
131
|
+
const includes = (fileType) => shouldDownloadFile(fileType, downloadScope) &&
|
|
132
|
+
!(excludeFileTypes?.has(fileType) ?? false);
|
|
117
133
|
const { screenshots, diffs, snapshottedAssets, rawPerScreenshotCssCoverage, rawPerScreenshotJsCoverage, mappedPerScreenshotJsCoverage, ...rest } = downloadUrls;
|
|
118
134
|
const filePromises = Object.entries(rest)
|
|
119
|
-
.filter(([fileType]) =>
|
|
135
|
+
.filter(([fileType]) => includes(fileType))
|
|
120
136
|
.map(([fileType, data]) => {
|
|
121
137
|
const filePath = (0, path_1.join)(replayDir, fileType);
|
|
122
138
|
return async () => {
|
|
@@ -128,10 +144,15 @@ const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope,
|
|
|
128
144
|
}
|
|
129
145
|
};
|
|
130
146
|
});
|
|
131
|
-
if (
|
|
147
|
+
if (includes("screenshots")) {
|
|
132
148
|
await (0, promises_1.mkdir)((0, path_1.join)(replayDir, "screenshots"), { recursive: true });
|
|
133
149
|
}
|
|
134
|
-
|
|
150
|
+
// If `previouslyDownloadedScope === "screenshots-only"` we trust that the
|
|
151
|
+
// screenshots are already on disk from a prior unfiltered download (the
|
|
152
|
+
// marker is only ever written after an unfiltered run) and skip re-download.
|
|
153
|
+
// Safe even when `excludeFileTypes` is set: we're leaving existing files in
|
|
154
|
+
// place, not re-using stale data.
|
|
155
|
+
const screenshotPromises = !includes("screenshots") ||
|
|
135
156
|
previouslyDownloadedScope === "screenshots-only"
|
|
136
157
|
? []
|
|
137
158
|
: Object.values(screenshots).flatMap((data) => {
|
|
@@ -149,8 +170,10 @@ const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope,
|
|
|
149
170
|
];
|
|
150
171
|
});
|
|
151
172
|
const diffsFolder = (0, path_1.join)(replayDir, "diffs");
|
|
152
|
-
|
|
153
|
-
|
|
173
|
+
if (includes("diffs")) {
|
|
174
|
+
await Promise.all(Object.keys(diffs ?? {}).map((baseReplayId) => (0, promises_1.mkdir)((0, path_1.join)(diffsFolder, baseReplayId), { recursive: true })));
|
|
175
|
+
}
|
|
176
|
+
const diffsPromises = includes("diffs")
|
|
154
177
|
? Object.values(diffs ?? {}).flatMap((diffsForBase) => {
|
|
155
178
|
return Object.values(diffsForBase).flatMap((urls) => {
|
|
156
179
|
return [
|
|
@@ -165,24 +188,22 @@ const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope,
|
|
|
165
188
|
})
|
|
166
189
|
: [];
|
|
167
190
|
const archivePromises = [
|
|
168
|
-
...(
|
|
191
|
+
...(includes("snapshottedAssets")
|
|
169
192
|
? [
|
|
170
193
|
() => downloadAndUnzipIntoDirectory(snapshottedAssets, replayDir, "snapshotted-assets"),
|
|
171
194
|
]
|
|
172
195
|
: []),
|
|
173
|
-
...(
|
|
174
|
-
rawPerScreenshotCssCoverage
|
|
196
|
+
...(includes("rawPerScreenshotCssCoverage") && rawPerScreenshotCssCoverage
|
|
175
197
|
? [
|
|
176
198
|
() => downloadAndUnzipIntoDirectory(rawPerScreenshotCssCoverage, replayDir, "raw-per-screenshot-css-coverage"),
|
|
177
199
|
]
|
|
178
200
|
: []),
|
|
179
|
-
...(
|
|
180
|
-
rawPerScreenshotJsCoverage
|
|
201
|
+
...(includes("rawPerScreenshotJsCoverage") && rawPerScreenshotJsCoverage
|
|
181
202
|
? [
|
|
182
203
|
() => downloadAndUnzipIntoDirectory(rawPerScreenshotJsCoverage, replayDir, "raw-per-screenshot-js-coverage"),
|
|
183
204
|
]
|
|
184
205
|
: []),
|
|
185
|
-
...(
|
|
206
|
+
...(includes("mappedPerScreenshotJsCoverage") &&
|
|
186
207
|
mappedPerScreenshotJsCoverage
|
|
187
208
|
? [
|
|
188
209
|
() => downloadAndUnzipIntoDirectory(mappedPerScreenshotJsCoverage, replayDir, "mapped-per-screenshot-js-coverage"),
|
|
@@ -200,4 +221,4 @@ const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope,
|
|
|
200
221
|
const getReplayDir = (replayId) => (0, path_1.join)((0, common_1.getMeticulousLocalDataDir)(), "replays", replayId);
|
|
201
222
|
exports.getReplayDir = getReplayDir;
|
|
202
223
|
//# sourceMappingURL=replays.js.map
|
|
203
|
-
//# debugId=
|
|
224
|
+
//# debugId=4d9da59a-0607-59a2-b98c-3d2bd95d2b99
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replays.js","sources":["../../src/scripts/replays.ts"],"sourceRoot":"","names":[],"mappings":";;;;;;;;AAAA,0CAAyD;AACzD,+BAAqC;AACrC,qDAIkC;AAClC,qDAGkC;AAClC,sDAA6B;AAC7B,mEAGyC;AACzC,yEAI4C;AAE5C,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,MAAM,6BAA6B,GAAG,KAAK,EACzC,WAAuE,EACvE,SAAiB,EACjB,aAAqB,EACN,EAAE;IACjB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACjD,MAAM,IAAA,gBAAK,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAA,sCAAsB,EAC1B,WAAW,CAAC,SAAS,EACrB,IAAA,WAAI,EAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,EACrC,SAAS,CACV,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,gBAAgB,GAAG,KAAK,EACnC,MAAwB,EACxB,QAAgB,EACe,EAAE;IACjC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAE5B,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,IAAA,oBAAY,EAAC,QAAQ,CAAC,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,MAAM,IAAA,wCAAqB,EAAC;QACzC,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,QAAQ;QACzB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAS,EAAC,MAAM,EAAE,QAAQ,CAAC;KAChD,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CACV,6CAA6C,QAAQ,8BAA8B,CACpF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC,CAAC;AAtBW,QAAA,gBAAgB,oBAsB3B;AAEF;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG;IACtB,YAAY;IACZ,kBAAkB;IAClB,eAAe;IACf,qCAAqC;CAC7B,CAAC;AAIX,MAAM,mCAAmC,GAAkC;IACzE,UAAU,EAAE,IAAI;IAChB,kBAAkB,EAAE,cAAc;IAClC,eAAe,EAAE,WAAW;IAC5B,qCAAqC,EACnC,0DAA0D;CAC7D,CAAC;AAEF,MAAM,kBAAkB,GAAG,CACzB,QAAgB,EAChB,aAA4B,EACnB,EAAE;IACX,OAAO,mCAAmC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,sCAAsC,GAAG,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"replays.js","sources":["../../src/scripts/replays.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"4d9da59a-0607-59a2-b98c-3d2bd95d2b99"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysmeticulous/downloading-helpers",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.282.0",
|
|
4
4
|
"description": "Helper utilities for downloading files & scripts required to execute replays",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -8,21 +8,7 @@
|
|
|
8
8
|
"files": [
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
|
-
"scripts": {
|
|
12
|
-
"clean": "rimraf dist tsconfig.tsbuildinfo",
|
|
13
|
-
"build": "tsc --build tsconfig.json",
|
|
14
|
-
"dev": "tsc --build tsconfig.json --watch",
|
|
15
|
-
"format": "prettier --write src",
|
|
16
|
-
"lint": "eslint \"src/**/*.{js,ts,tsx}\" --cache",
|
|
17
|
-
"lint:commit": "eslint --cache $(git diff --relative --name-only --diff-filter=ACMRTUXB master | grep -E \"(.js$|.ts$|.tsx$)\")",
|
|
18
|
-
"lint:fix": "eslint \"src/**/*.{js,ts,tsx}\" --cache --fix",
|
|
19
|
-
"depcheck": "depcheck --ignore-patterns=dist",
|
|
20
|
-
"test": "vitest run --passWithNoTests"
|
|
21
|
-
},
|
|
22
11
|
"dependencies": {
|
|
23
|
-
"@alwaysmeticulous/api": "2.280.0",
|
|
24
|
-
"@alwaysmeticulous/client": "2.280.0",
|
|
25
|
-
"@alwaysmeticulous/common": "2.280.0",
|
|
26
12
|
"axios": "^1.7.9",
|
|
27
13
|
"axios-retry": "^4.5.0",
|
|
28
14
|
"cli-progress": "^3.12.0",
|
|
@@ -31,13 +17,16 @@
|
|
|
31
17
|
"luxon": "^3.2.1",
|
|
32
18
|
"p-limit": "^3.1.0",
|
|
33
19
|
"proper-lockfile": "^4.1.2",
|
|
34
|
-
"tar": "^7.5.8"
|
|
20
|
+
"tar": "^7.5.8",
|
|
21
|
+
"@alwaysmeticulous/api": "2.280.0",
|
|
22
|
+
"@alwaysmeticulous/client": "2.281.0",
|
|
23
|
+
"@alwaysmeticulous/common": "2.280.0"
|
|
35
24
|
},
|
|
36
25
|
"devDependencies": {
|
|
37
26
|
"@types/cli-progress": "^3.11.6",
|
|
38
27
|
"@types/luxon": "^3.2.0",
|
|
39
28
|
"@types/proper-lockfile": "^4.1.2",
|
|
40
|
-
"vitest": "
|
|
29
|
+
"vitest": "^4.1.4"
|
|
41
30
|
},
|
|
42
31
|
"author": {
|
|
43
32
|
"name": "The Meticulous Team",
|
|
@@ -56,5 +45,15 @@
|
|
|
56
45
|
"bugs": {
|
|
57
46
|
"url": "https://github.com/alwaysmeticulous/meticulous-sdk/issues"
|
|
58
47
|
},
|
|
59
|
-
"
|
|
60
|
-
|
|
48
|
+
"scripts": {
|
|
49
|
+
"clean": "rimraf dist tsconfig.tsbuildinfo",
|
|
50
|
+
"build": "tsc --build tsconfig.json",
|
|
51
|
+
"dev": "tsc --build tsconfig.json --watch",
|
|
52
|
+
"format": "prettier --write src",
|
|
53
|
+
"lint": "eslint \"src/**/*.{js,ts,tsx}\" --cache",
|
|
54
|
+
"lint:commit": "eslint --cache $(git diff --relative --name-only --diff-filter=ACMRTUXB master | grep -E \"(.js$|.ts$|.tsx$)\")",
|
|
55
|
+
"lint:fix": "eslint \"src/**/*.{js,ts,tsx}\" --cache --fix",
|
|
56
|
+
"depcheck": "depcheck --ignore-patterns=dist",
|
|
57
|
+
"test": "vitest run --passWithNoTests"
|
|
58
|
+
}
|
|
59
|
+
}
|