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

135 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-14 15:51:31 +00:00
let totalCount: number
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
),
tap(value => (totalCount = value.totalCount)),
map(value => value.versions),
tap(value =>
value.map(info =>
console.log(`id0: ${info.id}, version: ${info.version}`)
)
)
)
}
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) {
return getVersionIds(
input.owner,
input.repo,
input.packageName,
input.numOldVersionsToDelete,
'',
input.token
).pipe(
map(value => {
const temp = input.numOldVersionsToDelete
input.numOldVersionsToDelete =
input.numOldVersionsToDelete - value.length <= 0
? 0
: input.numOldVersionsToDelete - value.length
2021-12-16 08:54:07 +00:00
input.numDeleted += value.filter(
info => !input.ignoreVersions.test(info.version)
).length
2021-12-14 15:51:31 +00:00
return value
.filter(info => !input.ignoreVersions.test(info.version))
.map(info => info.id)
.slice(0, temp)
})
)
} else {
return getVersionIds(
input.owner,
input.repo,
input.packageName,
100,
'',
input.token
).pipe(
map(value => {
2021-12-16 07:02:21 +00:00
let toDelete =
2021-12-14 15:51:31 +00:00
totalCount -
2021-12-14 16:06:05 +00:00
value.filter(info => input.ignoreVersions.test(info.version))
2021-12-14 15:51:31 +00:00
.length -
input.minVersionsToKeep
2021-12-16 07:02:21 +00:00
toDelete = toDelete > 100 ? 100 : toDelete
2021-12-14 16:15:58 +00:00
value = value.filter(info => !input.ignoreVersions.test(info.version))
2021-12-16 08:54:07 +00:00
if (toDelete > input.numDeleted && input.numDeleted < 100) {
2021-12-20 08:37:14 +00:00
// using input.numDeleted to keep track of deleted and remaining packages
2021-12-16 08:54:07 +00:00
input.numDeleted =
input.numDeleted + value.length > 100
2021-12-16 07:02:21 +00:00
? 100
2021-12-16 08:54:07 +00:00
: input.numDeleted + value.length
return toDelete - input.numDeleted >= 0
2021-12-14 16:15:58 +00:00
? value.map(info => info.id)
2021-12-16 08:54:07 +00:00
: value.map(info => info.id).slice(0, toDelete - input.numDeleted)
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)
console.log(`${input.numDeleted} versions deleted`)
2021-12-20 08:54:55 +00:00
return result.pipe(
2021-12-20 09:05:08 +00:00
concatMap(ids => deletePackageVersions(ids.slice(0, 100), input.token))
2021-12-20 08:54:55 +00:00
)
}