Skip to content

Commit

Permalink
fix: correct merging of config files so that keys from each file are …
Browse files Browse the repository at this point in the history
…kept (#4388)
  • Loading branch information
mcfedr authored Mar 27, 2023
1 parent b5b6bee commit 9284e20
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 12 deletions.
25 changes: 25 additions & 0 deletions packages/shared-ini-file-loader/src/mergeConfigFiles.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { mergeConfigFiles } from "./mergeConfigFiles";

describe(mergeConfigFiles.name, () => {
it("merges profiles that are in multiple files", () => {
const mockConfigFile = {
profileName1: { configKey: "configValue1" },
};
const mockCredentialsFile = {
profileName1: { credsKey: "configValue1" },
profileName2: { credsKey: "credsValue1" },
};

expect(mergeConfigFiles(mockConfigFile, mockCredentialsFile)).toMatchInlineSnapshot(`
Object {
"profileName1": Object {
"configKey": "configValue1",
"credsKey": "configValue1",
},
"profileName2": Object {
"credsKey": "credsValue1",
},
}
`);
});
});
20 changes: 20 additions & 0 deletions packages/shared-ini-file-loader/src/mergeConfigFiles.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { ParsedIniData } from "@aws-sdk/types";

/**
* Merge multiple profile config files such that settings each file are kept together
*
* @internal
*/
export const mergeConfigFiles = (...files: ParsedIniData[]): ParsedIniData => {
const merged: ParsedIniData = {};
for (const file of files) {
for (const [key, values] of Object.entries(file)) {
if (merged[key] !== undefined) {
Object.assign(merged[key], values);
} else {
merged[key] = values;
}
}
}
return merged;
};
24 changes: 16 additions & 8 deletions packages/shared-ini-file-loader/src/parseKnownFiles.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ jest.mock("./loadSharedConfigFiles");

describe(parseKnownFiles.name, () => {
const mockConfigFile = {
mockConfigProfileName1: { configKey1: "configValue1" },
mockConfigProfileName2: { configKey2: "configValue2" },
profileName1: { configKey1: "configValue1" },
profileName2: { configKey2: "configValue2" },
};
const mockCredentialsFile = {
mockCredentialsProfileName1: { credsKey1: "credsValue1" },
mockCredentialsProfileName2: { credsKey2: "credsValue2" },
profileName1: { credsKey1: "credsValue1" },
profileName2: { credsKey2: "credsValue2" },
};

afterEach(() => {
Expand All @@ -28,9 +28,17 @@ describe(parseKnownFiles.name, () => {
const parsedFiles = await parseKnownFiles(mockInit);

expect(loadSharedConfigFiles).toHaveBeenCalledWith(mockInit);
expect(parsedFiles).toEqual({
...mockConfigFile,
...mockCredentialsFile,
});
expect(parsedFiles).toMatchInlineSnapshot(`
Object {
"profileName1": Object {
"configKey1": "configValue1",
"credsKey1": "credsValue1",
},
"profileName2": Object {
"configKey2": "configValue2",
"credsKey2": "credsValue2",
},
}
`);
});
});
6 changes: 2 additions & 4 deletions packages/shared-ini-file-loader/src/parseKnownFiles.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ParsedIniData } from "@aws-sdk/types";

import { loadSharedConfigFiles, SharedConfigInit } from "./loadSharedConfigFiles";
import { mergeConfigFiles } from "./mergeConfigFiles";

export interface SourceProfileInit extends SharedConfigInit {
/**
Expand All @@ -17,8 +18,5 @@ export interface SourceProfileInit extends SharedConfigInit {
*/
export const parseKnownFiles = async (init: SourceProfileInit): Promise<ParsedIniData> => {
const parsedFiles = await loadSharedConfigFiles(init);
return {
...parsedFiles.configFile,
...parsedFiles.credentialsFile,
};
return mergeConfigFiles(parsedFiles.configFile, parsedFiles.credentialsFile);
};

0 comments on commit 9284e20

Please sign in to comment.