@lighthouse/common 6.10.0 → 6.10.1-canary.0
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/.mise.toml +6 -6
- package/CHANGELOG.md +758 -758
- package/README.md +1 -1
- package/dist/errors/FetchImageError.js +3 -3
- package/dist/helpers/fetch-image-for-pdf-generator-service/index.js +7 -7
- package/dist/helpers/floatify/index.js +6 -6
- package/dist/helpers/get-audit-items-data/index.js +47 -36
- package/dist/helpers/validate-url/index.js +4 -4
- package/dist/pdf/activity-report/index.js +32 -32
- package/dist/pdf/audit/index.js +23 -23
- package/dist/pdf/helpers/fields/index.js +47 -27
- package/dist/pdf/issue/index.js +23 -23
- package/dist/pdf/job/index.js +22 -22
- package/dist/pdf/shift-report/index.js +28 -28
- package/dist/pdf/task/index.js +23 -23
- package/dist/scheduling/generators/occurrenceIntervalsGenerator.js +2 -2
- package/dist/scheduling/generators/scheduleIntervalsGenerator.js +2 -2
- package/dist/scheduling/generators/serviceIntervalsGenerator.js +2 -2
- package/dist/scheduling/helpers/convertToTimezone.js +6 -6
- package/dist/scheduling/helpers/generateNonRepeatingSchedule.js +2 -2
- package/dist/scheduling/helpers/generateRepeatingSchedule.js +2 -2
- package/dist/scheduling/helpers/generateScheduleEnd.js +2 -2
- package/dist/scheduling/helpers/hasValidStartAndEnd.js +5 -5
- package/dist/scheduling/helpers/intervalCovers.js +6 -6
- package/dist/scheduling/helpers/intervalIntersectsEnd.js +6 -6
- package/dist/scheduling/helpers/intervalIntersectsStart.js +6 -6
- package/dist/scheduling/helpers/intervalOnlyIntersectsEnd.js +6 -6
- package/dist/scheduling/helpers/intervalOnlyIntersectsStart.js +6 -6
- package/dist/scheduling/helpers/intervalOutside.js +6 -6
- package/dist/scheduling/helpers/intervalWithin.js +6 -6
- package/dist/scheduling/helpers/mergeIntervals.js +6 -6
- package/dist/scheduling/helpers/splitIntervals.js +6 -6
- package/dist/scheduling/strategies/getNext.js +2 -2
- package/dist/scheduling/strategies/getNextExactDateOfMonth.js +2 -2
- package/dist/scheduling/strategies/getNextLastDayOfMonth.js +2 -2
- package/dist/scheduling/strategies/getNextLastWeekdayOfMonth.js +2 -2
- package/dist/scheduling/strategies/getNextNoRepeat.js +2 -2
- package/dist/scheduling/strategies/getNextWeekday.js +2 -2
- package/dist/scheduling/strategies/getNextXDayOfXWeekOfMonth.js +2 -2
- package/dist/service-hours/__helpers__/calculate-hours.js +4 -4
- package/dist/service-hours/__helpers__/isOpen.js +2 -2
- package/dist/service-hours/schema.js +4 -4
- package/lib/constants.js +12 -6
- package/lib/constants.js.map +1 -1
- package/lib/errors/DomainError.js +14 -21
- package/lib/errors/DomainError.js.map +1 -1
- package/lib/errors/FetchImageError.js +17 -24
- package/lib/errors/FetchImageError.js.map +1 -1
- package/lib/errors/ValidationError.js +30 -36
- package/lib/errors/ValidationError.js.map +1 -1
- package/lib/errors/index.js +23 -5
- package/lib/errors/index.js.map +1 -1
- package/lib/helpers/build-fetch-url/index.js +43 -47
- package/lib/helpers/build-fetch-url/index.js.map +1 -1
- package/lib/helpers/fetch-image/index.js +83 -82
- package/lib/helpers/fetch-image/index.js.map +1 -1
- package/lib/helpers/fetch-image-for-pdf-generator-service/index.js +168 -243
- package/lib/helpers/fetch-image-for-pdf-generator-service/index.js.map +1 -1
- package/lib/helpers/fetch-image-for-web/index.js +71 -94
- package/lib/helpers/fetch-image-for-web/index.js.map +1 -1
- package/lib/helpers/fetch-lighthouse-logo/index.js +36 -61
- package/lib/helpers/fetch-lighthouse-logo/index.js.map +1 -1
- package/lib/helpers/floatify/index.js +13 -7
- package/lib/helpers/floatify/index.js.map +1 -1
- package/lib/helpers/get-assignees-full-names/index.js +11 -7
- package/lib/helpers/get-assignees-full-names/index.js.map +1 -1
- package/lib/helpers/get-audit-entry-details/index.js +42 -32
- package/lib/helpers/get-audit-entry-details/index.js.map +1 -1
- package/lib/helpers/get-audit-items-data/index.js +104 -83
- package/lib/helpers/get-audit-items-data/index.js.map +1 -1
- package/lib/helpers/get-geometry-geocoded-string/index.js +10 -5
- package/lib/helpers/get-geometry-geocoded-string/index.js.map +1 -1
- package/lib/helpers/get-issue-details/index.js +53 -43
- package/lib/helpers/get-issue-details/index.js.map +1 -1
- package/lib/helpers/get-job-details/index.js +49 -41
- package/lib/helpers/get-job-details/index.js.map +1 -1
- package/lib/helpers/get-location-reference/index.js +32 -34
- package/lib/helpers/get-location-reference/index.js.map +1 -1
- package/lib/helpers/get-pretty-duration/index.js +16 -10
- package/lib/helpers/get-pretty-duration/index.js.map +1 -1
- package/lib/helpers/get-reference-details/index.js +20 -10
- package/lib/helpers/get-reference-details/index.js.map +1 -1
- package/lib/helpers/get-status-details/index.js +8 -2
- package/lib/helpers/get-status-details/index.js.map +1 -1
- package/lib/helpers/get-task-entry-details/index.js +32 -23
- package/lib/helpers/get-task-entry-details/index.js.map +1 -1
- package/lib/helpers/get-timezone-abbr/index.js +11 -4
- package/lib/helpers/get-timezone-abbr/index.js.map +1 -1
- package/lib/helpers/get-timezone-datetime/index.js +20 -13
- package/lib/helpers/get-timezone-datetime/index.js.map +1 -1
- package/lib/helpers/get-user-full-name/index.js +9 -3
- package/lib/helpers/get-user-full-name/index.js.map +1 -1
- package/lib/helpers/get-value-as-percentage/index.js +9 -4
- package/lib/helpers/get-value-as-percentage/index.js.map +1 -1
- package/lib/helpers/image-validators/index.js +18 -12
- package/lib/helpers/image-validators/index.js.map +1 -1
- package/lib/helpers/index.js +130 -18
- package/lib/helpers/index.js.map +1 -1
- package/lib/helpers/validate-url/index.js +11 -5
- package/lib/helpers/validate-url/index.js.map +1 -1
- package/lib/images/index.js +10 -4
- package/lib/images/index.js.map +1 -1
- package/lib/index.js +66 -10
- package/lib/index.js.map +1 -1
- package/lib/pdf/activity-report/index.js +407 -537
- package/lib/pdf/activity-report/index.js.map +1 -1
- package/lib/pdf/audit/index.js +137 -134
- package/lib/pdf/audit/index.js.map +1 -1
- package/lib/pdf/fonts/index.js +4 -2
- package/lib/pdf/fonts/index.js.map +1 -1
- package/lib/pdf/helpers/build-audit-content/index.js +57 -51
- package/lib/pdf/helpers/build-audit-content/index.js.map +1 -1
- package/lib/pdf/helpers/build-audit-follow-ups/index.js +52 -50
- package/lib/pdf/helpers/build-audit-follow-ups/index.js.map +1 -1
- package/lib/pdf/helpers/build-location-scans-content/index.js +22 -16
- package/lib/pdf/helpers/build-location-scans-content/index.js.map +1 -1
- package/lib/pdf/helpers/build-template-content/index.js +52 -51
- package/lib/pdf/helpers/build-template-content/index.js.map +1 -1
- package/lib/pdf/helpers/default-footer/index.js +38 -35
- package/lib/pdf/helpers/default-footer/index.js.map +1 -1
- package/lib/pdf/helpers/default-header/index.js +40 -35
- package/lib/pdf/helpers/default-header/index.js.map +1 -1
- package/lib/pdf/helpers/default-styles/index.js +7 -1
- package/lib/pdf/helpers/default-styles/index.js.map +1 -1
- package/lib/pdf/helpers/fields/index.js +225 -214
- package/lib/pdf/helpers/fields/index.js.map +1 -1
- package/lib/pdf/helpers/format-location-address/index.js +14 -8
- package/lib/pdf/helpers/format-location-address/index.js.map +1 -1
- package/lib/pdf/helpers/generate-definition/index.js +60 -65
- package/lib/pdf/helpers/generate-definition/index.js.map +1 -1
- package/lib/pdf/helpers/horizontal-line/index.js +14 -14
- package/lib/pdf/helpers/horizontal-line/index.js.map +1 -1
- package/lib/pdf/helpers/html-transformer/index.js +45 -35
- package/lib/pdf/helpers/html-transformer/index.js.map +1 -1
- package/lib/pdf/helpers/index.js +194 -15
- package/lib/pdf/helpers/index.js.map +1 -1
- package/lib/pdf/helpers/parse-value/index.js +10 -4
- package/lib/pdf/helpers/parse-value/index.js.map +1 -1
- package/lib/pdf/helpers/table/index.js +136 -205
- package/lib/pdf/helpers/table/index.js.map +1 -1
- package/lib/pdf/helpers/text/index.js +11 -8
- package/lib/pdf/helpers/text/index.js.map +1 -1
- package/lib/pdf/icons/index.js +8 -2
- package/lib/pdf/icons/index.js.map +1 -1
- package/lib/pdf/index.js +47 -6
- package/lib/pdf/index.js.map +1 -1
- package/lib/pdf/issue/index.js +141 -135
- package/lib/pdf/issue/index.js.map +1 -1
- package/lib/pdf/job/index.js +95 -81
- package/lib/pdf/job/index.js.map +1 -1
- package/lib/pdf/shift-report/emptyFixtures.js +8 -2
- package/lib/pdf/shift-report/emptyFixtures.js.map +1 -1
- package/lib/pdf/shift-report/index.js +399 -521
- package/lib/pdf/shift-report/index.js.map +1 -1
- package/lib/pdf/task/index.js +89 -83
- package/lib/pdf/task/index.js.map +1 -1
- package/lib/scheduling/generators/index.js +38 -3
- package/lib/scheduling/generators/index.js.map +1 -1
- package/lib/scheduling/generators/occurrenceIntervalsGenerator.js +44 -37
- package/lib/scheduling/generators/occurrenceIntervalsGenerator.js.map +1 -1
- package/lib/scheduling/generators/scheduleIntervalsGenerator.js +20 -28
- package/lib/scheduling/generators/scheduleIntervalsGenerator.js.map +1 -1
- package/lib/scheduling/generators/serviceIntervalsGenerator.js +120 -150
- package/lib/scheduling/generators/serviceIntervalsGenerator.js.map +1 -1
- package/lib/scheduling/helpers/convertToTimezone.js +18 -11
- package/lib/scheduling/helpers/convertToTimezone.js.map +1 -1
- package/lib/scheduling/helpers/generateNonRepeatingSchedule.js +57 -95
- package/lib/scheduling/helpers/generateNonRepeatingSchedule.js.map +1 -1
- package/lib/scheduling/helpers/generateRepeatingSchedule.js +80 -119
- package/lib/scheduling/helpers/generateRepeatingSchedule.js.map +1 -1
- package/lib/scheduling/helpers/generateScheduleEnd.js +24 -14
- package/lib/scheduling/helpers/generateScheduleEnd.js.map +1 -1
- package/lib/scheduling/helpers/hasValidStartAndEnd.js +19 -11
- package/lib/scheduling/helpers/hasValidStartAndEnd.js.map +1 -1
- package/lib/scheduling/helpers/index.js +159 -14
- package/lib/scheduling/helpers/index.js.map +1 -1
- package/lib/scheduling/helpers/intervalCovers.js +13 -7
- package/lib/scheduling/helpers/intervalCovers.js.map +1 -1
- package/lib/scheduling/helpers/intervalIntersectsEnd.js +13 -7
- package/lib/scheduling/helpers/intervalIntersectsEnd.js.map +1 -1
- package/lib/scheduling/helpers/intervalIntersectsStart.js +13 -7
- package/lib/scheduling/helpers/intervalIntersectsStart.js.map +1 -1
- package/lib/scheduling/helpers/intervalOnlyIntersectsEnd.js +15 -10
- package/lib/scheduling/helpers/intervalOnlyIntersectsEnd.js.map +1 -1
- package/lib/scheduling/helpers/intervalOnlyIntersectsStart.js +15 -10
- package/lib/scheduling/helpers/intervalOnlyIntersectsStart.js.map +1 -1
- package/lib/scheduling/helpers/intervalOutside.js +15 -9
- package/lib/scheduling/helpers/intervalOutside.js.map +1 -1
- package/lib/scheduling/helpers/intervalWithin.js +13 -7
- package/lib/scheduling/helpers/intervalWithin.js.map +1 -1
- package/lib/scheduling/helpers/mergeIntervals.js +21 -17
- package/lib/scheduling/helpers/mergeIntervals.js.map +1 -1
- package/lib/scheduling/helpers/splitIntervals.js +24 -23
- package/lib/scheduling/helpers/splitIntervals.js.map +1 -1
- package/lib/scheduling/index.js +38 -3
- package/lib/scheduling/index.js.map +1 -1
- package/lib/scheduling/scheduling.types.js +9 -3
- package/lib/scheduling/scheduling.types.js.map +1 -1
- package/lib/scheduling/strategies/getNext.js +57 -63
- package/lib/scheduling/strategies/getNext.js.map +1 -1
- package/lib/scheduling/strategies/getNextExactDateOfMonth.js +47 -56
- package/lib/scheduling/strategies/getNextExactDateOfMonth.js.map +1 -1
- package/lib/scheduling/strategies/getNextLastDayOfMonth.js +43 -51
- package/lib/scheduling/strategies/getNextLastDayOfMonth.js.map +1 -1
- package/lib/scheduling/strategies/getNextLastWeekdayOfMonth.js +49 -56
- package/lib/scheduling/strategies/getNextLastWeekdayOfMonth.js.map +1 -1
- package/lib/scheduling/strategies/getNextNoRepeat.js +25 -36
- package/lib/scheduling/strategies/getNextNoRepeat.js.map +1 -1
- package/lib/scheduling/strategies/getNextWeekday.js +47 -79
- package/lib/scheduling/strategies/getNextWeekday.js.map +1 -1
- package/lib/scheduling/strategies/getNextXDayOfXWeekOfMonth.js +52 -58
- package/lib/scheduling/strategies/getNextXDayOfXWeekOfMonth.js.map +1 -1
- package/lib/scheduling/strategies/index.js +82 -7
- package/lib/scheduling/strategies/index.js.map +1 -1
- package/lib/schema/index.js +16 -1
- package/lib/schema/index.js.map +1 -1
- package/lib/schema/schema.js +28 -34
- package/lib/schema/schema.js.map +1 -1
- package/lib/service-hours/__helpers__/calculate-hours.js +24 -22
- package/lib/service-hours/__helpers__/calculate-hours.js.map +1 -1
- package/lib/service-hours/__helpers__/isOpen.js +25 -24
- package/lib/service-hours/__helpers__/isOpen.js.map +1 -1
- package/lib/service-hours/index.js +27 -2
- package/lib/service-hours/index.js.map +1 -1
- package/lib/service-hours/schema.js +68 -55
- package/lib/service-hours/schema.js.map +1 -1
- package/package.json +86 -86
- package/vitest.config.ts +23 -23
- package/vitest.setup.js +7 -7
|
@@ -1,32 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.scheduleIntervalsGenerator = scheduleIntervalsGenerator;
|
|
7
|
+
var _helpers = require("../helpers");
|
|
8
|
+
var _scheduling = require("../scheduling.types");
|
|
9
|
+
/**
|
|
10
|
+
* Generates schedule service and occurrence intervals
|
|
7
11
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
case 0:
|
|
13
|
-
type = props.strategy.type;
|
|
14
|
-
isRepeating = type !== StrategyTypes.NoRepeat;
|
|
15
|
-
if (!isRepeating) {
|
|
16
|
-
_context.next = 2;
|
|
17
|
-
break;
|
|
18
|
-
}
|
|
19
|
-
return _context.delegateYield(generateRepeatingSchedule(props), "t0", 1);
|
|
20
|
-
case 1:
|
|
21
|
-
return _context.abrupt("return", _context.t0);
|
|
22
|
-
case 2:
|
|
23
|
-
return _context.delegateYield(generateNonRepeatingSchedule(props), "t1", 3);
|
|
24
|
-
case 3:
|
|
25
|
-
return _context.abrupt("return", _context.t1);
|
|
26
|
-
case 4:
|
|
27
|
-
case "end":
|
|
28
|
-
return _context.stop();
|
|
12
|
+
function* scheduleIntervalsGenerator(props) {
|
|
13
|
+
const {
|
|
14
|
+
strategy: {
|
|
15
|
+
type
|
|
29
16
|
}
|
|
30
|
-
}
|
|
17
|
+
} = props;
|
|
18
|
+
const isRepeating = type !== _scheduling.StrategyTypes.NoRepeat;
|
|
19
|
+
if (isRepeating) {
|
|
20
|
+
return yield* (0, _helpers.generateRepeatingSchedule)(props);
|
|
21
|
+
}
|
|
22
|
+
return yield* (0, _helpers.generateNonRepeatingSchedule)(props);
|
|
31
23
|
}
|
|
32
24
|
//# sourceMappingURL=scheduleIntervalsGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduleIntervalsGenerator.js","names":["
|
|
1
|
+
{"version":3,"file":"scheduleIntervalsGenerator.js","names":["_helpers","require","_scheduling","scheduleIntervalsGenerator","props","strategy","type","isRepeating","StrategyTypes","NoRepeat","generateRepeatingSchedule","generateNonRepeatingSchedule"],"sources":["../../../src/scheduling/generators/scheduleIntervalsGenerator.ts"],"sourcesContent":["import { Schema as ServiceHoursSchema } from '../../service-hours'\r\nimport {\r\n generateNonRepeatingSchedule,\r\n generateRepeatingSchedule,\r\n} from '../helpers'\r\nimport { Strategy, StrategyTypes } from '../scheduling.types'\r\n\r\ninterface ScheduleIntervalsGenerator {\r\n readonly end: number\r\n readonly isInitial: boolean\r\n readonly strategy: Strategy\r\n readonly serviceHours: ServiceHoursSchema\r\n readonly start: number\r\n}\r\n\r\n/**\r\n * Generates schedule service and occurrence intervals\r\n */\r\nexport function* scheduleIntervalsGenerator(props: ScheduleIntervalsGenerator) {\r\n const {\r\n strategy: { type },\r\n } = props\r\n const isRepeating = type !== StrategyTypes.NoRepeat\r\n\r\n if (isRepeating) {\r\n return yield* generateRepeatingSchedule(props)\r\n }\r\n\r\n return yield* generateNonRepeatingSchedule(props)\r\n}\r\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AAIA,IAAAC,WAAA,GAAAD,OAAA;AAUA;AACA;AACA;AACO,UAAUE,0BAA0BA,CAACC,KAAiC,EAAE;EAC7E,MAAM;IACJC,QAAQ,EAAE;MAAEC;IAAK;EACnB,CAAC,GAAGF,KAAK;EACT,MAAMG,WAAW,GAAGD,IAAI,KAAKE,yBAAa,CAACC,QAAQ;EAEnD,IAAIF,WAAW,EAAE;IACf,OAAO,OAAO,IAAAG,kCAAyB,EAACN,KAAK,CAAC;EAChD;EAEA,OAAO,OAAO,IAAAO,qCAA4B,EAACP,KAAK,CAAC;AACnD","ignoreList":[]}
|
|
@@ -1,157 +1,127 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.serviceIntervalsGenerator = serviceIntervalsGenerator;
|
|
8
|
+
var _fp = require("lodash/fp");
|
|
9
|
+
var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
|
|
10
|
+
var _serviceHours = require("../../service-hours");
|
|
11
|
+
var _scheduling = require("../scheduling.types");
|
|
12
|
+
var _helpers = require("../helpers");
|
|
13
|
+
/**
|
|
14
|
+
* Generates service intervals between start and end range for service hours
|
|
14
15
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
type: Types.Default
|
|
47
|
-
}, hours);
|
|
48
|
-
openOverrideHours = filter({
|
|
49
|
-
behaviour: Behaviours.Open,
|
|
50
|
-
type: Types.Override
|
|
51
|
-
}, hours); // NOTE: we must apply the timezone to overrides as they are stored in UTC
|
|
52
|
-
// and must be converted to timestamps in the timezone before processing
|
|
53
|
-
closeIntervals = reduce(function (memo, override) {
|
|
54
|
-
var mIntervalStart = moment.tz(override.start, timezone);
|
|
55
|
-
var mIntervalEnd = moment.tz(override.end, timezone);
|
|
56
|
-
var isInPast = mIntervalEnd.isBefore(mStart);
|
|
57
|
-
var isInFuture = mIntervalStart.isAfter(mEnd);
|
|
16
|
+
function* serviceIntervalsGenerator(props) {
|
|
17
|
+
const {
|
|
18
|
+
end,
|
|
19
|
+
serviceHours,
|
|
20
|
+
start
|
|
21
|
+
} = props;
|
|
22
|
+
const {
|
|
23
|
+
timezone
|
|
24
|
+
} = serviceHours;
|
|
25
|
+
const hasValidStartAndEnd = end > start && start < end;
|
|
26
|
+
if (!hasValidStartAndEnd) return [];
|
|
27
|
+
const mStart = _momentTimezone.default.tz(start, timezone);
|
|
28
|
+
const mEnd = _momentTimezone.default.tz(end, timezone);
|
|
29
|
+
const mStartValid = mStart.isValid();
|
|
30
|
+
const mEndValid = mEnd.isValid();
|
|
31
|
+
if (!mStartValid || !mEndValid) return [];
|
|
32
|
+
const {
|
|
33
|
+
hours
|
|
34
|
+
} = serviceHours;
|
|
35
|
+
const rangeInterval = [start, end];
|
|
36
|
+
const closeOverrideHours = (0, _fp.filter)({
|
|
37
|
+
behaviour: _serviceHours.Behaviours.Close,
|
|
38
|
+
type: _serviceHours.Types.Override
|
|
39
|
+
}, hours);
|
|
40
|
+
const defaultHours = (0, _fp.filter)({
|
|
41
|
+
type: _serviceHours.Types.Default
|
|
42
|
+
}, hours);
|
|
43
|
+
const openOverrideHours = (0, _fp.filter)({
|
|
44
|
+
behaviour: _serviceHours.Behaviours.Open,
|
|
45
|
+
type: _serviceHours.Types.Override
|
|
46
|
+
}, hours);
|
|
58
47
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return memo;
|
|
67
|
-
}, [], closeOverrideHours);
|
|
68
|
-
openIntervals = reduce(function (memo, override) {
|
|
69
|
-
var mIntervalStart = moment.tz(override.start, timezone);
|
|
70
|
-
var mIntervalEnd = moment.tz(override.end, timezone);
|
|
71
|
-
var isInPast = mIntervalEnd.isBefore(mStart);
|
|
72
|
-
var isInFuture = mIntervalStart.isAfter(mEnd);
|
|
48
|
+
// NOTE: we must apply the timezone to overrides as they are stored in UTC
|
|
49
|
+
// and must be converted to timestamps in the timezone before processing
|
|
50
|
+
const closeIntervals = (0, _fp.reduce)((memo, override) => {
|
|
51
|
+
const mIntervalStart = _momentTimezone.default.tz(override.start, timezone);
|
|
52
|
+
const mIntervalEnd = _momentTimezone.default.tz(override.end, timezone);
|
|
53
|
+
const isInPast = mIntervalEnd.isBefore(mStart);
|
|
54
|
+
const isInFuture = mIntervalStart.isAfter(mEnd);
|
|
73
55
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
// start of the week so are simply offsets
|
|
89
|
-
var endOffset = hour.end,
|
|
90
|
-
startOffset = hour.start;
|
|
91
|
-
var hourStart = weekStart + startOffset;
|
|
92
|
-
var hourEnd = weekStart + endOffset;
|
|
93
|
-
var interval = [hourStart, hourEnd];
|
|
94
|
-
var isIntervalIntersectingRangeEnd = intervalOnlyIntersectsEnd(interval, rangeInterval);
|
|
95
|
-
var isIntervalIntersectingRangeStart = intervalOnlyIntersectsStart(interval, rangeInterval);
|
|
96
|
-
var isIntervalInsideRange = intervalWithin(interval, rangeInterval);
|
|
97
|
-
var isRangeInsideInterval = intervalWithin(rangeInterval, interval);
|
|
98
|
-
var shouldSkip = !isIntervalInsideRange && !isRangeInsideInterval && !isIntervalIntersectingRangeStart && !isIntervalIntersectingRangeEnd;
|
|
99
|
-
if (shouldSkip) return;
|
|
100
|
-
var nextStart = isRangeInsideInterval || isIntervalIntersectingRangeStart ? start : hourStart;
|
|
101
|
-
var nextEnd = isRangeInsideInterval || isIntervalIntersectingRangeEnd ? end : hourEnd;
|
|
102
|
-
defaultIntervals.push([nextStart, nextEnd]);
|
|
103
|
-
}, defaultHours);
|
|
104
|
-
weekStart = weekStart + Durations.Week;
|
|
105
|
-
}
|
|
56
|
+
// NOTE: filter out any interval not relevant
|
|
57
|
+
if (isInPast || isInFuture) {
|
|
58
|
+
return memo;
|
|
59
|
+
}
|
|
60
|
+
const start = (0, _helpers.convertToTimezone)(override.start, timezone);
|
|
61
|
+
const end = (0, _helpers.convertToTimezone)(override.end, timezone);
|
|
62
|
+
memo.push([start, end]);
|
|
63
|
+
return memo;
|
|
64
|
+
}, [], closeOverrideHours);
|
|
65
|
+
const openIntervals = (0, _fp.reduce)((memo, override) => {
|
|
66
|
+
const mIntervalStart = _momentTimezone.default.tz(override.start, timezone);
|
|
67
|
+
const mIntervalEnd = _momentTimezone.default.tz(override.end, timezone);
|
|
68
|
+
const isInPast = mIntervalEnd.isBefore(mStart);
|
|
69
|
+
const isInFuture = mIntervalStart.isAfter(mEnd);
|
|
106
70
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return interval[0] >= rangeInterval[0] || interval[0] <= rangeInterval[1];
|
|
111
|
-
}), map(function (interval) {
|
|
112
|
-
var intervalCoversRange = intervalCovers(interval, rangeInterval);
|
|
113
|
-
var intervalIntersectsRangeEnd = intervalOnlyIntersectsEnd(interval, rangeInterval);
|
|
114
|
-
var intervalIntersectsRangeStart = intervalOnlyIntersectsStart(interval, rangeInterval);
|
|
115
|
-
var intervalStart = intervalIntersectsRangeStart ? rangeInterval[0] : interval[0];
|
|
116
|
-
var intervalEnd = intervalIntersectsRangeEnd ? rangeInterval[1] : interval[1];
|
|
117
|
-
return intervalCoversRange ? rangeInterval : [intervalStart, intervalEnd];
|
|
118
|
-
})); // NOTE: for simplicity we calculate all default service intervals and then
|
|
119
|
-
// apply the open and closed overrides, we can't do this as we iterate
|
|
120
|
-
// through the weeks as open and close overrides can potentially intersect
|
|
121
|
-
// across weeks
|
|
122
|
-
rangeOpenIntervals = getOverrideIntervalsForRange(openIntervals);
|
|
123
|
-
rangeCloseIntervals = getOverrideIntervalsForRange(closeIntervals);
|
|
124
|
-
mergedIntervals = mergeIntervals([].concat(defaultIntervals, _toConsumableArray(rangeOpenIntervals)));
|
|
125
|
-
serviceIntervals = splitIntervals(mergedIntervals, rangeCloseIntervals);
|
|
126
|
-
_iterator = _createForOfIteratorHelper(serviceIntervals);
|
|
127
|
-
_context.prev = 3;
|
|
128
|
-
_iterator.s();
|
|
129
|
-
case 4:
|
|
130
|
-
if ((_step = _iterator.n()).done) {
|
|
131
|
-
_context.next = 6;
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
interval = _step.value;
|
|
135
|
-
_context.next = 5;
|
|
136
|
-
return interval;
|
|
137
|
-
case 5:
|
|
138
|
-
_context.next = 4;
|
|
139
|
-
break;
|
|
140
|
-
case 6:
|
|
141
|
-
_context.next = 8;
|
|
142
|
-
break;
|
|
143
|
-
case 7:
|
|
144
|
-
_context.prev = 7;
|
|
145
|
-
_t = _context["catch"](3);
|
|
146
|
-
_iterator.e(_t);
|
|
147
|
-
case 8:
|
|
148
|
-
_context.prev = 8;
|
|
149
|
-
_iterator.f();
|
|
150
|
-
return _context.finish(8);
|
|
151
|
-
case 9:
|
|
152
|
-
case "end":
|
|
153
|
-
return _context.stop();
|
|
71
|
+
// NOTE: filter out any interval not relevant
|
|
72
|
+
if (isInPast || isInFuture) {
|
|
73
|
+
return memo;
|
|
154
74
|
}
|
|
155
|
-
|
|
75
|
+
const start = (0, _helpers.convertToTimezone)(override.start, timezone);
|
|
76
|
+
const end = (0, _helpers.convertToTimezone)(override.end, timezone);
|
|
77
|
+
memo.push([start, end]);
|
|
78
|
+
return memo;
|
|
79
|
+
}, [], openOverrideHours);
|
|
80
|
+
let weekStart = mStart.startOf(_scheduling.Unit.Week).valueOf();
|
|
81
|
+
const defaultIntervals = [];
|
|
82
|
+
while (weekStart < end) {
|
|
83
|
+
(0, _fp.forEach)(hour => {
|
|
84
|
+
// NOTE: hour start and end values are the number of minutes from the
|
|
85
|
+
// start of the week so are simply offsets
|
|
86
|
+
const {
|
|
87
|
+
end: endOffset,
|
|
88
|
+
start: startOffset
|
|
89
|
+
} = hour;
|
|
90
|
+
const hourStart = weekStart + startOffset;
|
|
91
|
+
const hourEnd = weekStart + endOffset;
|
|
92
|
+
const interval = [hourStart, hourEnd];
|
|
93
|
+
const isIntervalIntersectingRangeEnd = (0, _helpers.intervalOnlyIntersectsEnd)(interval, rangeInterval);
|
|
94
|
+
const isIntervalIntersectingRangeStart = (0, _helpers.intervalOnlyIntersectsStart)(interval, rangeInterval);
|
|
95
|
+
const isIntervalInsideRange = (0, _helpers.intervalWithin)(interval, rangeInterval);
|
|
96
|
+
const isRangeInsideInterval = (0, _helpers.intervalWithin)(rangeInterval, interval);
|
|
97
|
+
const shouldSkip = !isIntervalInsideRange && !isRangeInsideInterval && !isIntervalIntersectingRangeStart && !isIntervalIntersectingRangeEnd;
|
|
98
|
+
if (shouldSkip) return;
|
|
99
|
+
const nextStart = isRangeInsideInterval || isIntervalIntersectingRangeStart ? start : hourStart;
|
|
100
|
+
const nextEnd = isRangeInsideInterval || isIntervalIntersectingRangeEnd ? end : hourEnd;
|
|
101
|
+
defaultIntervals.push([nextStart, nextEnd]);
|
|
102
|
+
}, defaultHours);
|
|
103
|
+
weekStart = weekStart + _serviceHours.Durations.Week;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// NOTE: only include intervals which intersect our range and then map to
|
|
107
|
+
// ensure the intervals conform to the range interval
|
|
108
|
+
const getOverrideIntervalsForRange = (0, _fp.flow)((0, _fp.filter)(interval => interval[0] >= rangeInterval[0] || interval[0] <= rangeInterval[1]), (0, _fp.map)(interval => {
|
|
109
|
+
const intervalCoversRange = (0, _helpers.intervalCovers)(interval, rangeInterval);
|
|
110
|
+
const intervalIntersectsRangeEnd = (0, _helpers.intervalOnlyIntersectsEnd)(interval, rangeInterval);
|
|
111
|
+
const intervalIntersectsRangeStart = (0, _helpers.intervalOnlyIntersectsStart)(interval, rangeInterval);
|
|
112
|
+
const intervalStart = intervalIntersectsRangeStart ? rangeInterval[0] : interval[0];
|
|
113
|
+
const intervalEnd = intervalIntersectsRangeEnd ? rangeInterval[1] : interval[1];
|
|
114
|
+
return intervalCoversRange ? rangeInterval : [intervalStart, intervalEnd];
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
// NOTE: for simplicity we calculate all default service intervals and then
|
|
118
|
+
// apply the open and closed overrides, we can't do this as we iterate
|
|
119
|
+
// through the weeks as open and close overrides can potentially intersect
|
|
120
|
+
// across weeks
|
|
121
|
+
const rangeOpenIntervals = getOverrideIntervalsForRange(openIntervals);
|
|
122
|
+
const rangeCloseIntervals = getOverrideIntervalsForRange(closeIntervals);
|
|
123
|
+
const mergedIntervals = (0, _helpers.mergeIntervals)([...defaultIntervals, ...rangeOpenIntervals]);
|
|
124
|
+
const serviceIntervals = (0, _helpers.splitIntervals)(mergedIntervals, rangeCloseIntervals);
|
|
125
|
+
for (let interval of serviceIntervals) yield interval;
|
|
156
126
|
}
|
|
157
127
|
//# sourceMappingURL=serviceIntervalsGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceIntervalsGenerator.js","names":["serviceIntervalsGenerator","_createForOfIteratorHelper","r","e","t","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","from","test","filter","flow","forEach","map","reduce","moment","Behaviours","Durations","Types","Unit","convertToTimezone","intervalCovers","intervalOnlyIntersectsEnd","intervalOnlyIntersectsStart","intervalWithin","mergeIntervals","splitIntervals","props","end","serviceHours","start","timezone","hasValidStartAndEnd","mStart","mEnd","mStartValid","mEndValid","hours","rangeInterval","closeOverrideHours","defaultHours","openOverrideHours","closeIntervals","openIntervals","weekStart","defaultIntervals","getOverrideIntervalsForRange","rangeOpenIntervals","rangeCloseIntervals","mergedIntervals","serviceIntervals","_iterator","_step","interval","_t","_regeneratorRuntime","wrap","_context","prev","abrupt","tz","isValid","behaviour","Close","type","Override","Default","Open","memo","override","mIntervalStart","mIntervalEnd","isInPast","isBefore","isInFuture","isAfter","push","startOf","Week","valueOf","hour","endOffset","startOffset","hourStart","hourEnd","isIntervalIntersectingRangeEnd","isIntervalIntersectingRangeStart","isIntervalInsideRange","isRangeInsideInterval","shouldSkip","nextStart","nextEnd","intervalCoversRange","intervalIntersectsRangeEnd","intervalIntersectsRangeStart","intervalStart","intervalEnd","concat","_toConsumableArray","finish","stop","_marked"],"sources":["../../../src/scheduling/generators/serviceIntervalsGenerator.ts"],"sourcesContent":["import { filter, flow, forEach, map, reduce } from 'lodash/fp'\nimport moment from 'moment-timezone'\n\nimport {\n Behaviours,\n Durations,\n HoursSchema,\n Schema as ServiceHoursSchema,\n Types,\n} from '../../service-hours'\nimport { Interval, Unit } from '../scheduling.types'\nimport {\n convertToTimezone,\n intervalCovers,\n intervalOnlyIntersectsEnd,\n intervalOnlyIntersectsStart,\n intervalWithin,\n mergeIntervals,\n splitIntervals,\n} from '../helpers'\n\ninterface ServiceIntervalsGenerator {\n readonly end: number\n readonly serviceHours: ServiceHoursSchema\n readonly start: number\n}\n\n/**\n * Generates service intervals between start and end range for service hours\n */\nexport function* serviceIntervalsGenerator(props: ServiceIntervalsGenerator) {\n const { end, serviceHours, start } = props\n const { timezone } = serviceHours\n\n const hasValidStartAndEnd = end > start && start < end\n\n if (!hasValidStartAndEnd) return []\n\n const mStart = moment.tz(start, timezone)\n const mEnd = moment.tz(end, timezone)\n const mStartValid = mStart.isValid()\n const mEndValid = mEnd.isValid()\n\n if (!mStartValid || !mEndValid) return []\n\n const { hours } = serviceHours\n const rangeInterval = [start, end]\n\n const closeOverrideHours: HoursSchema[] = filter(\n { behaviour: Behaviours.Close, type: Types.Override },\n hours\n )\n const defaultHours: HoursSchema[] = filter({ type: Types.Default }, hours)\n const openOverrideHours: HoursSchema[] = filter(\n { behaviour: Behaviours.Open, type: Types.Override },\n hours\n )\n\n // NOTE: we must apply the timezone to overrides as they are stored in UTC\n // and must be converted to timestamps in the timezone before processing\n const closeIntervals = reduce(\n (memo, override) => {\n const mIntervalStart = moment.tz(override.start, timezone)\n const mIntervalEnd = moment.tz(override.end, timezone)\n\n const isInPast = mIntervalEnd.isBefore(mStart)\n const isInFuture = mIntervalStart.isAfter(mEnd)\n\n // NOTE: filter out any interval not relevant\n if (isInPast || isInFuture) {\n return memo\n }\n\n const start = convertToTimezone(override.start, timezone)\n const end = convertToTimezone(override.end, timezone)\n\n memo.push([start, end])\n\n return memo\n },\n [],\n closeOverrideHours\n )\n\n const openIntervals = reduce(\n (memo, override) => {\n const mIntervalStart = moment.tz(override.start, timezone)\n const mIntervalEnd = moment.tz(override.end, timezone)\n\n const isInPast = mIntervalEnd.isBefore(mStart)\n const isInFuture = mIntervalStart.isAfter(mEnd)\n\n // NOTE: filter out any interval not relevant\n if (isInPast || isInFuture) {\n return memo\n }\n\n const start = convertToTimezone(override.start, timezone)\n const end = convertToTimezone(override.end, timezone)\n\n memo.push([start, end])\n\n return memo\n },\n [],\n openOverrideHours\n )\n\n let weekStart = mStart.startOf(Unit.Week).valueOf()\n\n const defaultIntervals = []\n\n while (weekStart < end) {\n forEach(hour => {\n // NOTE: hour start and end values are the number of minutes from the\n // start of the week so are simply offsets\n const { end: endOffset, start: startOffset } = hour\n const hourStart = weekStart + startOffset\n const hourEnd = weekStart + endOffset\n\n const interval = [hourStart, hourEnd]\n\n const isIntervalIntersectingRangeEnd = intervalOnlyIntersectsEnd(\n interval,\n rangeInterval\n )\n const isIntervalIntersectingRangeStart = intervalOnlyIntersectsStart(\n interval,\n rangeInterval\n )\n const isIntervalInsideRange = intervalWithin(interval, rangeInterval)\n const isRangeInsideInterval = intervalWithin(rangeInterval, interval)\n\n const shouldSkip =\n !isIntervalInsideRange &&\n !isRangeInsideInterval &&\n !isIntervalIntersectingRangeStart &&\n !isIntervalIntersectingRangeEnd\n\n if (shouldSkip) return\n\n const nextStart =\n isRangeInsideInterval || isIntervalIntersectingRangeStart\n ? start\n : hourStart\n\n const nextEnd =\n isRangeInsideInterval || isIntervalIntersectingRangeEnd ? end : hourEnd\n\n defaultIntervals.push([nextStart, nextEnd])\n }, defaultHours)\n\n weekStart = weekStart + Durations.Week\n }\n\n // NOTE: only include intervals which intersect our range and then map to\n // ensure the intervals conform to the range interval\n const getOverrideIntervalsForRange = flow(\n filter(\n (interval: Interval): boolean =>\n interval[0] >= rangeInterval[0] || interval[0] <= rangeInterval[1]\n ),\n map(\n (interval: Interval): Interval => {\n const intervalCoversRange = intervalCovers(interval, rangeInterval)\n const intervalIntersectsRangeEnd = intervalOnlyIntersectsEnd(\n interval,\n rangeInterval\n )\n const intervalIntersectsRangeStart = intervalOnlyIntersectsStart(\n interval,\n rangeInterval\n )\n\n const intervalStart = intervalIntersectsRangeStart\n ? rangeInterval[0]\n : interval[0]\n const intervalEnd = intervalIntersectsRangeEnd\n ? rangeInterval[1]\n : interval[1]\n\n return intervalCoversRange\n ? rangeInterval\n : [intervalStart, intervalEnd]\n }\n )\n )\n\n // NOTE: for simplicity we calculate all default service intervals and then\n // apply the open and closed overrides, we can't do this as we iterate\n // through the weeks as open and close overrides can potentially intersect\n // across weeks\n const rangeOpenIntervals = getOverrideIntervalsForRange(openIntervals)\n const rangeCloseIntervals = getOverrideIntervalsForRange(closeIntervals)\n\n const mergedIntervals = mergeIntervals([\n ...defaultIntervals,\n ...rangeOpenIntervals,\n ])\n const serviceIntervals = splitIntervals(mergedIntervals, rangeCloseIntervals)\n\n for (let interval of serviceIntervals) yield interval\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"serviceIntervalsGenerator.js","names":["_fp","require","_momentTimezone","_interopRequireDefault","_serviceHours","_scheduling","_helpers","serviceIntervalsGenerator","props","end","serviceHours","start","timezone","hasValidStartAndEnd","mStart","moment","tz","mEnd","mStartValid","isValid","mEndValid","hours","rangeInterval","closeOverrideHours","filter","behaviour","Behaviours","Close","type","Types","Override","defaultHours","Default","openOverrideHours","Open","closeIntervals","reduce","memo","override","mIntervalStart","mIntervalEnd","isInPast","isBefore","isInFuture","isAfter","convertToTimezone","push","openIntervals","weekStart","startOf","Unit","Week","valueOf","defaultIntervals","forEach","hour","endOffset","startOffset","hourStart","hourEnd","interval","isIntervalIntersectingRangeEnd","intervalOnlyIntersectsEnd","isIntervalIntersectingRangeStart","intervalOnlyIntersectsStart","isIntervalInsideRange","intervalWithin","isRangeInsideInterval","shouldSkip","nextStart","nextEnd","Durations","getOverrideIntervalsForRange","flow","map","intervalCoversRange","intervalCovers","intervalIntersectsRangeEnd","intervalIntersectsRangeStart","intervalStart","intervalEnd","rangeOpenIntervals","rangeCloseIntervals","mergedIntervals","mergeIntervals","serviceIntervals","splitIntervals"],"sources":["../../../src/scheduling/generators/serviceIntervalsGenerator.ts"],"sourcesContent":["import { filter, flow, forEach, map, reduce } from 'lodash/fp'\r\nimport moment from 'moment-timezone'\r\n\r\nimport {\r\n Behaviours,\r\n Durations,\r\n HoursSchema,\r\n Schema as ServiceHoursSchema,\r\n Types,\r\n} from '../../service-hours'\r\nimport { Interval, Unit } from '../scheduling.types'\r\nimport {\r\n convertToTimezone,\r\n intervalCovers,\r\n intervalOnlyIntersectsEnd,\r\n intervalOnlyIntersectsStart,\r\n intervalWithin,\r\n mergeIntervals,\r\n splitIntervals,\r\n} from '../helpers'\r\n\r\ninterface ServiceIntervalsGenerator {\r\n readonly end: number\r\n readonly serviceHours: ServiceHoursSchema\r\n readonly start: number\r\n}\r\n\r\n/**\r\n * Generates service intervals between start and end range for service hours\r\n */\r\nexport function* serviceIntervalsGenerator(props: ServiceIntervalsGenerator) {\r\n const { end, serviceHours, start } = props\r\n const { timezone } = serviceHours\r\n\r\n const hasValidStartAndEnd = end > start && start < end\r\n\r\n if (!hasValidStartAndEnd) return []\r\n\r\n const mStart = moment.tz(start, timezone)\r\n const mEnd = moment.tz(end, timezone)\r\n const mStartValid = mStart.isValid()\r\n const mEndValid = mEnd.isValid()\r\n\r\n if (!mStartValid || !mEndValid) return []\r\n\r\n const { hours } = serviceHours\r\n const rangeInterval = [start, end]\r\n\r\n const closeOverrideHours: HoursSchema[] = filter(\r\n { behaviour: Behaviours.Close, type: Types.Override },\r\n hours\r\n )\r\n const defaultHours: HoursSchema[] = filter({ type: Types.Default }, hours)\r\n const openOverrideHours: HoursSchema[] = filter(\r\n { behaviour: Behaviours.Open, type: Types.Override },\r\n hours\r\n )\r\n\r\n // NOTE: we must apply the timezone to overrides as they are stored in UTC\r\n // and must be converted to timestamps in the timezone before processing\r\n const closeIntervals = reduce(\r\n (memo, override) => {\r\n const mIntervalStart = moment.tz(override.start, timezone)\r\n const mIntervalEnd = moment.tz(override.end, timezone)\r\n\r\n const isInPast = mIntervalEnd.isBefore(mStart)\r\n const isInFuture = mIntervalStart.isAfter(mEnd)\r\n\r\n // NOTE: filter out any interval not relevant\r\n if (isInPast || isInFuture) {\r\n return memo\r\n }\r\n\r\n const start = convertToTimezone(override.start, timezone)\r\n const end = convertToTimezone(override.end, timezone)\r\n\r\n memo.push([start, end])\r\n\r\n return memo\r\n },\r\n [],\r\n closeOverrideHours\r\n )\r\n\r\n const openIntervals = reduce(\r\n (memo, override) => {\r\n const mIntervalStart = moment.tz(override.start, timezone)\r\n const mIntervalEnd = moment.tz(override.end, timezone)\r\n\r\n const isInPast = mIntervalEnd.isBefore(mStart)\r\n const isInFuture = mIntervalStart.isAfter(mEnd)\r\n\r\n // NOTE: filter out any interval not relevant\r\n if (isInPast || isInFuture) {\r\n return memo\r\n }\r\n\r\n const start = convertToTimezone(override.start, timezone)\r\n const end = convertToTimezone(override.end, timezone)\r\n\r\n memo.push([start, end])\r\n\r\n return memo\r\n },\r\n [],\r\n openOverrideHours\r\n )\r\n\r\n let weekStart = mStart.startOf(Unit.Week).valueOf()\r\n\r\n const defaultIntervals = []\r\n\r\n while (weekStart < end) {\r\n forEach(hour => {\r\n // NOTE: hour start and end values are the number of minutes from the\r\n // start of the week so are simply offsets\r\n const { end: endOffset, start: startOffset } = hour\r\n const hourStart = weekStart + startOffset\r\n const hourEnd = weekStart + endOffset\r\n\r\n const interval = [hourStart, hourEnd]\r\n\r\n const isIntervalIntersectingRangeEnd = intervalOnlyIntersectsEnd(\r\n interval,\r\n rangeInterval\r\n )\r\n const isIntervalIntersectingRangeStart = intervalOnlyIntersectsStart(\r\n interval,\r\n rangeInterval\r\n )\r\n const isIntervalInsideRange = intervalWithin(interval, rangeInterval)\r\n const isRangeInsideInterval = intervalWithin(rangeInterval, interval)\r\n\r\n const shouldSkip =\r\n !isIntervalInsideRange &&\r\n !isRangeInsideInterval &&\r\n !isIntervalIntersectingRangeStart &&\r\n !isIntervalIntersectingRangeEnd\r\n\r\n if (shouldSkip) return\r\n\r\n const nextStart =\r\n isRangeInsideInterval || isIntervalIntersectingRangeStart\r\n ? start\r\n : hourStart\r\n\r\n const nextEnd =\r\n isRangeInsideInterval || isIntervalIntersectingRangeEnd ? end : hourEnd\r\n\r\n defaultIntervals.push([nextStart, nextEnd])\r\n }, defaultHours)\r\n\r\n weekStart = weekStart + Durations.Week\r\n }\r\n\r\n // NOTE: only include intervals which intersect our range and then map to\r\n // ensure the intervals conform to the range interval\r\n const getOverrideIntervalsForRange = flow(\r\n filter(\r\n (interval: Interval): boolean =>\r\n interval[0] >= rangeInterval[0] || interval[0] <= rangeInterval[1]\r\n ),\r\n map(\r\n (interval: Interval): Interval => {\r\n const intervalCoversRange = intervalCovers(interval, rangeInterval)\r\n const intervalIntersectsRangeEnd = intervalOnlyIntersectsEnd(\r\n interval,\r\n rangeInterval\r\n )\r\n const intervalIntersectsRangeStart = intervalOnlyIntersectsStart(\r\n interval,\r\n rangeInterval\r\n )\r\n\r\n const intervalStart = intervalIntersectsRangeStart\r\n ? rangeInterval[0]\r\n : interval[0]\r\n const intervalEnd = intervalIntersectsRangeEnd\r\n ? rangeInterval[1]\r\n : interval[1]\r\n\r\n return intervalCoversRange\r\n ? rangeInterval\r\n : [intervalStart, intervalEnd]\r\n }\r\n )\r\n )\r\n\r\n // NOTE: for simplicity we calculate all default service intervals and then\r\n // apply the open and closed overrides, we can't do this as we iterate\r\n // through the weeks as open and close overrides can potentially intersect\r\n // across weeks\r\n const rangeOpenIntervals = getOverrideIntervalsForRange(openIntervals)\r\n const rangeCloseIntervals = getOverrideIntervalsForRange(closeIntervals)\r\n\r\n const mergedIntervals = mergeIntervals([\r\n ...defaultIntervals,\r\n ...rangeOpenIntervals,\r\n ])\r\n const serviceIntervals = splitIntervals(mergedIntervals, rangeCloseIntervals)\r\n\r\n for (let interval of serviceIntervals) yield interval\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
var DATE_FORMAT = 'YYYY-MM-DD HH:mm';
|
|
1
|
+
"use strict";
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.convertToTimezone = convertToTimezone;
|
|
8
|
+
var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
|
|
9
|
+
const DATE_FORMAT = 'YYYY-MM-DD HH:mm';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Accepts a timestamp and returns the same timestamp but in the timezone
|
|
13
|
+
* provided
|
|
14
|
+
*
|
|
15
|
+
* convertToTimezone(1561248000000, 'Australia/Melbourne') // 2019-06-23T00:00:00+00:00
|
|
16
|
+
* returns 1561212000000 // 2019-06-23T00:00:00+10:00
|
|
10
17
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
function convertToTimezone(timestamp, timezone) {
|
|
19
|
+
const datestring = _momentTimezone.default.utc(timestamp).format(DATE_FORMAT);
|
|
20
|
+
const mTimestamp = _momentTimezone.default.tz(datestring, timezone).valueOf();
|
|
14
21
|
return mTimestamp;
|
|
15
22
|
}
|
|
16
23
|
//# sourceMappingURL=convertToTimezone.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToTimezone.js","names":["
|
|
1
|
+
{"version":3,"file":"convertToTimezone.js","names":["_momentTimezone","_interopRequireDefault","require","DATE_FORMAT","convertToTimezone","timestamp","timezone","datestring","moment","utc","format","mTimestamp","tz","valueOf"],"sources":["../../../src/scheduling/helpers/convertToTimezone.ts"],"sourcesContent":["import moment from 'moment-timezone'\r\n\r\nconst DATE_FORMAT = 'YYYY-MM-DD HH:mm'\r\n\r\n/**\r\n * Accepts a timestamp and returns the same timestamp but in the timezone\r\n * provided\r\n *\r\n * convertToTimezone(1561248000000, 'Australia/Melbourne') // 2019-06-23T00:00:00+00:00\r\n * returns 1561212000000 // 2019-06-23T00:00:00+10:00\r\n */\r\nexport function convertToTimezone(timestamp: number, timezone: string): moment {\r\n const datestring: string = moment.utc(timestamp).format(DATE_FORMAT)\r\n const mTimestamp: number = moment.tz(datestring, timezone).valueOf()\r\n return mTimestamp\r\n}\r\n"],"mappings":";;;;;;;AAAA,IAAAA,eAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,MAAMC,WAAW,GAAG,kBAAkB;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,iBAAiBA,CAACC,SAAiB,EAAEC,QAAgB,EAAU;EAC7E,MAAMC,UAAkB,GAAGC,uBAAM,CAACC,GAAG,CAACJ,SAAS,CAAC,CAACK,MAAM,CAACP,WAAW,CAAC;EACpE,MAAMQ,UAAkB,GAAGH,uBAAM,CAACI,EAAE,CAACL,UAAU,EAAED,QAAQ,CAAC,CAACO,OAAO,CAAC,CAAC;EACpE,OAAOF,UAAU;AACnB","ignoreList":[]}
|
|
@@ -1,100 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
3
|
-
var _marked = /*#__PURE__*/_regeneratorRuntime.mark(generateNonRepeatingSchedule);
|
|
4
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
5
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
6
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
7
|
-
import { isEmpty, first, last } from 'lodash/fp';
|
|
8
|
-
import { hasValidStartAndEnd } from '.';
|
|
9
|
-
import { IntervalTypes } from '../scheduling.types';
|
|
10
|
-
import { occurrenceIntervalsGenerator, serviceIntervalsGenerator } from '../generators';
|
|
1
|
+
"use strict";
|
|
11
2
|
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.generateNonRepeatingSchedule = generateNonRepeatingSchedule;
|
|
7
|
+
var _fp = require("lodash/fp");
|
|
8
|
+
var _ = require(".");
|
|
9
|
+
var _scheduling = require("../scheduling.types");
|
|
10
|
+
var _generators = require("../generators");
|
|
11
|
+
/**
|
|
12
|
+
* Generates non repeating schedule service and occurrence intervals
|
|
14
13
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
timezone: timezone
|
|
61
|
-
});
|
|
62
|
-
_iterator = _createForOfIteratorHelper(occurrenceIntervalsSequence);
|
|
63
|
-
_context.prev = 4;
|
|
64
|
-
_iterator.s();
|
|
65
|
-
case 5:
|
|
66
|
-
if ((_step = _iterator.n()).done) {
|
|
67
|
-
_context.next = 7;
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
occurrenceInterval = _step.value;
|
|
71
|
-
_context.next = 6;
|
|
72
|
-
return {
|
|
73
|
-
interval: occurrenceInterval,
|
|
74
|
-
type: IntervalTypes.Occurrence
|
|
75
|
-
};
|
|
76
|
-
case 6:
|
|
77
|
-
_context.next = 5;
|
|
78
|
-
break;
|
|
79
|
-
case 7:
|
|
80
|
-
_context.next = 9;
|
|
81
|
-
break;
|
|
82
|
-
case 8:
|
|
83
|
-
_context.prev = 8;
|
|
84
|
-
_t = _context["catch"](4);
|
|
85
|
-
_iterator.e(_t);
|
|
86
|
-
case 9:
|
|
87
|
-
_context.prev = 9;
|
|
88
|
-
_iterator.f();
|
|
89
|
-
return _context.finish(9);
|
|
90
|
-
case 10:
|
|
91
|
-
_i++;
|
|
92
|
-
_context.next = 2;
|
|
93
|
-
break;
|
|
94
|
-
case 11:
|
|
95
|
-
case "end":
|
|
96
|
-
return _context.stop();
|
|
14
|
+
function* generateNonRepeatingSchedule(props) {
|
|
15
|
+
const {
|
|
16
|
+
end,
|
|
17
|
+
serviceHours,
|
|
18
|
+
start,
|
|
19
|
+
strategy
|
|
20
|
+
} = props;
|
|
21
|
+
const isStartAndEndValid = (0, _.hasValidStartAndEnd)({
|
|
22
|
+
end,
|
|
23
|
+
start
|
|
24
|
+
});
|
|
25
|
+
if (!isStartAndEndValid) return [];
|
|
26
|
+
const serviceIntervalSequence = (0, _generators.serviceIntervalsGenerator)({
|
|
27
|
+
end,
|
|
28
|
+
serviceHours,
|
|
29
|
+
start
|
|
30
|
+
});
|
|
31
|
+
const {
|
|
32
|
+
hours,
|
|
33
|
+
timezone
|
|
34
|
+
} = serviceHours;
|
|
35
|
+
const hasServiceHours = !(0, _fp.isEmpty)(hours);
|
|
36
|
+
const intervals = [...serviceIntervalSequence];
|
|
37
|
+
|
|
38
|
+
// NOTE: when non repeating and has service hours the service interval is
|
|
39
|
+
// from the first and last service interval otherwise from the start and end
|
|
40
|
+
const serviceIntervals = !hasServiceHours ? [[start, end]] : !(0, _fp.isEmpty)(intervals) ? [[(0, _fp.first)(intervals)[0], (0, _fp.last)(intervals)[1]]] : [];
|
|
41
|
+
for (const serviceInterval of serviceIntervals) {
|
|
42
|
+
yield {
|
|
43
|
+
interval: serviceInterval,
|
|
44
|
+
type: _scheduling.IntervalTypes.Service
|
|
45
|
+
};
|
|
46
|
+
const occurrenceIntervalsSequence = (0, _generators.occurrenceIntervalsGenerator)({
|
|
47
|
+
// NOTE: as we only have one interval we should always set isInitial to
|
|
48
|
+
// true
|
|
49
|
+
isInitial: true,
|
|
50
|
+
serviceInterval,
|
|
51
|
+
strategy,
|
|
52
|
+
timezone
|
|
53
|
+
});
|
|
54
|
+
for (const occurrenceInterval of occurrenceIntervalsSequence) {
|
|
55
|
+
yield {
|
|
56
|
+
interval: occurrenceInterval,
|
|
57
|
+
type: _scheduling.IntervalTypes.Occurrence
|
|
58
|
+
};
|
|
97
59
|
}
|
|
98
|
-
}
|
|
60
|
+
}
|
|
99
61
|
}
|
|
100
62
|
//# sourceMappingURL=generateNonRepeatingSchedule.js.map
|