diff --git a/__test__/index.test.js b/__test__/index.test.js index 705a407..b3e6194 100644 --- a/__test__/index.test.js +++ b/__test__/index.test.js @@ -1,4 +1,13 @@ -const {DateRangeCheckerError, isEndDateInRange, isInRange, isStartDateAndEndDateIncludeRange, isStartDateAndEndDateInRange, isStartDateInRange} = require("../src") +const { + DateRangeCheckerError, + isEndDateInRange, + isInRange, + isStartDateAndEndDateIncludeRange, + isStartDateAndEndDateInRange, + isStartDateInRange, + findOverlappingDates, + findNonOverlappingDates +} = require("../src") describe('checkDateRangeFormat', () => { test('Throws error if dateRange is undefined', () => { @@ -132,3 +141,143 @@ describe('isStartDateAndEndDateIncludeRange', () => { expect(result).toBe(false) }) }) + +describe('findOverlappingDates', () => { + test('returns empty array when date ranges do not overlap', () => { + const result = findOverlappingDates( + { startDate: new Date('2022-01-01'), endDate: new Date('2023-12-31') }, + { startDate: new Date('2024-01-01'), endDate: new Date('2024-11-01') } + ) + expect(result).toEqual([]); + }) + + test('If there are overlapping dates, those dates are returned.', () => { + const referenceDateRange = { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-15') }; + const comparisonDateRange = { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-20') }; + + const result = findOverlappingDates(referenceDateRange, comparisonDateRange); + + expect(result).toEqual([ + new Date('2022-01-05'), + new Date('2022-01-06'), + new Date('2022-01-07'), + new Date('2022-01-08'), + new Date('2022-01-09'), + new Date('2022-01-10'), + new Date('2022-01-11'), + new Date('2022-01-12'), + new Date('2022-01-13'), + new Date('2022-01-14'), + new Date('2022-01-15'), + ]); + }); + + test('returns overlapping dates when one range is completely within the other', () => { + const referenceDateRange = { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-10') }; + const comparisonDateRange = { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-15') }; + + const result = findOverlappingDates(referenceDateRange, comparisonDateRange); + + expect(result).toEqual([ + new Date('2022-01-05'), + new Date('2022-01-06'), + new Date('2022-01-07'), + new Date('2022-01-08'), + new Date('2022-01-09'), + new Date('2022-01-10') + ]); + }); + + test('returns overlapping dates when date ranges are identical', () => { + const referenceDateRange = { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-15') }; + const comparisonDateRange = { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-15') }; + + const result = findOverlappingDates(referenceDateRange, comparisonDateRange); + + expect(result).toEqual([ + new Date('2022-01-05'), + new Date('2022-01-06'), + new Date('2022-01-07'), + new Date('2022-01-08'), + new Date('2022-01-09'), + new Date('2022-01-10'), + new Date('2022-01-11'), + new Date('2022-01-12'), + new Date('2022-01-13'), + new Date('2022-01-14'), + new Date('2022-01-15') + ]); + }); +}) + +describe('findNonOverlappingDates', () => { + test('returns merging two date ranges when there are no overlapping dates', () => { + const referenceDateRange = { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-10') }; + const comparisonDateRange = { startDate: new Date('2022-01-11'), endDate: new Date('2022-01-15') }; + + const result = findNonOverlappingDates(referenceDateRange, comparisonDateRange); + + expect(result).toEqual([ + new Date('2022-01-01'), + new Date('2022-01-02'), + new Date('2022-01-03'), + new Date('2022-01-04'), + new Date('2022-01-05'), + new Date('2022-01-06'), + new Date('2022-01-07'), + new Date('2022-01-08'), + new Date('2022-01-09'), + new Date('2022-01-10'), + new Date('2022-01-11'), + new Date('2022-01-12'), + new Date('2022-01-13'), + new Date('2022-01-14'), + new Date('2022-01-15') + ]); + }) + + test('returns empty array when both date ranges are same', () => { + const referenceDateRange = { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-10') }; + const comparisonDateRange = { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-10') }; + + const result = findNonOverlappingDates(referenceDateRange, comparisonDateRange); + + expect(result).toEqual([]); + }) + + test('returns nonOverlapping dates', () => { + const referenceDateRange = { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-10') }; + const comparisonDateRange = { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-15') }; + + const result = findNonOverlappingDates(referenceDateRange, comparisonDateRange); + + expect(result).toEqual([ + new Date('2022-01-01'), + new Date('2022-01-02'), + new Date('2022-01-03'), + new Date('2022-01-04'), + new Date('2022-01-11'), + new Date('2022-01-12'), + new Date('2022-01-13'), + new Date('2022-01-14'), + new Date('2022-01-15') + ]); + + const referenceDateRangeReverse = { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-15') }; + const comparisonDateRangeReverse = { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-10') }; + + const resultReverse = findNonOverlappingDates(referenceDateRangeReverse, comparisonDateRangeReverse); + + expect(resultReverse).toEqual([ + new Date('2022-01-01'), + new Date('2022-01-02'), + new Date('2022-01-03'), + new Date('2022-01-04'), + new Date('2022-01-11'), + new Date('2022-01-12'), + new Date('2022-01-13'), + new Date('2022-01-14'), + new Date('2022-01-15') + ]); + }) +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f902a93..13104e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,19 @@ { "name": "date-range-checker", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "date-range-checker", - "version": "1.0.0", + "version": "1.1.0", "license": "MIT", - "dependencies": { - "ts-node": "^10.9.2" - }, "devDependencies": { "@types/jest": "^29.5.12", "@types/node": "^20.11.25", "jest": "^29.7.0", "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", "typescript": "^5.4.2" } }, @@ -588,6 +586,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -599,6 +598,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -925,6 +925,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -941,7 +942,8 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -980,22 +982,26 @@ "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -1085,6 +1091,7 @@ "version": "20.12.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.3.tgz", "integrity": "sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==", + "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -1114,6 +1121,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -1125,6 +1133,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -1184,7 +1193,8 @@ "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "node_modules/argparse": { "version": "1.0.10", @@ -1557,7 +1567,8 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -1626,6 +1637,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "engines": { "node": ">=0.3.1" } @@ -2875,7 +2887,8 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -3555,6 +3568,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -3618,6 +3632,7 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3629,7 +3644,8 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true }, "node_modules/update-browserslist-db": { "version": "1.0.13", @@ -3664,7 +3680,8 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -3786,6 +3803,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "engines": { "node": ">=6" } diff --git a/package.json b/package.json index 98582a3..9a1d647 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "date-range-checker", - "version": "1.0.4", + "version": "1.1.0", "description": "A utility library for comparing date ranges", "main": "dist/cjs/index.js", "module": "dist/mjs/index.js", @@ -31,9 +31,10 @@ "@types/node": "^20.11.25", "jest": "^29.7.0", "ts-jest": "^29.1.2", - "typescript": "^5.4.2" + "typescript": "^5.4.2", + "ts-node": "^10.9.2" }, "dependencies": { - "ts-node": "^10.9.2" + } } diff --git a/src/index.ts b/src/index.ts index b1cca90..8a513b9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,5 @@ -interface DateRange { - startDate: Date; - endDate: Date; -} +import { DateRange } from "./type/type"; +import { findDateRangeEachDates } from "./util"; class DateRangeCheckerError extends Error { constructor(message: string) { @@ -181,6 +179,120 @@ function isStartDateAndEndDateIncludeRange(referenceDateRange: DateRange, compar ); } +/** + * @name findoverlappingDates + * @category Date Range Helpers + * @summary Finds overlapping dates between two date ranges. + * + * @description + * This function returns an array of dates that overlap between the given reference date range and comparison date range. + * If there is no overlap, an empty array is returned. + * Throws an error if the date range format is incorrect. + * + * @param {DateRange} referenceDateRange - The reference date range. + * @param {DateRange} comparisonDateRange - The comparison date range. + * @returns {Date[]} An array of overlapping dates found within the overlapping period of the two date ranges. + * @throws {DateRangeCheckerError} Throws an error if the date range format is incorrect. + * + * @example + * const overlappingDates = findOverlappingDates( + * { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-10') }, + * { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-15') } + * ); + * //=> [ + * // new Date('2022-01-05'), + * // new Date('2022-01-06'), + * // new Date('2022-01-07'), + * // new Date('2022-01-08'), + * // new Date('2022-01-09'), + * // new Date('2022-01-10') + * // ] + */ +function findOverlappingDates(referenceDateRange: DateRange, comparisonDateRange: DateRange): Date[] { + checkDateRangeFormat(referenceDateRange); + checkDateRangeFormat(comparisonDateRange); + + if (!isInRange(referenceDateRange, comparisonDateRange)) { + return []; + } + + const startDate = referenceDateRange.startDate.getTime() > comparisonDateRange.startDate.getTime() ? new Date(referenceDateRange.startDate) : new Date(comparisonDateRange.startDate); + const endDate = referenceDateRange.endDate.getTime() < comparisonDateRange.endDate.getTime() ? new Date(referenceDateRange.endDate) : new Date(comparisonDateRange.endDate); + + return [ + ...findDateRangeEachDates({startDate, endDate}) + ] +} + +/** + * @name findNonOverlappingDates + * @category Date Range Helpers + * @summary Finds non overlapping dates between two date ranges. + * + * @description + * This function returns an array of dates that non overlapping between the given reference date range and comparison date range. + * If two date ranges are same, return empty array. + * Throws an error if the date range format is incorrect. + * + * @param {DateRange} referenceDateRange - The reference date range. + * @param {DateRange} comparisonDateRange - The comparison date range. + * @returns {Date[]} An array of overlapping dates found within the overlapping period of the two date ranges. + * @throws {DateRangeCheckerError} Throws an error if the date range format is incorrect. + * + * @example + * const nonOverlappingDates = findNonOverlappingDates( + * { startDate: new Date('2022-01-01'), endDate: new Date('2022-01-10') }, + * { startDate: new Date('2022-01-05'), endDate: new Date('2022-01-15') } + * ); + * //=> [ + * // new Date('2022-01-01'), + * // new Date('2022-01-02'), + * // new Date('2022-01-03'), + * // new Date('2022-01-04'), + * // new Date('2022-01-11'), + * // new Date('2022-01-12') + * // new Date('2022-01-13') + * // new Date('2022-01-14') + * // new Date('2022-01-15') + * // ] + */ +function findNonOverlappingDates(referenceDateRange: DateRange, comparisonDateRange: DateRange): Date[] { + checkDateRangeFormat(referenceDateRange); + checkDateRangeFormat(comparisonDateRange); + + if (!isInRange(referenceDateRange, comparisonDateRange)) { + return [ + ...findDateRangeEachDates({ + startDate: referenceDateRange.startDate, + endDate: referenceDateRange.endDate + }), + ...findDateRangeEachDates({ + startDate: comparisonDateRange.startDate, + endDate: comparisonDateRange.endDate + }) + ]; + } + + const firstStartDate = referenceDateRange.startDate.getTime() < comparisonDateRange.startDate.getTime() ? new Date(referenceDateRange.startDate) : new Date(comparisonDateRange.startDate); + const firstEndDate = firstStartDate.getTime() === referenceDateRange.startDate.getTime() ? new Date(comparisonDateRange.startDate) : new Date(referenceDateRange.startDate); + firstEndDate.setDate(firstEndDate.getDate() - 1); + + const secondStartDate = referenceDateRange.endDate.getTime() < comparisonDateRange.endDate.getTime() ? new Date(referenceDateRange.endDate) : new Date(comparisonDateRange.endDate); + const secondEndDate = secondStartDate.getTime() == referenceDateRange.endDate.getTime() ? new Date(comparisonDateRange.endDate) : new Date(referenceDateRange.endDate); + secondStartDate.setDate(secondStartDate.getDate() + 1) + + return [ + ...findDateRangeEachDates({ + startDate: firstStartDate, + endDate: firstEndDate + }), + ...findDateRangeEachDates({ + startDate: secondStartDate, + endDate: secondEndDate + }) + ] +} + /** * @name checkDateRangeFormat * @category Date Range Helpers @@ -220,5 +332,7 @@ export { isEndDateInRange, isStartDateAndEndDateInRange, isStartDateAndEndDateIncludeRange, + findOverlappingDates, + findNonOverlappingDates, DateRangeCheckerError } \ No newline at end of file diff --git a/src/type/type.ts b/src/type/type.ts new file mode 100644 index 0000000..8535930 --- /dev/null +++ b/src/type/type.ts @@ -0,0 +1,8 @@ +interface DateRange { + startDate: Date; + endDate: Date; +} + +export { + DateRange +} \ No newline at end of file diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..d12cbde --- /dev/null +++ b/src/util.ts @@ -0,0 +1,18 @@ +import { DateRange } from "./type/type"; + + +function findDateRangeEachDates(dateRange: DateRange): Date[] { + const result: Date[] = []; + let currentDate = new Date(dateRange.startDate); + + while (currentDate.getTime() <= dateRange.endDate.getTime()) { + result.push(new Date(currentDate)); + currentDate.setDate(currentDate.getDate() + 1); + } + + return result; +} + +export { + findDateRangeEachDates +} \ No newline at end of file