import URL from 'url' ; import type { AllConfig } from '../config/types' ; import { PLATFORM_NOT_FOUND } from '../constants/error-messages' ; import { logger } from '../logger' ; import type { HostRule } from '../types' ; import { setGitAuthor , setNoVerify , setPrivateKey } from '../util/git' ; import * as hostRules from '../util/host-rules' ; import platforms from './api' ; import type { Platform } from './types' ; export * from './types' ; export const getPlatformList = ( ) : string [ ] => Array . from ( platforms . keys ( ) ) ; export const getPlatforms = ( ) : Map < string , Platform > => platforms ; let _platform ; const handler = { get ( _target , prop ) { if ( ! _platform ) { throw new Error ( PLATFORM_NOT_FOUND ) ; } return _platform [ prop ] ; } , } ; export const platform = new Proxy < Platform > ( { } as any , handler ) ; export function setPlatformApi ( name ) { if ( ! platforms . has ( name ) ) { throw new Error ( `Init: Platform "${ name }" not found. Must be one of: ${ getPlatformList ( ) . join ( ', ' ) }` ) ; } _platform = platforms . get ( name ) ; } export async function initPlatform ( config ) { setPrivateKey ( config . gitPrivateKey ) ; setNoVerify ( config . gitNoVerify ?? [ ] ) ; setPlatformApi ( config . platform ) ; const platformInfo = await platform . initPlatform ( config ) ; const returnConfig = { ... config , ... platformInfo } ; if ( config ?. gitAuthor ) { logger . debug ( `Using configured gitAuthor (${ config . gitAuthor })` ) ; returnConfig . gitAuthor = config . gitAuthor ; } else if ( platformInfo ?. gitAuthor ) { logger . debug ( `Using platform gitAuthor: ${ String ( platformInfo . gitAuthor ) }` ) ; returnConfig . gitAuthor = platformInfo . gitAuthor ; } setGitAuthor ( returnConfig . gitAuthor ) ; const platformRule = { matchHost : URL . parse ( returnConfig . endpoint ) . hostname , } ; [ 'token' , 'username' , 'password' ] . forEach ( ( field ) => { if ( config [ field ] ) { platformRule [ field ] = config [ field ] ; delete returnConfig [ field ] ; } } ) ; returnConfig . hostRules = returnConfig . hostRules || [ ] ; const typedPlatformRule = { ... platformRule , hostType : returnConfig . platform , } ; returnConfig . hostRules . push ( typedPlatformRule ) ; hostRules . add ( typedPlatformRule ) ; return returnConfig ; }