From a70c6e5c5f5b8557b0643de70870ae5b0a3fb134 Mon Sep 17 00:00:00 2001 From: Andriy Orehov Date: Fri, 28 Aug 2020 09:54:44 +0300 Subject: [PATCH 1/2] feature: more add utils --- README.md | 4 ++++ __tests__/calculations.test.ts | 16 +++++++++++++ __tests__/date-fns-jalali.test.ts | 16 +++++++++++++ packages/core/IUtils.d.ts | 4 ++++ .../src/date-fns-jalali-utils.ts | 20 ++++++++++++++++ packages/date-fns/src/date-fns-utils.ts | 20 ++++++++++++++++ packages/dayjs/src/dayjs-utils.ts | 20 ++++++++++++++++ packages/luxon/src/luxon-utils.ts | 24 +++++++++++++++++++ packages/moment/src/moment-utils.ts | 24 +++++++++++++++++++ 9 files changed, 148 insertions(+) diff --git a/README.md b/README.md index 74aaec7d..53dfcbba 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,11 @@ export interface IUtils { startOfWeek(value: TDate): TDate; endOfWeek(value: TDate): TDate; + addSeconds(value: TDate, count: number): TDate; + addMinutes(value: TDate, count: number): TDate; + addHours(value: TDate, count: number): TDate; addDays(value: TDate, count: number): TDate; + addWeeks(value: TDate, count: number): TDate; addMonths(value: TDate, count: number): TDate; startOfDay(value: TDate): TDate; diff --git a/__tests__/calculations.test.ts b/__tests__/calculations.test.ts index 50e32b1e..da29fbed 100644 --- a/__tests__/calculations.test.ts +++ b/__tests__/calculations.test.ts @@ -24,10 +24,26 @@ describe("DateTime calculations", () => { expect(utils.isValid("2018-42-30T11:60:00.000Z")).toBeFalsy(); }); + utilsTest("addSeconds", (date, utils, lib) => { + expect(utils.format(utils.addSeconds(date, 65), "seconds")).toBe("05"); + }); + + utilsTest("addMinutes", (date, utils, lib) => { + expect(utils.format(utils.addMinutes(date, 65), "minutes")).toBe("49"); + }); + + utilsTest("addHours", (date, utils, lib) => { + expect(utils.format(utils.addHours(date, 65), "hours24h")).toBe("04"); + }); + utilsTest("addDays", (date, utils, lib) => { expect(utils.format(utils.addDays(date, 1), "dayOfMonth")).toBe("31"); }); + utilsTest("addWeeks", (date, utils, lib) => { + expect(utils.getDiff(utils.addWeeks(date, 1), date, "weeks")).toBe(1); + }); + utilsTest("addMonths", (date, utils, lib) => { expect(utils.format(utils.addMonths(date, 2), "monthAndYear")).toBe("December 2018"); expect(utils.format(utils.addMonths(date, -2), "monthAndYear")).toBe("August 2018"); diff --git a/__tests__/date-fns-jalali.test.ts b/__tests__/date-fns-jalali.test.ts index f4e45e86..2bcb32b0 100644 --- a/__tests__/date-fns-jalali.test.ts +++ b/__tests__/date-fns-jalali.test.ts @@ -32,10 +32,26 @@ describe("DateFnsJalali", () => { expect(utils.isValid("2018-42-30T11:60:00.000Z")).toBeFalsy(); }); + it("DateFnsJalali -- addSeconds", () => { + expect(utils.format(utils.addSeconds(date, 65), "seconds")).toBe("05"); + }); + + it("DateFnsJalali -- addMinutes", () => { + expect(utils.format(utils.addMinutes(date, 65), "minutes")).toBe("49"); + }); + + it("DateFnsJalali -- addHours", () => { + expect(utils.format(utils.addHours(date, 65), "hours24h")).toBe("04"); + }); + it("DateFnsJalali -- addDays", () => { expect(utils.format(utils.addDays(date, 1), "dayOfMonth")).toBe("9"); }); + it("DateFnsJalali -- addWeeks", () => { + expect(utils.getDiff(utils.addWeeks(date, 1), date, "weeks")).toBe(1); + }); + it("DateFnsJalali -- addMonths", () => { expect(utils.format(utils.addMonths(date, 2), "monthAndYear")).toBe("دی 1397"); expect(utils.format(utils.addMonths(date, -2), "monthAndYear")).toBe("شهریور 1397"); diff --git a/packages/core/IUtils.d.ts b/packages/core/IUtils.d.ts index b5f5a13c..7bcc7103 100644 --- a/packages/core/IUtils.d.ts +++ b/packages/core/IUtils.d.ts @@ -114,7 +114,11 @@ export interface IUtils { startOfWeek(value: TDate): TDate; endOfWeek(value: TDate): TDate; + addSeconds(value: TDate, count: number): TDate; + addMinutes(value: TDate, count: number): TDate; + addHours(value: TDate, count: number): TDate; addDays(value: TDate, count: number): TDate; + addWeeks(value: TDate, count: number): TDate; addMonths(value: TDate, count: number): TDate; startOfDay(value: TDate): TDate; diff --git a/packages/date-fns-jalali/src/date-fns-jalali-utils.ts b/packages/date-fns-jalali/src/date-fns-jalali-utils.ts index df6665ae..28cf7c1e 100644 --- a/packages/date-fns-jalali/src/date-fns-jalali-utils.ts +++ b/packages/date-fns-jalali/src/date-fns-jalali-utils.ts @@ -1,4 +1,8 @@ +import addSeconds from "date-fns-jalali/addSeconds"; +import addMinutes from "date-fns-jalali/addMinutes"; +import addHours from "date-fns-jalali/addHours"; import addDays from "date-fns-jalali/addDays"; +import addWeeks from "date-fns-jalali/addWeeks"; import addMonths from "date-fns-jalali/addMonths"; import addYears from "date-fns-jalali/addYears"; import differenceInYears from "date-fns/differenceInYears"; @@ -137,10 +141,26 @@ export default class DateFnsJalaliUtils implements IUtils { return this.locale?.code || "fa-jalali-IR"; } + public addSeconds(value: Date, count: number) { + return addSeconds(value, count); + } + + public addMinutes(value: Date, count: number) { + return addMinutes(value, count); + } + + public addHours(value: Date, count: number) { + return addHours(value, count); + } + public addDays(value: Date, count: number) { return addDays(value, count); } + public addWeeks(value: Date, count: number) { + return addWeeks(value, count); + } + public addMonths(value: Date, count: number) { return addMonths(value, count); } diff --git a/packages/date-fns/src/date-fns-utils.ts b/packages/date-fns/src/date-fns-utils.ts index eaceb07f..ac2fc8aa 100644 --- a/packages/date-fns/src/date-fns-utils.ts +++ b/packages/date-fns/src/date-fns-utils.ts @@ -1,4 +1,8 @@ import addDays from "date-fns/addDays"; +import addSeconds from "date-fns/addSeconds"; +import addMinutes from "date-fns/addMinutes"; +import addHours from "date-fns/addHours"; +import addWeeks from "date-fns/addWeeks"; import addMonths from "date-fns/addMonths"; import addYears from "date-fns/addYears"; import differenceInYears from "date-fns/differenceInYears"; @@ -122,10 +126,26 @@ export default class DateFnsUtils implements IUtils { return this.locale?.code || "en-US"; } + public addSeconds(value: Date, count: number) { + return addSeconds(value, count); + } + + public addMinutes(value: Date, count: number) { + return addMinutes(value, count); + } + + public addHours(value: Date, count: number) { + return addHours(value, count); + } + public addDays(value: Date, count: number) { return addDays(value, count); } + public addWeeks(value: Date, count: number) { + return addWeeks(value, count); + } + public addMonths(value: Date, count: number) { return addMonths(value, count); } diff --git a/packages/dayjs/src/dayjs-utils.ts b/packages/dayjs/src/dayjs-utils.ts index ef786a68..d297f3b2 100644 --- a/packages/dayjs/src/dayjs-utils.ts +++ b/packages/dayjs/src/dayjs-utils.ts @@ -181,10 +181,30 @@ export default class DayjsUtils implements IUtils { return date.hour(); } + public addSeconds(date: Dayjs, count: number) { + return count < 0 + ? date.subtract(Math.abs(count), "second") + : date.add(count, "second"); + } + + public addMinutes(date: Dayjs, count: number) { + return count < 0 + ? date.subtract(Math.abs(count), "minute") + : date.add(count, "minute"); + } + + public addHours(date: Dayjs, count: number) { + return count < 0 ? date.subtract(Math.abs(count), "hour") : date.add(count, "hour"); + } + public addDays(date: Dayjs, count: number) { return count < 0 ? date.subtract(Math.abs(count), "day") : date.add(count, "day"); } + public addWeeks(date: Dayjs, count: number) { + return count < 0 ? date.subtract(Math.abs(count), "week") : date.add(count, "week"); + } + public addMonths(date: Dayjs, count: number) { return count < 0 ? date.subtract(Math.abs(count), "month") : date.add(count, "month"); } diff --git a/packages/luxon/src/luxon-utils.ts b/packages/luxon/src/luxon-utils.ts index 2f231c17..7416f714 100644 --- a/packages/luxon/src/luxon-utils.ts +++ b/packages/luxon/src/luxon-utils.ts @@ -97,10 +97,34 @@ export default class LuxonUtils implements IUtils { return this.locale || Settings.defaultLocale; } + public addSeconds(date: DateTime, count: number) { + return count < 0 + ? date.minus({ seconds: Math.abs(count) }) + : date.plus({ seconds: count }); + } + + public addMinutes(date: DateTime, count: number) { + return count < 0 + ? date.minus({ minutes: Math.abs(count) }) + : date.plus({ minutes: count }); + } + + public addHours(date: DateTime, count: number) { + return count < 0 + ? date.minus({ hours: Math.abs(count) }) + : date.plus({ hours: count }); + } + public addDays(date: DateTime, count: number) { return count < 0 ? date.minus({ days: Math.abs(count) }) : date.plus({ days: count }); } + public addWeeks(date: DateTime, count: number) { + return count < 0 + ? date.minus({ weeks: Math.abs(count) }) + : date.plus({ weeks: count }); + } + public addMonths(date: DateTime, count: number) { return count < 0 ? date.minus({ months: Math.abs(count) }) diff --git a/packages/moment/src/moment-utils.ts b/packages/moment/src/moment-utils.ts index 53cc7430..1fee7a8b 100644 --- a/packages/moment/src/moment-utils.ts +++ b/packages/moment/src/moment-utils.ts @@ -166,12 +166,36 @@ export default class MomentUtils implements IUtils { return date.get("hours"); } + public addSeconds(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "seconds") + : date.clone().add(count, "seconds"); + } + + public addMinutes(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "minutes") + : date.clone().add(count, "minutes"); + } + + public addHours(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "hours") + : date.clone().add(count, "hours"); + } + public addDays(date: Moment, count: number) { return count < 0 ? date.clone().subtract(Math.abs(count), "days") : date.clone().add(count, "days"); } + public addWeeks(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "weeks") + : date.clone().add(count, "weeks"); + } + public addMonths(date: Moment, count: number) { return count < 0 ? date.clone().subtract(Math.abs(count), "months") From 976eb4635dd41ab8aeff18d2cb4262c680c4447d Mon Sep 17 00:00:00 2001 From: Andriy Orehov Date: Fri, 28 Aug 2020 10:09:10 +0300 Subject: [PATCH 2/2] test: cover subtract cases --- __tests__/calculations.test.ts | 5 +++++ __tests__/date-fns-jalali.test.ts | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/__tests__/calculations.test.ts b/__tests__/calculations.test.ts index da29fbed..e1f7f584 100644 --- a/__tests__/calculations.test.ts +++ b/__tests__/calculations.test.ts @@ -26,22 +26,27 @@ describe("DateTime calculations", () => { utilsTest("addSeconds", (date, utils, lib) => { expect(utils.format(utils.addSeconds(date, 65), "seconds")).toBe("05"); + expect(utils.format(utils.addSeconds(date, -5), "seconds")).toBe("55"); }); utilsTest("addMinutes", (date, utils, lib) => { expect(utils.format(utils.addMinutes(date, 65), "minutes")).toBe("49"); + expect(utils.format(utils.addMinutes(date, -5), "minutes")).toBe("39"); }); utilsTest("addHours", (date, utils, lib) => { expect(utils.format(utils.addHours(date, 65), "hours24h")).toBe("04"); + expect(utils.format(utils.addHours(date, -5), "hours24h")).toBe("06"); }); utilsTest("addDays", (date, utils, lib) => { expect(utils.format(utils.addDays(date, 1), "dayOfMonth")).toBe("31"); + expect(utils.format(utils.addDays(date, -1), "dayOfMonth")).toBe("29"); }); utilsTest("addWeeks", (date, utils, lib) => { expect(utils.getDiff(utils.addWeeks(date, 1), date, "weeks")).toBe(1); + expect(utils.getDiff(utils.addWeeks(date, -1), date, "weeks")).toBe(-1); }); utilsTest("addMonths", (date, utils, lib) => { diff --git a/__tests__/date-fns-jalali.test.ts b/__tests__/date-fns-jalali.test.ts index 2bcb32b0..8be38710 100644 --- a/__tests__/date-fns-jalali.test.ts +++ b/__tests__/date-fns-jalali.test.ts @@ -34,22 +34,27 @@ describe("DateFnsJalali", () => { it("DateFnsJalali -- addSeconds", () => { expect(utils.format(utils.addSeconds(date, 65), "seconds")).toBe("05"); + expect(utils.format(utils.addSeconds(date, -5), "seconds")).toBe("55"); }); it("DateFnsJalali -- addMinutes", () => { expect(utils.format(utils.addMinutes(date, 65), "minutes")).toBe("49"); + expect(utils.format(utils.addMinutes(date, -5), "minutes")).toBe("39"); }); it("DateFnsJalali -- addHours", () => { expect(utils.format(utils.addHours(date, 65), "hours24h")).toBe("04"); + expect(utils.format(utils.addHours(date, -5), "hours24h")).toBe("06"); }); it("DateFnsJalali -- addDays", () => { expect(utils.format(utils.addDays(date, 1), "dayOfMonth")).toBe("9"); + expect(utils.format(utils.addDays(date, -1), "dayOfMonth")).toBe("7"); }); it("DateFnsJalali -- addWeeks", () => { expect(utils.getDiff(utils.addWeeks(date, 1), date, "weeks")).toBe(1); + expect(utils.getDiff(utils.addWeeks(date, -1), date, "weeks")).toBe(-1); }); it("DateFnsJalali -- addMonths", () => {