diff --git a/packages/common/jest.config.js b/packages/common/jest.config.js new file mode 100644 index 0000000..7b62f2d --- /dev/null +++ b/packages/common/jest.config.js @@ -0,0 +1,17 @@ +module.exports = { + roots: [ + '/src' + ], + transform: { + '^.+\\.tsx?$': 'ts-jest' + }, + testRegex: '(/__tests__/.*|\\.(test|spec))\\.tsx?$', + moduleFileExtensions: [ + 'ts', + 'tsx', + 'js', + 'jsx' + ], + setupFiles: ['/jest.setup.js'], + verbose: false +} diff --git a/packages/common/jest.setup.js b/packages/common/jest.setup.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/common/src/indexBy.test.ts b/packages/common/src/indexBy.test.ts new file mode 100644 index 0000000..533c255 --- /dev/null +++ b/packages/common/src/indexBy.test.ts @@ -0,0 +1,28 @@ +import {indexBy} from './indexBy' + +describe('indexBy', () => { + + const items = [{ + id: 10, + name: 'one', + value: true, + }, { + id: 20, + name: 'two', + value: false, + }] + + it('indexes objects by string property', () => { + expect(indexBy(items, 'id')).toEqual({ + 10: items[0], + 20: items[1], + }) + }) + + it('indexes objects by numeric property', () => { + expect(indexBy(items, 'name')).toEqual({ + one: items[0], + two: items[1], + }) + }) +}) diff --git a/packages/common/src/indexBy.ts b/packages/common/src/indexBy.ts new file mode 100644 index 0000000..f9b5093 --- /dev/null +++ b/packages/common/src/indexBy.ts @@ -0,0 +1,9 @@ +export function indexBy( + items: T[], + key: T[K] extends string | number ? K : never, +) { + return items.reduce((obj, item) => { + obj[String(item[key])] = item + return obj + }, {} as {[k: string]: T}) +}