Skip to content

Commit

Permalink
Migrate getWeekYear to TS (#2375)
Browse files Browse the repository at this point in the history
  • Loading branch information
tan75 committed Apr 1, 2021
1 parent 6065851 commit 4544f0c
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 89 deletions.
37 changes: 22 additions & 15 deletions src/getWeekYear/index.js → src/getWeekYear/index.ts
Expand Up @@ -2,6 +2,11 @@ import startOfWeek from '../startOfWeek/index'
import toDate from '../toDate/index'
import toInteger from '../_lib/toInteger/index'
import requiredArgs from '../_lib/requiredArgs/index'
import {
WeekStartOptions,
LocaleOptions,
FirstWeekContainsDateOptions,
} from '../types'

/**
* @name getWeekYear
Expand Down Expand Up @@ -33,34 +38,36 @@ import requiredArgs from '../_lib/requiredArgs/index'
*
* @example
* // Which week numbering year is 26 December 2004 with the default settings?
* var result = getWeekYear(new Date(2004, 11, 26))
* const result = getWeekYear(new Date(2004, 11, 26))
* //=> 2005
*
* @example
* // Which week numbering year is 26 December 2004 if week starts on Saturday?
* var result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })
* const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })
* //=> 2004
*
* @example
* // Which week numbering year is 26 December 2004 if the first week contains 4 January?
* var result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })
* const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })
* //=> 2004
*/
export default function getWeekYear(dirtyDate, dirtyOptions) {
export default function getWeekYear(
dirtyDate: Date | number,
options: LocaleOptions & WeekStartOptions & FirstWeekContainsDateOptions = {}
): number {
requiredArgs(1, arguments)

var date = toDate(dirtyDate)
var year = date.getFullYear()
const date = toDate(dirtyDate)
const year = date.getFullYear()

var options = dirtyOptions || {}
var locale = options.locale
var localeFirstWeekContainsDate =
const locale = options.locale
const localeFirstWeekContainsDate =
locale && locale.options && locale.options.firstWeekContainsDate
var defaultFirstWeekContainsDate =
const defaultFirstWeekContainsDate =
localeFirstWeekContainsDate == null
? 1
: toInteger(localeFirstWeekContainsDate)
var firstWeekContainsDate =
const firstWeekContainsDate =
options.firstWeekContainsDate == null
? defaultFirstWeekContainsDate
: toInteger(options.firstWeekContainsDate)
Expand All @@ -72,15 +79,15 @@ export default function getWeekYear(dirtyDate, dirtyOptions) {
)
}

var firstWeekOfNextYear = new Date(0)
const firstWeekOfNextYear = new Date(0)
firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate)
firstWeekOfNextYear.setHours(0, 0, 0, 0)
var startOfNextYear = startOfWeek(firstWeekOfNextYear, dirtyOptions)
const startOfNextYear = startOfWeek(firstWeekOfNextYear, options)

var firstWeekOfThisYear = new Date(0)
const firstWeekOfThisYear = new Date(0)
firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate)
firstWeekOfThisYear.setHours(0, 0, 0, 0)
var startOfThisYear = startOfWeek(firstWeekOfThisYear, dirtyOptions)
const startOfThisYear = startOfWeek(firstWeekOfThisYear, options)

if (date.getTime() >= startOfNextYear.getTime()) {
return year + 1
Expand Down
74 changes: 0 additions & 74 deletions src/getWeekYear/test.js

This file was deleted.

75 changes: 75 additions & 0 deletions src/getWeekYear/test.ts
@@ -0,0 +1,75 @@
// @flow
/* eslint-env mocha */

import assert from 'assert'
import getWeekYear from '.'

describe('getWeekYear', () => {
it('returns the local week-numbering year of the given date', () => {
const result = getWeekYear(new Date(2004, 11 /* Dec */, 26))
assert(result === 2005)
})

it('accepts a timestamp', () => {
const result = getWeekYear(new Date(2000, 11 /* Dec */, 30).getTime())
assert(result === 2000)
})

it('handles dates before 100 AD', () => {
const initialDate = new Date(0)
initialDate.setFullYear(7, 11 /* Dec */, 31)
initialDate.setHours(0, 0, 0, 0)
const result = getWeekYear(initialDate)
assert(result === 8)
})

it('returns NaN if the given date is invalid', () => {
const result = getWeekYear(new Date(NaN))
assert(isNaN(result))
})

it('allows to specify `weekStartsOn` and `firstWeekContainsDate` in locale', () => {
const date = new Date(2004, 11 /* Dec */, 26)
const result = getWeekYear(date, {
// @ts-expect-error
locale: {
options: { weekStartsOn: 1, firstWeekContainsDate: 4 },
},
})
assert(result === 2004)
})

it('`options.weekStartsOn` overwrites the first day of the week specified in locale', () => {
const date = new Date(2004, 11 /* Dec */, 26)
const result = getWeekYear(date, {
weekStartsOn: 1,
firstWeekContainsDate: 4,
// @ts-expect-error
locale: {
options: { weekStartsOn: 0, firstWeekContainsDate: 1 },
},
})
assert(result === 2004)
})

it('throws `RangeError` if `options.weekStartsOn` is not convertable to 0, 1, ..., 6 or undefined', () => {
// @ts-expect-error
const block = getWeekYear.bind(null, new Date(2007, 11 /* Dec */, 31), {
weekStartsOn: NaN,
})
assert.throws(block, RangeError)
})

it('throws `RangeError` if `options.firstWeekContainsDate` is not convertable to 1, 2, ..., 7 or undefined', () => {
// @ts-expect-error
const block = getWeekYear.bind(null, new Date(2007, 11 /* Dec */, 31), {
firstWeekContainsDate: NaN,
})
assert.throws(block, RangeError)
})

it('throws TypeError exception if passed less than 1 argument', () => {
// @ts-expect-error
assert.throws(getWeekYear.bind(null), TypeError)
})
})
6 changes: 6 additions & 0 deletions src/types.ts
Expand Up @@ -27,8 +27,14 @@ export interface LocaleOptions {
locale?: Locale
}

export interface FirstWeekContainsDateOptions {
firstWeekContainsDate?: FirstWeekContainsDate
}

export type Day = 0 | 1 | 2 | 3 | 4 | 5 | 6

export type FirstWeekContainsDate = 1 | 4

export interface DateValues {
year?: number
month?: number
Expand Down

0 comments on commit 4544f0c

Please sign in to comment.