diff --git a/src/index.js b/src/index.js index 45095f8961..1cfa91c1f9 100644 --- a/src/index.js +++ b/src/index.js @@ -174,6 +174,14 @@ export { default as nextWednesday } from './nextWednesday/index' export { default as parse } from './parse/index' export { default as parseISO } from './parseISO/index' export { default as parseJSON } from './parseJSON/index' +export { default as previousDay } from './previousDay/index' +export { default as previousMonday } from './previousMonday/index' +export { default as previousTuesday } from './previousTuesday/index' +export { default as previousWednesday } from './previousWednesday/index' +export { default as previousThursday } from './previousThursday/index' +export { default as previousFriday } from './previousFriday/index' +export { default as previousSaturday } from './previousSaturday/index' +export { default as previousSunday } from './previousSunday/index' export { default as quartersToMonths } from './quartersToMonths/index' export { default as quartersToYears } from './quartersToYears/index' export { default as roundToNearestMinutes } from './roundToNearestMinutes/index' diff --git a/src/previousDay/index.ts b/src/previousDay/index.ts new file mode 100644 index 0000000000..7440da6150 --- /dev/null +++ b/src/previousDay/index.ts @@ -0,0 +1,46 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import getDay from '../getDay' +import subDays from '../subDays' +import toDate from '../toDate' +import { Day } from '../types' + +const baseMap = [1,2,3,4,5,6,7] + +/** + * @name previousDay + * @category Weekday Helpers + * @summary When is the previous day of the week? + * + * @description + * When is the previous day of the week? 0-6 the day of the week, 0 represents Sunday. + * + * @param {Date | number} date - the date to check + * @param {Day} day - day of the week + * @returns {Date} - the date is the previous day of week + * @throws {TypeError} - 2 arguments required + * + * @example + * // When is the previous Monday before Mar, 20, 2020? + * const result = previousDay(new Date(2020, 2, 20), 1) + * //=> Mon Mar 16 2020 00:00:00 + * + * @example + * // When is the previous Tuesday before Mar, 21, 2020? + * const result = previousDay(new Date(2020, 2, 21), 2) + * //=> Tue Mar 17 2020 00:00:00 + */ +export default function previousDay(date: Date | number, day: Day): Date { + requiredArgs(2, arguments) + const map = genMap(day+1) + return subDays(toDate(date), map[getDay(toDate(date))]) +} + +function genMap(daysToMove: number): number[] { + if (daysToMove === 0) { + return baseMap + } else { + const mapStart = baseMap.slice(-daysToMove) + const mapEnd = baseMap.slice(0, baseMap.length - daysToMove) + return mapStart.concat(mapEnd) + } +} diff --git a/src/previousDay/test.ts b/src/previousDay/test.ts new file mode 100644 index 0000000000..1eb0680298 --- /dev/null +++ b/src/previousDay/test.ts @@ -0,0 +1,82 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previousDay from '.' + +describe('previousDay', function () { + it('returns the previous Monday given various dates after the same', function () { + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 18), 1), + new Date(2021, 5 /* Jun */, 14) + ) + + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 17), 1), + new Date(2021, 5 /* Jun */, 14) + ) + + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 14), 1), + new Date(2021, 5 /* Jun */, 7) + ) + + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 9), 1), + new Date(2021, 5 /* Jun */, 7) + ) + + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 8), 1), + new Date(2021, 5 /* Jun */, 7) + ) + + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 7), 1), + new Date(2021, 4 /* May */, 31) + ) + + }) + + it('returns the previous Tuesday given the Saturday after it', function () { + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 26), 2), + new Date(2020, 5 /* Jun */, 21) + ) + }) + + it('returns the previous Wednesday given the Saturday after it', function () { + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 26), 3), + new Date(2021, 5 /* Jun */, 23) + ) + }) + + it('returns the previous Thursday given the Saturday after it', function () { + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 26), 4), + new Date(2021, 5 /* Jun */, 24) + ) + }) + + it('returns the previous Friday given the Saturday after it', function () { + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 26), 5), + new Date(2021, 5 /* Jun */, 25) + ) + }) + + it('returns the previous Saturday given the Saturday after it', function () { + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 26), 6), + new Date(2021, 5 /* Jun */, 19) + ) + }) + + it('returns previours Sunday given the day is Sunday', function () { + assert.deepStrictEqual( + previousDay(new Date(2021, 5 /* Jun */, 27), 0), + new Date(2021, 5 /* Jun */, 20) + ) + }) +}) diff --git a/src/previousFriday/index.ts b/src/previousFriday/index.ts new file mode 100644 index 0000000000..4e7b0288f3 --- /dev/null +++ b/src/previousFriday/index.ts @@ -0,0 +1,25 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import previousDay from '../previousDay/index' +import toDate from '../toDate/index' + +/** + * @name previousFriday + * @category Weekday Helpers + * @summary When is the previous Friday? + * + * @description + * When is the previous Friday? + * + * @param {Date | number} date - the date to start counting from + * @returns {Date} the previous Friday + * @throws {TypeError} 1 argument required + * + * @example + * // When is the previous Friday before Jun, 19, 2021? + * const result = previousFriday(new Date(2021, 5, 19)) + * //=> Fri June 18 2021 00:00:00 + */ +export default function previousFriday(date: Date | number): Date { + requiredArgs(1, arguments) + return previousDay(toDate(date), 5) +} diff --git a/src/previousFriday/test.ts b/src/previousFriday/test.ts new file mode 100644 index 0000000000..595db63e1d --- /dev/null +++ b/src/previousFriday/test.ts @@ -0,0 +1,44 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previoursFriday from '.' + +describe('previoursFriday', function () { + it('returns the following Friday given various dates after the same', function () { + assert.deepStrictEqual( + previoursFriday(new Date(2021, 5 /* Jun */, 5)), + new Date(2021, 5 /* Jun */, 4) + ) + + assert.deepStrictEqual( + previoursFriday(new Date(2021, 5 /* Jun */, 6)), + new Date(2021, 5 /* Jun */, 4) + ) + + assert.deepStrictEqual( + previoursFriday(new Date(2021, 5 /* Jun */, 11)), + new Date(2021, 5 /* Jun */, 4) + ) + + assert.deepStrictEqual( + previoursFriday(new Date(2021, 5 /* Jun */, 14)), + new Date(2021, 5 /* Jun */, 11) + ) + + assert.deepStrictEqual( + previoursFriday(new Date(2021, 5 /* Jun */, 15)), + new Date(2021, 5 /* Jun */, 11) + ) + + assert.deepStrictEqual( + previoursFriday(new Date(2021, 5 /* Jun */, 24)), + new Date(2021, 5 /* Jun */, 18) + ) + + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + assert(previoursFriday(new Date(NaN)) instanceof Date) + }) +}) diff --git a/src/previousMonday/index.ts b/src/previousMonday/index.ts new file mode 100644 index 0000000000..ba9e43e3ee --- /dev/null +++ b/src/previousMonday/index.ts @@ -0,0 +1,25 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import previousDay from '../previousDay/index' +import toDate from '../toDate/index' + +/** + * @name previousMonday + * @category Weekday Helpers + * @summary When is the previous Monday? + * + * @description + * When is the previous Monday? + * + * @param {Date | number} date - the date to start counting from + * @returns {Date} the previous Monday + * @throws {TypeError} 1 argument required + * + * @example + * // When is the previous Monday before Jun, 18, 2021? + * const result = previousMonday(new Date(2021, 5, 18)) + * //=> Mon June 14 2021 00:00:00 + */ +export default function previousMonday(date: Date | number): Date { + requiredArgs(1, arguments) + return previousDay(toDate(date), 1) +} diff --git a/src/previousMonday/test.ts b/src/previousMonday/test.ts new file mode 100644 index 0000000000..249d9bdcef --- /dev/null +++ b/src/previousMonday/test.ts @@ -0,0 +1,44 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previoursMonday from '.' + +describe('previoursMonday', function () { + it('returns the following Monday given various dates after the same', function () { + assert.deepStrictEqual( + previoursMonday(new Date(2021, 5 /* Jun */, 5)), + new Date(2021, 4 /* May */, 31) + ) + + assert.deepStrictEqual( + previoursMonday(new Date(2021, 5 /* Jun */, 6)), + new Date(2021, 4 /* May */, 31) + ) + + assert.deepStrictEqual( + previoursMonday(new Date(2021, 5 /* Jun */, 7)), + new Date(2021, 4 /* May */, 31) + ) + + assert.deepStrictEqual( + previoursMonday(new Date(2021, 5 /* Jun */, 14)), + new Date(2021, 5 /* Jun */, 7) + ) + + assert.deepStrictEqual( + previoursMonday(new Date(2021, 5 /* Jun */, 15)), + new Date(2021, 5 /* Jun */, 14) + ) + + assert.deepStrictEqual( + previoursMonday(new Date(2021, 5 /* Jun */, 16)), + new Date(2021, 5 /* Jun */, 14) + ) + + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + assert(previoursMonday(new Date(NaN)) instanceof Date) + }) +}) diff --git a/src/previousSaturday/index.ts b/src/previousSaturday/index.ts new file mode 100644 index 0000000000..f3a529f44f --- /dev/null +++ b/src/previousSaturday/index.ts @@ -0,0 +1,25 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import previousDay from '../previousDay/index' +import toDate from '../toDate/index' + +/** + * @name previousSaturday + * @category Weekday Helpers + * @summary When is the previous Saturday? + * + * @description + * When is the previous Saturday? + * + * @param {Date | number} date - the date to start counting from + * @returns {Date} the previous Saturday + * @throws {TypeError} 1 argument required + * + * @example + * // When is the previous Saturday before Jun, 20, 2021? + * const result = previousSaturday(new Date(2021, 5, 20)) + * //=> Fri June 19 2021 00:00:00 + */ +export default function previousSaturday(date: Date | number): Date { + requiredArgs(1, arguments) + return previousDay(toDate(date), 6) +} diff --git a/src/previousSaturday/test.ts b/src/previousSaturday/test.ts new file mode 100644 index 0000000000..c14c839f87 --- /dev/null +++ b/src/previousSaturday/test.ts @@ -0,0 +1,44 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previoursSaturday from '.' + +describe('previoursSaturday', function () { + it('returns the following Saturday given various dates after the same', function () { + assert.deepStrictEqual( + previoursSaturday(new Date(2021, 5 /* Jun */, 7)), + new Date(2021, 5 /* Jun */, 5) + ) + + assert.deepStrictEqual( + previoursSaturday(new Date(2021, 5 /* Jun */, 8)), + new Date(2021, 5 /* Jun */, 5) + ) + + assert.deepStrictEqual( + previoursSaturday(new Date(2021, 5 /* Jun */, 12)), + new Date(2021, 5 /* Jun */, 5) + ) + + assert.deepStrictEqual( + previoursSaturday(new Date(2021, 5 /* Jun */, 16)), + new Date(2021, 5 /* Jun */, 12) + ) + + assert.deepStrictEqual( + previoursSaturday(new Date(2021, 5 /* Jun */, 17)), + new Date(2021, 5 /* Jun */, 12) + ) + + assert.deepStrictEqual( + previoursSaturday(new Date(2021, 5 /* Jun */, 24)), + new Date(2021, 5 /* Jun */, 19) + ) + + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + assert(previoursSaturday(new Date(NaN)) instanceof Date) + }) +}) diff --git a/src/previousSunday/index.ts b/src/previousSunday/index.ts new file mode 100644 index 0000000000..375461287a --- /dev/null +++ b/src/previousSunday/index.ts @@ -0,0 +1,25 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import previousDay from '../previousDay/index' +import toDate from '../toDate/index' + +/** + * @name previousSunday + * @category Weekday Helpers + * @summary When is the previous Sunday? + * + * @description + * When is the previous Sunday? + * + * @param {Date | number} date - the date to start counting from + * @returns {Date} the previous Sunday + * @throws {TypeError} 1 argument required + * + * @example + * // When is the previous Sunday before Jun, 21, 2021? + * const result = previousSunday(new Date(2021, 5, 21)) + * //=> Fri June 20 2021 00:00:00 + */ +export default function previousSunday(date: Date | number): Date { + requiredArgs(1, arguments) + return previousDay(toDate(date), 0) +} diff --git a/src/previousSunday/test.ts b/src/previousSunday/test.ts new file mode 100644 index 0000000000..b1eff92c97 --- /dev/null +++ b/src/previousSunday/test.ts @@ -0,0 +1,44 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previoursSunday from '.' + +describe('previoursSunday', function () { + it('returns the following Sunday given various dates after the same', function () { + assert.deepStrictEqual( + previoursSunday(new Date(2021, 5 /* Jun */, 7)), + new Date(2021, 5 /* Jun */, 6) + ) + + assert.deepStrictEqual( + previoursSunday(new Date(2021, 5 /* Jun */, 8)), + new Date(2021, 5 /* Jun */, 6) + ) + + assert.deepStrictEqual( + previoursSunday(new Date(2021, 5 /* Jun */, 13)), + new Date(2021, 5 /* Jun */, 6) + ) + + assert.deepStrictEqual( + previoursSunday(new Date(2021, 5 /* Jun */, 16)), + new Date(2021, 5 /* Jun */, 13) + ) + + assert.deepStrictEqual( + previoursSunday(new Date(2021, 5 /* Jun */, 17)), + new Date(2021, 5 /* Jun */, 13) + ) + + assert.deepStrictEqual( + previoursSunday(new Date(2021, 5 /* Jun */, 24)), + new Date(2021, 5 /* Jun */, 20) + ) + + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + assert(previoursSunday(new Date(NaN)) instanceof Date) + }) +}) diff --git a/src/previousThursday/index.ts b/src/previousThursday/index.ts new file mode 100644 index 0000000000..4c6c4909da --- /dev/null +++ b/src/previousThursday/index.ts @@ -0,0 +1,25 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import previousDay from '../previousDay/index' +import toDate from '../toDate/index' + +/** + * @name previousThursday + * @category Weekday Helpers + * @summary When is the previous Thursday? + * + * @description + * When is the previous Thursday? + * + * @param {Date | number} date - the date to start counting from + * @returns {Date} the previous Thursday + * @throws {TypeError} 1 argument required + * + * @example + * // When is the previous Thursday before Jun, 18, 2021? + * const result = previousThursday(new Date(2021, 5, 18)) + * //=> Thu June 17 2021 00:00:00 + */ +export default function previousThursday(date: Date | number): Date { + requiredArgs(1, arguments) + return previousDay(toDate(date), 4) +} diff --git a/src/previousThursday/test.ts b/src/previousThursday/test.ts new file mode 100644 index 0000000000..3e3a011227 --- /dev/null +++ b/src/previousThursday/test.ts @@ -0,0 +1,44 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previoursThursday from '.' + +describe('previoursThursday', function () { + it('returns the following Thursday given various dates after the same', function () { + assert.deepStrictEqual( + previoursThursday(new Date(2021, 5 /* Jun */, 5)), + new Date(2021, 5 /* Jun */, 3) + ) + + assert.deepStrictEqual( + previoursThursday(new Date(2021, 5 /* Jun */, 6)), + new Date(2021, 5 /* Jun */, 3) + ) + + assert.deepStrictEqual( + previoursThursday(new Date(2021, 5 /* Jun */, 10)), + new Date(2021, 5 /* Jun */, 3) + ) + + assert.deepStrictEqual( + previoursThursday(new Date(2021, 5 /* Jun */, 14)), + new Date(2021, 5 /* Jun */, 10) + ) + + assert.deepStrictEqual( + previoursThursday(new Date(2021, 5 /* Jun */, 15)), + new Date(2021, 5 /* Jun */, 10) + ) + + assert.deepStrictEqual( + previoursThursday(new Date(2021, 5 /* Jun */, 24)), + new Date(2021, 5 /* Jun */, 17) + ) + + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + assert(previoursThursday(new Date(NaN)) instanceof Date) + }) +}) diff --git a/src/previousTuesday/index.ts b/src/previousTuesday/index.ts new file mode 100644 index 0000000000..af17bccac2 --- /dev/null +++ b/src/previousTuesday/index.ts @@ -0,0 +1,25 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import previousDay from '../previousDay/index' +import toDate from '../toDate/index' + +/** + * @name previousTuesday + * @category Weekday Helpers + * @summary When is the previous Tuesday? + * + * @description + * When is the previous Tuesday? + * + * @param {Date | number} date - the date to start counting from + * @returns {Date} the previous Tuesday + * @throws {TypeError} 1 argument required + * + * @example + * // When is the previous Tuesday before Jun, 18, 2021? + * const result = previousTuesday(new Date(2021, 5, 18)) + * //=> Tue June 15 2021 00:00:00 + */ +export default function previousTuesday(date: Date | number): Date { + requiredArgs(1, arguments) + return previousDay(toDate(date), 2) +} \ No newline at end of file diff --git a/src/previousTuesday/test.ts b/src/previousTuesday/test.ts new file mode 100644 index 0000000000..62f51cfdc4 --- /dev/null +++ b/src/previousTuesday/test.ts @@ -0,0 +1,44 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previoursTuesday from '.' + +describe('previoursTuesday', function () { + it('returns the following Tuesday given various dates after the same', function () { + assert.deepStrictEqual( + previoursTuesday(new Date(2021, 5 /* Jun */, 5)), + new Date(2021, 5 /* Jun */, 1) + ) + + assert.deepStrictEqual( + previoursTuesday(new Date(2021, 5 /* Jun */, 6)), + new Date(2021, 5 /* Jun */, 1) + ) + + assert.deepStrictEqual( + previoursTuesday(new Date(2021, 5 /* Jun */, 8)), + new Date(2021, 5 /* Jun */, 1) + ) + + assert.deepStrictEqual( + previoursTuesday(new Date(2021, 5 /* Jun */, 15)), + new Date(2021, 5 /* Jun */, 8) + ) + + assert.deepStrictEqual( + previoursTuesday(new Date(2021, 5 /* Jun */, 17)), + new Date(2021, 5 /* Jun */, 15) + ) + + assert.deepStrictEqual( + previoursTuesday(new Date(2021, 5 /* Jun */, 18)), + new Date(2021, 5 /* Jun */, 15) + ) + + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + assert(previoursTuesday(new Date(NaN)) instanceof Date) + }) +}) diff --git a/src/previousWednesday/index.ts b/src/previousWednesday/index.ts new file mode 100644 index 0000000000..208603dc67 --- /dev/null +++ b/src/previousWednesday/index.ts @@ -0,0 +1,25 @@ +import requiredArgs from '../_lib/requiredArgs/index' +import previousDay from '../previousDay/index' +import toDate from '../toDate/index' + +/** + * @name previousWednesday + * @category Weekday Helpers + * @summary When is the previous Wednesday? + * + * @description + * When is the previous Wednesday? + * + * @param {Date | number} date - the date to start counting from + * @returns {Date} the previous Wednesday + * @throws {TypeError} 1 argument required + * + * @example + * // When is the previous Wednesday before Jun, 18, 2021? + * const result = previousWednesday(new Date(2021, 5, 18)) + * //=> Wed June 16 2021 00:00:00 + */ +export default function previousWednesday(date: Date | number): Date { + requiredArgs(1, arguments) + return previousDay(toDate(date), 3) +} diff --git a/src/previousWednesday/test.ts b/src/previousWednesday/test.ts new file mode 100644 index 0000000000..1dd47c7d0a --- /dev/null +++ b/src/previousWednesday/test.ts @@ -0,0 +1,44 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import previoursWednesday from '.' + +describe('previoursWednesday', function () { + it('returns the following Wednesday given various dates after the same', function () { + assert.deepStrictEqual( + previoursWednesday(new Date(2021, 5 /* Jun */, 5)), + new Date(2021, 5 /* Jun */, 2) + ) + + assert.deepStrictEqual( + previoursWednesday(new Date(2021, 5 /* Jun */, 6)), + new Date(2021, 5 /* Jun */, 2) + ) + + assert.deepStrictEqual( + previoursWednesday(new Date(2021, 5 /* Jun */, 9)), + new Date(2021, 5 /* Jun */, 2) + ) + + assert.deepStrictEqual( + previoursWednesday(new Date(2021, 5 /* Jun */, 17)), + new Date(2021, 5 /* Jun */, 16) + ) + + assert.deepStrictEqual( + previoursWednesday(new Date(2021, 5 /* Jun */, 18)), + new Date(2021, 5 /* Jun */, 16) + ) + + assert.deepStrictEqual( + previoursWednesday(new Date(2021, 5 /* Jun */, 25)), + new Date(2021, 5 /* Jun */, 24) + ) + + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + assert(previoursWednesday(new Date(NaN)) instanceof Date) + }) +})