Skip to content

Commit

Permalink
migrate setUTCDay to TS (date-fns#2681)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhirzh authored Nov 29, 2021
1 parent 52c2f94 commit fab57a9
Show file tree
Hide file tree
Showing 6 changed files with 253 additions and 234 deletions.
31 changes: 18 additions & 13 deletions src/_lib/setUTCDay/index.js → src/_lib/setUTCDay/index.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
import toInteger from '../toInteger/index'
import { LocaleOptions, WeekStartOptions } from '../../types'
import toDate from '../../toDate/index'
import requiredArgs from '../requiredArgs/index'
import toInteger from '../toInteger/index'

// This function will be a part of public API when UTC function will be implemented.
// See issue: https://github.com/date-fns/date-fns/issues/376
export default function setUTCDay(dirtyDate, dirtyDay, dirtyOptions) {
export default function setUTCDay(
dirtyDate: Date | number,
dirtyDay: Date | number,
dirtyOptions?: LocaleOptions & WeekStartOptions
): Date {
requiredArgs(2, arguments)

var options = dirtyOptions || {}
var locale = options.locale
var localeWeekStartsOn =
const options = dirtyOptions || {}
const locale = options.locale
const localeWeekStartsOn =
locale && locale.options && locale.options.weekStartsOn
var defaultWeekStartsOn =
const defaultWeekStartsOn =
localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn)
var weekStartsOn =
const weekStartsOn =
options.weekStartsOn == null
? defaultWeekStartsOn
: toInteger(options.weekStartsOn)
Expand All @@ -23,15 +28,15 @@ export default function setUTCDay(dirtyDate, dirtyDay, dirtyOptions) {
throw new RangeError('weekStartsOn must be between 0 and 6 inclusively')
}

var date = toDate(dirtyDate)
var day = toInteger(dirtyDay)
const date = toDate(dirtyDate)
const day = toInteger(dirtyDay)

var currentDay = date.getUTCDay()
const currentDay = date.getUTCDay()

var remainder = day % 7
var dayIndex = (remainder + 7) % 7
const remainder = day % 7
const dayIndex = (remainder + 7) % 7

var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay
const diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay

date.setUTCDate(date.getUTCDate() + diff)
return date
Expand Down
132 changes: 0 additions & 132 deletions src/_lib/setUTCDay/test.js

This file was deleted.

139 changes: 139 additions & 0 deletions src/_lib/setUTCDay/test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
// @flow
/* eslint-env mocha */

import assert from 'assert'
import { Locale } from '../../locale/types'
import setUTCDay from '.'

describe('setUTCDay', () => {
it('sets the day of the week', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 0)
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 31)))
})

it('allows to specify which day is the first day of the week', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 0, {
weekStartsOn: 1,
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 7)))
})

it('allows to specify which day is the first day of the week in locale', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 0, {
locale: {
options: { weekStartsOn: 1 },
} as Locale,
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 7)))
})

it('`options.weekStartsOn` overwrites the first day of the week specified in locale', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 0, {
weekStartsOn: 1,
locale: {
options: { weekStartsOn: 0 },
} as Locale,
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 7)))
})

describe('the day index is more than 6', () => {
it('sets the day of the next week', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 8)
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 8)))
})

it('allows to specify which day is the first day of the week', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 7, {
weekStartsOn: 1,
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 14)))
})

it('sets the day of another week in the future', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 14, {
weekStartsOn: 1,
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 21)))
})
})

describe('the day index is less than 0', () => {
it('sets the day of the last week', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), -6)
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 25)))
})

it('allows to specify which day is the first day of the week', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), -7, {
weekStartsOn: 1,
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 31)))
})

it('set the day of another week in the past', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), -14, {
weekStartsOn: 1,
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 24)))
})
})

it('accepts a timestamp', () => {
const result = setUTCDay(
new Date(Date.UTC(2014, 8 /* Sep */, 1)).getTime(),
3
)
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 3)))
})

it('converts a fractional number to an integer', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 0.9)
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 31)))
})

it('implicitly converts number arguments', () => {
const result = setUTCDay(
new Date(Date.UTC(2014, 8 /* Sep */, 1)),
// @ts-expect-error
'0'
)
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 31)))
})

it('implicitly converts options', () => {
const result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 0, {
// @ts-expect-error
weekStartsOn: '1',
})
assert.deepStrictEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 7)))
})

it('does not mutate the original date', () => {
const date = new Date(Date.UTC(2014, 8 /* Sep */, 1))
setUTCDay(date, 3)
assert.deepStrictEqual(date, new Date(Date.UTC(2014, 8 /* Sep */, 1)))
})

it('returns `Invalid Date` if the given date is invalid', () => {
const result = setUTCDay(new Date(NaN), 0)
assert(result instanceof Date && isNaN(result.getTime()))
})

it('returns `Invalid Date` if the given amount is NaN', () => {
const result = setUTCDay(new Date(2014, 8 /* Sep */, 1), NaN)
assert(result instanceof Date && isNaN(result.getTime()))
})

it('throws `RangeError` if `options.weekStartsOn` is not convertable to 0, 1, ..., 6 or undefined', () => {
const block = setUTCDay.bind(null, new Date(2014, 8 /* Sep */, 1), 0, {
weekStartsOn: NaN as Day,
})
assert.throws(block, RangeError)
})

it('throws TypeError exception if passed less than 1 argument', () => {
//@ts-expect-error
assert.throws(setUTCDay.bind(null, 1), TypeError)
})
})
22 changes: 12 additions & 10 deletions src/_lib/setUTCISODay/index.js → src/_lib/setUTCISODay/index.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
import toInteger from '../toInteger/index'
import toDate from '../../toDate/index'
import requiredArgs from '../requiredArgs/index'
import toInteger from '../toInteger/index'

// This function will be a part of public API when UTC function will be implemented.
// See issue: https://github.com/date-fns/date-fns/issues/376
export default function setUTCISODay(dirtyDate, dirtyDay) {
export default function setUTCISODay(
dirtyDate: Date | number,
dirtyDay: Date | number
): Date {
requiredArgs(2, arguments)

var day = toInteger(dirtyDay)

let day = toInteger(dirtyDay)
if (day % 7 === 0) {
day = day - 7
}

var weekStartsOn = 1
var date = toDate(dirtyDate)
var currentDay = date.getUTCDay()
const weekStartsOn = 1
const date = toDate(dirtyDate)
const currentDay = date.getUTCDay()

var remainder = day % 7
var dayIndex = (remainder + 7) % 7
const remainder = day % 7
const dayIndex = (remainder + 7) % 7

var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay
const diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay

date.setUTCDate(date.getUTCDate() + diff)
return date
Expand Down
Loading

0 comments on commit fab57a9

Please sign in to comment.