diff --git a/src/getWeekYear/index.js b/src/getWeekYear/index.ts similarity index 76% rename from src/getWeekYear/index.js rename to src/getWeekYear/index.ts index 08a9437d96..ce31d5d27e 100644 --- a/src/getWeekYear/index.js +++ b/src/getWeekYear/index.ts @@ -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 @@ -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) @@ -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 diff --git a/src/getWeekYear/test.js b/src/getWeekYear/test.js deleted file mode 100644 index 5272931c9f..0000000000 --- a/src/getWeekYear/test.js +++ /dev/null @@ -1,74 +0,0 @@ -// @flow -/* eslint-env mocha */ - -import assert from 'power-assert' -import getWeekYear from '.' - -describe('getWeekYear', function() { - it('returns the local week-numbering year of the given date', function() { - var result = getWeekYear(new Date(2004, 11 /* Dec */, 26)) - assert(result === 2005) - }) - - it('accepts a timestamp', function() { - var result = getWeekYear(new Date(2000, 11 /* Dec */, 30).getTime()) - assert(result === 2000) - }) - - it('handles dates before 100 AD', function() { - var initialDate = new Date(0) - initialDate.setFullYear(7, 11 /* Dec */, 31) - initialDate.setHours(0, 0, 0, 0) - var result = getWeekYear(initialDate) - assert(result === 8) - }) - - it('returns NaN if the given date is invalid', function() { - var result = getWeekYear(new Date(NaN)) - assert(isNaN(result)) - }) - - it('allows to specify `weekStartsOn` and `firstWeekContainsDate` in locale', function() { - var date = new Date(2004, 11 /* Dec */, 26) - var result = getWeekYear(date, { - // $ExpectedMistake - locale: { - options: { weekStartsOn: 1, firstWeekContainsDate: 4 } - } - }) - assert(result === 2004) - }) - - it('`options.weekStartsOn` overwrites the first day of the week specified in locale', function() { - var date = new Date(2004, 11 /* Dec */, 26) - var result = getWeekYear(date, { - weekStartsOn: 1, - firstWeekContainsDate: 4, - // $ExpectedMistake - locale: { - options: { weekStartsOn: 0, firstWeekContainsDate: 1 } - } - }) - assert(result === 2004) - }) - - it('throws `RangeError` if `options.weekStartsOn` is not convertable to 0, 1, ..., 6 or undefined', function() { - // $ExpectedMistake - var 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', function() { - // $ExpectedMistake - var 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', function() { - assert.throws(getWeekYear.bind(null), TypeError) - }) -}) diff --git a/src/getWeekYear/test.ts b/src/getWeekYear/test.ts new file mode 100644 index 0000000000..0f8bf54902 --- /dev/null +++ b/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) + }) +}) diff --git a/src/types.ts b/src/types.ts index 751e10b60e..1ccc4658a2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -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