@empiricalrun/test-gen 0.74.2 → 0.76.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/CHANGELOG.md +37 -0
- package/dist/agent/base/index.d.ts +43 -0
- package/dist/agent/base/index.d.ts.map +1 -0
- package/dist/agent/base/index.js +106 -0
- package/dist/agent/chat/agent-loop.d.ts +7 -7
- package/dist/agent/chat/agent-loop.d.ts.map +1 -1
- package/dist/agent/chat/agent-loop.js +5 -18
- package/dist/agent/chat/exports.d.ts +6 -4
- package/dist/agent/chat/exports.d.ts.map +1 -1
- package/dist/agent/chat/exports.js +9 -8
- package/dist/agent/chat/index.d.ts +6 -10
- package/dist/agent/chat/index.d.ts.map +1 -1
- package/dist/agent/chat/index.js +130 -200
- package/dist/agent/chat/prompt/index.d.ts +5 -4
- package/dist/agent/chat/prompt/index.d.ts.map +1 -1
- package/dist/agent/chat/prompt/index.js +79 -68
- package/dist/agent/chat/state.d.ts +3 -5
- package/dist/agent/chat/state.d.ts.map +1 -1
- package/dist/agent/chat/state.js +2 -10
- package/dist/agent/chat/utils.d.ts +2 -4
- package/dist/agent/chat/utils.d.ts.map +1 -1
- package/dist/agent/chat/utils.js +2 -16
- package/dist/agent/cli.d.ts +11 -0
- package/dist/agent/cli.d.ts.map +1 -0
- package/dist/agent/cli.js +209 -0
- package/dist/agent/code-review/index.d.ts +7 -0
- package/dist/agent/code-review/index.d.ts.map +1 -0
- package/dist/agent/code-review/index.js +65 -0
- package/dist/agent/code-review/prompt.d.ts +1 -1
- package/dist/agent/code-review/prompt.d.ts.map +1 -1
- package/dist/agent/code-review/prompt.js +52 -16
- package/dist/agent/index.d.ts +10 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +19 -0
- package/dist/agent/triage/index.d.ts +7 -0
- package/dist/agent/triage/index.d.ts.map +1 -0
- package/dist/agent/triage/index.js +102 -0
- package/dist/agent/video-analysis/index.d.ts +7 -0
- package/dist/agent/video-analysis/index.d.ts.map +1 -0
- package/dist/agent/video-analysis/index.js +35 -0
- package/dist/bin/index.js +6 -6
- package/dist/file-info/adapters/github/index.d.ts +2 -2
- package/dist/file-info/adapters/github/index.d.ts.map +1 -1
- package/dist/file-info/adapters/github/index.js +4 -4
- package/dist/file-info/adapters/github/reader.d.ts +5 -10
- package/dist/file-info/adapters/github/reader.d.ts.map +1 -1
- package/dist/file-info/adapters/github/reader.js +168 -138
- package/dist/tools/create-pull-request/index.d.ts.map +1 -0
- package/dist/tools/{definitions/commit-and-create-pr.js → create-pull-request/index.js} +30 -1
- package/dist/tools/create-pull-request/utils.d.ts +21 -0
- package/dist/tools/create-pull-request/utils.d.ts.map +1 -0
- package/dist/tools/create-pull-request/utils.js +83 -0
- package/dist/tools/definitions/extract-frames-from-video.d.ts +39 -0
- package/dist/tools/definitions/extract-frames-from-video.d.ts.map +1 -0
- package/dist/tools/definitions/extract-frames-from-video.js +60 -0
- package/dist/tools/definitions/fetch-video-analysis.d.ts +28 -0
- package/dist/tools/definitions/fetch-video-analysis.d.ts.map +1 -1
- package/dist/tools/definitions/fetch-video-analysis.js +39 -4
- package/dist/tools/definitions/rename-file.d.ts +3 -0
- package/dist/tools/definitions/rename-file.d.ts.map +1 -0
- package/dist/tools/definitions/rename-file.js +23 -0
- package/dist/tools/delete-file/index.d.ts.map +1 -1
- package/dist/tools/delete-file/index.js +13 -1
- package/dist/tools/executor/index.d.ts +1 -1
- package/dist/tools/executor/index.d.ts.map +1 -1
- package/dist/tools/executor/index.js +22 -7
- package/dist/tools/executor/utils/checkpoint.d.ts +1 -3
- package/dist/tools/executor/utils/checkpoint.d.ts.map +1 -1
- package/dist/tools/executor/utils/checkpoint.js +17 -17
- package/dist/tools/executor/utils/git.d.ts +9 -1
- package/dist/tools/executor/utils/git.d.ts.map +1 -1
- package/dist/tools/executor/utils/git.js +72 -2
- package/dist/tools/extract-frames-from-video/index.d.ts +7 -0
- package/dist/tools/extract-frames-from-video/index.d.ts.map +1 -0
- package/dist/tools/extract-frames-from-video/index.js +145 -0
- package/dist/tools/{fetch-image → fetch-file}/index.d.ts +2 -2
- package/dist/tools/fetch-file/index.d.ts.map +1 -0
- package/dist/tools/fetch-file/index.js +97 -0
- package/dist/tools/fetch-session-diff/index.d.ts +3 -0
- package/dist/tools/fetch-session-diff/index.d.ts.map +1 -0
- package/dist/tools/fetch-session-diff/index.js +46 -0
- package/dist/tools/fetch-video-analysis/index.d.ts +3 -3
- package/dist/tools/fetch-video-analysis/index.d.ts.map +1 -1
- package/dist/tools/fetch-video-analysis/index.js +84 -24
- package/dist/tools/fetch-video-analysis/open-ai.d.ts +6 -0
- package/dist/tools/fetch-video-analysis/open-ai.d.ts.map +1 -0
- package/dist/tools/fetch-video-analysis/open-ai.js +37 -0
- package/dist/tools/fetch-video-analysis/utils.d.ts +9 -3
- package/dist/tools/fetch-video-analysis/utils.d.ts.map +1 -1
- package/dist/tools/fetch-video-analysis/utils.js +64 -15
- package/dist/tools/fetch-video-analysis/video-analysis.d.ts +2 -2
- package/dist/tools/fetch-video-analysis/video-analysis.d.ts.map +1 -1
- package/dist/tools/fetch-video-analysis/video-analysis.js +24 -8
- package/dist/tools/file-operations/create.d.ts.map +1 -1
- package/dist/tools/file-operations/create.js +6 -3
- package/dist/tools/file-operations/insert.d.ts.map +1 -1
- package/dist/tools/file-operations/insert.js +6 -3
- package/dist/tools/file-operations/replace.d.ts.map +1 -1
- package/dist/tools/file-operations/replace.js +6 -3
- package/dist/tools/file-operations/shared/git-helper.d.ts.map +1 -1
- package/dist/tools/file-operations/shared/git-helper.js +1 -1
- package/dist/tools/file-operations/view/index.d.ts +2 -5
- package/dist/tools/file-operations/view/index.d.ts.map +1 -1
- package/dist/tools/file-operations/view/index.js +2 -22
- package/dist/tools/index.d.ts +28 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +50 -22
- package/dist/tools/issues/update-issue.d.ts.map +1 -1
- package/dist/tools/issues/update-issue.js +16 -9
- package/dist/tools/merge-conflicts/index.js +1 -1
- package/dist/tools/rename-file/index.d.ts +3 -0
- package/dist/tools/rename-file/index.d.ts.map +1 -0
- package/dist/tools/rename-file/index.js +88 -0
- package/dist/tools/review-pull-request/index.d.ts +3 -0
- package/dist/tools/review-pull-request/index.d.ts.map +1 -0
- package/dist/tools/review-pull-request/index.js +103 -0
- package/dist/tools/run-test.js +2 -2
- package/dist/tools/test-run-fetcher/index.d.ts.map +1 -1
- package/dist/tools/test-run-fetcher/index.js +4 -14
- package/dist/tools/trace-dot-zip/index.d.ts.map +1 -1
- package/dist/tools/trace-dot-zip/index.js +2 -1
- package/dist/tools/trace-dot-zip/types.d.ts +35 -3
- package/dist/tools/trace-dot-zip/types.d.ts.map +1 -1
- package/dist/tools/trace-dot-zip/utils/network-trace.d.ts +7 -2
- package/dist/tools/trace-dot-zip/utils/network-trace.d.ts.map +1 -1
- package/dist/tools/trace-dot-zip/utils/network-trace.js +130 -10
- package/dist/tools/upgrade-packages/index.js +1 -1
- package/dist/tools/utils/urls.d.ts +5 -0
- package/dist/tools/utils/urls.d.ts.map +1 -0
- package/dist/tools/utils/urls.js +19 -0
- package/dist/tools/view-failed-test-run-report/index.d.ts.map +1 -1
- package/dist/tools/view-failed-test-run-report/index.js +3 -15
- package/dist/utils/file.d.ts +1 -0
- package/dist/utils/file.d.ts.map +1 -1
- package/dist/utils/file.js +45 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -3
- package/dist/utils/local-ffmpeg-client.d.ts +27 -0
- package/dist/utils/local-ffmpeg-client.d.ts.map +1 -0
- package/dist/{tools/fetch-video-analysis → utils}/local-ffmpeg-client.js +117 -27
- package/package.json +5 -5
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/agent/chat/utils/tool-calls.d.ts +0 -21
- package/dist/agent/chat/utils/tool-calls.d.ts.map +0 -1
- package/dist/agent/chat/utils/tool-calls.js +0 -64
- package/dist/tools/commit-and-create-pr/index.d.ts.map +0 -1
- package/dist/tools/commit-and-create-pr/index.js +0 -83
- package/dist/tools/definitions/commit-and-create-pr.d.ts +0 -3
- package/dist/tools/definitions/commit-and-create-pr.d.ts.map +0 -1
- package/dist/tools/fetch-image/index.d.ts.map +0 -1
- package/dist/tools/fetch-image/index.js +0 -63
- package/dist/tools/fetch-video-analysis/local-ffmpeg-client.d.ts +0 -24
- package/dist/tools/fetch-video-analysis/local-ffmpeg-client.d.ts.map +0 -1
- /package/dist/tools/{commit-and-create-pr → create-pull-request}/index.d.ts +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reviewPullRequestTool = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const exports_1 = require("../../agent/chat/exports");
|
|
6
|
+
const state_1 = require("../../agent/chat/state");
|
|
7
|
+
const code_review_1 = require("../../agent/code-review");
|
|
8
|
+
const fetch_session_diff_1 = require("../fetch-session-diff");
|
|
9
|
+
const CODE_REVIEW_MODEL = "claude-sonnet-4-20250514";
|
|
10
|
+
const ReviewPullRequestInputSchema = zod_1.z.object({
|
|
11
|
+
sessionUrl: zod_1.z.string().describe("The URL of the chat session to review"),
|
|
12
|
+
});
|
|
13
|
+
exports.reviewPullRequestTool = {
|
|
14
|
+
schema: {
|
|
15
|
+
name: "reviewPullRequest",
|
|
16
|
+
description: `Reviews a pull request by using CodeReviewAgent to fetch session diff and analyze it. Returns a boolean result with an explanation.`,
|
|
17
|
+
parameters: ReviewPullRequestInputSchema,
|
|
18
|
+
},
|
|
19
|
+
needsBrowser: false,
|
|
20
|
+
isInlineTool: true,
|
|
21
|
+
execute: async ({ input, apiClient }) => {
|
|
22
|
+
try {
|
|
23
|
+
const { sessionUrl } = input;
|
|
24
|
+
if (!sessionUrl) {
|
|
25
|
+
return {
|
|
26
|
+
isError: true,
|
|
27
|
+
result: "No chat session URL provided",
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const agent = new code_review_1.CodeReviewAgent({
|
|
31
|
+
featureFlags: [],
|
|
32
|
+
selectedModel: CODE_REVIEW_MODEL,
|
|
33
|
+
});
|
|
34
|
+
const userPrompt = `Review this session: ${sessionUrl}`;
|
|
35
|
+
const chatState = (0, state_1.createChatState)({
|
|
36
|
+
userPrompt,
|
|
37
|
+
attachments: [],
|
|
38
|
+
existingState: undefined,
|
|
39
|
+
selectedModel: CODE_REVIEW_MODEL,
|
|
40
|
+
error: null,
|
|
41
|
+
});
|
|
42
|
+
agent.initializeWithState(chatState);
|
|
43
|
+
let chatModel = (0, exports_1.createChatModel)(chatState.messages, CODE_REVIEW_MODEL);
|
|
44
|
+
while (!chatModel.askUserForInput) {
|
|
45
|
+
await agent.runLoop({
|
|
46
|
+
messages: chatModel.messages,
|
|
47
|
+
reporter: async (data) => {
|
|
48
|
+
console.log("Review progress:", data);
|
|
49
|
+
},
|
|
50
|
+
onPendingToolCall: async (toolCalls) => {
|
|
51
|
+
const [toolCall] = toolCalls;
|
|
52
|
+
// TODO: This will only work for 1 tool - will break if
|
|
53
|
+
// code review agent has more tools: need first class primitive
|
|
54
|
+
// for inline tool execution
|
|
55
|
+
if (toolCall?.name === "fetchSessionDiff") {
|
|
56
|
+
const tool = fetch_session_diff_1.fetchSessionDiffTool;
|
|
57
|
+
const result = await tool.execute({
|
|
58
|
+
input: toolCall.input,
|
|
59
|
+
apiClient,
|
|
60
|
+
repoPath: ``,
|
|
61
|
+
featureFlags: [],
|
|
62
|
+
});
|
|
63
|
+
chatModel.pushToolResultsMessage([toolCall], [result]);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
onLLMResponse: async (response, model) => {
|
|
67
|
+
console.log(`Agent responded using ${model}:`, response);
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
// Update the chatModel with the agent's final state for next iteration
|
|
71
|
+
if (agent.messages) {
|
|
72
|
+
chatModel = (0, exports_1.createChatModel)(agent.messages, CODE_REVIEW_MODEL);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const messages = agent.messages || [];
|
|
76
|
+
const lastMessage = messages.length
|
|
77
|
+
? messages[messages.length - 1]
|
|
78
|
+
: undefined;
|
|
79
|
+
const lastMessageTextPart = lastMessage
|
|
80
|
+
? lastMessage.parts
|
|
81
|
+
.filter((p) => "text" in p)
|
|
82
|
+
.find((p) => "text" in p && !!p.text)
|
|
83
|
+
: undefined;
|
|
84
|
+
if (!lastMessageTextPart) {
|
|
85
|
+
return {
|
|
86
|
+
isError: true,
|
|
87
|
+
result: "Could not extract text response from agent",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
isError: false,
|
|
92
|
+
result: lastMessageTextPart.text,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.error("Error reviewing pull request", error);
|
|
97
|
+
return {
|
|
98
|
+
isError: true,
|
|
99
|
+
result: error instanceof Error ? error.message : String(error),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
package/dist/tools/run-test.js
CHANGED
|
@@ -9,7 +9,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
10
|
const artifacts_1 = require("../artifacts");
|
|
11
11
|
const utils_1 = require("../artifacts/utils");
|
|
12
|
-
const
|
|
12
|
+
const json_1 = require("../utils/json");
|
|
13
13
|
const run_test_1 = require("./definitions/run-test");
|
|
14
14
|
function buildReportUrl(projectName, testRunId) {
|
|
15
15
|
return `https://reports.empirical.run/${projectName}/${testRunId}/index.html`;
|
|
@@ -17,7 +17,7 @@ function buildReportUrl(projectName, testRunId) {
|
|
|
17
17
|
function buildResult({ hasTestPassed, summaryJson, reportUrl, }) {
|
|
18
18
|
const summaryWithoutConfig = { ...summaryJson, config: undefined };
|
|
19
19
|
delete summaryWithoutConfig["config"];
|
|
20
|
-
const truncatedSummaryJson = (0,
|
|
20
|
+
const truncatedSummaryJson = (0, json_1.truncateJsonValues)(summaryWithoutConfig);
|
|
21
21
|
return `
|
|
22
22
|
Test run is complete. Result: ${hasTestPassed ? "Passed" : "Failed"}
|
|
23
23
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/test-run-fetcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/test-run-fetcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAcvD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,eAAO,MAAM,sBAAsB,EAAE,IAkHpC,CAAC"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.fetchTestRunReportTool = void 0;
|
|
4
4
|
exports.extractPathAfterSourceRepo = extractPathAfterSourceRepo;
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
|
+
const urls_1 = require("../utils/urls");
|
|
6
7
|
const TestRunSchema = zod_1.z.object({
|
|
7
8
|
testRunUrl: zod_1.z
|
|
8
9
|
.string()
|
|
@@ -26,23 +27,12 @@ exports.fetchTestRunReportTool = {
|
|
|
26
27
|
needsBrowser: false,
|
|
27
28
|
isInlineTool: true,
|
|
28
29
|
execute: async ({ input, apiClient }) => {
|
|
29
|
-
const { testRunUrl } = input;
|
|
30
|
-
// Remove query parameters if they exist
|
|
31
|
-
const urlWithoutParams = testRunUrl.split("?")[0] || testRunUrl;
|
|
32
|
-
// Extract the run ID and repo name from the URL
|
|
33
|
-
const urlParts = urlWithoutParams.split("/");
|
|
34
|
-
const runId = urlParts.pop(); // Last part is the run ID
|
|
35
|
-
const repoName = urlParts[urlParts.length - 2]; // Second to last part is the repo name
|
|
36
|
-
if (!runId || !repoName) {
|
|
37
|
-
return {
|
|
38
|
-
isError: true,
|
|
39
|
-
result: "Invalid test run URL - could not extract run ID or repo name",
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
let data = null;
|
|
43
30
|
if (!apiClient) {
|
|
44
31
|
throw new Error("Dashboard API client is not available.");
|
|
45
32
|
}
|
|
33
|
+
const { testRunUrl } = input;
|
|
34
|
+
let data = null;
|
|
35
|
+
const { repoName, runId } = (0, urls_1.extractProjectFromUrl)(testRunUrl);
|
|
46
36
|
try {
|
|
47
37
|
data = await apiClient.request(`/api/test-runs/${runId}?repo_name=${repoName}`, { method: "GET" });
|
|
48
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAa9D,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAa9D,eAAO,MAAM,eAAe,EAAE,IAwD7B,CAAC"}
|
|
@@ -28,11 +28,12 @@ exports.traceDotZipTool = {
|
|
|
28
28
|
(0, network_trace_1.generateNetworkTraceFromZipUrl)({ url: traceFileUrl }),
|
|
29
29
|
(0, console_trace_1.generateConsoleTraceFromZipUrl)({ url: traceFileUrl }),
|
|
30
30
|
]);
|
|
31
|
-
const cleanNetworkTraceOutput = (0, network_trace_1.stripIrrelevantInfoFromNetworkFailureArray)(networkTraceOutput);
|
|
31
|
+
const cleanNetworkTraceOutput = (0, network_trace_1.stripIrrelevantInfoFromNetworkFailureArray)(networkTraceOutput.hydratedFailedCalls);
|
|
32
32
|
return {
|
|
33
33
|
isError: false,
|
|
34
34
|
result: JSON.stringify({
|
|
35
35
|
failed_network_requests: cleanNetworkTraceOutput,
|
|
36
|
+
request_sequence: networkTraceOutput.networkCallSequence,
|
|
36
37
|
console_error_logs: consoleTraceOutput,
|
|
37
38
|
}, null, 2),
|
|
38
39
|
};
|
|
@@ -8,13 +8,35 @@ export type CapturedNetworkFailure = {
|
|
|
8
8
|
headers: {
|
|
9
9
|
[any: string]: string;
|
|
10
10
|
}[] | [];
|
|
11
|
+
body?: {
|
|
12
|
+
mimeType?: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
params?: any[];
|
|
15
|
+
_sha1?: string;
|
|
16
|
+
content?: string;
|
|
17
|
+
};
|
|
11
18
|
};
|
|
12
19
|
response: {
|
|
13
20
|
headers: {
|
|
14
21
|
[any: string]: string;
|
|
15
22
|
}[] | [];
|
|
23
|
+
body?: {
|
|
24
|
+
mimeType?: string;
|
|
25
|
+
text?: string;
|
|
26
|
+
params?: any[];
|
|
27
|
+
_sha1?: string;
|
|
28
|
+
content?: string;
|
|
29
|
+
};
|
|
16
30
|
};
|
|
17
31
|
};
|
|
32
|
+
export type NetworkRequestSequence = {
|
|
33
|
+
step: number;
|
|
34
|
+
method: string;
|
|
35
|
+
endpoint: string;
|
|
36
|
+
status: number;
|
|
37
|
+
redirect_to?: string;
|
|
38
|
+
duration_ms: number;
|
|
39
|
+
};
|
|
18
40
|
export type CapturedConsoleLog = {
|
|
19
41
|
type: "console";
|
|
20
42
|
messageType: "log" | "info" | "warning" | "error" | string;
|
|
@@ -44,11 +66,12 @@ export type PlaywrightNetworkTrace = {
|
|
|
44
66
|
queryString: any[];
|
|
45
67
|
headersSize: number;
|
|
46
68
|
bodySize: number;
|
|
47
|
-
postData
|
|
69
|
+
postData?: {
|
|
48
70
|
mimeType: string;
|
|
49
|
-
text
|
|
71
|
+
text?: string;
|
|
50
72
|
params: any[];
|
|
51
|
-
_sha1
|
|
73
|
+
_sha1?: string;
|
|
74
|
+
_file?: string;
|
|
52
75
|
};
|
|
53
76
|
};
|
|
54
77
|
response: {
|
|
@@ -61,6 +84,15 @@ export type PlaywrightNetworkTrace = {
|
|
|
61
84
|
bodySize: number;
|
|
62
85
|
redirectURL: string;
|
|
63
86
|
_transferSize: number;
|
|
87
|
+
content: {
|
|
88
|
+
size: number;
|
|
89
|
+
mimeType: string;
|
|
90
|
+
text?: string;
|
|
91
|
+
encoding?: string;
|
|
92
|
+
_sha1?: string;
|
|
93
|
+
_file?: string;
|
|
94
|
+
compression?: number;
|
|
95
|
+
};
|
|
64
96
|
};
|
|
65
97
|
cache: any;
|
|
66
98
|
timings: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC,EAAE,MAAM,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,OAAO,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,EAAE,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CapturedNetworkFailure } from "../types";
|
|
1
|
+
import { CapturedNetworkFailure, NetworkRequestSequence, PlaywrightNetworkTrace } from "../types";
|
|
2
2
|
type ArgsT = {
|
|
3
3
|
url: string;
|
|
4
4
|
logPrefix?: string;
|
|
@@ -15,7 +15,12 @@ export declare const generateNetworkTrace: ({ logPrefix, url, failure, }: ArgsT)
|
|
|
15
15
|
allFailedCalls: CapturedNetworkFailure[];
|
|
16
16
|
failedCallsWithinTimeRange: CapturedNetworkFailure[];
|
|
17
17
|
}>;
|
|
18
|
-
export declare const generateNetworkTraceFromZipUrl: ({ url, }: ArgsT) => Promise<
|
|
18
|
+
export declare const generateNetworkTraceFromZipUrl: ({ url, }: ArgsT) => Promise<{
|
|
19
|
+
hydratedFailedCalls: CapturedNetworkFailure[];
|
|
20
|
+
networkCallSequence: NetworkRequestSequence[];
|
|
21
|
+
}>;
|
|
19
22
|
export declare const stripIrrelevantInfoFromNetworkFailureArray: (failures: CapturedNetworkFailure[]) => Partial<CapturedNetworkFailure>[];
|
|
23
|
+
export declare const hydrateSha1Bodies: (failures: CapturedNetworkFailure[], zipUrl: string) => Promise<CapturedNetworkFailure[]>;
|
|
24
|
+
export declare const buildNetworkCallSequence: (unformattedFailedNetworkCallsWithHeaders: PlaywrightNetworkTrace[]) => NetworkRequestSequence[];
|
|
20
25
|
export {};
|
|
21
26
|
//# sourceMappingURL=network-trace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-trace.d.ts","sourceRoot":"","sources":["../../../../src/tools/trace-dot-zip/utils/network-trace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"network-trace.d.ts","sourceRoot":"","sources":["../../../../src/tools/trace-dot-zip/utils/network-trace.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAUlB,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,EACJ;YACE,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;SAChB,GACD,SAAS,CAAC;KACf,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,8BAIxC,KAAK,KAAG,OAAO,CAAC;IACjB,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,0BAA0B,EAAE,sBAAsB,EAAE,CAAC;CACtD,CA+KA,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAU,UAElD,KAAK,KAAG,OAAO,CAAC;IACjB,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;CAC/C,CAyEA,CAAC;AAsBF,eAAO,MAAM,0CAA0C,GACrD,UAAU,sBAAsB,EAAE,KACjC,OAAO,CAAC,sBAAsB,CAAC,EAoBjC,CAAC;AAmCF,eAAO,MAAM,iBAAiB,GAC5B,UAAU,sBAAsB,EAAE,EAClC,QAAQ,MAAM,KACb,OAAO,CAAC,sBAAsB,EAAE,CA+BlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,0CAA0C,sBAAsB,EAAE,KACjE,sBAAsB,EA2BxB,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.stripIrrelevantInfoFromNetworkFailureArray = exports.generateNetworkTraceFromZipUrl = exports.generateNetworkTrace = void 0;
|
|
3
|
+
exports.buildNetworkCallSequence = exports.hydrateSha1Bodies = exports.stripIrrelevantInfoFromNetworkFailureArray = exports.generateNetworkTraceFromZipUrl = exports.generateNetworkTrace = void 0;
|
|
4
4
|
const date_fns_1 = require("date-fns");
|
|
5
|
+
const json_1 = require("../../../utils/json");
|
|
5
6
|
const extract_zip_1 = require("./extract-zip");
|
|
6
7
|
const NON_RELEVANT_NETWORK_CALL_KEYWORDS = [
|
|
7
8
|
"sentry",
|
|
@@ -97,6 +98,7 @@ const generateNetworkTrace = async ({ logPrefix = "network-trace", url, failure,
|
|
|
97
98
|
method: call?.snapshot?.request?.method,
|
|
98
99
|
request: {
|
|
99
100
|
headers: call?.snapshot?.request?.headers ?? [],
|
|
101
|
+
body: call?.snapshot?.request?.postData ?? undefined,
|
|
100
102
|
},
|
|
101
103
|
response: {
|
|
102
104
|
headers: call?.snapshot?.response?.headers ?? [],
|
|
@@ -130,7 +132,8 @@ const generateNetworkTrace = async ({ logPrefix = "network-trace", url, failure,
|
|
|
130
132
|
exports.generateNetworkTrace = generateNetworkTrace;
|
|
131
133
|
const generateNetworkTraceFromZipUrl = async ({ url, }) => {
|
|
132
134
|
try {
|
|
133
|
-
const
|
|
135
|
+
const allNetworkCalls = [];
|
|
136
|
+
const relevantNetworkCalls = [];
|
|
134
137
|
await (0, extract_zip_1.extractFileFromZipFromUrl)({
|
|
135
138
|
zipUrl: url,
|
|
136
139
|
fileNames: ["0-trace.network"],
|
|
@@ -141,23 +144,47 @@ const generateNetworkTraceFromZipUrl = async ({ url, }) => {
|
|
|
141
144
|
let lines = tempBuffer.split("\n");
|
|
142
145
|
lines.slice(0, -1).forEach((line) => {
|
|
143
146
|
const parsedNetworkTrace = JSON.parse(line);
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
const hasValidResponseStatus = !!parsedNetworkTrace?.snapshot?.response?.status;
|
|
148
|
+
const responseStatus = Number(parsedNetworkTrace?.snapshot?.response?.status);
|
|
149
|
+
allNetworkCalls.push(parsedNetworkTrace);
|
|
150
|
+
// only failures & redirects for detailed analysis
|
|
151
|
+
if (hasValidResponseStatus &&
|
|
152
|
+
(responseStatus === 308 ||
|
|
153
|
+
(400 <= responseStatus && responseStatus < 600))) {
|
|
154
|
+
relevantNetworkCalls.push(parsedNetworkTrace);
|
|
149
155
|
}
|
|
150
156
|
});
|
|
151
157
|
tempBuffer = lines[lines.length - 1] || "";
|
|
152
158
|
};
|
|
153
159
|
},
|
|
154
160
|
});
|
|
155
|
-
|
|
161
|
+
const failedCalls = relevantNetworkCalls.filter((c) => {
|
|
162
|
+
const status = c.snapshot.response.status;
|
|
163
|
+
return 400 <= status && status < 600;
|
|
164
|
+
});
|
|
165
|
+
const sequenceCalls = allNetworkCalls.filter((c) => {
|
|
166
|
+
const hasValidResponseStatus = !!c.snapshot.response.status;
|
|
167
|
+
const status = Number(c.snapshot.response.status);
|
|
168
|
+
return (hasValidResponseStatus &&
|
|
169
|
+
((400 <= status && status < 600) ||
|
|
170
|
+
status === 307 ||
|
|
171
|
+
status === 308 ||
|
|
172
|
+
status === 301 ||
|
|
173
|
+
status === 302));
|
|
174
|
+
// excluding: 304 (cached), 2xx success
|
|
175
|
+
});
|
|
176
|
+
const networkCallSequence = (0, exports.buildNetworkCallSequence)(sequenceCalls);
|
|
177
|
+
const formattedFailedCalls = failedCalls.map(formatNetworkFailure);
|
|
178
|
+
const hydratedFailedCalls = await (0, exports.hydrateSha1Bodies)(formattedFailedCalls, url);
|
|
179
|
+
return { hydratedFailedCalls, networkCallSequence };
|
|
156
180
|
}
|
|
157
181
|
catch (error) {
|
|
158
182
|
console.error(`Error fetching or processing the zip file: ${url}`, error);
|
|
159
183
|
}
|
|
160
|
-
return
|
|
184
|
+
return {
|
|
185
|
+
hydratedFailedCalls: [],
|
|
186
|
+
networkCallSequence: [],
|
|
187
|
+
};
|
|
161
188
|
};
|
|
162
189
|
exports.generateNetworkTraceFromZipUrl = generateNetworkTraceFromZipUrl;
|
|
163
190
|
const formatNetworkFailure = (call) => {
|
|
@@ -169,21 +196,114 @@ const formatNetworkFailure = (call) => {
|
|
|
169
196
|
method: call?.snapshot?.request?.method,
|
|
170
197
|
request: {
|
|
171
198
|
headers: call?.snapshot?.request?.headers ?? [],
|
|
199
|
+
body: call?.snapshot?.request?.postData ?? undefined,
|
|
172
200
|
},
|
|
173
201
|
response: {
|
|
174
202
|
headers: call?.snapshot?.response?.headers ?? [],
|
|
203
|
+
body: call?.snapshot?.response?.content ?? undefined,
|
|
175
204
|
},
|
|
176
205
|
};
|
|
177
206
|
};
|
|
178
207
|
const stripIrrelevantInfoFromNetworkFailureArray = (failures) => {
|
|
179
|
-
return failures.map(({ endpoint, status, timestamp, method }) => {
|
|
208
|
+
return failures.map(({ endpoint, status, timestamp, method, request, response }) => {
|
|
180
209
|
const strippedFailureInfo = {
|
|
181
210
|
endpoint,
|
|
182
211
|
status,
|
|
183
212
|
timestamp,
|
|
184
213
|
method,
|
|
214
|
+
request: {
|
|
215
|
+
headers: [],
|
|
216
|
+
body: request.body,
|
|
217
|
+
},
|
|
218
|
+
response: {
|
|
219
|
+
headers: [],
|
|
220
|
+
body: response.body,
|
|
221
|
+
},
|
|
185
222
|
};
|
|
186
223
|
return strippedFailureInfo;
|
|
187
224
|
});
|
|
188
225
|
};
|
|
189
226
|
exports.stripIrrelevantInfoFromNetworkFailureArray = stripIrrelevantInfoFromNetworkFailureArray;
|
|
227
|
+
const resolveSha1File = async (zipUrl, sha1) => {
|
|
228
|
+
if (!sha1)
|
|
229
|
+
return undefined;
|
|
230
|
+
let result;
|
|
231
|
+
const fileName = `resources/${sha1}`; // the _sha1 reference is a filename like abcd.bin or abcd.json
|
|
232
|
+
await (0, extract_zip_1.extractFileFromZipFromUrl)({
|
|
233
|
+
zipUrl,
|
|
234
|
+
fileNames: [fileName],
|
|
235
|
+
chunkProcessor: () => {
|
|
236
|
+
let buffer = "";
|
|
237
|
+
return (chunk) => {
|
|
238
|
+
buffer += chunk.toString("utf-8");
|
|
239
|
+
result = buffer;
|
|
240
|
+
};
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
if (!result)
|
|
244
|
+
return undefined;
|
|
245
|
+
let truncatedContent;
|
|
246
|
+
try {
|
|
247
|
+
const parsedResult = JSON.parse(result);
|
|
248
|
+
truncatedContent = JSON.stringify((0, json_1.truncateJsonValues)(parsedResult));
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
truncatedContent = (0, json_1.truncateJsonValues)(result);
|
|
252
|
+
}
|
|
253
|
+
return truncatedContent;
|
|
254
|
+
};
|
|
255
|
+
const hydrateSha1Bodies = async (failures, zipUrl) => {
|
|
256
|
+
return Promise.all(failures.map(async (failure) => {
|
|
257
|
+
const reqSha1 = failure.request.body?._sha1;
|
|
258
|
+
const reqMimeType = failure.request.body?.mimeType;
|
|
259
|
+
const resSha1 = failure.response.body?._sha1;
|
|
260
|
+
const resMimeType = failure.response.body?.mimeType;
|
|
261
|
+
return {
|
|
262
|
+
...failure,
|
|
263
|
+
request: {
|
|
264
|
+
...failure.request,
|
|
265
|
+
body: reqSha1
|
|
266
|
+
? {
|
|
267
|
+
mimeType: reqMimeType,
|
|
268
|
+
content: await resolveSha1File(zipUrl, reqSha1),
|
|
269
|
+
}
|
|
270
|
+
: failure.request.body,
|
|
271
|
+
},
|
|
272
|
+
response: {
|
|
273
|
+
...failure.response,
|
|
274
|
+
body: resSha1
|
|
275
|
+
? {
|
|
276
|
+
mimeType: resMimeType,
|
|
277
|
+
content: await resolveSha1File(zipUrl, resSha1),
|
|
278
|
+
}
|
|
279
|
+
: failure.response.body,
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}));
|
|
283
|
+
};
|
|
284
|
+
exports.hydrateSha1Bodies = hydrateSha1Bodies;
|
|
285
|
+
const buildNetworkCallSequence = (unformattedFailedNetworkCallsWithHeaders) => {
|
|
286
|
+
return unformattedFailedNetworkCallsWithHeaders.map((trace, idx) => {
|
|
287
|
+
const snap = trace.snapshot;
|
|
288
|
+
const url = new URL(snap.request.url);
|
|
289
|
+
let redirect_to = undefined;
|
|
290
|
+
if (snap.response.redirectURL) {
|
|
291
|
+
try {
|
|
292
|
+
// attempting to make it absolute if relative
|
|
293
|
+
redirect_to = new URL(snap.response.redirectURL, snap.request.url).toString();
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
redirect_to = snap.response.redirectURL; // fallback as-is
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
step: idx + 1,
|
|
301
|
+
method: snap.request.method,
|
|
302
|
+
endpoint: url.pathname,
|
|
303
|
+
status: snap.response.status,
|
|
304
|
+
redirect_to,
|
|
305
|
+
duration_ms: Math.round(snap.time),
|
|
306
|
+
};
|
|
307
|
+
});
|
|
308
|
+
};
|
|
309
|
+
exports.buildNetworkCallSequence = buildNetworkCallSequence;
|
|
@@ -50,7 +50,7 @@ exports.upgradePackagesTool = {
|
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
const updateMessage = `upgrade ${changes.length} package${changes.length === 1 ? "" : "s"}`;
|
|
53
|
-
(0, git_1.
|
|
53
|
+
(0, git_1.stageAndCommitFilesAsBotUser)({
|
|
54
54
|
commitMessage: `[upgrade-packages] ${updateMessage}`,
|
|
55
55
|
files: ["package.json", "package-lock.json"],
|
|
56
56
|
repoPath,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/urls.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM;;;EAiBvD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractProjectFromUrl = extractProjectFromUrl;
|
|
4
|
+
function extractProjectFromUrl(testRunUrl) {
|
|
5
|
+
// Remove query parameters if they exist
|
|
6
|
+
const urlWithoutParams = testRunUrl.split("?")[0] || testRunUrl;
|
|
7
|
+
// Extract the run ID and repo name from the URL
|
|
8
|
+
const urlParts = urlWithoutParams.split("/");
|
|
9
|
+
const runId = urlParts.pop();
|
|
10
|
+
const projectSlug = urlParts[urlParts.length - 2];
|
|
11
|
+
if (!runId || !projectSlug) {
|
|
12
|
+
throw new Error("Invalid test run URL - could not extract run ID or project slug");
|
|
13
|
+
}
|
|
14
|
+
const repoName = `${projectSlug}-tests`;
|
|
15
|
+
return {
|
|
16
|
+
repoName,
|
|
17
|
+
runId,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/view-failed-test-run-report/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/view-failed-test-run-report/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,6BAA6B;;;;;;EAExC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAChD,OAAO,6BAA6B,CACrC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,IAsKzC,CAAC"}
|
|
@@ -4,6 +4,7 @@ exports.viewFailedTestRunReportTool = exports.ViewFailedTestRunReportSchema = vo
|
|
|
4
4
|
// import fs from "fs";
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const playwright_report_parser_1 = require("../../utils/playwright-report-parser");
|
|
7
|
+
const urls_1 = require("../utils/urls");
|
|
7
8
|
exports.ViewFailedTestRunReportSchema = zod_1.z.object({
|
|
8
9
|
testRunUrl: zod_1.z.string().describe("The URL of the test run to process."),
|
|
9
10
|
});
|
|
@@ -17,18 +18,7 @@ exports.viewFailedTestRunReportTool = {
|
|
|
17
18
|
isInlineTool: true,
|
|
18
19
|
execute: async ({ input, apiClient }) => {
|
|
19
20
|
const { testRunUrl } = input;
|
|
20
|
-
|
|
21
|
-
const urlWithoutParams = testRunUrl.split("?")[0] || testRunUrl;
|
|
22
|
-
// Extract the run ID and repo name from the URL
|
|
23
|
-
const urlParts = urlWithoutParams.split("/");
|
|
24
|
-
const runId = urlParts.pop(); // Last part is the run ID
|
|
25
|
-
const repoName = urlParts[urlParts.length - 2]; // Second to last part is the repo name
|
|
26
|
-
if (!runId || !repoName) {
|
|
27
|
-
return {
|
|
28
|
-
isError: true,
|
|
29
|
-
result: "Invalid test run URL - could not extract run ID or repo name",
|
|
30
|
-
};
|
|
31
|
-
}
|
|
21
|
+
const { repoName, runId } = (0, urls_1.extractProjectFromUrl)(testRunUrl);
|
|
32
22
|
let result = {
|
|
33
23
|
testRun: null,
|
|
34
24
|
summary: null,
|
|
@@ -80,9 +70,7 @@ exports.viewFailedTestRunReportTool = {
|
|
|
80
70
|
// );
|
|
81
71
|
const htmlDetailed = await apiClient.request(`/api/reports/html-detailed`, {
|
|
82
72
|
method: "GET",
|
|
83
|
-
params: {
|
|
84
|
-
url: indexHtmlUrl,
|
|
85
|
-
},
|
|
73
|
+
params: { url: indexHtmlUrl },
|
|
86
74
|
});
|
|
87
75
|
const parsedReport = (0, playwright_report_parser_1.parsePlaywrightTestReport)(summaryData);
|
|
88
76
|
// fs.writeFileSync(
|
package/dist/utils/file.d.ts
CHANGED
package/dist/utils/file.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgBpB"}
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,cAAiB,KAChB,OAAO,CAAC,IAAI,CAUd,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgBpB"}
|
package/dist/utils/file.js
CHANGED
|
@@ -1,11 +1,55 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.safeCleanupDirectory = void 0;
|
|
6
40
|
exports.findFileRecursively = findFileRecursively;
|
|
7
|
-
const fs_1 =
|
|
41
|
+
const fs_1 = __importStar(require("fs"));
|
|
8
42
|
const path_1 = __importDefault(require("path"));
|
|
43
|
+
const safeCleanupDirectory = async (dirPath, label = "cleanup") => {
|
|
44
|
+
try {
|
|
45
|
+
console.log(`[${label}] Cleaning up directory: ${dirPath}`);
|
|
46
|
+
await fs_1.promises.rm(dirPath, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.warn(`[${label}] Failed to cleanup directory ${dirPath}:`, error instanceof Error ? error.message : String(error));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.safeCleanupDirectory = safeCleanupDirectory;
|
|
9
53
|
function findFileRecursively(directory, fileName) {
|
|
10
54
|
const files = fs_1.default.readdirSync(directory);
|
|
11
55
|
for (const file of files) {
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC"}
|