import { describe, expect, it } from '@jest/globals'; import { get } from '../src/index'; const data = { customer: { address: { city: 'bangalore' }, orders: [ { id: 'order-1', items: [ { id: 1, amount: 10 }, { id: 2, amount: 20 } ] }, { id: 'order-2', items: [ { id: 3, amount: 30 }, { id: 4, amount: 40 } ] } ] } }; describe('get', () => { it.each([ ['customer.address.city', 'bangalore'], ['customer.orders.items.amount', [10, 20, 30, 40]], ['customer.orders.items.amount[0]', 10], ['..items.amount', [10, 20, 30, 40]], ['..amount', [10, 20, 30, 40]], ['..items.amount[0]', 10], ['..items[0].amount', 10], ['..items[5].amount', undefined], // invalid index ['..id', ['order-1', 1, 2, 'order-2', 3, 4]], // all ids ['customer.orders.foo', undefined], ['..customer.foo', undefined], ['..address', [{ city: 'bangalore' }]], // .. will return array ['..address[0]', { city: 'bangalore' }] ])('%s should be %j', (expr, result) => { expect(get(data, expr)).toEqual(result); }); // filter and map it.each([ ['..items[?].amount', [40], (i: any) => i.amount > 30], // [?] filter ['..items[?].amount', [40], { id: 4, amount: 40 }], // object filter ['..items[?].amount', undefined, { id: 5, amount: 40 }], ['..items..amount[?][0]', 40, (amt: number) => amt > 30], ['..items..amount[0][?]', undefined, (amt: number) => amt > 30], // filter on single value ['..items..amount[?]', [11, 21, 31, 41], (amt: number) => amt + 1], // [?] mapper ['..items..amount[0][?]', 11, (amt: number) => amt + 1] // [?] map on single value ])('%s should be %j for %s', (expr, result, filter) => { expect(get(data, expr, filter)).toEqual(result); }); });