From fdf0043b9cd81aedb6d0e1f59ff4d50b53361bb9 Mon Sep 17 00:00:00 2001 From: harttle Date: Sun, 12 May 2019 21:03:35 +0800 Subject: [PATCH] fix: date from integer, #125 --- src/builtin/filters/date.ts | 6 ++++-- src/builtin/tags/decrement.ts | 3 ++- src/builtin/tags/increment.ts | 3 ++- src/util/underscore.ts | 4 ++++ test/integration/builtin/filters/date.ts | 22 ++++++++++++++++++++++ test/unit/util/underscore.ts | 8 ++++++++ 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/builtin/filters/date.ts b/src/builtin/filters/date.ts index e3a54517c5..6546303036 100644 --- a/src/builtin/filters/date.ts +++ b/src/builtin/filters/date.ts @@ -1,13 +1,15 @@ import strftime from '../../util/strftime' -import { isString } from '../../util/underscore' +import { isString, isNumber } from '../../util/underscore' export default { 'date': (v: string | Date, arg: string) => { let date = v if (v === 'now') { date = new Date() + } else if (isNumber(v)) { + date = new Date(v * 1000) } else if (isString(v)) { - date = new Date(v) + date = /^\d+$/.test(v) ? new Date(+v * 1000) : new Date(v) } return isValidDate(date) ? strftime(date, arg) : v } diff --git a/src/builtin/tags/decrement.ts b/src/builtin/tags/decrement.ts index 9d40e955e2..70bbb4b670 100644 --- a/src/builtin/tags/decrement.ts +++ b/src/builtin/tags/decrement.ts @@ -3,6 +3,7 @@ import { identifier } from '../../parser/lexical' import TagToken from '../../parser/tag-token' import Context from '../../context/context' import ITagImplOptions from '../../template/tag/itag-impl-options' +import { isNumber } from '../../util/underscore' export default { parse: function (token: TagToken) { @@ -12,7 +13,7 @@ export default { }, render: function (context: Context) { const scope = context.environments - if (typeof scope[this.variable] !== 'number') { + if (!isNumber(scope[this.variable])) { scope[this.variable] = 0 } return --scope[this.variable] diff --git a/src/builtin/tags/increment.ts b/src/builtin/tags/increment.ts index ebba0555ba..44125313d9 100644 --- a/src/builtin/tags/increment.ts +++ b/src/builtin/tags/increment.ts @@ -1,5 +1,6 @@ import assert from '../../util/assert' import { identifier } from '../../parser/lexical' +import { isNumber } from '../../util/underscore' import ITagImplOptions from '../../template/tag/itag-impl-options' export default { @@ -10,7 +11,7 @@ export default { }, render: function (context) { const scope = context.environments - if (typeof scope[this.variable] !== 'number') { + if (!isNumber(scope[this.variable])) { scope[this.variable] = 0 } const val = scope[this.variable] diff --git a/src/util/underscore.ts b/src/util/underscore.ts index 40eccfda40..acee3dabc4 100644 --- a/src/util/underscore.ts +++ b/src/util/underscore.ts @@ -37,6 +37,10 @@ export function toValue (value: any): any { return value instanceof Drop ? value.valueOf() : value } +export function isNumber (value: any): value is number { + return typeof value === 'number' +} + export function toLiquid (value: any): any { if (isFunction(value.toLiquid)) return toLiquid(value.toLiquid()) return value diff --git a/test/integration/builtin/filters/date.ts b/test/integration/builtin/filters/date.ts index feb3811b00..a7f7cdd8a1 100644 --- a/test/integration/builtin/filters/date.ts +++ b/test/integration/builtin/filters/date.ts @@ -1,6 +1,12 @@ import { test, ctx } from '../../../stub/render' +import { expect } from 'chai' +import Liquid from '../../../../src/liquid' describe('filters/date', function () { + let liquid: Liquid + beforeEach(function () { + liquid = new Liquid() + }) it('should support date: %a %b %d %Y', function () { const str = ctx.date.toDateString() return test('{{ date | date:"%a %b %d %Y"}}', str) @@ -17,4 +23,20 @@ describe('filters/date', function () { it('should render object as string if not valid', function () { return test('{{ obj | date: "%Y"}}', '[object Object]') }) + it('should create from number-like string', async function () { + const src = '{{ "1488859200" | date: "%Y-%m-%dT%H:%M:%S" }}' + const dst = '2017-03-07T12:00:00' + expect(await liquid.parseAndRender(src)).to.equal(dst) + }) + it('should create from number', async function () { + const src = '{{ 1488859200 | date: "%Y-%m-%dT%H:%M:%S" }}' + const dst = '2017-03-07T12:00:00' + expect(await liquid.parseAndRender(src)).to.equal(dst) + }) + it('should support manipulation', async function () { + const src = '{{ date | date: "%s" | minus : 604800 | date: "%Y-%m-%dT%H:%M:%S"}}' + const ctx = { date: new Date('2017-03-07 12:00:00.000+8:00') } + const dst = '2017-02-28T12:00:00' + expect(await liquid.parseAndRender(src, ctx)).to.equal(dst) + }) }) diff --git a/test/unit/util/underscore.ts b/test/unit/util/underscore.ts index 269fca031f..5b08eb7e4f 100644 --- a/test/unit/util/underscore.ts +++ b/test/unit/util/underscore.ts @@ -18,6 +18,14 @@ describe('util/underscore', function () { expect(_.isString(123)).to.be.false }) }) + describe('.isNumber()', function () { + it('should return false for "foo"', function () { + expect(_.isNumber('foo')).to.be.false + }) + it('should return true for 0', function () { + expect(_.isNumber(0)).to.be.true + }) + }) describe('.stringify()', function () { it('should respect to toLiquid() method', function () { expect(_.stringify({ toLiquid: () => 'foo' })).to.equal('foo')