action-pinner 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/LICENSE +21 -0
- package/README.md +406 -0
- package/action.yml +53 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/src/action-mode.d.ts +1 -0
- package/dist/src/action-mode.js +109 -0
- package/dist/src/action-mode.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +780 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js +291 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/dependabot.d.ts +1 -0
- package/dist/src/dependabot.js +11 -0
- package/dist/src/dependabot.js.map +1 -0
- package/dist/src/enforcement.d.ts +12 -0
- package/dist/src/enforcement.js +238 -0
- package/dist/src/enforcement.js.map +1 -0
- package/dist/src/github-app.d.ts +6 -0
- package/dist/src/github-app.js +4 -0
- package/dist/src/github-app.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +16 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logging.d.ts +8 -0
- package/dist/src/logging.js +38 -0
- package/dist/src/logging.js.map +1 -0
- package/dist/src/multi-repo-scanner.d.ts +69 -0
- package/dist/src/multi-repo-scanner.js +121 -0
- package/dist/src/multi-repo-scanner.js.map +1 -0
- package/dist/src/netrc-auth.d.ts +13 -0
- package/dist/src/netrc-auth.js +123 -0
- package/dist/src/netrc-auth.js.map +1 -0
- package/dist/src/org.d.ts +49 -0
- package/dist/src/org.js +162 -0
- package/dist/src/org.js.map +1 -0
- package/dist/src/pattern-match.d.ts +5 -0
- package/dist/src/pattern-match.js +59 -0
- package/dist/src/pattern-match.js.map +1 -0
- package/dist/src/pinner.d.ts +6 -0
- package/dist/src/pinner.js +148 -0
- package/dist/src/pinner.js.map +1 -0
- package/dist/src/pr.d.ts +87 -0
- package/dist/src/pr.js +165 -0
- package/dist/src/pr.js.map +1 -0
- package/dist/src/report.d.ts +10 -0
- package/dist/src/report.js +54 -0
- package/dist/src/report.js.map +1 -0
- package/dist/src/resolver.d.ts +44 -0
- package/dist/src/resolver.js +227 -0
- package/dist/src/resolver.js.map +1 -0
- package/dist/src/scanner.d.ts +8 -0
- package/dist/src/scanner.js +128 -0
- package/dist/src/scanner.js.map +1 -0
- package/dist/src/types.d.ts +170 -0
- package/dist/src/types.js +41 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +22 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/workflow-paths.d.ts +4 -0
- package/dist/src/workflow-paths.js +29 -0
- package/dist/src/workflow-paths.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FilePatch, PinEvidence, PinActionsConfig } from "./types.js";
|
|
2
|
+
export interface RunFingerprint {
|
|
3
|
+
toolVersion: string;
|
|
4
|
+
configHash: string;
|
|
5
|
+
fingerprint: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildRunFingerprint(config: PinActionsConfig, toolVersion: string): RunFingerprint;
|
|
8
|
+
export declare function collectEvidence(patches: FilePatch[]): PinEvidence[];
|
|
9
|
+
export declare function formatEvidence(patches: FilePatch[]): string;
|
|
10
|
+
export declare function formatFingerprint(fingerprint: RunFingerprint): string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { toDisplayPath } from "./workflow-paths.js";
|
|
3
|
+
export function buildRunFingerprint(config, toolVersion) {
|
|
4
|
+
const configHash = sha256(stableStringify(config));
|
|
5
|
+
const fingerprint = sha256(`${toolVersion}\n${configHash}`);
|
|
6
|
+
return {
|
|
7
|
+
toolVersion,
|
|
8
|
+
configHash,
|
|
9
|
+
fingerprint
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function collectEvidence(patches) {
|
|
13
|
+
const evidence = patches.flatMap((patch) => patch.evidence);
|
|
14
|
+
// Sort evidence by workflow path, line number, and ref for deterministic output
|
|
15
|
+
return evidence.sort((a, b) => {
|
|
16
|
+
const pathCmp = a.filePath.localeCompare(b.filePath);
|
|
17
|
+
if (pathCmp !== 0)
|
|
18
|
+
return pathCmp;
|
|
19
|
+
return a.line - b.line;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function formatEvidence(patches) {
|
|
23
|
+
const evidence = collectEvidence(patches);
|
|
24
|
+
if (evidence.length === 0) {
|
|
25
|
+
return "- (none)";
|
|
26
|
+
}
|
|
27
|
+
return evidence.map(formatEvidenceEntry).join("\n");
|
|
28
|
+
}
|
|
29
|
+
export function formatFingerprint(fingerprint) {
|
|
30
|
+
return [
|
|
31
|
+
`- Tool version: \`${fingerprint.toolVersion}\``,
|
|
32
|
+
`- Config hash: \`${fingerprint.configHash}\``,
|
|
33
|
+
`- Run fingerprint: \`${fingerprint.fingerprint}\``
|
|
34
|
+
].join("\n");
|
|
35
|
+
}
|
|
36
|
+
function formatEvidenceEntry(entry) {
|
|
37
|
+
return `- ${toDisplayPath(entry.filePath)}:${entry.line} ${entry.originalRef} -> ${entry.resolvedSha} (source=${entry.sourceRepo}, method=${entry.resolutionMethod}, resolvedAt=${entry.resolvedAt})`;
|
|
38
|
+
}
|
|
39
|
+
function stableStringify(value) {
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
return `[${value.map((item) => stableStringify(item)).join(",")}]`;
|
|
42
|
+
}
|
|
43
|
+
if (value && typeof value === "object") {
|
|
44
|
+
const entries = Object.entries(value)
|
|
45
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
46
|
+
.map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`);
|
|
47
|
+
return `{${entries.join(",")}}`;
|
|
48
|
+
}
|
|
49
|
+
return JSON.stringify(value);
|
|
50
|
+
}
|
|
51
|
+
function sha256(value) {
|
|
52
|
+
return createHash("sha256").update(value).digest("hex");
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ActionReference, ResolutionResult } from "./types.js";
|
|
2
|
+
export interface CommitLookupClient {
|
|
3
|
+
repos: {
|
|
4
|
+
getCommit: (args: {
|
|
5
|
+
owner: string;
|
|
6
|
+
repo: string;
|
|
7
|
+
ref: string;
|
|
8
|
+
}) => Promise<{
|
|
9
|
+
data: {
|
|
10
|
+
sha: string;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface ResolverOptions {
|
|
16
|
+
token?: string;
|
|
17
|
+
apiBaseUrl?: string;
|
|
18
|
+
useNetrc?: boolean;
|
|
19
|
+
verbose?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function normalizeGithubApiUrl(url?: string): string;
|
|
22
|
+
export declare function buildResolutionKey(reference: Pick<ActionReference, "action" | "ref">): string;
|
|
23
|
+
export declare class ActionResolver {
|
|
24
|
+
private octokit;
|
|
25
|
+
private readonly cache;
|
|
26
|
+
private readonly inFlight;
|
|
27
|
+
private readonly verbose;
|
|
28
|
+
private authMethod;
|
|
29
|
+
private readonly initPromise;
|
|
30
|
+
constructor(token?: string, client?: CommitLookupClient, options?: ResolverOptions);
|
|
31
|
+
private initNetrcAuth;
|
|
32
|
+
private getBaseUrl;
|
|
33
|
+
resolve(reference: ActionReference): Promise<ResolutionResult>;
|
|
34
|
+
private lookupCommit;
|
|
35
|
+
private isRetryable;
|
|
36
|
+
private getDelayMs;
|
|
37
|
+
private delay;
|
|
38
|
+
private getStatus;
|
|
39
|
+
private getCode;
|
|
40
|
+
private getHeader;
|
|
41
|
+
private isSecondaryRateLimit;
|
|
42
|
+
}
|
|
43
|
+
export { AmbiguousRefError, UnresolvedRefError } from "./types.js";
|
|
44
|
+
export { applyNetrcAuth, redactNetrcAuth } from "./netrc-auth.js";
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { Octokit } from "@octokit/rest";
|
|
2
|
+
import { UnresolvedRefError } from "./types.js";
|
|
3
|
+
import { getNetrcCredentials } from "./netrc-auth.js";
|
|
4
|
+
const MAX_ATTEMPTS = 4;
|
|
5
|
+
const BASE_DELAY_MS = 1000;
|
|
6
|
+
const MAX_DELAY_MS = 30_000;
|
|
7
|
+
const SHA_PATTERN = /^[0-9a-f]{40}$/i;
|
|
8
|
+
const RESOLUTION_METHOD = "repos.getCommit";
|
|
9
|
+
export function normalizeGithubApiUrl(url) {
|
|
10
|
+
if (!url) {
|
|
11
|
+
return "https://api.github.com";
|
|
12
|
+
}
|
|
13
|
+
let normalized = url.trim().toLowerCase();
|
|
14
|
+
// Remove trailing slashes
|
|
15
|
+
normalized = normalized.replace(/\/+$/, "");
|
|
16
|
+
// Handle github.com special case
|
|
17
|
+
if (normalized === "https://github.com" || normalized === "github.com") {
|
|
18
|
+
return "https://api.github.com";
|
|
19
|
+
}
|
|
20
|
+
// If it's an enterprise URL without /api/v3, add it
|
|
21
|
+
// Extract the hostname to check precisely (avoid substring false matches like evil.api.github.com)
|
|
22
|
+
const hostname = normalized.replace(/^https?:\/\//, "").split("/")[0];
|
|
23
|
+
if (!normalized.includes("/api/v3") && hostname !== "api.github.com") {
|
|
24
|
+
normalized = `${normalized}/api/v3`;
|
|
25
|
+
}
|
|
26
|
+
// Ensure https://
|
|
27
|
+
if (!normalized.startsWith("https://")) {
|
|
28
|
+
normalized = `https://${normalized}`;
|
|
29
|
+
}
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
export function buildResolutionKey(reference) {
|
|
33
|
+
return `${reference.action}@${reference.ref}`;
|
|
34
|
+
}
|
|
35
|
+
export class ActionResolver {
|
|
36
|
+
octokit;
|
|
37
|
+
cache = new Map();
|
|
38
|
+
inFlight = new Map();
|
|
39
|
+
verbose;
|
|
40
|
+
authMethod;
|
|
41
|
+
initPromise;
|
|
42
|
+
constructor(token, client, options) {
|
|
43
|
+
this.verbose = options?.verbose ?? false;
|
|
44
|
+
this.authMethod = "anonymous";
|
|
45
|
+
if (client) {
|
|
46
|
+
this.octokit = client;
|
|
47
|
+
this.initPromise = Promise.resolve();
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const apiBaseUrl = normalizeGithubApiUrl(options?.apiBaseUrl);
|
|
51
|
+
if (token) {
|
|
52
|
+
this.octokit = new Octokit({ auth: token, baseUrl: apiBaseUrl });
|
|
53
|
+
this.authMethod = "token";
|
|
54
|
+
this.initPromise = Promise.resolve();
|
|
55
|
+
}
|
|
56
|
+
else if (options?.useNetrc) {
|
|
57
|
+
this.authMethod = "netrc";
|
|
58
|
+
// Placeholder until init resolves; initNetrcAuth will replace this with an authenticated client
|
|
59
|
+
this.octokit = new Octokit({ baseUrl: apiBaseUrl });
|
|
60
|
+
this.initPromise = this.initNetrcAuth(apiBaseUrl);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.octokit = new Octokit({ baseUrl: apiBaseUrl });
|
|
64
|
+
this.authMethod = "anonymous (rate-limited)";
|
|
65
|
+
this.initPromise = Promise.resolve();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (this.verbose) {
|
|
69
|
+
console.log(`GitHub API base URL: ${this.getBaseUrl()}`);
|
|
70
|
+
console.log(`Authentication method: ${this.authMethod}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async initNetrcAuth(apiBaseUrl) {
|
|
74
|
+
const host = new URL(apiBaseUrl).hostname;
|
|
75
|
+
const creds = await getNetrcCredentials(host);
|
|
76
|
+
if (creds) {
|
|
77
|
+
this.octokit = new Octokit({
|
|
78
|
+
auth: `${creds.login}:${creds.password}`,
|
|
79
|
+
baseUrl: apiBaseUrl
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.authMethod = "anonymous (rate-limited)";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
getBaseUrl() {
|
|
87
|
+
const octokit = this.octokit;
|
|
88
|
+
return octokit.request?.endpoint?.baseUrl ?? "https://api.github.com";
|
|
89
|
+
}
|
|
90
|
+
async resolve(reference) {
|
|
91
|
+
await this.initPromise;
|
|
92
|
+
if (!reference.ref) {
|
|
93
|
+
throw new Error(`Cannot resolve missing ref for ${reference.raw}`);
|
|
94
|
+
}
|
|
95
|
+
if (reference.kind !== "tag-or-branch" || SHA_PATTERN.test(reference.ref)) {
|
|
96
|
+
throw new Error(`Cannot resolve non-resolvable ref for ${reference.raw}`);
|
|
97
|
+
}
|
|
98
|
+
const cacheKey = buildResolutionKey(reference);
|
|
99
|
+
const existing = this.cache.get(cacheKey);
|
|
100
|
+
if (existing) {
|
|
101
|
+
return existing;
|
|
102
|
+
}
|
|
103
|
+
const pending = this.inFlight.get(cacheKey);
|
|
104
|
+
if (pending) {
|
|
105
|
+
return pending;
|
|
106
|
+
}
|
|
107
|
+
const [owner, repo] = reference.action.split("/");
|
|
108
|
+
if (!owner || !repo) {
|
|
109
|
+
throw new Error(`Invalid action slug: ${reference.action}`);
|
|
110
|
+
}
|
|
111
|
+
const lookup = this.lookupCommit(owner, repo, reference.ref, cacheKey);
|
|
112
|
+
this.inFlight.set(cacheKey, lookup);
|
|
113
|
+
return lookup.finally(() => {
|
|
114
|
+
this.inFlight.delete(cacheKey);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async lookupCommit(owner, repo, ref, cacheKey) {
|
|
118
|
+
let lastError;
|
|
119
|
+
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt += 1) {
|
|
120
|
+
try {
|
|
121
|
+
const commit = await this.octokit.repos.getCommit({
|
|
122
|
+
owner,
|
|
123
|
+
repo,
|
|
124
|
+
ref
|
|
125
|
+
});
|
|
126
|
+
const result = {
|
|
127
|
+
original: `${owner}/${repo}@${ref}`,
|
|
128
|
+
sha: commit.data.sha,
|
|
129
|
+
comment: ref,
|
|
130
|
+
sourceRepo: `${owner}/${repo}`,
|
|
131
|
+
resolutionMethod: RESOLUTION_METHOD,
|
|
132
|
+
resolvedAt: new Date().toISOString()
|
|
133
|
+
};
|
|
134
|
+
this.cache.set(cacheKey, result);
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
lastError = error;
|
|
139
|
+
const status = this.getStatus(error);
|
|
140
|
+
// Handle authentication errors
|
|
141
|
+
if (status === 401) {
|
|
142
|
+
const message = this.authMethod === "netrc"
|
|
143
|
+
? "Authentication failed with netrc credentials. Check machine entry in ~/.netrc"
|
|
144
|
+
: "Invalid or expired token. Check PIN_ACTIONS_TOKEN or CLI --token";
|
|
145
|
+
throw new Error(message);
|
|
146
|
+
}
|
|
147
|
+
if (attempt >= MAX_ATTEMPTS - 1 || !this.isRetryable(error)) {
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
await this.delay(this.getDelayMs(error, attempt));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
throw new UnresolvedRefError(`${owner}/${repo}@${ref}`, MAX_ATTEMPTS, MAX_ATTEMPTS, lastError instanceof Error ? lastError.message : String(lastError));
|
|
154
|
+
}
|
|
155
|
+
isRetryable(error) {
|
|
156
|
+
const status = this.getStatus(error);
|
|
157
|
+
if (status === 429 || status === 502 || status === 503 || status === 504) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
if (status === 403 && this.isSecondaryRateLimit(error)) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
if (typeof status === "number" && status >= 500 && status <= 599) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
const code = this.getCode(error);
|
|
167
|
+
return code === "ECONNRESET" || code === "ETIMEDOUT" || code === "EAI_AGAIN";
|
|
168
|
+
}
|
|
169
|
+
getDelayMs(error, attempt) {
|
|
170
|
+
const retryAfter = this.getHeader(error, "retry-after");
|
|
171
|
+
if (retryAfter) {
|
|
172
|
+
const seconds = Number(retryAfter);
|
|
173
|
+
if (Number.isFinite(seconds) && seconds > 0) {
|
|
174
|
+
return Math.min(seconds * 1000, MAX_DELAY_MS);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const reset = this.getHeader(error, "x-ratelimit-reset");
|
|
178
|
+
if (reset) {
|
|
179
|
+
const resetAt = Number(reset) * 1000;
|
|
180
|
+
if (Number.isFinite(resetAt) && resetAt > Date.now()) {
|
|
181
|
+
return Math.min(resetAt - Date.now() + 250, MAX_DELAY_MS);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return Math.min(BASE_DELAY_MS * 2 ** attempt, MAX_DELAY_MS);
|
|
185
|
+
}
|
|
186
|
+
async delay(ms) {
|
|
187
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
188
|
+
}
|
|
189
|
+
getStatus(error) {
|
|
190
|
+
if (!error || typeof error !== "object") {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
const status = error.status;
|
|
194
|
+
return typeof status === "number" ? status : undefined;
|
|
195
|
+
}
|
|
196
|
+
getCode(error) {
|
|
197
|
+
if (!error || typeof error !== "object") {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
const code = error.code;
|
|
201
|
+
return typeof code === "string" ? code : undefined;
|
|
202
|
+
}
|
|
203
|
+
getHeader(error, name) {
|
|
204
|
+
if (!error || typeof error !== "object") {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
const headers = error.response
|
|
208
|
+
?.headers;
|
|
209
|
+
const value = headers?.[name.toLowerCase()];
|
|
210
|
+
if (typeof value === "string") {
|
|
211
|
+
return value;
|
|
212
|
+
}
|
|
213
|
+
if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
|
|
214
|
+
return value[0];
|
|
215
|
+
}
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
isSecondaryRateLimit(error) {
|
|
219
|
+
if (!(error instanceof Error)) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
return /secondary rate limit/i.test(error.message);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
export { AmbiguousRefError, UnresolvedRefError } from "./types.js";
|
|
226
|
+
export { applyNetrcAuth, redactNetrcAuth } from "./netrc-auth.js";
|
|
227
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ActionReference, ScanResult } from "./types.js";
|
|
2
|
+
export declare function scanWorkflows(includePatterns?: string[], cwd?: string, options?: {
|
|
3
|
+
excludePatterns?: string[];
|
|
4
|
+
includeActions?: string[];
|
|
5
|
+
excludeActions?: string[];
|
|
6
|
+
}): Promise<ScanResult>;
|
|
7
|
+
export declare function buildScanResult(references: ActionReference[], filesScanned: number): ScanResult;
|
|
8
|
+
export declare function extractActionReferences(filePath: string, content: string): ActionReference[];
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import fg from "fast-glob";
|
|
3
|
+
import { matchesAnyPattern } from "./pattern-match.js";
|
|
4
|
+
import { resolveWorkflowPatterns } from "./workflow-paths.js";
|
|
5
|
+
const SHA_PATTERN = /^[0-9a-f]{40}$/i;
|
|
6
|
+
export async function scanWorkflows(includePatterns = [], cwd = process.cwd(), options = {}) {
|
|
7
|
+
const files = await fg(resolveWorkflowPatterns(includePatterns), {
|
|
8
|
+
cwd,
|
|
9
|
+
absolute: true,
|
|
10
|
+
onlyFiles: true,
|
|
11
|
+
dot: true,
|
|
12
|
+
ignore: options.excludePatterns ?? []
|
|
13
|
+
});
|
|
14
|
+
const references = [];
|
|
15
|
+
// Sort files for deterministic traversal
|
|
16
|
+
const sortedFiles = files.sort();
|
|
17
|
+
for (const filePath of sortedFiles) {
|
|
18
|
+
const content = await readFile(filePath, "utf8");
|
|
19
|
+
references.push(...extractActionReferences(filePath, content));
|
|
20
|
+
}
|
|
21
|
+
const filteredReferences = references
|
|
22
|
+
.filter((reference) => {
|
|
23
|
+
if (options.includeActions &&
|
|
24
|
+
options.includeActions.length > 0 &&
|
|
25
|
+
!matchesActionPattern(reference.action, options.includeActions)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
if (options.excludeActions &&
|
|
29
|
+
options.excludeActions.length > 0 &&
|
|
30
|
+
matchesActionPattern(reference.action, options.excludeActions)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
});
|
|
35
|
+
return buildScanResult(filteredReferences, sortedFiles.length);
|
|
36
|
+
}
|
|
37
|
+
export function buildScanResult(references, filesScanned) {
|
|
38
|
+
// Sort references by file path and then by line number for deterministic output
|
|
39
|
+
const sortedReferences = references.sort((a, b) => {
|
|
40
|
+
const pathCmp = a.filePath.localeCompare(b.filePath);
|
|
41
|
+
if (pathCmp !== 0)
|
|
42
|
+
return pathCmp;
|
|
43
|
+
return a.line - b.line;
|
|
44
|
+
});
|
|
45
|
+
const unpinned = sortedReferences
|
|
46
|
+
.filter((r) => r.kind === "tag-or-branch")
|
|
47
|
+
.sort((a, b) => {
|
|
48
|
+
const pathCmp = a.filePath.localeCompare(b.filePath);
|
|
49
|
+
if (pathCmp !== 0)
|
|
50
|
+
return pathCmp;
|
|
51
|
+
return a.line - b.line;
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
summary: {
|
|
55
|
+
filesScanned,
|
|
56
|
+
referencesFound: sortedReferences.length,
|
|
57
|
+
unpinnedFound: unpinned.length
|
|
58
|
+
},
|
|
59
|
+
references: sortedReferences,
|
|
60
|
+
unpinned
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function extractActionReferences(filePath, content) {
|
|
64
|
+
const lines = content.split(/\r?\n/);
|
|
65
|
+
const references = [];
|
|
66
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
67
|
+
const line = lines[index];
|
|
68
|
+
const match = line.match(/^\s*-?\s*uses:\s*(['"]?)([^'"#\s]+)\1/);
|
|
69
|
+
if (!match) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const raw = match[2];
|
|
73
|
+
const parsed = parseActionRef(raw);
|
|
74
|
+
references.push({
|
|
75
|
+
filePath,
|
|
76
|
+
line: index + 1,
|
|
77
|
+
column: match[0].indexOf("uses:") + 1,
|
|
78
|
+
raw,
|
|
79
|
+
action: parsed.action,
|
|
80
|
+
ref: parsed.ref,
|
|
81
|
+
kind: classifyActionRef(raw, parsed.ref)
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return references;
|
|
85
|
+
}
|
|
86
|
+
function matchesActionPattern(action, patterns) {
|
|
87
|
+
return patterns.some((pattern) => {
|
|
88
|
+
const normalizedPattern = pattern.trim();
|
|
89
|
+
if (!normalizedPattern) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// If only a repository name is provided (e.g. "cache"), match against the repo segment.
|
|
93
|
+
const target = normalizedPattern.includes("/") ? action : action.split("/")[1] ?? action;
|
|
94
|
+
return matchesAnyPattern(target, [normalizedPattern], { caseInsensitive: true });
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function parseActionRef(raw) {
|
|
98
|
+
if (raw.startsWith("docker://")) {
|
|
99
|
+
return { action: raw };
|
|
100
|
+
}
|
|
101
|
+
if (raw.startsWith("./")) {
|
|
102
|
+
return { action: raw };
|
|
103
|
+
}
|
|
104
|
+
const separator = raw.lastIndexOf("@");
|
|
105
|
+
if (separator === -1) {
|
|
106
|
+
return { action: raw };
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
action: raw.slice(0, separator),
|
|
110
|
+
ref: raw.slice(separator + 1)
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function classifyActionRef(raw, ref) {
|
|
114
|
+
if (raw.startsWith("docker://")) {
|
|
115
|
+
return "docker";
|
|
116
|
+
}
|
|
117
|
+
if (raw.startsWith("./")) {
|
|
118
|
+
return "local";
|
|
119
|
+
}
|
|
120
|
+
if (!raw.includes("@") || !ref) {
|
|
121
|
+
return "invalid";
|
|
122
|
+
}
|
|
123
|
+
if (SHA_PATTERN.test(ref)) {
|
|
124
|
+
return "pinned-sha";
|
|
125
|
+
}
|
|
126
|
+
return "tag-or-branch";
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scanner.ts"],"names":[],"mappings":"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"}
|