Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion packages/auto-merge/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"author": "Florian Imdahl <git@ffflorian.de>",
"bin": "dist/cli.js",
"dependencies": {
"axios": "1.13.2",
"commander": "14.0.2",
"cosmiconfig": "9.0.0",
"logdown": "3.3.1"
Expand Down
6 changes: 3 additions & 3 deletions packages/auto-merge/src/AutoMerge.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,17 @@ describe('AutoMerge', () => {
},
});

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

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

nock(autoMerge['apiClient'].defaults.baseURL!)
nock(autoMerge['baseURL']!)
.put(/^\/repos\/.+?\/.+?\/pulls\/\d+\/merge\/?$/)
.reply(HTTP_STATUS.OK, {data: 'not-used'})
.persist();
Expand Down
69 changes: 41 additions & 28 deletions packages/auto-merge/src/AutoMerge.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import fs from 'node:fs';
import path from 'node:path';
import axios, {AxiosError, AxiosInstance} from 'axios';
import logdown from 'logdown';

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

export class AutoMerge {
private readonly apiClient: AxiosInstance;
private readonly baseHeaders: Record<string, string>;
private readonly config: AutoMergeConfig;
private readonly logger: logdown.Logger;
private readonly baseURL: string;

constructor(config: AutoMergeConfig) {
this.config = config;
Expand All @@ -28,14 +28,12 @@ export class AutoMerge {
markdown: false,
});
this.logger.state.isEnabled = true;
this.apiClient = axios.create({
baseURL: 'https://api.github.com',
headers: {
Accept: 'application/vnd.github+json',
Authorization: `token ${this.config.authToken}`,
'User-Agent': `${toolName} v${toolVersion}`,
},
});
this.baseURL = 'https://api.github.com';
this.baseHeaders = {
Accept: 'application/vnd.github+json',
Authorization: `token ${this.config.authToken}`,
'User-Agent': `${toolName} v${toolVersion}`,
};
this.checkConfig(this.config);
}

Expand Down Expand Up @@ -90,9 +88,12 @@ export class AutoMerge {
}

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

async mergeByMatch(regex: RegExp, repositories?: Repository[]): Promise<RepositoryResult[]> {
Expand Down Expand Up @@ -124,11 +125,9 @@ export class AutoMerge {
await this.postReview(repositorySlug, pullNumber);
}
} catch (error) {
this.logger.error(
`Could not approve request #${pullNumber} in "${repositorySlug}": ${(error as AxiosError).message}`
);
this.logger.error(`Could not approve request #${pullNumber} in "${repositorySlug}": ${(error as Error).message}`);
actionResult.status = 'bad';
actionResult.error = (error as AxiosError).toString();
actionResult.error = (error as Error).toString();
}
return actionResult;
}
Expand All @@ -142,10 +141,10 @@ export class AutoMerge {
}
} catch (error) {
this.logger.error(
`Could not merge pull request #${pullNumber} in "${repositorySlug}": ${(error as AxiosError).message}`
`Could not merge pull request #${pullNumber} in "${repositorySlug}": ${(error as Error).message}`
);
actionResult.status = 'bad';
actionResult.error = (error as AxiosError).toString();
actionResult.error = (error as Error).toString();
}
return actionResult;
}
Expand All @@ -162,7 +161,7 @@ export class AutoMerge {
const pullRequests = await this.getPullRequestsBySlug(repositorySlug);
repositories.push({pullRequests, repositorySlug});
} catch (error) {
this.logger.error(`Could not get pull requests for "${repositorySlug}": ${(error as AxiosError).message}`);
this.logger.error(`Could not get pull requests for "${repositorySlug}": ${(error as Error).message}`);
}
}

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

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

/** @see https://docs.github.com/en/rest/reference/issues#create-an-issue-comment */
private async putMerge(repositorySlug: string, pullNumber: number, squash?: boolean): Promise<void> {
const resourceUrl = `/repos/${repositorySlug}/pulls/${pullNumber}/merge`;
await this.apiClient.put(resourceUrl, squash ? {merge_method: 'squash'} : undefined);
const resourceUrl = new URL(`/repos/${repositorySlug}/pulls/${pullNumber}/merge`, this.baseURL);
if (squash) {
resourceUrl.search = new URLSearchParams({merge_method: 'squash'}).toString();
}

const response = await fetch(resourceUrl, {headers: this.baseHeaders, method: 'PUT'});
if (!response.ok) {
throw new Error(`Error while merging pull request: ${response.statusText}`);
}
}

private async getPullRequestsBySlug(repositorySlug: string): Promise<GitHubPullRequest[]> {
const resourceUrl = `/repos/${repositorySlug}/pulls`;
const params = {per_page: 100, state: 'open'};
const response = await this.apiClient.get<GitHubPullRequest[]>(resourceUrl, {params});
return response.data;
const resourceUrl = new URL(`/repos/${repositorySlug}/pulls`, this.baseURL);
resourceUrl.search = new URLSearchParams({per_page: '100', state: 'open'}).toString();
const response = await fetch(resourceUrl, {headers: this.baseHeaders});
if (!response.ok) {
throw new Error(`Error while fetching pull requests: ${response.statusText}`);
}
return response.json();
}
}
2 changes: 1 addition & 1 deletion packages/auto-merge/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
"rootDir": "src",
"target": "ES2018"
},
"exclude": ["dist", "node_modules", "*.test.ts"],
"exclude": ["dist", "node_modules", "**/*.test.ts"],
"extends": "../../tsconfig.json"
}
1 change: 0 additions & 1 deletion packages/electron-info/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"author": "Florian Imdahl <git@ffflorian.de>",
"bin": "dist/cli.js",
"dependencies": {
"axios": "1.13.2",
"chalk": "5.6.2",
"commander": "14.0.2",
"date-fns": "4.1.0",
Expand Down
8 changes: 5 additions & 3 deletions packages/electron-info/src/HTTPService.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import fs from 'node:fs/promises';
import {inspect} from 'node:util';
import axios from 'axios';
import logdown from 'logdown';

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

try {
const response = await axios.get<RawReleaseInfo[]>(downloadUrl, {timeout: this.options.timeout});
releases = response.data;
const response = await fetch(downloadUrl, {signal: AbortSignal.timeout(this.options.timeout)});
if (!response.ok) {
throw new Error(response.statusText);
}
releases = (await response.json()) as RawReleaseInfo[];
} catch (error) {
throw new Error(`Request failed: "${(error as Error).message}"`);
}
Expand Down
1 change: 0 additions & 1 deletion packages/gh-open/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"author": "Florian Imdahl <git@ffflorian.de>",
"bin": "dist/cli.js",
"dependencies": {
"axios": "1.13.2",
"commander": "14.0.2",
"find-up": "8.0.0",
"logdown": "3.3.1",
Expand Down
2 changes: 1 addition & 1 deletion packages/gh-open/src/GitHubClient.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ describe('GitHubClient', () => {
await gitHubClient.getPullRequests('user', 'repository');
assert.fail('Should not have resolved');
} catch (error) {
expect((error as Error).message).toBe('timeout of 500ms exceeded');
expect((error as Error).message).toBe('The operation was aborted due to timeout');
} finally {
nock.cleanAll();
}
Expand Down
23 changes: 12 additions & 11 deletions packages/gh-open/src/GitHubClient.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import axios, {AxiosInstance} from 'axios';

export interface PullRequest {
_links: {
html: {
Expand All @@ -14,10 +12,12 @@ export interface PullRequest {
const TWO_SECONDS_IN_MILLIS = 2000;

export class GitHubClient {
private readonly apiClient: AxiosInstance;
private readonly baseURL: string;
private readonly timeout: number;

constructor(timeout: number = TWO_SECONDS_IN_MILLIS) {
this.apiClient = axios.create({baseURL: 'https://api.github.com', timeout});
this.baseURL = 'https://api.github.com';
this.timeout = timeout;
}

async getPullRequestByBranch(user: string, repository: string, branch: string): Promise<PullRequest | undefined> {
Expand All @@ -29,14 +29,15 @@ export class GitHubClient {
* @see https://developer.github.com/v3/pulls/#list-pull-requests
*/
async getPullRequests(user: string, repository: string): Promise<PullRequest[]> {
const resourceUrl = `repos/${user}/${repository}/pulls`;
const resourceUrl = new URL(`repos/${user}/${repository}/pulls`, this.baseURL);
resourceUrl.search = new URLSearchParams({per_page: '100', state: 'open'}).toString();

const response = await fetch(resourceUrl, {signal: AbortSignal.timeout(this.timeout)});

const response = await this.apiClient.get(resourceUrl, {
params: {
state: 'open',
},
});
if (!response.ok) {
throw new Error(`Error while fetching pull requests: ${response.statusText}`);
}

return response.data;
return response.json();
}
}
1 change: 0 additions & 1 deletion packages/my-timezone/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"author": "Florian Imdahl <git@ffflorian.de>",
"bin": "dist/cli.js",
"dependencies": {
"axios": "1.13.2",
"commander": "14.0.2",
"ntpclient": "1.10.1"
},
Expand Down
31 changes: 16 additions & 15 deletions packages/my-timezone/src/MyTimezone.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import axios, {AxiosError, AxiosRequestConfig} from 'axios';
import {NTPClient} from 'ntpclient';

export enum DIRECTION {
Expand Down Expand Up @@ -75,28 +74,30 @@ export class MyTimezone {
}

public async getLocationByName(address: string, radius?: string): Promise<Location> {
const requestConfig: AxiosRequestConfig = {
method: 'get',
params: {
format: 'json',
limit: 9,
// eslint-disable-next-line id-length
q: address,
},
url: `${nominatimAPI}/search`,
};
const url = new URL(`${nominatimAPI}/search`);

const params = new URLSearchParams({
format: 'json',
limit: '9',
// eslint-disable-next-line id-length
q: address,
});

if (radius) {
requestConfig.params.radius = radius;
params.append('radius', radius);
}
url.search = params.toString();

let results: OSMResult[];

try {
const response = await axios.request<OSMResult[]>(requestConfig);
results = response.data;
const response = await fetch(url, {});
if (!response.ok) {
throw new Error(response.statusText);
}
results = (await response.json()) as OSMResult[];
} catch (error) {
throw new Error(`Nominatim API Error: ${(error as AxiosError).message}`);
throw new Error(`Nominatim API Error: ${(error as Error).message}`);
}

if (!results.length) {
Expand Down
3 changes: 0 additions & 3 deletions packages/ntfy/package.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
{
"author": "Florian Imdahl <git@ffflorian.de>",
"dependencies": {
"axios": "1.13.2"
},
"description": "Send notifications over ntfy.sh.",
"devDependencies": {
"rimraf": "6.1.0",
Expand Down
Loading