Skip to content

Commit cb36f9e

Browse files
authored
feat: Remove axios (#1040)
1 parent eedb298 commit cb36f9e

File tree

15 files changed

+167
-147
lines changed

15 files changed

+167
-147
lines changed

packages/auto-merge/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"author": "Florian Imdahl <[email protected]>",
33
"bin": "dist/cli.js",
44
"dependencies": {
5-
"axios": "1.13.2",
65
"commander": "14.0.2",
76
"cosmiconfig": "9.0.0",
87
"logdown": "3.3.1"

packages/auto-merge/src/AutoMerge.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,17 @@ describe('AutoMerge', () => {
4949
},
5050
});
5151

52-
nock(autoMerge['apiClient'].defaults.baseURL!)
52+
nock(autoMerge['baseURL']!)
5353
.post(/^\/repos\/.+?\/.+?\/pulls\/\d+\/reviews\/?$/)
5454
.reply(HTTP_STATUS.OK, {data: 'not-used'})
5555
.persist();
5656

57-
nock(autoMerge['apiClient'].defaults.baseURL!)
57+
nock(autoMerge['baseURL']!)
5858
.get(/^\/repos\/.+?\/.+?\/pulls\/\d+\/?$/)
5959
.reply(HTTP_STATUS.OK, {data: 'not-used'})
6060
.persist();
6161

62-
nock(autoMerge['apiClient'].defaults.baseURL!)
62+
nock(autoMerge['baseURL']!)
6363
.put(/^\/repos\/.+?\/.+?\/pulls\/\d+\/merge\/?$/)
6464
.reply(HTTP_STATUS.OK, {data: 'not-used'})
6565
.persist();

packages/auto-merge/src/AutoMerge.ts

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import fs from 'node:fs';
22
import path from 'node:path';
3-
import axios, {AxiosError, AxiosInstance} from 'axios';
43
import logdown from 'logdown';
54

65
import type {AutoMergeConfig, ActionResult, GitHubPullRequest, Repository, RepositoryResult} from './types/index.js';
@@ -17,9 +16,10 @@ const {bin, version: toolVersion}: PackageJson = JSON.parse(fs.readFileSync(pack
1716
const toolName = Object.keys(bin)[0];
1817

1918
export class AutoMerge {
20-
private readonly apiClient: AxiosInstance;
19+
private readonly baseHeaders: Record<string, string>;
2120
private readonly config: AutoMergeConfig;
2221
private readonly logger: logdown.Logger;
22+
private readonly baseURL: string;
2323

2424
constructor(config: AutoMergeConfig) {
2525
this.config = config;
@@ -28,14 +28,12 @@ export class AutoMerge {
2828
markdown: false,
2929
});
3030
this.logger.state.isEnabled = true;
31-
this.apiClient = axios.create({
32-
baseURL: 'https://api.github.com',
33-
headers: {
34-
Accept: 'application/vnd.github+json',
35-
Authorization: `token ${this.config.authToken}`,
36-
'User-Agent': `${toolName} v${toolVersion}`,
37-
},
38-
});
31+
this.baseURL = 'https://api.github.com';
32+
this.baseHeaders = {
33+
Accept: 'application/vnd.github+json',
34+
Authorization: `token ${this.config.authToken}`,
35+
'User-Agent': `${toolName} v${toolVersion}`,
36+
};
3937
this.checkConfig(this.config);
4038
}
4139

@@ -90,9 +88,12 @@ export class AutoMerge {
9088
}
9189

9290
private async isPullRequestMergeable(repositorySlug: string, pullNumber: number): Promise<boolean> {
93-
const resourceUrl = `/repos/${repositorySlug}/pulls/${pullNumber}`;
94-
const response = await this.apiClient.get<GitHubPullRequest>(resourceUrl);
95-
return response.data.mergeable_state === 'clean';
91+
const resourceUrl = new URL(`/repos/${repositorySlug}/pulls/${pullNumber}`, this.baseURL);
92+
const response = await fetch(resourceUrl, {headers: this.baseHeaders});
93+
if (!response.ok) {
94+
throw new Error(`Error while checking merge request: ${response.statusText}`);
95+
}
96+
return (await response.json()).mergeable_state === 'clean';
9697
}
9798

9899
async mergeByMatch(regex: RegExp, repositories?: Repository[]): Promise<RepositoryResult[]> {
@@ -124,11 +125,9 @@ export class AutoMerge {
124125
await this.postReview(repositorySlug, pullNumber);
125126
}
126127
} catch (error) {
127-
this.logger.error(
128-
`Could not approve request #${pullNumber} in "${repositorySlug}": ${(error as AxiosError).message}`
129-
);
128+
this.logger.error(`Could not approve request #${pullNumber} in "${repositorySlug}": ${(error as Error).message}`);
130129
actionResult.status = 'bad';
131-
actionResult.error = (error as AxiosError).toString();
130+
actionResult.error = (error as Error).toString();
132131
}
133132
return actionResult;
134133
}
@@ -142,10 +141,10 @@ export class AutoMerge {
142141
}
143142
} catch (error) {
144143
this.logger.error(
145-
`Could not merge pull request #${pullNumber} in "${repositorySlug}": ${(error as AxiosError).message}`
144+
`Could not merge pull request #${pullNumber} in "${repositorySlug}": ${(error as Error).message}`
146145
);
147146
actionResult.status = 'bad';
148-
actionResult.error = (error as AxiosError).toString();
147+
actionResult.error = (error as Error).toString();
149148
}
150149
return actionResult;
151150
}
@@ -162,7 +161,7 @@ export class AutoMerge {
162161
const pullRequests = await this.getPullRequestsBySlug(repositorySlug);
163162
repositories.push({pullRequests, repositorySlug});
164163
} catch (error) {
165-
this.logger.error(`Could not get pull requests for "${repositorySlug}": ${(error as AxiosError).message}`);
164+
this.logger.error(`Could not get pull requests for "${repositorySlug}": ${(error as Error).message}`);
166165
}
167166
}
168167

@@ -176,20 +175,34 @@ export class AutoMerge {
176175

177176
/** @see https://docs.github.com/en/rest/reference/pulls#create-a-review-for-a-pull-request */
178177
private async postReview(repositorySlug: string, pullNumber: number): Promise<void> {
179-
const resourceUrl = `/repos/${repositorySlug}/pulls/${pullNumber}/reviews`;
180-
await this.apiClient.post(resourceUrl, {event: 'APPROVE'});
178+
const resourceUrl = new URL(`/repos/${repositorySlug}/pulls/${pullNumber}/reviews`, this.baseURL);
179+
resourceUrl.search = new URLSearchParams({event: 'APPROVE'}).toString();
180+
const response = await fetch(resourceUrl, {headers: this.baseHeaders, method: 'POST'});
181+
if (!response.ok) {
182+
throw new Error(`Error while approving pull request: ${response.statusText}`);
183+
}
181184
}
182185

183186
/** @see https://docs.github.com/en/rest/reference/issues#create-an-issue-comment */
184187
private async putMerge(repositorySlug: string, pullNumber: number, squash?: boolean): Promise<void> {
185-
const resourceUrl = `/repos/${repositorySlug}/pulls/${pullNumber}/merge`;
186-
await this.apiClient.put(resourceUrl, squash ? {merge_method: 'squash'} : undefined);
188+
const resourceUrl = new URL(`/repos/${repositorySlug}/pulls/${pullNumber}/merge`, this.baseURL);
189+
if (squash) {
190+
resourceUrl.search = new URLSearchParams({merge_method: 'squash'}).toString();
191+
}
192+
193+
const response = await fetch(resourceUrl, {headers: this.baseHeaders, method: 'PUT'});
194+
if (!response.ok) {
195+
throw new Error(`Error while merging pull request: ${response.statusText}`);
196+
}
187197
}
188198

189199
private async getPullRequestsBySlug(repositorySlug: string): Promise<GitHubPullRequest[]> {
190-
const resourceUrl = `/repos/${repositorySlug}/pulls`;
191-
const params = {per_page: 100, state: 'open'};
192-
const response = await this.apiClient.get<GitHubPullRequest[]>(resourceUrl, {params});
193-
return response.data;
200+
const resourceUrl = new URL(`/repos/${repositorySlug}/pulls`, this.baseURL);
201+
resourceUrl.search = new URLSearchParams({per_page: '100', state: 'open'}).toString();
202+
const response = await fetch(resourceUrl, {headers: this.baseHeaders});
203+
if (!response.ok) {
204+
throw new Error(`Error while fetching pull requests: ${response.statusText}`);
205+
}
206+
return response.json();
194207
}
195208
}

packages/auto-merge/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
"rootDir": "src",
88
"target": "ES2018"
99
},
10-
"exclude": ["dist", "node_modules", "*.test.ts"],
10+
"exclude": ["dist", "node_modules", "**/*.test.ts"],
1111
"extends": "../../tsconfig.json"
1212
}

packages/electron-info/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"author": "Florian Imdahl <[email protected]>",
33
"bin": "dist/cli.js",
44
"dependencies": {
5-
"axios": "1.13.2",
65
"chalk": "5.6.2",
76
"commander": "14.0.2",
87
"date-fns": "4.1.0",

packages/electron-info/src/HTTPService.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import fs from 'node:fs/promises';
22
import {inspect} from 'node:util';
3-
import axios from 'axios';
43
import logdown from 'logdown';
54

65
import type {Options, RawReleaseInfo} from './ElectronInfo.js';
@@ -29,8 +28,11 @@ export class HTTPService {
2928
let releases = [];
3029

3130
try {
32-
const response = await axios.get<RawReleaseInfo[]>(downloadUrl, {timeout: this.options.timeout});
33-
releases = response.data;
31+
const response = await fetch(downloadUrl, {signal: AbortSignal.timeout(this.options.timeout)});
32+
if (!response.ok) {
33+
throw new Error(response.statusText);
34+
}
35+
releases = (await response.json()) as RawReleaseInfo[];
3436
} catch (error) {
3537
throw new Error(`Request failed: "${(error as Error).message}"`);
3638
}

packages/gh-open/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"author": "Florian Imdahl <[email protected]>",
33
"bin": "dist/cli.js",
44
"dependencies": {
5-
"axios": "1.13.2",
65
"commander": "14.0.2",
76
"find-up": "8.0.0",
87
"logdown": "3.3.1",

packages/gh-open/src/GitHubClient.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe('GitHubClient', () => {
2121
await gitHubClient.getPullRequests('user', 'repository');
2222
assert.fail('Should not have resolved');
2323
} catch (error) {
24-
expect((error as Error).message).toBe('timeout of 500ms exceeded');
24+
expect((error as Error).message).toBe('The operation was aborted due to timeout');
2525
} finally {
2626
nock.cleanAll();
2727
}
Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import axios, {AxiosInstance} from 'axios';
2-
31
export interface PullRequest {
42
_links: {
53
html: {
@@ -14,10 +12,12 @@ export interface PullRequest {
1412
const TWO_SECONDS_IN_MILLIS = 2000;
1513

1614
export class GitHubClient {
17-
private readonly apiClient: AxiosInstance;
15+
private readonly baseURL: string;
16+
private readonly timeout: number;
1817

1918
constructor(timeout: number = TWO_SECONDS_IN_MILLIS) {
20-
this.apiClient = axios.create({baseURL: 'https://api.github.com', timeout});
19+
this.baseURL = 'https://api.github.com';
20+
this.timeout = timeout;
2121
}
2222

2323
async getPullRequestByBranch(user: string, repository: string, branch: string): Promise<PullRequest | undefined> {
@@ -29,14 +29,15 @@ export class GitHubClient {
2929
* @see https://developer.github.com/v3/pulls/#list-pull-requests
3030
*/
3131
async getPullRequests(user: string, repository: string): Promise<PullRequest[]> {
32-
const resourceUrl = `repos/${user}/${repository}/pulls`;
32+
const resourceUrl = new URL(`repos/${user}/${repository}/pulls`, this.baseURL);
33+
resourceUrl.search = new URLSearchParams({per_page: '100', state: 'open'}).toString();
34+
35+
const response = await fetch(resourceUrl, {signal: AbortSignal.timeout(this.timeout)});
3336

34-
const response = await this.apiClient.get(resourceUrl, {
35-
params: {
36-
state: 'open',
37-
},
38-
});
37+
if (!response.ok) {
38+
throw new Error(`Error while fetching pull requests: ${response.statusText}`);
39+
}
3940

40-
return response.data;
41+
return response.json();
4142
}
4243
}

packages/my-timezone/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"author": "Florian Imdahl <[email protected]>",
33
"bin": "dist/cli.js",
44
"dependencies": {
5-
"axios": "1.13.2",
65
"commander": "14.0.2",
76
"ntpclient": "1.10.1"
87
},

0 commit comments

Comments
 (0)