Files
delete-package-versions/src/delete.ts

127 lines
3.2 KiB
TypeScript
Raw Normal View History

2022-12-28 14:43:50 +00:00
/* eslint-disable i18n-text/no-en */
2022-12-30 20:03:11 +00:00
import {Input} from './input'
2021-12-14 15:51:31 +00:00
import {EMPTY, Observable, of, throwError} from 'rxjs'
2022-12-30 12:55:09 +00:00
import {reduce, concatMap, map, expand, tap} from 'rxjs/operators'
2022-12-28 14:43:50 +00:00
import {
deletePackageVersions,
getOldestVersions,
RestVersionInfo
} from './version'
2023-01-03 16:35:40 +00:00
export const RATE_LIMIT = 100
2021-12-22 19:09:58 +00:00
let totalCount = 0
2021-12-14 15:51:31 +00:00
export function getVersionIds(
owner: string,
packageName: string,
2022-12-28 14:43:50 +00:00
packageType: string,
2021-12-14 15:51:31 +00:00
numVersions: number,
2022-12-28 14:43:50 +00:00
page: number,
2021-12-14 15:51:31 +00:00
token: string
2022-12-28 14:43:50 +00:00
): Observable<RestVersionInfo[]> {
2021-12-14 15:51:31 +00:00
return getOldestVersions(
owner,
packageName,
2022-12-28 14:43:50 +00:00
packageType,
2021-12-14 15:51:31 +00:00
numVersions,
2022-12-28 14:43:50 +00:00
page,
2021-12-14 15:51:31 +00:00
token
).pipe(
expand(value =>
value.paginate
? getOldestVersions(
owner,
packageName,
2022-12-28 14:43:50 +00:00
packageType,
2021-12-14 15:51:31 +00:00
numVersions,
2022-12-29 15:35:31 +05:30
value.page + 1,
2021-12-14 15:51:31 +00:00
token
)
: EMPTY
),
2022-12-29 14:43:48 +05:30
tap(value => (totalCount = totalCount + value.totalCount)),
reduce((acc, value) => acc.concat(value.versions), [] as RestVersionInfo[])
2021-12-14 15:51:31 +00:00
)
}
export function finalIds(input: Input): Observable<string[]> {
if (input.packageVersionIds.length > 0) {
const toDelete = Math.min(input.packageVersionIds.length, RATE_LIMIT)
return of(input.packageVersionIds.slice(0, toDelete))
}
if (input.hasOldestVersionQueryInfo()) {
2022-12-29 15:35:31 +05:30
return getVersionIds(
input.owner,
input.packageName,
input.packageType,
RATE_LIMIT,
1,
input.token
).pipe(
// This code block executes on all versions of a package starting from oldest
map(value => {
// we need to delete oldest versions first
value.sort((a, b) => {
return (
new Date(a.created_at).getTime() - new Date(b.created_at).getTime()
)
})
/*
2021-12-23 13:01:35 +00:00
Here first filter out the versions that are to be ignored.
2023-01-03 16:35:40 +00:00
Then compute number of versions to delete (toDelete) based on the inputs.
2021-12-23 13:01:35 +00:00
*/
2022-12-29 15:35:31 +05:30
value = value.filter(info => !input.ignoreVersions.test(info.version))
let toDelete = 0
if (input.minVersionsToKeep < 0) {
toDelete = Math.min(
value.length,
Math.min(input.numOldVersionsToDelete, RATE_LIMIT)
)
} else {
toDelete = Math.min(
value.length - input.minVersionsToKeep,
RATE_LIMIT
)
}
if (toDelete < 0) return []
return value.map(info => info.id.toString()).slice(0, toDelete)
})
)
}
2021-12-14 15:57:21 +00:00
return throwError(
"Could not get packageVersionIds. Explicitly specify using the 'package-version-ids' input"
)
}
export function deleteVersions(input: Input): Observable<boolean> {
if (!input.token) {
return throwError('No token found')
}
2021-12-14 12:34:03 +00:00
if (!input.checkInput()) {
2021-12-24 10:21:02 +00:00
return throwError('Invalid input combination')
2021-12-14 12:34:03 +00:00
}
2021-12-14 15:51:31 +00:00
if (input.numOldVersionsToDelete <= 0 && input.minVersionsToKeep < 0) {
console.log(
'Number of old versions to delete input is 0 or less, no versions will be deleted'
)
return of(true)
}
2021-12-16 08:54:07 +00:00
const result = finalIds(input)
2022-12-28 12:56:30 +00:00
return result.pipe(
concatMap(ids =>
deletePackageVersions(
ids,
input.owner,
input.packageName,
input.packageType,
input.token
)
)
)
}