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,170 @@
|
|
|
1
|
+
export type ScanMode = "scan" | "fix" | "enforce" | "pr";
|
|
2
|
+
export interface PRConfig {
|
|
3
|
+
create: boolean;
|
|
4
|
+
branchPrefix: string;
|
|
5
|
+
title: string;
|
|
6
|
+
labels: string[];
|
|
7
|
+
reviewers: string[];
|
|
8
|
+
assignees: string[];
|
|
9
|
+
bodyTemplate?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface EnforcementConfig {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
failOnUnpinned: boolean;
|
|
14
|
+
allowActions: string[];
|
|
15
|
+
exceptions: EnforcementException[];
|
|
16
|
+
}
|
|
17
|
+
export interface EnforcementException {
|
|
18
|
+
action: string;
|
|
19
|
+
ref?: string;
|
|
20
|
+
workflow?: string;
|
|
21
|
+
reason?: string;
|
|
22
|
+
justification?: string;
|
|
23
|
+
expiresAt?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface DependabotConfig {
|
|
26
|
+
addVersionComments: boolean;
|
|
27
|
+
commentFormat: string;
|
|
28
|
+
generateConfigSnippet: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface OrgConfig {
|
|
31
|
+
name?: string;
|
|
32
|
+
type?: "org" | "user";
|
|
33
|
+
includePrivate: boolean;
|
|
34
|
+
includeArchived: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface PinActionsConfig {
|
|
37
|
+
mode: ScanMode;
|
|
38
|
+
include: string[];
|
|
39
|
+
exclude: string[];
|
|
40
|
+
repos: string[];
|
|
41
|
+
includeRepos: string[];
|
|
42
|
+
excludeActions: string[];
|
|
43
|
+
excludeRepos: string[];
|
|
44
|
+
org: OrgConfig;
|
|
45
|
+
pr: PRConfig;
|
|
46
|
+
enforcement: EnforcementConfig;
|
|
47
|
+
dependabot: DependabotConfig;
|
|
48
|
+
githubApiUrl?: string;
|
|
49
|
+
useNetrc?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export type ActionRefKind = "pinned-sha" | "tag-or-branch" | "local" | "docker" | "invalid";
|
|
52
|
+
export interface ActionReference {
|
|
53
|
+
filePath: string;
|
|
54
|
+
line: number;
|
|
55
|
+
column?: number;
|
|
56
|
+
raw: string;
|
|
57
|
+
action: string;
|
|
58
|
+
ref?: string;
|
|
59
|
+
kind: ActionRefKind;
|
|
60
|
+
}
|
|
61
|
+
export interface ResolutionResult {
|
|
62
|
+
original: string;
|
|
63
|
+
sha: string;
|
|
64
|
+
comment: string;
|
|
65
|
+
sourceRepo: string;
|
|
66
|
+
resolutionMethod: string;
|
|
67
|
+
resolvedAt: string;
|
|
68
|
+
}
|
|
69
|
+
export interface PinEvidence {
|
|
70
|
+
filePath: string;
|
|
71
|
+
line: number;
|
|
72
|
+
originalRef: string;
|
|
73
|
+
resolvedSha: string;
|
|
74
|
+
sourceRepo: string;
|
|
75
|
+
resolutionMethod: string;
|
|
76
|
+
resolvedAt: string;
|
|
77
|
+
}
|
|
78
|
+
export interface FilePatch {
|
|
79
|
+
filePath: string;
|
|
80
|
+
originalContent: string;
|
|
81
|
+
updatedContent: string;
|
|
82
|
+
referencesUpdated: ActionReference[];
|
|
83
|
+
evidence: PinEvidence[];
|
|
84
|
+
}
|
|
85
|
+
export interface ScanResult {
|
|
86
|
+
summary: ScanSummary;
|
|
87
|
+
references: ActionReference[];
|
|
88
|
+
unpinned: ActionReference[];
|
|
89
|
+
}
|
|
90
|
+
export interface ScanSummary {
|
|
91
|
+
filesScanned: number;
|
|
92
|
+
referencesFound: number;
|
|
93
|
+
unpinnedFound: number;
|
|
94
|
+
}
|
|
95
|
+
export type EnforcementFindingOutcome = "allowed" | "violation";
|
|
96
|
+
export type EnforcementFindingReason = "allowlist" | "exception" | "unpinned" | "expired-exception" | "invalid-exception";
|
|
97
|
+
export type EnforcementExceptionIssueReason = "expired" | "invalid-action" | "invalid-ref" | "invalid-workflow" | "invalid-expiry";
|
|
98
|
+
export interface EnforcementFinding extends ActionReference {
|
|
99
|
+
outcome: EnforcementFindingOutcome;
|
|
100
|
+
reason: EnforcementFindingReason;
|
|
101
|
+
message: string;
|
|
102
|
+
exception?: EnforcementException;
|
|
103
|
+
matchedPattern?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface EnforcementExceptionIssue {
|
|
106
|
+
index: number;
|
|
107
|
+
reason: EnforcementExceptionIssueReason;
|
|
108
|
+
message: string;
|
|
109
|
+
exception: EnforcementException;
|
|
110
|
+
}
|
|
111
|
+
export interface EnforcementSummary extends ScanSummary {
|
|
112
|
+
allowedCount: number;
|
|
113
|
+
violationCount: number;
|
|
114
|
+
invalidExceptionCount: number;
|
|
115
|
+
}
|
|
116
|
+
export interface EnforcementResult {
|
|
117
|
+
summary: EnforcementSummary;
|
|
118
|
+
references: ActionReference[];
|
|
119
|
+
allowed: EnforcementFinding[];
|
|
120
|
+
violations: EnforcementFinding[];
|
|
121
|
+
invalidExceptions: EnforcementExceptionIssue[];
|
|
122
|
+
compliant: boolean;
|
|
123
|
+
}
|
|
124
|
+
export interface MultiRepoEnforcementEntry {
|
|
125
|
+
repository: string;
|
|
126
|
+
defaultBranch: string;
|
|
127
|
+
scan: ScanResult;
|
|
128
|
+
enforcement: EnforcementResult;
|
|
129
|
+
}
|
|
130
|
+
export interface MultiRepoEnforcementResult {
|
|
131
|
+
repositories: MultiRepoEnforcementEntry[];
|
|
132
|
+
summary: {
|
|
133
|
+
repositoriesScanned: number;
|
|
134
|
+
repositoriesWithViolations: number;
|
|
135
|
+
filesScanned: number;
|
|
136
|
+
referencesFound: number;
|
|
137
|
+
unpinnedFound: number;
|
|
138
|
+
allowedCount: number;
|
|
139
|
+
violationCount: number;
|
|
140
|
+
invalidExceptionCount: number;
|
|
141
|
+
};
|
|
142
|
+
invalidExceptions: EnforcementExceptionIssue[];
|
|
143
|
+
compliant: boolean;
|
|
144
|
+
}
|
|
145
|
+
export interface ResolutionErrorDetails {
|
|
146
|
+
ref: string;
|
|
147
|
+
reason: string;
|
|
148
|
+
suggestions?: string[];
|
|
149
|
+
retryDetails?: {
|
|
150
|
+
attempts: number;
|
|
151
|
+
maxAttempts: number;
|
|
152
|
+
lastError?: string;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export declare class AmbiguousRefError extends Error {
|
|
156
|
+
readonly details: ResolutionErrorDetails & {
|
|
157
|
+
matchingShas: Array<{
|
|
158
|
+
sha: string;
|
|
159
|
+
source: string;
|
|
160
|
+
}>;
|
|
161
|
+
};
|
|
162
|
+
constructor(ref: string, matchingShas: Array<{
|
|
163
|
+
sha: string;
|
|
164
|
+
source: string;
|
|
165
|
+
}>);
|
|
166
|
+
}
|
|
167
|
+
export declare class UnresolvedRefError extends Error {
|
|
168
|
+
readonly details: ResolutionErrorDetails;
|
|
169
|
+
constructor(ref: string, attempts: number, maxAttempts: number, lastError?: string);
|
|
170
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class AmbiguousRefError extends Error {
|
|
2
|
+
details;
|
|
3
|
+
constructor(ref, matchingShas) {
|
|
4
|
+
const details = {
|
|
5
|
+
ref,
|
|
6
|
+
reason: "Ambiguous ref resolved to multiple SHAs",
|
|
7
|
+
matchingShas,
|
|
8
|
+
suggestions: [
|
|
9
|
+
"Use pinning logic to explicitly specify the target SHA",
|
|
10
|
+
"Use explicit flags to disambiguate the reference"
|
|
11
|
+
]
|
|
12
|
+
};
|
|
13
|
+
super(`Ambiguous ref: ${ref} resolved to ${matchingShas.length} SHAs`);
|
|
14
|
+
this.name = "AmbiguousRefError";
|
|
15
|
+
this.details = details;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class UnresolvedRefError extends Error {
|
|
19
|
+
details;
|
|
20
|
+
constructor(ref, attempts, maxAttempts, lastError) {
|
|
21
|
+
const details = {
|
|
22
|
+
ref,
|
|
23
|
+
reason: "Could not resolve ref after retries",
|
|
24
|
+
suggestions: [
|
|
25
|
+
"Verify the ref exists in the repository",
|
|
26
|
+
"For private repositories, use a least-privilege token with Contents: Read (or classic repo scope only if fine-grained tokens are not available)",
|
|
27
|
+
"Add Pull requests: Write only when you are using PR creation features",
|
|
28
|
+
"Use --continue-on-error to skip this reference"
|
|
29
|
+
],
|
|
30
|
+
retryDetails: {
|
|
31
|
+
attempts,
|
|
32
|
+
maxAttempts,
|
|
33
|
+
lastError
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
super(`Failed to resolve ${ref} after ${attempts} attempts: ${lastError}`);
|
|
37
|
+
this.name = "UnresolvedRefError";
|
|
38
|
+
this.details = details;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAgMA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1B,OAAO,CAErB;IAEF,YACE,GAAW,EACX,YAAoD;QAEpD,MAAM,OAAO,GAAG;YACd,GAAG;YACH,MAAM,EAAE,yCAAyC;YACjD,YAAY;YACZ,WAAW,EAAE;gBACX,wDAAwD;gBACxD,kDAAkD;aACnD;SACF,CAAC;QACF,KAAK,CAAC,kBAAkB,GAAG,gBAAgB,YAAY,CAAC,MAAM,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3B,OAAO,CAAyB;IAEhD,YAAY,GAAW,EAAE,QAAgB,EAAE,WAAmB,EAAE,SAAkB;QAChF,MAAM,OAAO,GAAG;YACd,GAAG;YACH,MAAM,EAAE,qCAAqC;YAC7C,WAAW,EAAE;gBACX,yCAAyC;gBACzC,iJAAiJ;gBACjJ,uEAAuE;gBACvE,gDAAgD;aACjD;YACD,YAAY,EAAE;gBACZ,QAAQ;gBACR,WAAW;gBACX,SAAS;aACV;SACF,CAAC;QACF,KAAK,CAAC,qBAAqB,GAAG,UAAU,QAAQ,cAAc,SAAS,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getToolVersion(): Promise<string>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
let versionPromise;
|
|
3
|
+
export function getToolVersion() {
|
|
4
|
+
versionPromise ??= readPackageVersion();
|
|
5
|
+
return versionPromise;
|
|
6
|
+
}
|
|
7
|
+
async function readPackageVersion() {
|
|
8
|
+
for (const relativePath of ["../package.json", "../../package.json"]) {
|
|
9
|
+
try {
|
|
10
|
+
const packageJson = await readFile(new URL(relativePath, import.meta.url), "utf8");
|
|
11
|
+
const parsed = JSON.parse(packageJson);
|
|
12
|
+
if (typeof parsed.version === "string" && parsed.version.length > 0) {
|
|
13
|
+
return parsed.version;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Try the next known package.json location.
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
throw new Error("Unable to determine tool version from package.json.");
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,IAAI,cAA2C,CAAC;AAEhD,MAAM,UAAU,cAAc;IAC5B,cAAc,KAAK,kBAAkB,EAAE,CAAC;IACxC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,KAAK,MAAM,YAAY,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA0B,CAAC;YAChE,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpE,OAAO,MAAM,CAAC,OAAO,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const DEFAULT_WORKFLOW_PATTERNS: string[];
|
|
2
|
+
export declare function resolveWorkflowPatterns(inputs?: string[]): string[];
|
|
3
|
+
export declare function normalizeWorkflowPattern(pattern: string): string;
|
|
4
|
+
export declare function toDisplayPath(filePath: string, cwd?: string): string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { relative, sep } from "node:path";
|
|
2
|
+
export const DEFAULT_WORKFLOW_PATTERNS = [
|
|
3
|
+
".github/workflows/**/*.yml",
|
|
4
|
+
".github/workflows/**/*.yaml"
|
|
5
|
+
];
|
|
6
|
+
const GLOB_PATTERN = /[*?[{]/;
|
|
7
|
+
export function resolveWorkflowPatterns(inputs = []) {
|
|
8
|
+
if (inputs.length === 0) {
|
|
9
|
+
return DEFAULT_WORKFLOW_PATTERNS.map(normalizeWorkflowPattern);
|
|
10
|
+
}
|
|
11
|
+
return inputs.flatMap((input) => {
|
|
12
|
+
const normalized = normalizeWorkflowPattern(input);
|
|
13
|
+
if (GLOB_PATTERN.test(normalized) || isWorkflowFile(normalized)) {
|
|
14
|
+
return [normalized];
|
|
15
|
+
}
|
|
16
|
+
const base = normalized.replace(/\/+$/, "");
|
|
17
|
+
return [`${base}/**/*.yml`, `${base}/**/*.yaml`];
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function normalizeWorkflowPattern(pattern) {
|
|
21
|
+
return pattern.replace(/\\/g, "/");
|
|
22
|
+
}
|
|
23
|
+
function isWorkflowFile(path) {
|
|
24
|
+
return path.endsWith(".yml") || path.endsWith(".yaml");
|
|
25
|
+
}
|
|
26
|
+
export function toDisplayPath(filePath, cwd = process.cwd()) {
|
|
27
|
+
return relative(cwd, filePath).split(sep).join("/");
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=workflow-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-paths.js","sourceRoot":"","sources":["../../src/workflow-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,4BAA4B;IAC5B,6BAA6B;CAC9B,CAAC;AAEF,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B,MAAM,UAAU,uBAAuB,CAAC,SAAmB,EAAE;IAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,yBAAyB,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,IAAI,WAAW,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjE,OAAO,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "action-pinner",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Modern, maintained utility for pinning GitHub Actions to commit SHAs.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/src/",
|
|
9
|
+
"dist/index.*",
|
|
10
|
+
"README.md",
|
|
11
|
+
"LICENSE",
|
|
12
|
+
"action.yml"
|
|
13
|
+
],
|
|
14
|
+
"bin": {
|
|
15
|
+
"action-pinner": "dist/src/index.js"
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public",
|
|
19
|
+
"provenance": true
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"prepare": "npm run build",
|
|
23
|
+
"build": "tsc -p tsconfig.json",
|
|
24
|
+
"clean": "rimraf dist",
|
|
25
|
+
"dev": "tsx src/index.ts",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"lint": "tsc --noEmit -p tsconfig.json"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"github-actions",
|
|
34
|
+
"security",
|
|
35
|
+
"supply-chain",
|
|
36
|
+
"dependabot",
|
|
37
|
+
"cli"
|
|
38
|
+
],
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/jongalloway/action-pinner.git"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/jongalloway/action-pinner#readme",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/jongalloway/action-pinner/issues"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@octokit/rest": "^22.0.0",
|
|
50
|
+
"commander": "^14.0.0",
|
|
51
|
+
"fast-glob": "^3.3.3",
|
|
52
|
+
"simple-git": "^3.28.0",
|
|
53
|
+
"yaml": "^2.8.1"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/node": "^24.0.1",
|
|
57
|
+
"rimraf": "^6.0.1",
|
|
58
|
+
"tsx": "^4.20.3",
|
|
59
|
+
"typescript": "^5.8.3",
|
|
60
|
+
"vitest": "^3.2.4"
|
|
61
|
+
}
|
|
62
|
+
}
|