@alanszp/business-days-date-fns 4.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +93 -0
- package/.gitignore +3 -0
- package/.npmignore +3 -0
- package/LICENSE +21 -0
- package/README.MD +51 -0
- package/babel.config.js +7 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +17 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/addBusinessDays.d.ts +1 -0
- package/dist/utils/addBusinessDays.js +42 -0
- package/dist/utils/addBusinessDays.js.map +1 -0
- package/dist/utils/addBusinessDays.test.d.ts +1 -0
- package/dist/utils/addBusinessDays.test.js +94 -0
- package/dist/utils/addBusinessDays.test.js.map +1 -0
- package/dist/utils/differenceInBusinessDay.test.d.ts +1 -0
- package/dist/utils/differenceInBusinessDay.test.js +96 -0
- package/dist/utils/differenceInBusinessDay.test.js.map +1 -0
- package/dist/utils/differenceInBusinessDays.d.ts +1 -0
- package/dist/utils/differenceInBusinessDays.js +34 -0
- package/dist/utils/differenceInBusinessDays.js.map +1 -0
- package/dist/utils/isBusinessDay.d.ts +1 -0
- package/dist/utils/isBusinessDay.js +16 -0
- package/dist/utils/isBusinessDay.js.map +1 -0
- package/dist/utils/isBusinessDay.test.d.ts +1 -0
- package/dist/utils/isBusinessDay.test.js +34 -0
- package/dist/utils/isBusinessDay.test.js.map +1 -0
- package/dist/utils/isNonBusinessDay.d.ts +1 -0
- package/dist/utils/isNonBusinessDay.js +17 -0
- package/dist/utils/isNonBusinessDay.js.map +1 -0
- package/dist/utils/isNonBusinessDay.test.d.ts +1 -0
- package/dist/utils/isNonBusinessDay.test.js +52 -0
- package/dist/utils/isNonBusinessDay.test.js.map +1 -0
- package/dist/utils/requiredArgs.d.ts +1 -0
- package/dist/utils/requiredArgs.js +10 -0
- package/dist/utils/requiredArgs.js.map +1 -0
- package/dist/utils/subBusinessDays.d.ts +1 -0
- package/dist/utils/subBusinessDays.js +14 -0
- package/dist/utils/subBusinessDays.js.map +1 -0
- package/dist/utils/subBusinessDays.test.d.ts +1 -0
- package/dist/utils/subBusinessDays.test.js +69 -0
- package/dist/utils/subBusinessDays.test.js.map +1 -0
- package/dist/utils/withNonBusinessDays.d.ts +11 -0
- package/dist/utils/withNonBusinessDays.js +45 -0
- package/dist/utils/withNonBusinessDays.js.map +1 -0
- package/dist/utils/withNonBusinessDays.test.d.ts +1 -0
- package/dist/utils/withNonBusinessDays.test.js +73 -0
- package/dist/utils/withNonBusinessDays.test.js.map +1 -0
- package/dist/utils/wrapperNonBusinessDays.d.ts +3 -0
- package/dist/utils/wrapperNonBusinessDays.js +70 -0
- package/dist/utils/wrapperNonBusinessDays.js.map +1 -0
- package/header.png +0 -0
- package/jest.config.js +10 -0
- package/package.json +39 -0
- package/src/cache/index.ts +13 -0
- package/src/index.ts +1 -0
- package/src/utils/addBusinessDays.test.ts +131 -0
- package/src/utils/addBusinessDays.ts +46 -0
- package/src/utils/differenceInBusinessDay.test.ts +176 -0
- package/src/utils/differenceInBusinessDays.ts +37 -0
- package/src/utils/isBusinessDay.test.ts +47 -0
- package/src/utils/isBusinessDay.ts +18 -0
- package/src/utils/isNonBusinessDay.test.ts +69 -0
- package/src/utils/isNonBusinessDay.ts +17 -0
- package/src/utils/requiredArgs.ts +5 -0
- package/src/utils/subBusinessDays.test.ts +99 -0
- package/src/utils/subBusinessDays.ts +10 -0
- package/src/utils/withNonBusinessDays.test.ts +82 -0
- package/src/utils/withNonBusinessDays.ts +87 -0
- package/src/utils/wrapperNonBusinessDays.ts +78 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isNonBusinessDay = void 0;
|
|
7
|
+
const date_fns_1 = require("date-fns");
|
|
8
|
+
const isSameDay_1 = __importDefault(require("date-fns/isSameDay"));
|
|
9
|
+
const requiredArgs_1 = require("./requiredArgs");
|
|
10
|
+
function isNonBusinessDay(nonBusinessDays, dirtyDate) {
|
|
11
|
+
(0, requiredArgs_1.requiredArgs)(1, [dirtyDate]);
|
|
12
|
+
const date = (0, date_fns_1.toDate)(dirtyDate);
|
|
13
|
+
return (nonBusinessDays.some((nonBusinessDay) => (0, isSameDay_1.default)(nonBusinessDay, date)) ||
|
|
14
|
+
(0, date_fns_1.isWeekend)(date));
|
|
15
|
+
}
|
|
16
|
+
exports.isNonBusinessDay = isNonBusinessDay;
|
|
17
|
+
//# sourceMappingURL=isNonBusinessDay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNonBusinessDay.js","sourceRoot":"","sources":["../../src/utils/isNonBusinessDay.ts"],"names":[],"mappings":";;;;;;AAAA,uCAA6C;AAC7C,mEAA2C;AAC3C,iDAA8C;AAE9C,SAAgB,gBAAgB,CAC9B,eAAuB,EACvB,SAAe;IAEf,IAAA,2BAAY,EAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAE7B,MAAM,IAAI,GAAG,IAAA,iBAAM,EAAC,SAAS,CAAC,CAAC;IAE/B,OAAO,CACL,eAAe,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,IAAA,mBAAS,EAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACzE,IAAA,oBAAS,EAAC,IAAI,CAAC,CAChB,CAAC;AACJ,CAAC;AAZD,4CAYC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const date_fns_1 = require("date-fns");
|
|
8
|
+
const isNonBusinessDay_1 = require("./isNonBusinessDay");
|
|
9
|
+
describe("isNonBusinessDay", () => {
|
|
10
|
+
it("should return true because is part of NBD", () => {
|
|
11
|
+
const result = (0, isNonBusinessDay_1.isNonBusinessDay)([new Date("2022-01-01"), new Date("2022-01-02")], new Date("2022-01-01"));
|
|
12
|
+
expect(result).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it("should return true because weekend", () => {
|
|
15
|
+
const saturday = (0, isNonBusinessDay_1.isNonBusinessDay)([], new Date("2022-01-01"));
|
|
16
|
+
const sunday = (0, isNonBusinessDay_1.isNonBusinessDay)([], new Date("2022-01-02"));
|
|
17
|
+
expect(saturday).toBeTruthy();
|
|
18
|
+
expect(sunday).toBeTruthy();
|
|
19
|
+
});
|
|
20
|
+
it("should return false because are part of the week", () => {
|
|
21
|
+
const monday = (0, isNonBusinessDay_1.isNonBusinessDay)([], new Date("2022-01-03"));
|
|
22
|
+
const tuesday = (0, isNonBusinessDay_1.isNonBusinessDay)([], new Date("2022-01-04"));
|
|
23
|
+
const wednesday = (0, isNonBusinessDay_1.isNonBusinessDay)([], new Date("2022-01-05"));
|
|
24
|
+
const thursday = (0, isNonBusinessDay_1.isNonBusinessDay)([], new Date("2022-01-06"));
|
|
25
|
+
const friday = (0, isNonBusinessDay_1.isNonBusinessDay)([], new Date("2022-01-07"));
|
|
26
|
+
expect(monday).toBeFalsy();
|
|
27
|
+
expect(tuesday).toBeFalsy();
|
|
28
|
+
expect(wednesday).toBeFalsy();
|
|
29
|
+
expect(thursday).toBeFalsy();
|
|
30
|
+
expect(friday).toBeFalsy();
|
|
31
|
+
});
|
|
32
|
+
it("should work properly using hh:mm:ss", () => {
|
|
33
|
+
const sundayLate = (0, isNonBusinessDay_1.isNonBusinessDay)([], (0, date_fns_1.parse)("2022-01-23T23:59:59", "yyyy-MM-dd HH:mm:ss", new Date()));
|
|
34
|
+
const dayOffLate = (0, isNonBusinessDay_1.isNonBusinessDay)([(0, date_fns_1.parse)("2022-01-24T23:59:59", "yyyy-MM-dd HH:mm:ss", new Date())], (0, date_fns_1.parse)("2022-01-24T23:59:59", "yyyy-MM-dd HH:mm:ss", new Date()));
|
|
35
|
+
expect(sundayLate).toBeFalsy();
|
|
36
|
+
expect(dayOffLate).toBeFalsy();
|
|
37
|
+
});
|
|
38
|
+
it("should return false because is not part of is part of NBD", () => {
|
|
39
|
+
const result = (0, isNonBusinessDay_1.isNonBusinessDay)([new Date("2022-01-01"), new Date("2022-01-02")], new Date("2022-01-03"));
|
|
40
|
+
expect(result).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it("throws TypeError exception if passed less than 2 arguments", () => {
|
|
43
|
+
try {
|
|
44
|
+
// @ts-ignore
|
|
45
|
+
(0, isNonBusinessDay_1.isNonBusinessDay)([new Date("2022-01-01"), new Date("2022-01-02")]);
|
|
46
|
+
assert_1.default.throws(isNonBusinessDay_1.isNonBusinessDay.bind(null), TypeError);
|
|
47
|
+
assert_1.default.throws(isNonBusinessDay_1.isNonBusinessDay.bind(null, 1), TypeError);
|
|
48
|
+
}
|
|
49
|
+
catch (_a) { }
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=isNonBusinessDay.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNonBusinessDay.test.js","sourceRoot":"","sources":["../../src/utils/isNonBusinessDay.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function requiredArgs(required: number, args: unknown[]): void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requiredArgs = void 0;
|
|
4
|
+
function requiredArgs(required, args) {
|
|
5
|
+
if (args.length < required) {
|
|
6
|
+
throw new TypeError(`${required} argument${required > 1 ? "s" : ""} required, but only ${args.length} present`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
exports.requiredArgs = requiredArgs;
|
|
10
|
+
//# sourceMappingURL=requiredArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requiredArgs.js","sourceRoot":"","sources":["../../src/utils/requiredArgs.ts"],"names":[],"mappings":";;;AAAA,SAAgB,YAAY,CAAC,QAAgB,EAAE,IAAe;IAC5D,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE;QAC1B,MAAM,IAAI,SAAS,CAAC,GAAG,QAAQ,YAAY,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,uBAAuB,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;KACjH;AACH,CAAC;AAJD,oCAIC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function subBusinessDays(nonBusinessDays: Date[], dirtyDate: Date | number, dirtyAmount: number): Date;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.subBusinessDays = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const addBusinessDays_1 = require("./addBusinessDays");
|
|
6
|
+
const requiredArgs_1 = require("./requiredArgs");
|
|
7
|
+
function subBusinessDays(nonBusinessDays, dirtyDate, dirtyAmount) {
|
|
8
|
+
// eslint-disable-next-line prefer-rest-params
|
|
9
|
+
(0, requiredArgs_1.requiredArgs)(2, [dirtyDate, dirtyAmount]);
|
|
10
|
+
const amount = (0, lodash_1.toInteger)(dirtyAmount);
|
|
11
|
+
return (0, addBusinessDays_1.addBusinessDays)(nonBusinessDays, dirtyDate, -amount);
|
|
12
|
+
}
|
|
13
|
+
exports.subBusinessDays = subBusinessDays;
|
|
14
|
+
//# sourceMappingURL=subBusinessDays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subBusinessDays.js","sourceRoot":"","sources":["../../src/utils/subBusinessDays.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AACnC,uDAAoD;AACpD,iDAA8C;AAE9C,SAAgB,eAAe,CAAC,eAAuB,EAAE,SAAwB,EAAE,WAAmB;IACpG,8CAA8C;IAC9C,IAAA,2BAAY,EAAC,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,WAAW,CAAC,CAAC;IACtC,OAAO,IAAA,iCAAe,EAAC,eAAe,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;AAC9D,CAAC;AALD,0CAKC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const subBusinessDays_1 = require("./subBusinessDays");
|
|
8
|
+
describe("subBusinessDay", () => {
|
|
9
|
+
it("should return 2 next days", () => {
|
|
10
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([new Date("2022-01-20")], new Date("2022-01-21"), 1);
|
|
11
|
+
expect(result).toEqual(new Date("2022-01-19"));
|
|
12
|
+
});
|
|
13
|
+
it("should return next monday", () => {
|
|
14
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([new Date("2022-01-20"), new Date("2022-01-21")], new Date("2022-01-24"), 1);
|
|
15
|
+
expect(result).toEqual(new Date("2022-01-19"));
|
|
16
|
+
});
|
|
17
|
+
it("should return next monday when you start on weekend", () => {
|
|
18
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date("2022-01-24"), 1);
|
|
19
|
+
expect(result).toEqual(new Date("2022-01-21"));
|
|
20
|
+
});
|
|
21
|
+
it("substract the given number of business days", () => {
|
|
22
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date(2014, 8 /* Sep */, 1), 10);
|
|
23
|
+
expect(result).toEqual(new Date(2014, 7 /* Aug */, 18));
|
|
24
|
+
});
|
|
25
|
+
it("handles negative amount", () => {
|
|
26
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date(2014, 7 /* Sep */, 18), -10);
|
|
27
|
+
expect(result).toEqual(new Date(2014, 8 /* Sep */, 1));
|
|
28
|
+
});
|
|
29
|
+
it("can handle a large number of business days", () => {
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
if (typeof global.timeout === "function") {
|
|
32
|
+
// @ts-ignore
|
|
33
|
+
global.timeout(500 /* 500 ms test timeout */);
|
|
34
|
+
}
|
|
35
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date(15000, 0 /* Jan */, 1), 3387885);
|
|
36
|
+
expect(result).toEqual(new Date(2014, 0 /* Jan */, 1));
|
|
37
|
+
});
|
|
38
|
+
it("accepts a timestamp", () => {
|
|
39
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date(2014, 8 /* Sep */, 1).getTime(), 10);
|
|
40
|
+
expect(result).toEqual(new Date(2014, 7 /* Aug */, 18));
|
|
41
|
+
});
|
|
42
|
+
it("converts a fractional number to an integer", () => {
|
|
43
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date(2014, 8 /* Sep */, 1), 10.5);
|
|
44
|
+
expect(result).toEqual(new Date(2014, 7 /* Aug */, 18));
|
|
45
|
+
});
|
|
46
|
+
it("implicitly converts number arguments", () => {
|
|
47
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date(2014, 8 /* Sep */, 1),
|
|
48
|
+
// @ts-ignore
|
|
49
|
+
"10");
|
|
50
|
+
expect(result).toEqual(new Date(2014, 7 /* Aug */, 18));
|
|
51
|
+
});
|
|
52
|
+
it("does not mutate the original date", () => {
|
|
53
|
+
const date = new Date(2014, 8 /* Sep */, 1);
|
|
54
|
+
(0, subBusinessDays_1.subBusinessDays)([], date, 11);
|
|
55
|
+
expect(date).toEqual(new Date(2014, 8 /* Sep */, 1));
|
|
56
|
+
});
|
|
57
|
+
it("returns `Invalid Date` if the given date is invalid", () => {
|
|
58
|
+
const result = (0, subBusinessDays_1.subBusinessDays)([], new Date(NaN), 10);
|
|
59
|
+
expect(result instanceof Date && Number.isNaN(result.getTime())).toBeTruthy();
|
|
60
|
+
});
|
|
61
|
+
it("throws TypeError exception if passed less than 2 arguments", () => {
|
|
62
|
+
try {
|
|
63
|
+
assert_1.default.throws(subBusinessDays_1.subBusinessDays.bind(null), TypeError);
|
|
64
|
+
assert_1.default.throws(subBusinessDays_1.subBusinessDays.bind(null, new Date(2014, 8 /* Sep */, 1)), TypeError);
|
|
65
|
+
}
|
|
66
|
+
catch (_a) { }
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=subBusinessDays.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subBusinessDays.test.js","sourceRoot":"","sources":["../../src/utils/subBusinessDays.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Options as CacheOptions } from "lru-cache";
|
|
2
|
+
export declare type WithNonBusinessDaysOutput<IdentifyObject> = {
|
|
3
|
+
addBusinessDays: (dirtyDate: Date | number, dirtyAmount: number, identify?: IdentifyObject) => Promise<Date> | Date;
|
|
4
|
+
subBusinessDays: (dirtyDate: Date | number, dirtyAmount: number, identify?: IdentifyObject) => Promise<Date> | Date;
|
|
5
|
+
differenceInBusinessDays: (dirtyDate: Date | number, dirtyAmount: number, identify: IdentifyObject) => Promise<number> | number;
|
|
6
|
+
isNonBusinessDay: (date: Date, identify: IdentifyObject) => Promise<boolean> | boolean;
|
|
7
|
+
isBusinessDay: (date: Date, identify: IdentifyObject) => Promise<boolean> | boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function withNonBusinessDays<Options>(fetchStrategy: ((opts?: Options) => Promise<Date[]>) | Date[], cacheOpts?: CacheOptions<string, Date[]> & {
|
|
10
|
+
serializeOptions?: (opts?: Options) => string;
|
|
11
|
+
}): WithNonBusinessDaysOutput<Options>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.withNonBusinessDays = void 0;
|
|
23
|
+
const lodash_1 = __importStar(require("lodash/"));
|
|
24
|
+
const addBusinessDays_1 = require("./addBusinessDays");
|
|
25
|
+
const subBusinessDays_1 = require("./subBusinessDays");
|
|
26
|
+
const differenceInBusinessDays_1 = require("./differenceInBusinessDays");
|
|
27
|
+
const wrapperNonBusinessDays_1 = require("./wrapperNonBusinessDays");
|
|
28
|
+
const isNonBusinessDay_1 = require("./isNonBusinessDay");
|
|
29
|
+
const isBusinessDay_1 = require("./isBusinessDay");
|
|
30
|
+
const cache_1 = require("../cache");
|
|
31
|
+
function withNonBusinessDays(fetchStrategy, cacheOpts) {
|
|
32
|
+
if (!(0, lodash_1.default)(fetchStrategy) && !(0, lodash_1.isArray)(fetchStrategy)) {
|
|
33
|
+
throw new Error("You must send a function for fetchStrategy or a list of dates");
|
|
34
|
+
}
|
|
35
|
+
const cache = (0, cache_1.buildNonBusinessDaysCache)(cacheOpts);
|
|
36
|
+
return {
|
|
37
|
+
addBusinessDays: (0, wrapperNonBusinessDays_1.wrapperDateAndNumberNonBusinessDays)(cache, fetchStrategy, addBusinessDays_1.addBusinessDays, cacheOpts === null || cacheOpts === void 0 ? void 0 : cacheOpts.serializeOptions),
|
|
38
|
+
differenceInBusinessDays: (0, wrapperNonBusinessDays_1.wrapperDateAndNumberNonBusinessDays)(cache, fetchStrategy, differenceInBusinessDays_1.differenceInBusinessDays, cacheOpts === null || cacheOpts === void 0 ? void 0 : cacheOpts.serializeOptions),
|
|
39
|
+
subBusinessDays: (0, wrapperNonBusinessDays_1.wrapperDateAndNumberNonBusinessDays)(cache, fetchStrategy, subBusinessDays_1.subBusinessDays, cacheOpts === null || cacheOpts === void 0 ? void 0 : cacheOpts.serializeOptions),
|
|
40
|
+
isNonBusinessDay: (0, wrapperNonBusinessDays_1.wrapperDateNonBusinessDays)(cache, fetchStrategy, isNonBusinessDay_1.isNonBusinessDay, cacheOpts === null || cacheOpts === void 0 ? void 0 : cacheOpts.serializeOptions),
|
|
41
|
+
isBusinessDay: (0, wrapperNonBusinessDays_1.wrapperDateNonBusinessDays)(cache, fetchStrategy, isBusinessDay_1.isBusinessDay, cacheOpts === null || cacheOpts === void 0 ? void 0 : cacheOpts.serializeOptions),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
exports.withNonBusinessDays = withNonBusinessDays;
|
|
45
|
+
//# sourceMappingURL=withNonBusinessDays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withNonBusinessDays.js","sourceRoot":"","sources":["../../src/utils/withNonBusinessDays.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA8C;AAE9C,uDAAoD;AACpD,uDAAoD;AACpD,yEAAsE;AACtE,qEAGkC;AAClC,yDAAsD;AACtD,mDAAgD;AAChD,oCAAqD;AA4BrD,SAAgB,mBAAmB,CACjC,aAA6D,EAC7D,SAEC;IAED,IAAI,CAAC,IAAA,gBAAU,EAAC,aAAa,CAAC,IAAI,CAAC,IAAA,gBAAO,EAAC,aAAa,CAAC,EAAE;QACzD,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;KACH;IAED,MAAM,KAAK,GAAG,IAAA,iCAAyB,EAAC,SAAS,CAAC,CAAC;IAEnD,OAAO;QACL,eAAe,EAAE,IAAA,4DAAmC,EAClD,KAAK,EACL,aAAa,EACb,iCAAe,EACf,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,gBAAgB,CAC5B;QACD,wBAAwB,EAAE,IAAA,4DAAmC,EAC3D,KAAK,EAEL,aAAa,EACb,mDAAwB,EACxB,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,gBAAgB,CAC5B;QACD,eAAe,EAAE,IAAA,4DAAmC,EAClD,KAAK,EACL,aAAa,EACb,iCAAe,EACf,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,gBAAgB,CAC5B;QACD,gBAAgB,EAAE,IAAA,mDAA0B,EAC1C,KAAK,EACL,aAAa,EACb,mCAAgB,EAChB,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,gBAAgB,CAC5B;QACD,aAAa,EAAE,IAAA,mDAA0B,EACvC,KAAK,EACL,aAAa,EACb,6BAAa,EACb,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,gBAAgB,CAC5B;KACF,CAAC;AACJ,CAAC;AA/CD,kDA+CC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const assert_1 = __importDefault(require("assert"));
|
|
16
|
+
const withNonBusinessDays_1 = require("./withNonBusinessDays");
|
|
17
|
+
const mockNBD = [new Date("2022-01-19"), new Date("2022-01-20")];
|
|
18
|
+
const mockSerializer = jest.fn();
|
|
19
|
+
describe("withNonBusinessDays", () => {
|
|
20
|
+
it("bootstraping sync should return fns", () => {
|
|
21
|
+
const { addBusinessDays, subBusinessDays, isBusinessDay, isNonBusinessDay, differenceInBusinessDays, } = (0, withNonBusinessDays_1.withNonBusinessDays)([new Date("2022-01-01"), new Date("2022-01-10")]);
|
|
22
|
+
expect(typeof addBusinessDays).toBe("function");
|
|
23
|
+
expect(typeof subBusinessDays).toBe("function");
|
|
24
|
+
expect(typeof isBusinessDay).toBe("function");
|
|
25
|
+
expect(typeof isNonBusinessDay).toBe("function");
|
|
26
|
+
expect(typeof differenceInBusinessDays).toBe("function");
|
|
27
|
+
});
|
|
28
|
+
it("bootstraping async should return fns and call serializer", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
+
const mockFetchStrategy = jest.fn();
|
|
30
|
+
mockFetchStrategy.mockImplementation(() => Promise.resolve(mockNBD));
|
|
31
|
+
const { addBusinessDays, subBusinessDays, isBusinessDay, isNonBusinessDay, differenceInBusinessDays, } = (0, withNonBusinessDays_1.withNonBusinessDays)(mockFetchStrategy, {
|
|
32
|
+
serializeOptions: mockSerializer,
|
|
33
|
+
});
|
|
34
|
+
expect(typeof addBusinessDays).toBe("function");
|
|
35
|
+
expect(typeof subBusinessDays).toBe("function");
|
|
36
|
+
expect(typeof isBusinessDay).toBe("function");
|
|
37
|
+
expect(typeof isNonBusinessDay).toBe("function");
|
|
38
|
+
expect(typeof differenceInBusinessDays).toBe("function");
|
|
39
|
+
yield addBusinessDays(new Date(), 1, { month: 1 });
|
|
40
|
+
expect(mockSerializer).toHaveBeenCalledWith({ month: 1 });
|
|
41
|
+
expect(mockFetchStrategy).toHaveBeenCalled();
|
|
42
|
+
}));
|
|
43
|
+
it("bootstraping async addBusinessDays", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
44
|
+
const mockFetchStrategy = jest.fn();
|
|
45
|
+
mockFetchStrategy.mockImplementation(() => Promise.resolve(mockNBD));
|
|
46
|
+
const { addBusinessDays } = (0, withNonBusinessDays_1.withNonBusinessDays)(mockFetchStrategy, {
|
|
47
|
+
serializeOptions: (obj) => JSON.stringify(obj),
|
|
48
|
+
});
|
|
49
|
+
const result = yield addBusinessDays(new Date("2022-01-18"), 1);
|
|
50
|
+
expect(result).toEqual(new Date("2022-01-21"));
|
|
51
|
+
}));
|
|
52
|
+
it("bootstraping async throw error", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const mockFetchStrategy = jest.fn();
|
|
54
|
+
mockFetchStrategy.mockImplementation(() => Promise.reject());
|
|
55
|
+
try {
|
|
56
|
+
assert_1.default.throws(withNonBusinessDays_1.withNonBusinessDays.bind(mockFetchStrategy), TypeError);
|
|
57
|
+
}
|
|
58
|
+
catch (_a) { }
|
|
59
|
+
}));
|
|
60
|
+
it("bootstraping sync addBusinessDays", () => {
|
|
61
|
+
const { addBusinessDays } = (0, withNonBusinessDays_1.withNonBusinessDays)(mockNBD);
|
|
62
|
+
const result = addBusinessDays(new Date("2022-01-18"), 1);
|
|
63
|
+
expect(result).toEqual(new Date("2022-01-21"));
|
|
64
|
+
});
|
|
65
|
+
it("bootstraping should throw error for bad input", () => {
|
|
66
|
+
try {
|
|
67
|
+
assert_1.default.throws(withNonBusinessDays_1.withNonBusinessDays.bind(null), TypeError);
|
|
68
|
+
assert_1.default.throws(withNonBusinessDays_1.withNonBusinessDays.bind(null), TypeError);
|
|
69
|
+
}
|
|
70
|
+
catch (_a) { }
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=withNonBusinessDays.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withNonBusinessDays.test.js","sourceRoot":"","sources":["../../src/utils/withNonBusinessDays.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import LRUCache from "lru-cache";
|
|
2
|
+
export declare function wrapperDateAndNumberNonBusinessDays<IdentifyObject, R>(cacheNBD: LRUCache<string, Date[]>, fetchStrategy: ((opts?: IdentifyObject) => Promise<Date[]>) | Date[], fn: (nonBusinessDays: Date[], dirtyDate: Date | number, dirtyAmount: number) => R, serializeOptions?: (opts?: IdentifyObject) => string): ((dirtyDate: Date | number, dirtyAmount: number) => R) | ((dirtyDate: Date | number, dirtyAmount: number, identify?: IdentifyObject | undefined) => Promise<R>);
|
|
3
|
+
export declare function wrapperDateNonBusinessDays<IdentifyObject, R>(cacheNBD: LRUCache<string, Date[]>, fetchStrategy: ((opts?: IdentifyObject) => Promise<Date[]>) | Date[], fn: (nonBusinessDays: Date[], date: Date) => R, serializeOptions?: (opts?: IdentifyObject) => string): ((date: Date) => R) | ((date: Date, identify?: IdentifyObject | undefined) => Promise<R>);
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.wrapperDateNonBusinessDays = exports.wrapperDateAndNumberNonBusinessDays = void 0;
|
|
16
|
+
const errors_1 = require("@alanszp/errors");
|
|
17
|
+
const isArray_1 = __importDefault(require("lodash/isArray"));
|
|
18
|
+
function wrapperDateAndNumberNonBusinessDays(cacheNBD, fetchStrategy, fn, serializeOptions) {
|
|
19
|
+
if ((0, isArray_1.default)(fetchStrategy)) {
|
|
20
|
+
return (dirtyDate, dirtyAmount) => fn(fetchStrategy, dirtyDate, dirtyAmount);
|
|
21
|
+
}
|
|
22
|
+
return (dirtyDate, dirtyAmount, identify) => __awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
const cacheIdentify = serializeOptions
|
|
24
|
+
? serializeOptions(identify)
|
|
25
|
+
: JSON.stringify(identify);
|
|
26
|
+
const cache = cacheNBD.get(cacheIdentify);
|
|
27
|
+
let nonBusinessDays = [];
|
|
28
|
+
if (!cache) {
|
|
29
|
+
try {
|
|
30
|
+
nonBusinessDays = yield fetchStrategy(identify);
|
|
31
|
+
cacheNBD.set(cacheIdentify, nonBusinessDays);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new errors_1.InternalServerError(error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
nonBusinessDays = cache;
|
|
39
|
+
}
|
|
40
|
+
return fn(nonBusinessDays, dirtyDate, dirtyAmount);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
exports.wrapperDateAndNumberNonBusinessDays = wrapperDateAndNumberNonBusinessDays;
|
|
44
|
+
function wrapperDateNonBusinessDays(cacheNBD, fetchStrategy, fn, serializeOptions) {
|
|
45
|
+
if ((0, isArray_1.default)(fetchStrategy)) {
|
|
46
|
+
return (date) => fn(fetchStrategy, date);
|
|
47
|
+
}
|
|
48
|
+
return (date, identify) => __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
const cacheIdentify = serializeOptions
|
|
50
|
+
? serializeOptions(identify)
|
|
51
|
+
: JSON.stringify(identify);
|
|
52
|
+
const cache = cacheNBD.get(cacheIdentify);
|
|
53
|
+
let nonBusinessDays = [];
|
|
54
|
+
if (!cache) {
|
|
55
|
+
try {
|
|
56
|
+
nonBusinessDays = yield fetchStrategy(identify);
|
|
57
|
+
cacheNBD.set(cacheIdentify, nonBusinessDays);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new errors_1.InternalServerError(error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
nonBusinessDays = cache;
|
|
65
|
+
}
|
|
66
|
+
return fn(nonBusinessDays, date);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
exports.wrapperDateNonBusinessDays = wrapperDateNonBusinessDays;
|
|
70
|
+
//# sourceMappingURL=wrapperNonBusinessDays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapperNonBusinessDays.js","sourceRoot":"","sources":["../../src/utils/wrapperNonBusinessDays.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAAsD;AACtD,6DAAqC;AAGrC,SAAgB,mCAAmC,CACjD,QAAkC,EAClC,aAAoE,EACpE,EAIM,EACN,gBAAoD;IAEpD,IAAI,IAAA,iBAAO,EAAC,aAAa,CAAC,EAAE;QAC1B,OAAO,CAAC,SAAwB,EAAE,WAAmB,EAAE,EAAE,CACvD,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;KAC7C;IAED,OAAO,CACL,SAAwB,EACxB,WAAmB,EACnB,QAAyB,EACb,EAAE;QACd,MAAM,aAAa,GAAG,gBAAgB;YACpC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAE1C,IAAI,eAAe,GAAW,EAAE,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE;YACV,IAAI;gBACF,eAAe,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAChD,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;aAC9C;YAAC,OAAO,KAAc,EAAE;gBACvB,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC,CAAC;aACtC;SACF;aAAM;YACL,eAAe,GAAG,KAAK,CAAC;SACzB;QAED,OAAO,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC,CAAA,CAAC;AACJ,CAAC;AAxCD,kFAwCC;AAED,SAAgB,0BAA0B,CACxC,QAAkC,EAClC,aAAoE,EACpE,EAA8C,EAC9C,gBAAoD;IAEpD,IAAI,IAAA,iBAAO,EAAC,aAAa,CAAC,EAAE;QAC1B,OAAO,CAAC,IAAU,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;KAChD;IAED,OAAO,CAAO,IAAU,EAAE,QAAyB,EAAc,EAAE;QACjE,MAAM,aAAa,GAAG,gBAAgB;YACpC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAE1C,IAAI,eAAe,GAAW,EAAE,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE;YACV,IAAI;gBACF,eAAe,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAChD,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;aAC9C;YAAC,OAAO,KAAc,EAAE;gBACvB,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC,CAAC;aACtC;SACF;aAAM;YACL,eAAe,GAAG,KAAK,CAAC;SACzB;QAED,OAAO,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAA,CAAC;AACJ,CAAC;AA/BD,gEA+BC"}
|
package/header.png
ADDED
|
Binary file
|
package/jest.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@alanszp/business-days-date-fns",
|
|
3
|
+
"version": "4.0.10",
|
|
4
|
+
"description": "Wrapper for date-fns core TS/JS lib.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"typings": "dist/index.d.ts",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"files": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"compile": "rm -rf ./dist && tsc --declaration",
|
|
16
|
+
"compile-watch": "tsc -w",
|
|
17
|
+
"build": "yarn run compile",
|
|
18
|
+
"prepack": "yarn run build",
|
|
19
|
+
"yalc-publish": "yarn run yalc publish",
|
|
20
|
+
"dev-tdd": "yarn run test--watch",
|
|
21
|
+
"test": "TZ=Etc/UTC jest",
|
|
22
|
+
"coverage": "yarn run test --coverage",
|
|
23
|
+
"test--watch": "yarn run test --watch"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@alanszp/errors": "^4.0.5",
|
|
27
|
+
"@babel/core": "^7.16.12",
|
|
28
|
+
"date-fns": "^2.28.0",
|
|
29
|
+
"lodash": "^4.17.21"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@babel/preset-env": "^7.16.11",
|
|
33
|
+
"@babel/preset-typescript": "^7.16.7",
|
|
34
|
+
"@types/jest": "^27.4.0",
|
|
35
|
+
"assert": "^2.0.0",
|
|
36
|
+
"jest": "^27.4.7"
|
|
37
|
+
},
|
|
38
|
+
"gitHead": "8f2981459501da8cf7e9c7583f7508753f286c70"
|
|
39
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import LRUCache, { Options } from "lru-cache";
|
|
2
|
+
|
|
3
|
+
const oneDay = 1000 * 60 * 60 * 24;
|
|
4
|
+
|
|
5
|
+
const DEFAULT_OPTIONS: Options<string, Date[]> = {
|
|
6
|
+
max: 300,
|
|
7
|
+
maxAge: oneDay,
|
|
8
|
+
stale: true,
|
|
9
|
+
updateAgeOnGet: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const buildNonBusinessDaysCache = (options?: Options<string, Date[]>) =>
|
|
13
|
+
new LRUCache<string, Date[]>(options || DEFAULT_OPTIONS);
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { withNonBusinessDays } from "./utils/withNonBusinessDays";
|