Skip to content

Commit

Permalink
fix: Add NegativeYear Plugin support (#2640)
Browse files Browse the repository at this point in the history
  • Loading branch information
klm-turing committed May 12, 2024
1 parent 3737c8c commit 6a42e0d
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
23 changes: 23 additions & 0 deletions src/plugin/negativeYear/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export default (_, c, dayjs) => {
const proto = c.prototype

const parseDate = (cfg) => {
const { date } = cfg
if (typeof date === 'string' && date.charAt(0) === '-') {
const newDate = new Date(date.slice(1))
const fullYear = newDate.getFullYear()
if (date.indexOf(`-${fullYear}`) !== -1) {
return dayjs(newDate).subtract(fullYear * 2, 'year').toDate()
}
return date
}
return date
}

const oldParse = proto.parse
proto.parse = function (cfg) {
cfg.date = parseDate.bind(this)(cfg)
oldParse.bind(this)(cfg)
}
}

52 changes: 52 additions & 0 deletions test/plugin/negativeYear.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import MockDate from 'mockdate'
import dayjs from 'dayjs'
import negativeYear from '../../src/plugin/negativeYear'
import utc from '../../src/plugin/utc'
import { REGEX_PARSE } from '../../src/constant'


dayjs.extend(negativeYear)
dayjs.extend(utc)

beforeEach(() => {
MockDate.set(new Date())
})

afterEach(() => {
MockDate.reset()
})

describe('negativeYear', () => {
it('parses negative years', () => {
expect(dayjs('-2020-01-01').year()).toBe(-2020)
const date = '-2021/01/03'
const date2 = '01/03/-2021'
const date3 = '01-03--2021'
const d = date.match(REGEX_PARSE)
expect(dayjs(date).format('YYYY-MM-DD')).toBe('-2021-01-03')
expect(dayjs(date2).format('YYYY-MM-DD')).toBe('Invalid Date')
expect(dayjs(date3).format()).toBe('Invalid Date')
expect(d).toBe(null)
})

it('does not parse non-negative years', () => {
expect(dayjs('2020-01-01').year()).toBe(2020)
})

it('works with other plugins', () => {
expect(dayjs.utc('-2020-01-01').year()).toBe(-2020)
})

it('Add and subtract with negative years', () => {
expect(dayjs('-2006').add(1, 'y')).toEqual(dayjs('-2005'))
expect(dayjs('-2006').subtract(1, 'y')).toEqual(dayjs('-2007'))
expect(dayjs('-2006').add(1, 'y').format('YYYY')).toBe(dayjs('-2005').format('YYYY'))
expect(dayjs('-2006').subtract(1, 'y').format('YYYY')).toBe(dayjs('-2007').format('YYYY'))
})

it('Compare date with negative years', () => {
expect(dayjs('-2006').isAfter(dayjs('-2007'))).toBeTruthy()
expect(dayjs('-2006').isBefore(dayjs('-2005'))).toBeTruthy()
expect(dayjs('-2006').isSame('-2006')).toBeTruthy()
})
})
4 changes: 4 additions & 0 deletions types/plugin/negativeYear.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import {PluginFunc} from 'dayjs'

declare const plugin: PluginFunc
export = plugin

0 comments on commit 6a42e0d

Please sign in to comment.