import { ICredentialDataDecryptedObject } from 'n8n-workflow' ; import { CredentialTypes , GenericHelpers , ICredentialsOverwrite } from '.' ; class CredentialsOverwritesClass { private credentialTypes = CredentialTypes ( ) ; private overwriteData : ICredentialsOverwrite = { } ; private resolvedTypes : string [ ] = [ ] ; async init ( overwriteData ? ) { this . resolvedTypes . length = 0 ; if ( overwriteData !== undefined ) { this . __setData ( JSON . parse ( JSON . stringify ( overwriteData ) ) ) ; return ; } const data = ( await GenericHelpers . getConfigValue ( 'credentials.overwrite.data' ) ) as string ; try { const overwriteData = JSON . parse ( data ) ; this . __setData ( overwriteData ) ; } catch ( error ) { throw new Error ( `The credentials-overwrite is not valid JSON.` ) ; } } __setData ( overwriteData ) { this . overwriteData = overwriteData ; for ( const credentialTypeData of this . credentialTypes . getAll ( ) ) { const type = credentialTypeData . name ; const overwrites = this . __getExtended ( type ) ; if ( overwrites && Object . keys ( overwrites ) . length ) { this . overwriteData [ type ] = overwrites ; credentialTypeData . __overwrittenProperties = Object . keys ( overwrites ) ; } } } applyOverwrite ( type , data ) { const overwrites = this . get ( type ) ; if ( overwrites === undefined ) { return data ; } const returnData = JSON . parse ( JSON . stringify ( data ) ) ; for ( const key of Object . keys ( overwrites ) ) { if ( [ null , undefined , '' ] . includes ( returnData [ key ] ) ) { returnData [ key ] = overwrites [ key ] ; } } return returnData ; } __getExtended ( type ) { if ( this . resolvedTypes . includes ( type ) ) { return this . overwriteData [ type ] ; } const credentialTypeData = this . credentialTypes . getByName ( type ) ; if ( credentialTypeData === undefined ) { throw new Error ( `The credentials of type "${ type }" are not known.` ) ; } if ( credentialTypeData . extends === undefined ) { this . resolvedTypes . push ( type ) ; return this . overwriteData [ type ] ; } const overwrites = { } ; for ( const credentialsTypeName of credentialTypeData . extends ) { Object . assign ( overwrites , this . __getExtended ( credentialsTypeName ) ) ; } if ( this . overwriteData [ type ] !== undefined ) { Object . assign ( overwrites , this . overwriteData [ type ] ) ; } this . resolvedTypes . push ( type ) ; return overwrites ; } get ( type ) { return this . overwriteData [ type ] ; } getAll ( ) { return this . overwriteData ; } } let credentialsOverwritesInstance ; export function CredentialsOverwrites ( ) { if ( credentialsOverwritesInstance === undefined ) { credentialsOverwritesInstance = new CredentialsOverwritesClass ( ) ; } return credentialsOverwritesInstance ; }