diff --git a/jest.config.cjs b/jest.config.cjs deleted file mode 100644 index 6f3d23e0d..000000000 --- a/jest.config.cjs +++ /dev/null @@ -1,31 +0,0 @@ -/** @type {import('jest').Config} */ -const config = { - verbose: true, - transform: { - '^.+\\.m?[tj]sx?$': ['ts-jest'], - }, - testMatch: [ - '/src/**/__tests__/**/*.ts?(x)', - '/(test|src)/**/*(*.)@(spec|test).ts?(x)', - '/test/**/*.(test|spec).(js|jsx|ts|tsx)', - ], - clearMocks: true, - collectCoverage: true, - coverageReporters: ['json', 'lcov', 'clover', 'cobertura', 'text'], - coverageDirectory: 'coverage', - coveragePathIgnorePatterns: ['/node_modules/'], - testPathIgnorePatterns: ['/node_modules/'], - watchPathIgnorePatterns: ['/node_modules/'], - reporters: [ - 'default', - [ - 'jest-junit', - { - outputDirectory: 'test-reports', - }, - ], - ], - preset: 'ts-jest/presets/default-legacy', -}; - -module.exports = config; diff --git a/src/CredentialsClient.ts b/src/CredentialsClient.ts index 1b79bb16d..f05b2b593 100644 --- a/src/CredentialsClient.ts +++ b/src/CredentialsClient.ts @@ -20,14 +20,19 @@ export class CredentialsClient { private readonly requestHandler?: NodeHttpHandler; constructor(props: CredentialsClientProps) { - this.region = props.region; + if (props.region !== undefined) { + this.region = props.region; + } if (props.proxyServer) { info('Configuring proxy handler for STS client'); - const getProxyForUrl = new ProxyResolver({ + const proxyOptions: { httpProxy: string; httpsProxy: string; noProxy?: string } = { httpProxy: props.proxyServer, httpsProxy: props.proxyServer, - noProxy: props.noProxy, - }).getProxyForUrl; + }; + if (props.noProxy !== undefined) { + proxyOptions.noProxy = props.noProxy; + } + const getProxyForUrl = new ProxyResolver(proxyOptions).getProxyForUrl; const handler = new ProxyAgent({ getProxyForUrl }); this.requestHandler = new NodeHttpHandler({ httpsAgent: handler, @@ -38,11 +43,14 @@ export class CredentialsClient { public get stsClient(): STSClient { if (!this._stsClient) { - this._stsClient = new STSClient({ - region: this.region, - customUserAgent: USER_AGENT, - requestHandler: this.requestHandler ? this.requestHandler : undefined, - }); + const config = { customUserAgent: USER_AGENT } as { + customUserAgent: string; + region?: string; + requestHandler?: NodeHttpHandler; + }; + if (this.region !== undefined) config.region = this.region; + if (this.requestHandler !== undefined) config.requestHandler = this.requestHandler; + this._stsClient = new STSClient(config); } return this._stsClient; } @@ -88,9 +96,9 @@ export class CredentialsClient { } private async loadCredentials() { - const client = new STSClient({ - requestHandler: this.requestHandler ? this.requestHandler : undefined, - }); + const config = {} as { requestHandler?: NodeHttpHandler }; + if (this.requestHandler !== undefined) config.requestHandler = this.requestHandler; + const client = new STSClient(config); return client.config.credentials(); } } diff --git a/src/ProxyResolver.ts b/src/ProxyResolver.ts index d2bc052a2..50291be54 100644 --- a/src/ProxyResolver.ts +++ b/src/ProxyResolver.ts @@ -18,9 +18,10 @@ export class ProxyResolver { this.options = options; } - getProxyForUrl(url: string, _req: http.ClientRequest): string { + // This method matches the interface expected by 'proxy-agent'. It is an arrow function to bind 'this'. + public readonly getProxyForUrl = (url: string, _req: http.ClientRequest): string => { return this.getProxyForUrlOptions(url, this.options); - } + }; private getProxyForUrlOptions(url: string | URL, options?: ProxyOptions): string { let parsedUrl: URL; diff --git a/src/helpers.ts b/src/helpers.ts index 92f29d0db..1babe5861 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -115,7 +115,14 @@ export async function getCallerIdentity(client: STSClient): Promise<{ Account: s if (!identity.Account || !identity.Arn) { throw new Error('Could not get Account ID or ARN from STS. Did you set credentials?'); } - return { Account: identity.Account, Arn: identity.Arn, UserId: identity.UserId }; + const result: { Account: string; Arn: string; UserId?: string } = { + Account: identity.Account, + Arn: identity.Arn, + }; + if (identity.UserId !== undefined) { + result.UserId = identity.UserId; + } + return result; } // Obtains account ID from STS Client and sets it as output diff --git a/src/index.ts b/src/index.ts index a9f15c45f..20d511e1d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -110,7 +110,10 @@ export async function run() { exportRegion(region, outputEnvCredentials); // Instantiate credentials client - const credentialsClient = new CredentialsClient({ region, proxyServer, noProxy }); + const clientProps: { region: string; proxyServer?: string; noProxy?: string } = { region }; + if (proxyServer) clientProps.proxyServer = proxyServer; + if (noProxy) clientProps.noProxy = noProxy; + const credentialsClient = new CredentialsClient(clientProps); let sourceAccountId: string; let webIdentityToken: string; diff --git a/tsconfig.json b/tsconfig.json index 227fd8171..9294dbf31 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "allowUnreachableCode": false, "allowUnusedLabels": false, "strict": true, - "exactOptionalPropertyTypes": false, + "exactOptionalPropertyTypes": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, "noImplicitReturns": true,