actions-up 1.1.0 → 1.1.1
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/core/api/client.d.ts +5 -4
- package/dist/core/api/client.js +55 -51
- package/dist/package.js +1 -1
- package/package.json +1 -2
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/** Processed release information with normalized types. */
|
|
2
1
|
interface ReleaseInfo {
|
|
3
2
|
/** Release description or null if not provided. */
|
|
4
3
|
description: string | null;
|
|
@@ -19,18 +18,19 @@ interface ReleaseInfo {
|
|
|
19
18
|
interface TagInfo {
|
|
20
19
|
/** Tag or commit message, null if not provided. */
|
|
21
20
|
message: string | null;
|
|
21
|
+
/** Git commit SHA that this tag points to. */
|
|
22
|
+
sha: string | null;
|
|
22
23
|
/** Date when the tag was created or committed. */
|
|
23
24
|
date: Date | null;
|
|
24
25
|
/** Tag name (e.g., 'v1.2.3'). */
|
|
25
26
|
tag: string;
|
|
26
|
-
/** Git commit SHA that this tag points to. */
|
|
27
|
-
sha: string;
|
|
28
27
|
}
|
|
29
28
|
/** GitHub REST API client with optional authentication. */
|
|
30
29
|
export declare class Client {
|
|
30
|
+
private readonly baseUrl;
|
|
31
|
+
private readonly token;
|
|
31
32
|
private rateLimitReset;
|
|
32
33
|
private rateLimitRemaining;
|
|
33
|
-
private readonly octokit;
|
|
34
34
|
/**
|
|
35
35
|
* Creates a new GitHub API client.
|
|
36
36
|
*
|
|
@@ -75,6 +75,7 @@ export declare class Client {
|
|
|
75
75
|
* @returns True if rate limit is below threshold.
|
|
76
76
|
*/
|
|
77
77
|
shouldWaitForRateLimit(threshold?: number): boolean;
|
|
78
|
+
private makeRequest;
|
|
78
79
|
private updateRateLimitInfo;
|
|
79
80
|
}
|
|
80
81
|
export {};
|
package/dist/core/api/client.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Octokit } from "@octokit/rest";
|
|
2
1
|
var GitHubRateLimitError = class extends Error {
|
|
3
2
|
constructor(resetAt) {
|
|
4
3
|
let resetTime = resetAt.toLocaleTimeString();
|
|
@@ -7,14 +6,14 @@ var GitHubRateLimitError = class extends Error {
|
|
|
7
6
|
}
|
|
8
7
|
};
|
|
9
8
|
var Client = class Client {
|
|
9
|
+
baseUrl = "https://api.github.com";
|
|
10
|
+
token;
|
|
10
11
|
rateLimitReset = /* @__PURE__ */ new Date();
|
|
11
12
|
rateLimitRemaining = 60;
|
|
12
|
-
octokit;
|
|
13
13
|
constructor(token) {
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
|
|
17
|
-
this.rateLimitRemaining = authToken ? 5e3 : 60;
|
|
14
|
+
this.token = token ?? process.env["GITHUB_TOKEN"];
|
|
15
|
+
if (!this.token) console.warn("No GitHub token found. API rate limits will be restricted.");
|
|
16
|
+
this.rateLimitRemaining = this.token ? 5e3 : 60;
|
|
18
17
|
}
|
|
19
18
|
static isRateLimitError(error) {
|
|
20
19
|
if (error && typeof error === "object") {
|
|
@@ -29,19 +28,12 @@ var Client = class Client {
|
|
|
29
28
|
try {
|
|
30
29
|
let displayTag = tag.replace(/^refs\/tags\//u, "");
|
|
31
30
|
try {
|
|
32
|
-
let
|
|
33
|
-
|
|
34
|
-
owner,
|
|
35
|
-
repo
|
|
36
|
-
});
|
|
37
|
-
this.updateRateLimitInfo(releaseHeaders);
|
|
31
|
+
let releaseResp = await this.makeRequest(`/repos/${owner}/${repo}/releases/tags/${displayTag}`);
|
|
32
|
+
let releaseData = releaseResp.data;
|
|
38
33
|
let sha = null;
|
|
39
34
|
if (releaseData.target_commitish) try {
|
|
40
|
-
let
|
|
41
|
-
|
|
42
|
-
owner,
|
|
43
|
-
repo
|
|
44
|
-
});
|
|
35
|
+
let commitResp = await this.makeRequest(`/repos/${owner}/${repo}/commits/${releaseData.target_commitish}`);
|
|
36
|
+
let commitData = commitResp.data;
|
|
45
37
|
({sha} = commitData);
|
|
46
38
|
} catch {
|
|
47
39
|
sha = releaseData.target_commitish;
|
|
@@ -53,32 +45,22 @@ var Client = class Client {
|
|
|
53
45
|
tag: displayTag
|
|
54
46
|
};
|
|
55
47
|
} catch (releaseError) {
|
|
56
|
-
if (releaseError
|
|
57
|
-
let
|
|
58
|
-
|
|
59
|
-
owner,
|
|
60
|
-
repo
|
|
61
|
-
});
|
|
62
|
-
this.updateRateLimitInfo(referenceHeaders);
|
|
48
|
+
if (releaseError && typeof releaseError === "object" && "status" in releaseError && releaseError.status === 404) try {
|
|
49
|
+
let referenceResp = await this.makeRequest(`/repos/${owner}/${repo}/git/refs/tags/${displayTag}`);
|
|
50
|
+
let referenceData = referenceResp.data;
|
|
63
51
|
let { sha } = referenceData.object;
|
|
64
52
|
let message = null;
|
|
65
53
|
let date = null;
|
|
66
54
|
if (referenceData.object.type === "tag") try {
|
|
67
|
-
let
|
|
68
|
-
|
|
69
|
-
owner,
|
|
70
|
-
repo
|
|
71
|
-
});
|
|
55
|
+
let tagResp = await this.makeRequest(`/repos/${owner}/${repo}/git/tags/${sha}`);
|
|
56
|
+
let tagData = tagResp.data;
|
|
72
57
|
({sha} = tagData.object);
|
|
73
|
-
message = tagData
|
|
58
|
+
({message} = tagData);
|
|
74
59
|
date = tagData.tagger.date ? new Date(tagData.tagger.date) : null;
|
|
75
60
|
} catch {}
|
|
76
|
-
else
|
|
77
|
-
let
|
|
78
|
-
|
|
79
|
-
owner,
|
|
80
|
-
repo
|
|
81
|
-
});
|
|
61
|
+
else try {
|
|
62
|
+
let commitResp = await this.makeRequest(`/repos/${owner}/${repo}/git/commits/${sha}`);
|
|
63
|
+
let commitData = commitResp.data;
|
|
82
64
|
({message} = commitData);
|
|
83
65
|
date = commitData.author.date ? new Date(commitData.author.date) : null;
|
|
84
66
|
} catch {}
|
|
@@ -89,7 +71,7 @@ var Client = class Client {
|
|
|
89
71
|
sha
|
|
90
72
|
};
|
|
91
73
|
} catch (tagError) {
|
|
92
|
-
if (tagError
|
|
74
|
+
if (tagError && typeof tagError === "object" && "status" in tagError && tagError.status === 404) return null;
|
|
93
75
|
throw tagError;
|
|
94
76
|
}
|
|
95
77
|
throw releaseError;
|
|
@@ -101,12 +83,8 @@ var Client = class Client {
|
|
|
101
83
|
}
|
|
102
84
|
async getAllReleases(owner, repo, limit = 10) {
|
|
103
85
|
try {
|
|
104
|
-
let
|
|
105
|
-
|
|
106
|
-
owner,
|
|
107
|
-
repo
|
|
108
|
-
});
|
|
109
|
-
this.updateRateLimitInfo(headers);
|
|
86
|
+
let releasesResp = await this.makeRequest(`/repos/${owner}/${repo}/releases?per_page=${limit}`);
|
|
87
|
+
let releases = releasesResp.data;
|
|
110
88
|
let releaseInfos = [];
|
|
111
89
|
await Promise.all(releases.map(async (release) => {
|
|
112
90
|
let sha = null;
|
|
@@ -114,7 +92,7 @@ var Client = class Client {
|
|
|
114
92
|
let tagInfo = await this.getTagInfo(owner, repo, release.tag_name);
|
|
115
93
|
if (tagInfo) ({sha} = tagInfo);
|
|
116
94
|
} catch {
|
|
117
|
-
sha = release.target_commitish
|
|
95
|
+
sha = release.target_commitish;
|
|
118
96
|
}
|
|
119
97
|
releaseInfos.push({
|
|
120
98
|
publishedAt: new Date(release.published_at),
|
|
@@ -134,17 +112,14 @@ var Client = class Client {
|
|
|
134
112
|
}
|
|
135
113
|
async getLatestRelease(owner, repo) {
|
|
136
114
|
try {
|
|
137
|
-
let
|
|
138
|
-
|
|
139
|
-
repo
|
|
140
|
-
});
|
|
141
|
-
this.updateRateLimitInfo(headers);
|
|
115
|
+
let releaseResp = await this.makeRequest(`/repos/${owner}/${repo}/releases/latest`);
|
|
116
|
+
let release = releaseResp.data;
|
|
142
117
|
let sha = null;
|
|
143
118
|
if (release.tag_name) try {
|
|
144
119
|
let tagInfo = await this.getTagInfo(owner, repo, release.tag_name);
|
|
145
120
|
if (tagInfo) ({sha} = tagInfo);
|
|
146
121
|
} catch {
|
|
147
|
-
sha = release.target_commitish
|
|
122
|
+
sha = release.target_commitish;
|
|
148
123
|
}
|
|
149
124
|
return {
|
|
150
125
|
publishedAt: new Date(release.published_at),
|
|
@@ -156,7 +131,7 @@ var Client = class Client {
|
|
|
156
131
|
sha
|
|
157
132
|
};
|
|
158
133
|
} catch (error) {
|
|
159
|
-
if (error
|
|
134
|
+
if (error && typeof error === "object" && "status" in error && error.status === 404) return null;
|
|
160
135
|
if (Client.isRateLimitError(error)) throw new GitHubRateLimitError(this.rateLimitReset);
|
|
161
136
|
throw error;
|
|
162
137
|
}
|
|
@@ -170,6 +145,35 @@ var Client = class Client {
|
|
|
170
145
|
shouldWaitForRateLimit(threshold = 100) {
|
|
171
146
|
return this.rateLimitRemaining < threshold;
|
|
172
147
|
}
|
|
148
|
+
async makeRequest(path, options = {}) {
|
|
149
|
+
let headers = {
|
|
150
|
+
Accept: "application/vnd.github.v3+json",
|
|
151
|
+
"User-Agent": "actions-up",
|
|
152
|
+
...options.headers
|
|
153
|
+
};
|
|
154
|
+
if (this.token) headers["Authorization"] = `Bearer ${this.token}`;
|
|
155
|
+
let response = await fetch(`${this.baseUrl}${path}`, {
|
|
156
|
+
...options,
|
|
157
|
+
headers
|
|
158
|
+
});
|
|
159
|
+
let responseHeaders = {};
|
|
160
|
+
for (let [key, value] of response.headers.entries()) responseHeaders[key] = value;
|
|
161
|
+
this.updateRateLimitInfo(responseHeaders);
|
|
162
|
+
if (!response.ok) {
|
|
163
|
+
let error = /* @__PURE__ */ new Error(`GitHub API error: ${response.status} ${response.statusText}`);
|
|
164
|
+
error.status = response.status;
|
|
165
|
+
if (response.status === 403) {
|
|
166
|
+
let text = await response.text();
|
|
167
|
+
if (text.includes("rate limit") || text.includes("API rate limit")) error.message = "API rate limit exceeded";
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
let data = await response.json();
|
|
172
|
+
return {
|
|
173
|
+
headers: responseHeaders,
|
|
174
|
+
data
|
|
175
|
+
};
|
|
176
|
+
}
|
|
173
177
|
updateRateLimitInfo(headers) {
|
|
174
178
|
let remaining = headers["x-ratelimit-remaining"];
|
|
175
179
|
if (remaining !== void 0) this.rateLimitRemaining = typeof remaining === "string" ? Number.parseInt(remaining, 10) : remaining;
|
package/dist/package.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const version = "1.1.
|
|
1
|
+
const version = "1.1.1";
|
|
2
2
|
export { version };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "actions-up",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Interactive CLI tool to update GitHub Actions to latest versions with SHA pinning",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"github-actions",
|
|
@@ -36,7 +36,6 @@
|
|
|
36
36
|
"./dist"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@octokit/rest": "^22.0.0",
|
|
40
39
|
"cac": "^6.7.14",
|
|
41
40
|
"enquirer": "^2.4.1",
|
|
42
41
|
"nanospinner": "^1.2.2",
|