Files
delete-package-versions/src/delete.ts
2021-12-21 18:14:06 +00:00

139 lines
3.9 KiB
TypeScript

import {Input} from './input'
import {EMPTY, Observable, of, throwError} from 'rxjs'
import {deletePackageVersions, getOldestVersions, VersionInfo} from './version'
import {concatMap, map, expand, tap} from 'rxjs/operators'
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)),
tap(value =>
console.log(`in expand value length: ${value.versions.length}`)
),
map(value => value.versions)
)
}
export function finalIds(input: Input): Observable<string[]> {
if (input.packageVersionIds.length > 0) {
return of(input.packageVersionIds)
}
if (input.hasOldestVersionQueryInfo()) {
if (input.minVersionsToKeep < 0) {
input.numOldVersionsToDelete =
input.numOldVersionsToDelete < 100 ? input.numOldVersionsToDelete : 100
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
input.numDeleted += value.filter(
info => !input.ignoreVersions.test(info.version)
).length
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 => {
totalCount =
totalCount -
value.filter(info => input.ignoreVersions.test(info.version)).length
value = value.filter(info => !input.ignoreVersions.test(info.version))
let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted
toDelete = toDelete > value.length ? value.length : toDelete
if (toDelete > 0 && input.numDeleted < 100) {
// using input.numDeleted to keep track of deleted and remaining packages
if (input.numDeleted + toDelete > 100) {
toDelete = 100 - input.numDeleted
input.numDeleted = 100
} else {
input.numDeleted = input.numDeleted + toDelete
}
//return value.map(info => info.id).slice(0, toDelete)
return []
} else return []
})
)
}
}
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')
}
if (!input.checkInput()) {
return throwError('Invlaid input combination')
}
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)
}
const result = finalIds(input)
return result.pipe(
tap(value => (input.numDeleted = value.length < 100 ? value.length : 100)),
tap(() => {
if (input.numDeleted > 0)
console.log(`${input.numDeleted} versions will be deleted`)
}),
concatMap(ids => deletePackageVersions(ids, input.token))
)
}