Skip to content

Commit d88521e

Browse files
authored
fix(shared-ini-file-loader): read config files from paths relative to homedir (#1315)
Co-authored-by: Alex Rybakov <[email protected]>
1 parent 978b724 commit d88521e

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

.changeset/eight-beans-visit.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@smithy/shared-ini-file-loader": patch
3+
---
4+
5+
read config files from paths relative to homedir

packages/shared-ini-file-loader/src/loadSharedConfigFiles.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { getConfigData } from "./getConfigData";
22
import { getConfigFilepath } from "./getConfigFilepath";
33
import { getCredentialsFilepath } from "./getCredentialsFilepath";
4+
import { getHomeDir } from "./getHomeDir";
45
import { loadSharedConfigFiles } from "./loadSharedConfigFiles";
56
import { parseIni } from "./parseIni";
67
import { slurpFile } from "./slurpFile";
@@ -10,6 +11,7 @@ jest.mock("./getConfigFilepath");
1011
jest.mock("./getCredentialsFilepath");
1112
jest.mock("./parseIni");
1213
jest.mock("./slurpFile");
14+
jest.mock("./getHomeDir");
1315

1416
describe("loadSharedConfigFiles", () => {
1517
const mockConfigFilepath = "/mock/file/path/config";
@@ -18,13 +20,15 @@ describe("loadSharedConfigFiles", () => {
1820
configFile: mockConfigFilepath,
1921
credentialsFile: mockCredsFilepath,
2022
};
23+
const mockHomeDir = "/users/alias";
2124

2225
beforeEach(() => {
2326
(getConfigFilepath as jest.Mock).mockReturnValue(mockConfigFilepath);
2427
(getCredentialsFilepath as jest.Mock).mockReturnValue(mockCredsFilepath);
2528
(parseIni as jest.Mock).mockImplementation((args) => args);
2629
(getConfigData as jest.Mock).mockImplementation((args) => args);
2730
(slurpFile as jest.Mock).mockImplementation((path) => Promise.resolve(path));
31+
(getHomeDir as jest.Mock).mockReturnValue(mockHomeDir);
2832
});
2933

3034
afterEach(() => {
@@ -49,6 +53,20 @@ describe("loadSharedConfigFiles", () => {
4953
expect(getCredentialsFilepath).not.toHaveBeenCalled();
5054
});
5155

56+
it("expands homedir in configFile and credentialsFile from init if defined", async () => {
57+
const sharedConfigFiles = await loadSharedConfigFiles({
58+
filepath: "~/path/credentials",
59+
configFilepath: "~/path/config",
60+
});
61+
expect(sharedConfigFiles).toStrictEqual({
62+
configFile: "/users/alias/path/config",
63+
credentialsFile: "/users/alias/path/credentials",
64+
});
65+
expect(getHomeDir).toHaveBeenCalled();
66+
expect(getConfigFilepath).not.toHaveBeenCalled();
67+
expect(getCredentialsFilepath).not.toHaveBeenCalled();
68+
});
69+
5270
describe("swallows error and returns empty configuration", () => {
5371
it("when readFile throws error", async () => {
5472
(slurpFile as jest.Mock).mockRejectedValue("error");

packages/shared-ini-file-loader/src/loadSharedConfigFiles.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { Logger, SharedConfigFiles } from "@smithy/types";
2+
import { join } from "path";
23

34
import { getConfigData } from "./getConfigData";
45
import { getConfigFilepath } from "./getConfigFilepath";
56
import { getCredentialsFilepath } from "./getCredentialsFilepath";
7+
import { getHomeDir } from "./getHomeDir";
68
import { parseIni } from "./parseIni";
79
import { slurpFile } from "./slurpFile";
810

@@ -39,15 +41,27 @@ export const CONFIG_PREFIX_SEPARATOR = ".";
3941

4042
export const loadSharedConfigFiles = async (init: SharedConfigInit = {}): Promise<SharedConfigFiles> => {
4143
const { filepath = getCredentialsFilepath(), configFilepath = getConfigFilepath() } = init;
44+
const homeDir = getHomeDir();
45+
const relativeHomeDirPrefix = "~/";
46+
47+
let resolvedFilepath = filepath;
48+
if (filepath.startsWith(relativeHomeDirPrefix)) {
49+
resolvedFilepath = join(homeDir, filepath.slice(2));
50+
}
51+
52+
let resolvedConfigFilepath = configFilepath;
53+
if (configFilepath.startsWith(relativeHomeDirPrefix)) {
54+
resolvedConfigFilepath = join(homeDir, configFilepath.slice(2));
55+
}
4256

4357
const parsedFiles = await Promise.all([
44-
slurpFile(configFilepath, {
58+
slurpFile(resolvedConfigFilepath, {
4559
ignoreCache: init.ignoreCache,
4660
})
4761
.then(parseIni)
4862
.then(getConfigData)
4963
.catch(swallowError),
50-
slurpFile(filepath, {
64+
slurpFile(resolvedFilepath, {
5165
ignoreCache: init.ignoreCache,
5266
})
5367
.then(parseIni)

0 commit comments

Comments
 (0)