diff --git a/.changeset/calm-socks-end.md b/.changeset/calm-socks-end.md new file mode 100644 index 00000000000..2c6783acc04 --- /dev/null +++ b/.changeset/calm-socks-end.md @@ -0,0 +1,5 @@ +--- +"@smithy/node-config-provider": patch +--- + +Pass logger to environment variable selector diff --git a/packages/node-config-provider/src/configLoader.spec.ts b/packages/node-config-provider/src/configLoader.spec.ts index b6b8c061633..4ca14edc3ab 100644 --- a/packages/node-config-provider/src/configLoader.spec.ts +++ b/packages/node-config-provider/src/configLoader.spec.ts @@ -39,7 +39,7 @@ describe("loadConfig", () => { configuration ); expect(fromEnv).toHaveBeenCalledTimes(1); - expect(fromEnv).toHaveBeenCalledWith(envVarSelector, undefined); + expect(fromEnv).toHaveBeenCalledWith(envVarSelector, {}); expect(fromSharedConfigFiles).toHaveBeenCalledTimes(1); expect(fromSharedConfigFiles).toHaveBeenCalledWith(configKey, configuration); expect(fromStatic).toHaveBeenCalledTimes(1); @@ -84,4 +84,26 @@ describe("loadConfig", () => { expect(fromEnv).toHaveBeenCalledTimes(1); expect(fromEnv).toHaveBeenCalledWith(envVarSelector, { signingName: configWithSigningName.signingName }); }); + + it("passes logger in options object of fromEnv()", () => { + const configWithSigningName = { + ...configuration, + logger: console, + }; + const envVarSelector = (env: Record) => env["AWS_CONFIG_FOO"]; + const configKey = (profile: Profile) => profile["aws_config_foo"]; + const defaultValue = "foo-value"; + + loadConfig( + { + environmentVariableSelector: envVarSelector, + configFileSelector: configKey, + default: defaultValue, + }, + configWithSigningName + ); + + expect(fromEnv).toHaveBeenCalledTimes(1); + expect(fromEnv).toHaveBeenCalledWith(envVarSelector, { logger: configWithSigningName.logger }); + }); }); diff --git a/packages/node-config-provider/src/configLoader.ts b/packages/node-config-provider/src/configLoader.ts index 08b4de3f84d..741166c84d2 100644 --- a/packages/node-config-provider/src/configLoader.ts +++ b/packages/node-config-provider/src/configLoader.ts @@ -37,7 +37,9 @@ export const loadConfig = ( { environmentVariableSelector, configFileSelector, default: defaultValue }: LoadedConfigSelectors, configuration: LocalConfigOptions = {} ): Provider => { - const envOptions = configuration.signingName ? { signingName: configuration.signingName } : undefined; + const { signingName, logger } = configuration; + const envOptions: EnvOptions = { signingName, logger }; + return memoize( chain( fromEnv(environmentVariableSelector, envOptions), diff --git a/packages/node-config-provider/src/fromEnv.ts b/packages/node-config-provider/src/fromEnv.ts index 78b8139e609..ce3754f2e3e 100644 --- a/packages/node-config-provider/src/fromEnv.ts +++ b/packages/node-config-provider/src/fromEnv.ts @@ -1,5 +1,5 @@ import { CredentialsProviderError } from "@smithy/property-provider"; -import { Provider } from "@smithy/types"; +import { Logger, Provider } from "@smithy/types"; import { getSelectorName } from "./getSelectorName"; @@ -11,6 +11,11 @@ export interface EnvOptions { * The SigV4 service signing name. */ signingName?: string; + + /** + * For credential resolution trace logging. + */ + logger?: Logger; } // Using Record instead of NodeJS.ProcessEnv, in order to not get type errors in non node environments @@ -31,7 +36,8 @@ export const fromEnv = return config as T; } catch (e) { throw new CredentialsProviderError( - e.message || `Not found in ENV: ${getSelectorName(envVarSelector.toString())}` + e.message || `Not found in ENV: ${getSelectorName(envVarSelector.toString())}`, + { logger: options?.logger } ); } };