Skip to content

Commit e0697ed

Browse files
authored
feat(credential-provider-env): refactor into modular components (#3293)
1 parent 3485cf0 commit e0697ed

File tree

4 files changed

+87
-96
lines changed

4 files changed

+87
-96
lines changed

Diff for: packages/credential-provider-env/src/fromEnv.spec.ts

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { CredentialsProviderError } from "@aws-sdk/property-provider";
2+
3+
import { ENV_EXPIRATION, ENV_KEY, ENV_SECRET, ENV_SESSION, fromEnv } from "./fromEnv";
4+
5+
describe(fromEnv.name, () => {
6+
const ORIGINAL_ENV = process.env;
7+
const mockAccessKeyId = "mockAccessKeyId";
8+
const mockSecretAccessKey = "mockSecretAccessKey";
9+
const mockSessionToken = "mockSessionToken";
10+
const mockExpiration = new Date().toISOString();
11+
12+
beforeEach(() => {
13+
process.env = {
14+
...ORIGINAL_ENV,
15+
[ENV_KEY]: mockAccessKeyId,
16+
[ENV_SECRET]: mockSecretAccessKey,
17+
[ENV_SESSION]: mockSessionToken,
18+
[ENV_EXPIRATION]: mockExpiration,
19+
};
20+
});
21+
22+
afterEach(() => {
23+
process.env = ORIGINAL_ENV;
24+
});
25+
26+
it("should read credentials from known environment variables", async () => {
27+
const receivedCreds = await fromEnv()();
28+
expect(receivedCreds).toStrictEqual({
29+
accessKeyId: mockAccessKeyId,
30+
secretAccessKey: mockSecretAccessKey,
31+
sessionToken: mockSessionToken,
32+
expiration: new Date(mockExpiration),
33+
});
34+
});
35+
36+
it("can create credentials without a session token or expiration", async () => {
37+
delete process.env[ENV_SESSION];
38+
delete process.env[ENV_EXPIRATION];
39+
const receivedCreds = await fromEnv()();
40+
expect(receivedCreds).toStrictEqual({
41+
accessKeyId: mockAccessKeyId,
42+
secretAccessKey: mockSecretAccessKey,
43+
});
44+
});
45+
46+
it.each([ENV_KEY, ENV_SECRET])("throws if env['%s'] is not found", async (key) => {
47+
delete process.env[key];
48+
const expectedError = new CredentialsProviderError("Unable to find environment variable credentials.");
49+
try {
50+
await fromEnv()();
51+
fail(`expected ${expectedError}`);
52+
} catch (error) {
53+
expect(error).toStrictEqual(expectedError);
54+
}
55+
});
56+
});

Diff for: packages/credential-provider-env/src/fromEnv.ts

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { CredentialsProviderError } from "@aws-sdk/property-provider";
2+
import { CredentialProvider } from "@aws-sdk/types";
3+
4+
export const ENV_KEY = "AWS_ACCESS_KEY_ID";
5+
export const ENV_SECRET = "AWS_SECRET_ACCESS_KEY";
6+
export const ENV_SESSION = "AWS_SESSION_TOKEN";
7+
export const ENV_EXPIRATION = "AWS_CREDENTIAL_EXPIRATION";
8+
9+
/**
10+
* Source AWS credentials from known environment variables. If either the
11+
* `AWS_ACCESS_KEY_ID` or `AWS_SECRET_ACCESS_KEY` environment variable is not
12+
* set in this process, the provider will return a rejected promise.
13+
*/
14+
export const fromEnv = (): CredentialProvider => async () => {
15+
const accessKeyId: string | undefined = process.env[ENV_KEY];
16+
const secretAccessKey: string | undefined = process.env[ENV_SECRET];
17+
const sessionToken: string | undefined = process.env[ENV_SESSION];
18+
const expiry: string | undefined = process.env[ENV_EXPIRATION];
19+
20+
if (accessKeyId && secretAccessKey) {
21+
return {
22+
accessKeyId,
23+
secretAccessKey,
24+
...(sessionToken && { sessionToken }),
25+
...(expiry && { expiration: new Date(expiry) }),
26+
};
27+
}
28+
29+
throw new CredentialsProviderError("Unable to find environment variable credentials.");
30+
};

Diff for: packages/credential-provider-env/src/index.spec.ts

-66
This file was deleted.

Diff for: packages/credential-provider-env/src/index.ts

+1-30
Original file line numberDiff line numberDiff line change
@@ -1,30 +1 @@
1-
import { CredentialsProviderError } from "@aws-sdk/property-provider";
2-
import { CredentialProvider } from "@aws-sdk/types";
3-
4-
export const ENV_KEY = "AWS_ACCESS_KEY_ID";
5-
export const ENV_SECRET = "AWS_SECRET_ACCESS_KEY";
6-
export const ENV_SESSION = "AWS_SESSION_TOKEN";
7-
export const ENV_EXPIRATION = "AWS_CREDENTIAL_EXPIRATION";
8-
9-
/**
10-
* Source AWS credentials from known environment variables. If either the
11-
* `AWS_ACCESS_KEY_ID` or `AWS_SECRET_ACCESS_KEY` environment variable is not
12-
* set in this process, the provider will return a rejected promise.
13-
*/
14-
export function fromEnv(): CredentialProvider {
15-
return () => {
16-
const accessKeyId: string | undefined = process.env[ENV_KEY];
17-
const secretAccessKey: string | undefined = process.env[ENV_SECRET];
18-
const expiry: string | undefined = process.env[ENV_EXPIRATION];
19-
if (accessKeyId && secretAccessKey) {
20-
return Promise.resolve({
21-
accessKeyId,
22-
secretAccessKey,
23-
sessionToken: process.env[ENV_SESSION],
24-
expiration: expiry ? new Date(expiry) : undefined,
25-
});
26-
}
27-
28-
return Promise.reject(new CredentialsProviderError("Unable to find environment variable credentials."));
29-
};
30-
}
1+
export * from "./fromEnv";

0 commit comments

Comments
 (0)