diff --git a/src/context/context.ts b/src/context/context.ts index af43ec3a57..d5b8a0de9d 100644 --- a/src/context/context.ts +++ b/src/context/context.ts @@ -123,11 +123,23 @@ function readProperty (obj: Scope, key: string) { if (obj.hasOwnProperty(key)) return obj[key] return obj.liquidMethodMissing(key) } - return key === 'size' ? readSize(obj) : obj[key] + if (key === 'size') return readSize(obj) + if (key === 'first') return readFirst(obj) + if (key === 'last') return readLast(obj) + return obj[key] +} + +function readFirst (obj: Scope) { + if (_.isArray(obj)) return obj[0] + return obj['first'] +} + +function readLast (obj: Scope) { + if (_.isArray(obj)) return obj[obj.length - 1] + return obj['last'] } function readSize (obj: Scope) { - if (!_.isNil(obj['size'])) return obj['size'] if (_.isArray(obj) || _.isString(obj)) return obj.length return obj['size'] } diff --git a/test/unit/context/context.ts b/test/unit/context/context.ts index 2c51692f97..66441f3a71 100644 --- a/test/unit/context/context.ts +++ b/test/unit/context/context.ts @@ -11,6 +11,10 @@ describe('Context', function () { foo: 'zoo', one: 1, zoo: { size: 4 }, + obj: { + first: 'f', + last: 'l' + }, bar: { zoo: 'coo', 'Mr.Smith': 'John', @@ -124,6 +128,18 @@ describe('Context', function () { it('should return undefined if do not have size and length', async function () { expect(ctx.get('one.size')).to.equal(undefined) }) + it('should read .first of array', async function () { + expect(ctx.get('bar.arr.first')).to.equal('a') + }) + it('should read .first of object', async function () { + expect(ctx.get('obj.first')).to.equal('f') + }) + it('should read .last of array', async function () { + expect(ctx.get('bar.arr.last')).to.equal('b') + }) + it('should read .last of object', async function () { + expect(ctx.get('obj.last')).to.equal('l') + }) }) describe('strictVariables', async function () { let ctx: Context