Skip to content

Commit c504d2b

Browse files
committed
Support name-pattern
1 parent 8c1a59c commit c504d2b

File tree

6 files changed

+72
-4
lines changed

6 files changed

+72
-4
lines changed

action.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@ inputs:
1616
names:
1717
description: >-
1818
Names of the packages.
19-
required: true
19+
required: false
20+
21+
name-pattern:
22+
description: >-
23+
Names of the packages.
24+
required: false
2025

2126
semver-pattern:
2227
description: >-

src/action.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ export async function executeAction(input: Input, queryStrategy: QueryStrategy,
88
warning("No package versions will be actually deleted")
99
}
1010

11+
if (input.namePattern) {
12+
info("Fetching package names")
13+
14+
input.names = await queryStrategy.queryPackageNames(input)
15+
16+
input.names.forEach((it) => {
17+
info(`${it}`)
18+
})
19+
}
20+
1121
info("Fetching packages")
1222

1323
const packages = await queryStrategy.queryPackages(input)

src/input.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Input, PackageType } from "./types"
55
const DEFAULT_KEEP = 2
66

77
function getRegExpInput(name: string): RegExp | undefined {
8-
const input = getInput("version-pattern")
8+
const input = getInput(name)
99

1010
if (input !== "") {
1111
try {
@@ -50,6 +50,7 @@ function getTypeInput(name: string): PackageType {
5050
export function getActionInput(): Input {
5151
return {
5252
names: getMultilineInput("names"),
53+
namePattern: getRegExpInput("name-pattern"),
5354
versionPattern: getRegExpInput("version-pattern"),
5455
semverPattern: genSemVerInput("semver-pattern"),
5556
keep: Number(getInput("keep") || DEFAULT_KEEP),
@@ -62,7 +63,11 @@ export function getActionInput(): Input {
6263
}
6364

6465
export function validateInput(input: Input): Input {
65-
if (input.names.length <= 0) {
66+
if (input.namePattern && input.names && input.names.length > 0) {
67+
throw new Error("Only one of name-pattern and names can be specified")
68+
}
69+
70+
if (!input.namePattern && (!input.names || input.names.length <= 0)) {
6671
throw new Error("names cannot be empty")
6772
}
6873

src/query/strategies/organization.query.strategy.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ export default class OrganizationQueryStrategy implements QueryStrategy {
66
constructor(private readonly octokit: InstanceType<typeof GitHub>) {}
77

88
async queryPackages(input: RestInput): Promise<Package[]> {
9+
if (!input.names) {
10+
throw new Error("No names specified")
11+
}
912
return await Promise.all(
1013
input.names.map(async (name) => {
1114
const response = await this.queryPackage(input, name)
@@ -15,6 +18,26 @@ export default class OrganizationQueryStrategy implements QueryStrategy {
1518
)
1619
}
1720

21+
async queryPackageNames(input: RestInput) {
22+
if (!input.namePattern) {
23+
throw new Error("No name-pattern specified")
24+
}
25+
const namePattern = input.namePattern
26+
try {
27+
const params = {
28+
package_type: input.type,
29+
org: input.organization,
30+
per_page: 100,
31+
}
32+
33+
const packages = await this.octokit.paginate(this.octokit.rest.packages.listPackagesForOrganization, params)
34+
35+
return packages.map((p) => p.name).filter((n) => namePattern.test(n))
36+
} catch (error) {
37+
throw new Error(`Failed to query package name pattern ${input.namePattern}: ${error}`)
38+
}
39+
}
40+
1841
private async queryPackage(input: RestInput, name: string) {
1942
try {
2043
const params = {

src/query/strategies/user.query.strategy.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ export default class UserQueryStrategy implements QueryStrategy {
66
constructor(private readonly octokit: InstanceType<typeof GitHub>) {}
77

88
async queryPackages(input: RestInput): Promise<Package[]> {
9+
if (!input.names) {
10+
throw new Error("No names specified")
11+
}
912
return await Promise.all(
1013
input.names.map(async (name) => {
1114
const response = await this.queryPackage(input, name)
@@ -15,6 +18,26 @@ export default class UserQueryStrategy implements QueryStrategy {
1518
)
1619
}
1720

21+
async queryPackageNames(input: RestInput) {
22+
if (!input.namePattern) {
23+
throw new Error("No name-pattern specified")
24+
}
25+
const namePattern = input.namePattern
26+
try {
27+
const params = {
28+
package_type: input.type,
29+
username: input.user,
30+
per_page: 100,
31+
}
32+
33+
const packages = await this.octokit.paginate(this.octokit.rest.packages.listPackagesForUser, params)
34+
35+
return packages.map((p) => p.name).filter((n) => namePattern.test(n))
36+
} catch (error) {
37+
throw new Error(`Failed to query package name pattern ${input.namePattern}: ${error}`)
38+
}
39+
}
40+
1841
private async queryPackage(input: RestInput, name: string) {
1942
try {
2043
const params = {

src/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ export enum PackageType {
1010
}
1111

1212
export type Input = {
13-
names: string[]
13+
names?: string[]
14+
namePattern?: RegExp
1415
versionPattern?: RegExp
1516
semverPattern?: Range
1617
keep: number
@@ -38,6 +39,7 @@ export type PackageVersion = {
3839

3940
export interface QueryStrategy {
4041
queryPackages(input: Input): Promise<Package[]>
42+
queryPackageNames(input: Input): Promise<string[]>
4143
}
4244

4345
export interface DeleteStrategy {

0 commit comments

Comments
 (0)