From 9db371f09def4ecd7b8ab09bc478db5c3a14bd55 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Thu, 26 Oct 2023 06:32:30 +0000 Subject: [PATCH] Delete whole package if last version will be deleted Fixes #33 --- src/action.ts | 20 ++++++++++++++----- .../organization.delete.strategy.ts | 8 ++++++++ src/delete/strategies/user.delete.strategy.ts | 8 ++++++++ src/process/process.ts | 10 ++++++++-- src/types.ts | 2 ++ test/action.spec.ts | 1 + test/process/process.spec.ts | 11 ++++++++++ 7 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/action.ts b/src/action.ts index c4a3255..f5a30fb 100644 --- a/src/action.ts +++ b/src/action.ts @@ -39,12 +39,22 @@ export async function executeAction(input: Input, queryStrategy: QueryStrategy, await group("Deleting packages", async () => { await Promise.all( processedPackages - .flatMap((pkg) => pkg.versions.map((version) => ({ name: pkg.name, version }))) - .map(async ({ name, version }) => { - info(`Deleting version ${version.names.join(", ")} of package ${name}`) + .flatMap((pkg) => + pkg.versions.map((version) => ({ name: pkg.name, version, totalVersions: pkg.totalVersions })) + ) + .map(async ({ name, version, totalVersions }) => { + if (totalVersions > 1) { + info(`Deleting version ${version.names.join(", ")} of package ${name}`) - if (!input.dryRun) { - await deleteStrategy.deletePackageVersion(input, name, version.id) + if (!input.dryRun) { + await deleteStrategy.deletePackageVersion(input, name, version.id) + } + } else { + info(`Deleting package ${name}`) + + if (!input.dryRun) { + await deleteStrategy.deletePackage(input, name) + } } }) ) diff --git a/src/delete/strategies/organization.delete.strategy.ts b/src/delete/strategies/organization.delete.strategy.ts index 58bea7b..475245d 100644 --- a/src/delete/strategies/organization.delete.strategy.ts +++ b/src/delete/strategies/organization.delete.strategy.ts @@ -12,4 +12,12 @@ export default class OrganizationDeleteStrategy implements DeleteStrategy { org: input.organization, }) } + + async deletePackage(input: RestInput, name: string): Promise { + await this.octokit.rest.packages.deletePackageForOrg({ + package_name: name, + package_type: input.type, + org: input.organization, + }) + } } diff --git a/src/delete/strategies/user.delete.strategy.ts b/src/delete/strategies/user.delete.strategy.ts index b3f598d..a973c4b 100644 --- a/src/delete/strategies/user.delete.strategy.ts +++ b/src/delete/strategies/user.delete.strategy.ts @@ -12,4 +12,12 @@ export default class UserDeleteStrategy implements DeleteStrategy { username: input.user, }) } + + async deletePackage(input: RestInput, name: string): Promise { + await this.octokit.rest.packages.deletePackageForUser({ + package_name: name, + package_type: input.type, + username: input.user, + }) + } } diff --git a/src/process/process.ts b/src/process/process.ts index f8719a2..a371511 100644 --- a/src/process/process.ts +++ b/src/process/process.ts @@ -12,7 +12,11 @@ type RestVersion = components["schemas"]["package-version"] export function processPackages(input: Input, packages: Package[]): Package[] { return packages - .map(({ name, versions }) => ({ name, versions: findVersionsToDelete(input, versions).slice(input.keep) })) + .map(({ name, versions, totalVersions }) => ({ + name, + versions: findVersionsToDelete(input, versions).slice(input.keep), + totalVersions, + })) .filter((it) => it.versions.length >= 1) } @@ -35,9 +39,11 @@ export function findVersionsToDelete(input: Input, versions: PackageVersion[]): } export function processResponse(name: string, response: RestResponse): Package { + const versions = response.data.map((version) => processVersion(version)).filter((it) => it.names.length >= 1) return { name, - versions: response.data.map((version) => processVersion(version)).filter((it) => it.names.length >= 1), + versions: versions, + totalVersions: versions.length, } } diff --git a/src/types.ts b/src/types.ts index 4fa278e..2e7ea3e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -29,6 +29,7 @@ export type RestInput = Input & { export type Package = { name: string versions: PackageVersion[] + totalVersions: number } export type PackageVersion = { @@ -42,4 +43,5 @@ export interface QueryStrategy { export interface DeleteStrategy { deletePackageVersion(input: Input, name: string, id: string): Promise + deletePackage(input: Input, name: string): Promise } diff --git a/test/action.spec.ts b/test/action.spec.ts index ab8c009..3e882ae 100644 --- a/test/action.spec.ts +++ b/test/action.spec.ts @@ -10,6 +10,7 @@ const packages = [ { id: "a", names: ["1.0.0"] }, { id: "b", names: ["docker-base-layer"] }, ], + totalVersions: 2, }, ] diff --git a/test/process/process.spec.ts b/test/process/process.spec.ts index 9881c28..d426c7f 100644 --- a/test/process/process.spec.ts +++ b/test/process/process.spec.ts @@ -22,6 +22,7 @@ test("filters correctly", () => { { id: "a", names: ["2"] }, { id: "b", names: ["1"] }, ], + totalVersions: 2, }, { name: "test2", @@ -29,6 +30,7 @@ test("filters correctly", () => { { id: "c", names: ["2"] }, { id: "d", names: ["1"] }, ], + totalVersions: 2, }, ] ) @@ -61,6 +63,7 @@ test("filters based on semver", () => { { id: "c", names: ["3.0.1-alpha01"] }, { id: "d", names: ["v3.10.2"] }, ], + totalVersions: 4, }, ] ) @@ -88,6 +91,7 @@ test("filters based on regex", () => { { id: "a", names: ["2-test"] }, { id: "b", names: ["1"] }, ], + totalVersions: 2, }, { name: "test2", @@ -95,6 +99,7 @@ test("filters based on regex", () => { { id: "c", names: ["2-test"] }, { id: "d", names: ["1-test"] }, ], + totalVersions: 2, }, ] ) @@ -126,6 +131,7 @@ test("respects keep", () => { { id: "b", names: ["2"] }, { id: "c", names: ["1"] }, ], + totalVersions: 3, }, { name: "test2", @@ -133,6 +139,7 @@ test("respects keep", () => { { id: "d", names: ["1"] }, { id: "e", names: ["1"] }, ], + totalVersions: 2, }, ] ) @@ -161,6 +168,7 @@ test("filters with multiple names", () => { { id: "a", names: ["2"] }, { id: "b", names: ["1", "1-test"] }, ], + totalVersions: 2, }, { name: "test2", @@ -168,6 +176,7 @@ test("filters with multiple names", () => { { id: "c", names: ["2"] }, { id: "d", names: ["1"] }, ], + totalVersions: 2, }, ] ) @@ -314,6 +323,7 @@ test("process rest container response", () => { names: ["1.0.0-RC1", "1.0.0-beta1"], }, ], + totalVersions: 3, }) }) @@ -340,5 +350,6 @@ test("process rest npm response", () => { names: ["1.0.0"], }, ], + totalVersions: 4, }) })