diff --git a/lib/core/__tests__/utils.test.js b/lib/core/__tests__/utils.test.js index 080ef43010cc..342c95c7b5f7 100644 --- a/lib/core/__tests__/utils.test.js +++ b/lib/core/__tests__/utils.test.js @@ -97,4 +97,45 @@ describe('utils', () => { expect(utils.getGitLastUpdated(tempFilePath)).toBeNull(); fs.unlinkSync(tempFilePath); }); + + test('idx', () => { + const a = {}; + const b = {hello: 'world'}; + const env = { + translation: { + enabled: true, + enabledLanguages: [ + { + enabled: true, + name: 'English', + tag: 'en', + }, + { + enabled: true, + name: '日本語', + tag: 'ja', + }, + ], + }, + versioning: { + enabled: false, + versions: [], + }, + }; + const variable = 'enabledLanguages'; + expect(utils.idx(a, [('b', 'c')])).toBeUndefined(); + expect(utils.idx(b, ['hello'])).toEqual('world'); + expect(utils.idx(b, 'hello')).toEqual('world'); + expect(utils.idx(env, 'typo')).toBeUndefined(); + expect(utils.idx(env, 'versioning')).toEqual({ + enabled: false, + versions: [], + }); + expect(utils.idx(env, ['translation', 'enabled'])).toEqual(true); + expect( + utils.idx(env, ['translation', variable]).map(lang => lang.tag) + ).toEqual(['en', 'ja']); + expect(utils.idx(undefined)).toBeUndefined(); + expect(utils.idx(null)).toBeNull(); + }); }); diff --git a/lib/core/utils.js b/lib/core/utils.js index d79732fd37c3..602eea58b69e 100644 --- a/lib/core/utils.js +++ b/lib/core/utils.js @@ -29,8 +29,13 @@ function getPath(pathStr, cleanUrl = false) { : removeExtension(pathStr); } -function idx(target, path) { - return path.reduce((obj, key) => obj && obj[key], target); +function idx(target, keyPaths) { + return ( + target && + (Array.isArray(keyPaths) + ? keyPaths.reduce((obj, key) => obj && obj[key], target) + : target[keyPaths]) + ); } function getGitLastUpdated(filepath) {