fix: fetch correct asset URL after finalization; test; some refactoring (#738)

This commit is contained in:
Mozi
2026-03-14 19:49:25 -04:00
committed by GitHub
parent d015dc32db
commit 3074e62a34
5 changed files with 239 additions and 62 deletions

View File

@@ -65,6 +65,22 @@ export interface Releaser {
}): Promise<{ data: Release }>;
allReleases(params: { owner: string; repo: string }): AsyncIterable<{ data: Release[] }>;
listReleaseAssets(params: {
owner: string;
repo: string;
release_id: number;
}): Promise<Array<{ id: number; name: string; [key: string]: any }>>;
deleteReleaseAsset(params: { owner: string; repo: string; asset_id: number }): Promise<void>;
uploadReleaseAsset(params: {
url: string;
size: number;
mime: string;
token: string;
data: any;
}): Promise<{ status: number; data: any }>;
}
export class GitHubReleaser implements Releaser {
@@ -181,6 +197,44 @@ export class GitHubReleaser implements Releaser {
this.github.rest.repos.listReleases.endpoint.merge(updatedParams),
);
}
async listReleaseAssets(params: {
owner: string;
repo: string;
release_id: number;
}): Promise<Array<{ id: number; name: string; [key: string]: any }>> {
return this.github.paginate(this.github.rest.repos.listReleaseAssets, {
...params,
per_page: 100,
});
}
async deleteReleaseAsset(params: {
owner: string;
repo: string;
asset_id: number;
}): Promise<void> {
await this.github.rest.repos.deleteReleaseAsset(params);
}
async uploadReleaseAsset(params: {
url: string;
size: number;
mime: string;
token: string;
data: any;
}): Promise<{ status: number; data: any }> {
return this.github.request({
method: 'POST',
url: params.url,
headers: {
'content-length': `${params.size}`,
'content-type': params.mime,
authorization: `token ${params.token}`,
},
data: params.data,
});
}
}
export const asset = (path: string): ReleaseAsset => {
@@ -197,7 +251,7 @@ export const mimeOrDefault = (path: string): string => {
export const upload = async (
config: Config,
github: GitHub,
releaser: Releaser,
url: string,
path: string,
currentAssets: Array<{ id: number; name: string }>,
@@ -216,7 +270,7 @@ export const upload = async (
return null;
} else {
console.log(`♻️ Deleting previously uploaded asset ${name}...`);
await github.rest.repos.deleteReleaseAsset({
await releaser.deleteReleaseAsset({
asset_id: currentAsset.id || 1,
owner,
repo,
@@ -228,14 +282,11 @@ export const upload = async (
endpoint.searchParams.append('name', name);
const fh = await open(path);
try {
const resp = await github.request({
method: 'POST',
const resp = await releaser.uploadReleaseAsset({
url: endpoint.toString(),
headers: {
'content-length': `${size}`,
'content-type': mime,
authorization: `token ${config.github_token}`,
},
size,
mime,
token: config.github_token,
data: fh.readableWebStream({ type: 'bytes' }),
});
const json = resp.data;
@@ -399,6 +450,41 @@ export const finalizeRelease = async (
}
};
/**
* Lists assets belonging to a release.
*
* @param config - Release configuration as specified by user
* @param releaser - The GitHub API wrapper for release operations
* @param release - The existing release to be checked
* @param maxRetries - The maximum number of attempts
*/
export const listReleaseAssets = async (
config: Config,
releaser: Releaser,
release: Release,
maxRetries: number = 3,
): Promise<Array<{ id: number; name: string; [key: string]: any }>> => {
if (maxRetries <= 0) {
console.log(`❌ Too many retries. Aborting...`);
throw new Error('Too many retries.');
}
const [owner, repo] = config.github_repository.split('/');
try {
const assets = await releaser.listReleaseAssets({
owner,
repo,
release_id: release.id,
});
return assets;
} catch (error) {
console.warn(`error listing assets of release: ${error}`);
console.log(`retrying... (${maxRetries - 1} retries remaining)`);
return listReleaseAssets(config, releaser, release, maxRetries - 1);
}
};
/**
* Finds a release by tag name from all a repository's releases.
*