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

130 lines
3.7 KiB
TypeScript
Raw Normal View History

import {Input} from './input'
2021-12-14 15:51:31 +00:00
import {EMPTY, Observable, of, throwError} from 'rxjs'
2021-12-16 07:02:21 +00:00
import {deletePackageVersions, getOldestVersions, VersionInfo} from './version'
2021-12-14 15:51:31 +00:00
import {concatMap, map, expand, tap} from 'rxjs/operators'
2021-12-22 19:09:58 +00:00
const RATE_LIMIT = 100
let totalCount = 0
2021-12-14 15:51:31 +00:00
export function getVersionIds(
owner: string,
repo: string,
packageName: string,
numVersions: number,
cursor: string,
token: string
): Observable<VersionInfo[]> {
return getOldestVersions(
owner,
repo,
packageName,
numVersions,
cursor,
token
).pipe(
expand(value =>
value.paginate
? getOldestVersions(
owner,
repo,
packageName,
numVersions,
value.cursor,
token
)
: EMPTY
),
2021-12-22 21:39:57 +00:00
tap(
value => (totalCount = totalCount === 0 ? value.totalCount : totalCount)
),
2021-12-20 09:21:35 +00:00
map(value => value.versions)
2021-12-14 15:51:31 +00:00
)
}
export function finalIds(input: Input): Observable<string[]> {
if (input.packageVersionIds.length > 0) {
return of(input.packageVersionIds)
}
if (input.hasOldestVersionQueryInfo()) {
2021-12-14 15:51:31 +00:00
if (input.minVersionsToKeep < 0) {
2021-12-21 17:34:02 +00:00
input.numOldVersionsToDelete =
2021-12-21 18:52:10 +00:00
input.numOldVersionsToDelete < RATE_LIMIT
? input.numOldVersionsToDelete
: RATE_LIMIT
2021-12-22 19:09:58 +00:00
console.log(
`input.numOldVersionsToDelete: ${input.numOldVersionsToDelete}`
)
2021-12-14 15:51:31 +00:00
return getVersionIds(
input.owner,
input.repo,
input.packageName,
input.numOldVersionsToDelete,
'',
input.token
).pipe(
map(value => {
2021-12-22 19:09:58 +00:00
value = value.filter(info => !input.ignoreVersions.test(info.version))
2021-12-14 15:51:31 +00:00
const temp = input.numOldVersionsToDelete
input.numOldVersionsToDelete =
input.numOldVersionsToDelete - value.length <= 0
? 0
: input.numOldVersionsToDelete - value.length
2021-12-22 19:09:58 +00:00
return value.map(info => info.id).slice(0, temp)
2021-12-14 15:51:31 +00:00
})
)
} else {
return getVersionIds(
input.owner,
input.repo,
input.packageName,
2021-12-22 19:21:20 +00:00
RATE_LIMIT,
2021-12-14 15:51:31 +00:00
'',
input.token
).pipe(
map(value => {
2021-12-21 17:34:02 +00:00
totalCount =
2021-12-14 15:51:31 +00:00
totalCount -
2021-12-21 17:34:02 +00:00
value.filter(info => input.ignoreVersions.test(info.version)).length
2021-12-14 16:15:58 +00:00
value = value.filter(info => !input.ignoreVersions.test(info.version))
2021-12-21 17:34:02 +00:00
let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted
toDelete = toDelete > value.length ? value.length : toDelete
2021-12-21 18:52:10 +00:00
if (toDelete > 0 && input.numDeleted < RATE_LIMIT) {
2021-12-20 08:37:14 +00:00
// using input.numDeleted to keep track of deleted and remaining packages
2021-12-22 19:09:58 +00:00
if (input.numDeleted + toDelete > RATE_LIMIT) {
2021-12-21 18:52:10 +00:00
toDelete = RATE_LIMIT - input.numDeleted
input.numDeleted = RATE_LIMIT
2021-12-21 17:34:02 +00:00
} else {
input.numDeleted = input.numDeleted + toDelete
}
2021-12-21 18:23:06 +00:00
return value.map(info => info.id).slice(0, toDelete)
2021-12-14 15:51:31 +00:00
} else return []
})
)
}
}
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-14 15:51:31 +00:00
return throwError('Invlaid 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)
2021-12-23 09:46:46 +00:00
return result.pipe(concatMap(ids => deletePackageVersions(ids, input.token)))
}