@handong66/evidoc-github-action 0.1.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/src/index.d.ts +21 -0
- package/dist/src/index.js +94 -0
- package/dist/src/index.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type DriftReport } from "@handong66/evidoc-core";
|
|
2
|
+
export type FailOn = "none" | "broken" | "review_needed";
|
|
3
|
+
export interface ActionPolicy {
|
|
4
|
+
failOn: FailOn;
|
|
5
|
+
}
|
|
6
|
+
export interface GithubActionOptions extends ActionPolicy {
|
|
7
|
+
cwd: string;
|
|
8
|
+
changedFiles?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface GithubActionResult {
|
|
11
|
+
exitCode: number;
|
|
12
|
+
report: DriftReport;
|
|
13
|
+
setupWarnings: string[];
|
|
14
|
+
markdownSummary: string;
|
|
15
|
+
annotations: string;
|
|
16
|
+
prComment: string;
|
|
17
|
+
sarif: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function shouldFailAction(report: DriftReport, policy: ActionPolicy): boolean;
|
|
20
|
+
export declare function runGithubAction(options: GithubActionOptions): Promise<GithubActionResult>;
|
|
21
|
+
export declare function parseFailOn(value: string | undefined): FailOn;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { checkRepository, detectRepositoryEvidocWorkflowText, evidocWorkflowWarnings } from "@handong66/evidoc-core";
|
|
4
|
+
import { formatGithubAnnotations, formatMarkdownReport, formatPrComment, formatSarifReport } from "@handong66/evidoc-reports";
|
|
5
|
+
export function shouldFailAction(report, policy) {
|
|
6
|
+
if (policy.failOn === "none")
|
|
7
|
+
return false;
|
|
8
|
+
if (policy.failOn === "broken")
|
|
9
|
+
return report.summary.broken > 0;
|
|
10
|
+
return report.summary.broken > 0 || report.summary.reviewNeeded > 0;
|
|
11
|
+
}
|
|
12
|
+
export async function runGithubAction(options) {
|
|
13
|
+
const report = await checkRepository(options.cwd, { changedFiles: options.changedFiles });
|
|
14
|
+
const setupWarnings = await findEvidocWorkflowWarnings(options.cwd);
|
|
15
|
+
const reportFormatOptions = {
|
|
16
|
+
setupWarnings,
|
|
17
|
+
scanScope: options.changedFiles === undefined ? undefined : "changed-only"
|
|
18
|
+
};
|
|
19
|
+
const markdownSummary = formatMarkdownReport(report, reportFormatOptions);
|
|
20
|
+
return {
|
|
21
|
+
exitCode: shouldFailAction(report, options) ? 1 : 0,
|
|
22
|
+
report,
|
|
23
|
+
setupWarnings,
|
|
24
|
+
markdownSummary,
|
|
25
|
+
annotations: formatGithubAnnotations(report),
|
|
26
|
+
prComment: formatPrComment(report, reportFormatOptions),
|
|
27
|
+
sarif: formatSarifReport(report)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function findEvidocWorkflowWarnings(root) {
|
|
31
|
+
const workflowsRoot = join(root, ".github", "workflows");
|
|
32
|
+
let entries;
|
|
33
|
+
try {
|
|
34
|
+
entries = await readdir(workflowsRoot);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const warnings = [];
|
|
40
|
+
const defaultBranch = await readGithubEventDefaultBranch();
|
|
41
|
+
for (const entry of entries.sort()) {
|
|
42
|
+
if (!entry.endsWith(".yml") && !entry.endsWith(".yaml"))
|
|
43
|
+
continue;
|
|
44
|
+
const workflowPath = `.github/workflows/${entry}`;
|
|
45
|
+
let text;
|
|
46
|
+
try {
|
|
47
|
+
text = await readFile(join(root, workflowPath), "utf8");
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const detection = await detectRepositoryEvidocWorkflowText(root, text);
|
|
53
|
+
if (detection.matches) {
|
|
54
|
+
warnings.push(...evidocWorkflowWarnings(workflowPath, text, defaultBranch));
|
|
55
|
+
for (const action of detection.localActions) {
|
|
56
|
+
warnings.push(...evidocWorkflowWarnings(action.path, action.text, undefined));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return warnings;
|
|
61
|
+
}
|
|
62
|
+
async function readGithubEventDefaultBranch() {
|
|
63
|
+
const eventPath = process.env.GITHUB_EVENT_PATH;
|
|
64
|
+
if (!eventPath)
|
|
65
|
+
return undefined;
|
|
66
|
+
try {
|
|
67
|
+
const event = JSON.parse(await readFile(eventPath, "utf8"));
|
|
68
|
+
return sanitizeBranchName(typeof event.repository?.default_branch === "string" ? event.repository.default_branch : undefined);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function sanitizeBranchName(value) {
|
|
75
|
+
const branch = value?.trim();
|
|
76
|
+
if (!branch || !isSafeBranchName(branch))
|
|
77
|
+
return undefined;
|
|
78
|
+
return branch;
|
|
79
|
+
}
|
|
80
|
+
function isSafeBranchName(branch) {
|
|
81
|
+
if (branch === "@" || branch.startsWith("/") || branch.endsWith("/") || branch.endsWith("."))
|
|
82
|
+
return false;
|
|
83
|
+
if (branch.includes("..") || branch.includes("//") || branch.includes("@{"))
|
|
84
|
+
return false;
|
|
85
|
+
if (branch.split("/").some((part) => part.startsWith(".") || part.endsWith(".lock")))
|
|
86
|
+
return false;
|
|
87
|
+
return !/[\x00-\x20\x7f~^:?*[\]\\`]/.test(branch);
|
|
88
|
+
}
|
|
89
|
+
export function parseFailOn(value) {
|
|
90
|
+
if (value === "broken" || value === "review_needed" || value === "none")
|
|
91
|
+
return value;
|
|
92
|
+
return "review_needed";
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@handong66/evidoc-github-action",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"prepublishOnly": "node ../../scripts/ensure-built-package.mjs"
|
|
7
|
+
},
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/src/index.js"
|
|
10
|
+
},
|
|
11
|
+
"types": "./dist/src/index.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist/src"
|
|
14
|
+
],
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@handong66/evidoc-core": "0.1.0",
|
|
17
|
+
"@handong66/evidoc-reports": "0.1.0"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/handong66/Evidoc.git"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/handong66/Evidoc/issues"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/handong66/Evidoc#readme"
|
|
28
|
+
}
|