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 { 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 { 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 { 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)) ) }