import is from '@sindresorhus/is' ; import { PlatformId } from '../../constants' ; import { resolveBaseUrl } from '../url' ; import { Http , HttpOptions , HttpResponse , InternalHttpOptions } from '.' ; let baseUrl ; export const setBaseUrl = ( newBaseUrl ) : void => { baseUrl = newBaseUrl . replace ( /\/*$/ , '/' ) ; } ; export interface GiteaHttpOptions extends InternalHttpOptions { paginate ? : boolean ; token ? : string ; } function getPaginationContainer < T = unknown > ( body ) { if ( is . array ( body ) && body . length ) { return body as T [ ] ; } if ( is . plainObject ( body ) && is . array ( body ?. data ) && body . data . length ) { return body . data as T [ ] ; } return null ; } function resolveUrl ( path , base ) { const resolvedUrlString = resolveBaseUrl ( base , path ) ; return new URL ( resolvedUrlString ) ; } export class GiteaHttp extends Http < GiteaHttpOptions , GiteaHttpOptions > { constructor ( options ? ) { super ( PlatformId . Gitea , options ) ; } protected override async request < T > ( path , options ? ) { const resolvedUrl = resolveUrl ( path , options ?. baseUrl ?? baseUrl ) ; const opts = { baseUrl , ... options , } ; const res = await super . request < T > ( resolvedUrl , opts ) ; const pc = getPaginationContainer < T > ( res . body ) ; if ( opts . paginate && pc ) { const total = parseInt ( res . headers [ 'x-total-count' ] as string , 10 ) ; let nextPage = parseInt ( resolvedUrl . searchParams . get ( 'page' ) ?? '1' , 10 ) ; while ( total && pc . length < total ) { nextPage += 1 ; resolvedUrl . searchParams . set ( 'page' , nextPage . toString ( ) ) ; const nextRes = await super . request < T > ( resolvedUrl . toString ( ) , opts ) ; const nextPc = getPaginationContainer < T > ( nextRes . body ) ; if ( nextPc === null ) { break ; } pc . push ( ... nextPc ) ; } } return res ; } }