Skip to content

Commit 6f64f3a

Browse files
committed
Add a node default region provider
1 parent c889522 commit 6f64f3a

25 files changed

+315
-209
lines changed

packages/region-provider-node/.gitignore

Lines changed: 0 additions & 4 deletions
This file was deleted.

packages/region-provider-node/__tests__/fromSharedConfigFiles.ts

Whitespace-only changes.

packages/region-provider-node/index.ts

Lines changed: 0 additions & 2 deletions
This file was deleted.

packages/region-provider-node/lib/fromEnv.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

packages/region-provider-node/package.json

Lines changed: 0 additions & 28 deletions
This file was deleted.

packages/region-provider-node/tsconfig.json

Lines changed: 0 additions & 13 deletions
This file was deleted.

packages/region-provider/.npmignore

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/src/
2+
/coverage/
3+
tsconfig.test.json
4+
5+
*.spec.js
6+
*.spec.d.ts
7+
*.spec.js.map
8+
9+
*.mock.js
10+
*.mock.d.ts
11+
*.mock.js.map
12+
13+
*.fixture.js
14+
*.fixture.d.ts
15+
*.fixture.js.map

packages/region-provider/__tests__/chain.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.

packages/region-provider/__tests__/fromString.ts

Lines changed: 0 additions & 10 deletions
This file was deleted.

packages/region-provider/__tests__/memoize.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.

packages/region-provider/index.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

packages/region-provider/lib/Provider.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

packages/region-provider/lib/chain.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

packages/region-provider/lib/fromString.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/region-provider/lib/memoize.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

packages/region-provider/package.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
"name": "@aws/region-provider",
33
"version": "0.0.1",
44
"private": true,
5-
"description": "AWS region provider core. Provides an abstraction for sourcing a region from one or more asynchronous sources",
6-
"main": "index.js",
5+
"description": "AWS region provider for Node.JS. Will determine the default region to use for AWS clients by checking known environment variables and shared configuration files",
6+
"main": "./build/index.js",
7+
"typings": "./build/index.d.ts",
78
"scripts": {
89
"prepublishOnly": "tsc",
9-
"pretest": "tsc",
10+
"pretest": "tsc -p tsconfig.test.json",
1011
"test": "jest"
1112
},
1213
"keywords": [
@@ -16,10 +17,13 @@
1617
"author": "[email protected]",
1718
"license": "Apache-2.0",
1819
"dependencies": {
20+
"@aws/property-provider": "^0.0.1",
21+
"@aws/shared-ini-file-loader": "^0.0.1",
1922
"@aws/types": "^0.0.1"
2023
},
2124
"devDependencies": {
2225
"@types/jest": "^20.0.2",
26+
"@types/node": "^7.0.12",
2327
"jest": "^20.0.4",
2428
"typescript": "^2.3"
2529
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import {defaultProvider} from './defaultProvider';
2+
import {ProviderError} from '@aws/property-provider';
3+
4+
jest.mock('./fromEnv', () => {
5+
const envProvider = jest.fn();
6+
return {
7+
fromEnv: jest.fn(() => envProvider),
8+
};
9+
});
10+
import {fromEnv, EnvConfiguration} from './fromEnv';
11+
12+
jest.mock('./fromSharedConfigFiles', () => {
13+
const iniProvider = jest.fn();
14+
return {
15+
fromSharedConfigFiles: jest.fn(() => iniProvider),
16+
};
17+
});
18+
import {fromSharedConfigFiles, SharedConfigInit} from './fromSharedConfigFiles';
19+
20+
beforeEach(() => {
21+
(fromEnv() as any).mockClear();
22+
(fromSharedConfigFiles() as any).mockClear();
23+
(fromEnv as any).mockClear();
24+
(fromSharedConfigFiles as any).mockClear();
25+
});
26+
27+
describe('defaultProvider', () => {
28+
it(
29+
'should stop after the environmental provider if a region has been found',
30+
async () => {
31+
const region = 'foo';
32+
(fromEnv() as any).mockImplementation(() => Promise.resolve(region));
33+
34+
expect(await defaultProvider()()).toEqual(region);
35+
expect((fromEnv() as any).mock.calls.length).toBe(1);
36+
expect((fromSharedConfigFiles() as any).mock.calls.length).toBe(0);
37+
}
38+
);
39+
40+
it(
41+
'should continue on to the ini provider if no environment variable region has been found',
42+
async () => {
43+
const region = 'foo';
44+
45+
(fromEnv() as any).mockImplementation(() => Promise.reject(new ProviderError('Nothing here!')));
46+
(fromSharedConfigFiles() as any).mockImplementation(() => Promise.resolve(region));
47+
48+
expect(await defaultProvider()()).toEqual(region);
49+
expect((fromEnv() as any).mock.calls.length).toBe(1);
50+
expect((fromSharedConfigFiles() as any).mock.calls.length).toBe(1);
51+
}
52+
);
53+
54+
it('should pass configuration on to the env provider', async () => {
55+
const envConfig: EnvConfiguration = {
56+
environmentVariableName: 'foo',
57+
};
58+
59+
(fromEnv() as any).mockImplementation(() => Promise.resolve('region'));
60+
(fromEnv as any).mockClear();
61+
62+
await expect(defaultProvider(envConfig)()).resolves;
63+
64+
expect((fromEnv as any).mock.calls.length).toBe(1);
65+
expect((fromEnv as any).mock.calls[0][0]).toBe(envConfig);
66+
});
67+
68+
it('should pass configuration on to the ini provider', async () => {
69+
const iniConfig: SharedConfigInit = {
70+
profile: 'foo',
71+
filepath: '/home/user/.secrets/credentials.ini',
72+
configFilepath: '/home/user/.secrets/credentials.ini',
73+
};
74+
75+
(fromEnv() as any).mockImplementation(() => Promise.reject(new ProviderError('Keep moving!')));
76+
(fromSharedConfigFiles() as any).mockImplementation(() => Promise.resolve('region'));
77+
78+
(fromSharedConfigFiles as any).mockClear();
79+
80+
await expect(defaultProvider(iniConfig)()).resolves;
81+
82+
expect((fromSharedConfigFiles as any).mock.calls.length).toBe(1);
83+
expect((fromSharedConfigFiles as any).mock.calls[0][0]).toBe(iniConfig);
84+
});
85+
86+
it('should return the same promise across invocations', async () => {
87+
const region = 'foo';
88+
(fromEnv() as any).mockImplementation(() => Promise.resolve(region));
89+
90+
const provider = defaultProvider();
91+
92+
expect(await provider()).toEqual(region);
93+
94+
expect(provider()).toBe(provider());
95+
96+
expect(await provider()).toEqual(region);
97+
expect((fromEnv() as any).mock.calls.length).toBe(1);
98+
});
99+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import {EnvConfiguration, fromEnv} from './fromEnv';
2+
import {SharedConfigInit, fromSharedConfigFiles} from './fromSharedConfigFiles';
3+
import {chain, memoize} from '@aws/property-provider';
4+
import {Provider} from '@aws/types';
5+
6+
export type RegionProviderConfiguration =
7+
EnvConfiguration &
8+
SharedConfigInit;
9+
10+
export function defaultProvider(
11+
configuration: RegionProviderConfiguration = {}
12+
): Provider<string> {
13+
return memoize(chain(
14+
fromEnv(configuration),
15+
fromSharedConfigFiles(configuration)
16+
));
17+
}

packages/region-provider-node/__tests__/fromEnv.ts renamed to packages/region-provider/src/fromEnv.spec.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import {fromEnv, ENV_REGION} from '../lib/fromEnv';
1+
import {fromEnv, ENV_REGION} from './fromEnv';
2+
import {ProviderError} from '@aws/property-provider';
23

34
describe('fromEnv', () => {
45
const ENV_CUSTOM = 'AWS_DEFAULT_REGION';
@@ -21,12 +22,18 @@ describe('fromEnv', () => {
2122
});
2223

2324
it(`should reject the promise is ${ENV_REGION} is not set`, async () => {
24-
await expect(fromEnv()()).rejects;
25+
await expect(fromEnv()())
26+
.rejects
27+
.toMatchObject(new ProviderError(
28+
`No value defined for the AWS_REGION environment variable`
29+
));
2530
});
2631

2732
it('should allow specifying custom environment variables', async () => {
2833
process.env[ENV_CUSTOM] = 'eu-central-35';
2934
expect(process.env[ENV_REGION]).toBeUndefined();
30-
expect(await fromEnv(ENV_CUSTOM)()).toBe(process.env[ENV_CUSTOM]);
35+
expect(
36+
await fromEnv({environmentVariableName: ENV_CUSTOM})()
37+
).toBe(process.env[ENV_CUSTOM]);
3138
});
3239
});

0 commit comments

Comments
 (0)