@royalschedule/maps 4.0.32 → 4.0.33
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/dist/Additio/from/courses.js.map +1 -1
- package/dist/Additio/from/events.js.map +1 -1
- package/dist/Additio/from/groups.js.map +1 -1
- package/dist/Additio/from/index.js.map +1 -1
- package/dist/Additio/from/locations.js.map +1 -1
- package/dist/Additio/from/persons.js.map +1 -1
- package/dist/Additio/from/schedules.d.ts +1 -0
- package/dist/Additio/from/schedules.js +2 -4
- package/dist/Additio/from/schedules.js.map +1 -1
- package/dist/Additio/from/teachers.js.map +1 -1
- package/dist/Additio/to/index.d.ts +2 -0
- package/dist/Additio/to/schedules.js +2 -4
- package/dist/Additio/to/schedules.js.map +1 -1
- package/dist/Admentum/from/courses.js.map +1 -1
- package/dist/Admentum/from/events.js.map +1 -1
- package/dist/Admentum/from/groups.js.map +1 -1
- package/dist/Admentum/from/index.js.map +1 -1
- package/dist/Admentum/from/locations.js.map +1 -1
- package/dist/Admentum/from/persons.js.map +1 -1
- package/dist/Admentum/from/schedules.d.ts +1 -0
- package/dist/Admentum/from/schedules.js +3 -6
- package/dist/Admentum/from/schedules.js.map +1 -1
- package/dist/Admentum/from/teachers.js.map +1 -1
- package/dist/Admentum/to/index.d.ts +1 -0
- package/dist/Admentum/to/schedules.js +4 -7
- package/dist/Admentum/to/schedules.js.map +1 -1
- package/dist/Excel/index.d.ts +4 -3
- package/dist/Excel/v1/from/index.js +1 -1
- package/dist/Excel/v1/from/index.js.map +1 -1
- package/dist/Excel/v1/index.d.ts +1 -0
- package/dist/Excel/v2/from/index.js +45 -54
- package/dist/Excel/v2/from/index.js.map +1 -1
- package/dist/Excel/v2/index.d.ts +1 -0
- package/dist/IdunSoft/from/courses.js.map +1 -1
- package/dist/IdunSoft/from/events.js +1 -2
- package/dist/IdunSoft/from/events.js.map +1 -1
- package/dist/IdunSoft/from/groups.js.map +1 -1
- package/dist/IdunSoft/from/index.js.map +1 -1
- package/dist/IdunSoft/from/locations.js.map +1 -1
- package/dist/IdunSoft/from/schedules.d.ts +1 -0
- package/dist/IdunSoft/from/schedules.js.map +1 -1
- package/dist/IdunSoft/from/teachers.js.map +1 -1
- package/dist/IdunSoft/to/index.d.ts +1 -0
- package/dist/IdunSoft/to/schedules.js +3 -6
- package/dist/IdunSoft/to/schedules.js.map +1 -1
- package/dist/InfoMentor/to/index.d.ts +1 -0
- package/dist/InfoMentor/to/schedules.js +1 -2
- package/dist/InfoMentor/to/schedules.js.map +1 -1
- package/dist/PlanDigital/from/index.js.map +1 -1
- package/dist/PlanDigital/from/schedules.js +9 -11
- package/dist/PlanDigital/from/schedules.js.map +1 -1
- package/dist/PlanDigital/index.d.ts +1 -0
- package/dist/Quiculum/file/to/index.d.ts +1 -0
- package/dist/Quiculum/file/to/schedules.js +5 -9
- package/dist/Quiculum/file/to/schedules.js.map +1 -1
- package/dist/RS/from/division.d.ts +1 -0
- package/dist/RS/from/division.js +1 -2
- package/dist/RS/from/division.js.map +1 -1
- package/dist/RS/from/index.js.map +1 -1
- package/dist/RS/from/schedules.d.ts +1 -0
- package/dist/RS/from/schedules.js.map +1 -1
- package/dist/RS/make-connected.d.ts +3 -1
- package/dist/RS/make-connected.js +34 -42
- package/dist/RS/make-connected.js.map +1 -1
- package/dist/RS/to/index.js.map +1 -1
- package/dist/RS/to/initial-configuration.js +4 -6
- package/dist/RS/to/initial-configuration.js.map +1 -1
- package/dist/RS/to/input/collections.js.map +1 -1
- package/dist/RS/to/input/default.js +1 -2
- package/dist/RS/to/input/default.js.map +1 -1
- package/dist/RS/to/input/dependencies.js +1 -2
- package/dist/RS/to/input/dependencies.js.map +1 -1
- package/dist/RS/to/input/dynamic-locked-times.js +1 -2
- package/dist/RS/to/input/dynamic-locked-times.js.map +1 -1
- package/dist/RS/to/input/events.js.map +1 -1
- package/dist/RS/to/input/groups.js.map +1 -1
- package/dist/RS/to/input/individuals.js +1 -2
- package/dist/RS/to/input/individuals.js.map +1 -1
- package/dist/RS/to/input/input.js +1 -2
- package/dist/RS/to/input/input.js.map +1 -1
- package/dist/RS/to/input/intervals.js +2 -4
- package/dist/RS/to/input/intervals.js.map +1 -1
- package/dist/RS/to/input/periods.js +2 -4
- package/dist/RS/to/input/periods.js.map +1 -1
- package/dist/RS/to/input/settings.js.map +1 -1
- package/dist/RS/to/input/teachers.js +1 -1
- package/dist/RS/to/input/teachers.js.map +1 -1
- package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
- package/dist/RS/to/input/util/parse-days.js.map +1 -1
- package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
- package/dist/RS/to/input/util/parse-intervals.js +2 -4
- package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
- package/dist/RS/to/input/util/parse-location-references.js +1 -2
- package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
- package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
- package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
- package/dist/RS/to/input/util/util.js +1 -2
- package/dist/RS/to/input/util/util.js.map +1 -1
- package/dist/RS/to/schedules.js.map +1 -1
- package/dist/RS/types/to.d.ts +1 -0
- package/dist/SS12000/from/activities.js +1 -2
- package/dist/SS12000/from/activities.js.map +1 -1
- package/dist/SS12000/from/calendar-events.js.map +1 -1
- package/dist/SS12000/from/duties.js.map +1 -1
- package/dist/SS12000/from/groups.js.map +1 -1
- package/dist/SS12000/from/index.js.map +1 -1
- package/dist/SS12000/from/persons.js.map +1 -1
- package/dist/SS12000/from/resources.js.map +1 -1
- package/dist/SS12000/from/rooms.js.map +1 -1
- package/dist/SS12000/from/syllabuses.js.map +1 -1
- package/dist/SS12000/index.d.ts +236 -201
- package/dist/SS12000/to/activities.js.map +1 -1
- package/dist/SS12000/to/calendar-events.js.map +1 -1
- package/dist/SS12000/to/common.js.map +1 -1
- package/dist/SS12000/to/duties.js.map +1 -1
- package/dist/SS12000/to/groups.js.map +1 -1
- package/dist/SS12000/to/index.d.ts +1 -0
- package/dist/SS12000/to/persons.js.map +1 -1
- package/dist/SS12000/to/resources.js.map +1 -1
- package/dist/SS12000/to/rooms.js.map +1 -1
- package/dist/SS12000/to/syllabuses.js.map +1 -1
- package/dist/SchoolSoft/api/from/index.js.map +1 -1
- package/dist/SchoolSoft/api/from/schedules.js +8 -12
- package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/api/index.d.ts +1 -0
- package/dist/SchoolSoft/file/from/index.js.map +1 -1
- package/dist/SchoolSoft/file/from/schedules.js +83 -87
- package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/file/index.d.ts +1 -0
- package/dist/SchoolSoft/file/to/index.d.ts +1 -0
- package/dist/SchoolSoft/file/to/schedules.js +1 -2
- package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
- package/dist/SchoolSoft/index.d.ts +1 -0
- package/dist/Schoolity/txt/to/index.d.ts +1 -0
- package/dist/Schoolity/txt/to/schedules.js +5 -12
- package/dist/Schoolity/txt/to/schedules.js.map +1 -1
- package/dist/Skola24/mdb/from/course-and-events.js +3 -5
- package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
- package/dist/Skola24/mdb/from/groups.js.map +1 -1
- package/dist/Skola24/mdb/from/index.js.map +1 -1
- package/dist/Skola24/mdb/from/locations.js.map +1 -1
- package/dist/Skola24/mdb/from/schedule.d.ts +1 -0
- package/dist/Skola24/mdb/from/schedule.js.map +1 -1
- package/dist/Skola24/mdb/from/teachers.js.map +1 -1
- package/dist/Skola24/txt/from/calendar-exceptions.js +1 -2
- package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
- package/dist/Skola24/txt/from/division.js.map +1 -1
- package/dist/Skola24/txt/from/index.js.map +1 -1
- package/dist/Skola24/txt/from/period.js +31 -34
- package/dist/Skola24/txt/from/period.js.map +1 -1
- package/dist/Skola24/txt/from/schedules.d.ts +1 -0
- package/dist/Skola24/txt/from/schedules.js +6 -10
- package/dist/Skola24/txt/from/schedules.js.map +1 -1
- package/dist/Skola24/txt/from/util.js.map +1 -1
- package/dist/Skola24/txt/index.d.ts +1 -0
- package/dist/Skola24/txt/to/index.d.ts +1 -0
- package/dist/Skola24/txt/to/schedules.js +5 -12
- package/dist/Skola24/txt/to/schedules.js.map +1 -1
- package/dist/common/constants.js.map +1 -1
- package/dist/common/functions.js.map +1 -1
- package/dist/common/get-date.js.map +1 -1
- package/dist/common/make-chainable/index.js.map +1 -1
- package/dist/common/types.d.ts +1 -3
- package/dist/core/from/configurations.js.map +1 -1
- package/dist/core/from/courses.js.map +1 -1
- package/dist/core/from/events.js.map +1 -1
- package/dist/core/from/exceptions.js.map +1 -1
- package/dist/core/from/groups.js.map +1 -1
- package/dist/core/from/index.js.map +1 -1
- package/dist/core/from/locations.js.map +1 -1
- package/dist/core/from/locked-times.js.map +1 -1
- package/dist/core/from/overlap-groups.js.map +1 -1
- package/dist/core/from/periods.js.map +1 -1
- package/dist/core/from/persons.js.map +1 -1
- package/dist/core/from/root-intervals.js.map +1 -1
- package/dist/core/from/schedules.js.map +1 -1
- package/dist/core/from/settings.js.map +1 -1
- package/dist/core/from/syllabuses.js.map +1 -1
- package/dist/core/from/teachers.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/interfaces/index.d.ts +23 -0
- package/dist/core/interfaces/other/companies.d.ts +1 -0
- package/dist/core/interfaces/other/companies.js.map +1 -1
- package/dist/core/interfaces/other/index.d.ts +6 -0
- package/dist/core/interfaces/other/operations.d.ts +1 -0
- package/dist/core/interfaces/vertices/companies.d.ts +1 -0
- package/dist/core/interfaces/vertices/configurations.d.ts +1 -0
- package/dist/core/interfaces/vertices/courses.d.ts +1 -0
- package/dist/core/interfaces/vertices/division-settings.d.ts +2 -0
- package/dist/core/interfaces/vertices/divisions.d.ts +1 -0
- package/dist/core/interfaces/vertices/events.d.ts +1 -0
- package/dist/core/interfaces/vertices/exceptions.d.ts +1 -0
- package/dist/core/interfaces/vertices/generations.d.ts +2 -0
- package/dist/core/interfaces/vertices/groups.d.ts +1 -0
- package/dist/core/interfaces/vertices/index.d.ts +1 -0
- package/dist/core/interfaces/vertices/locations.d.ts +1 -0
- package/dist/core/interfaces/vertices/locked-times.d.ts +2 -0
- package/dist/core/interfaces/vertices/overlap-groups.d.ts +1 -0
- package/dist/core/interfaces/vertices/periods.d.ts +3 -0
- package/dist/core/interfaces/vertices/persons.d.ts +1 -0
- package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +1 -0
- package/dist/core/interfaces/vertices/properties/coalesced.d.ts +1 -0
- package/dist/core/interfaces/vertices/root-intervals.d.ts +2 -0
- package/dist/core/interfaces/vertices/syllabuses.d.ts +1 -0
- package/dist/core/interfaces/vertices/teachers.d.ts +1 -0
- package/dist/core/interfaces/vertices/threads.d.ts +6 -4
- package/dist/core/interfaces/vertices/users.d.ts +1 -0
- package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +6 -6
- package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
- package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +9 -9
- package/dist/core/interfaces/vertices/util/edges.d.ts +7 -7
- package/dist/core/interfaces/vertices/util/index.d.ts +6 -0
- package/dist/core/interfaces/vertices/util/util.d.ts +20 -24
- package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +11 -11
- package/dist/core/interfaces/vertices/util/vertex.d.ts +1 -1
- package/dist/core/interfaces/vertices/vertex-query.d.ts +27 -26
- package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
- package/dist/core/to/configurations.js +1 -2
- package/dist/core/to/configurations.js.map +1 -1
- package/dist/core/to/courses.js +1 -2
- package/dist/core/to/courses.js.map +1 -1
- package/dist/core/to/division.js.map +1 -1
- package/dist/core/to/events.js +1 -2
- package/dist/core/to/events.js.map +1 -1
- package/dist/core/to/exceptions.js +1 -2
- package/dist/core/to/exceptions.js.map +1 -1
- package/dist/core/to/groups.js +1 -2
- package/dist/core/to/groups.js.map +1 -1
- package/dist/core/to/locations.js +1 -2
- package/dist/core/to/locations.js.map +1 -1
- package/dist/core/to/locked-times.js +1 -2
- package/dist/core/to/locked-times.js.map +1 -1
- package/dist/core/to/overlap-groups.js +1 -2
- package/dist/core/to/overlap-groups.js.map +1 -1
- package/dist/core/to/periods.js +1 -2
- package/dist/core/to/periods.js.map +1 -1
- package/dist/core/to/persons.js +1 -2
- package/dist/core/to/persons.js.map +1 -1
- package/dist/core/to/root-intervals.js +1 -2
- package/dist/core/to/root-intervals.js.map +1 -1
- package/dist/core/to/schedules.d.ts +1 -0
- package/dist/core/to/schedules.js.map +1 -1
- package/dist/core/to/settings.js +1 -2
- package/dist/core/to/settings.js.map +1 -1
- package/dist/core/to/syllabuses.js +1 -2
- package/dist/core/to/syllabuses.js.map +1 -1
- package/dist/core/to/teachers.js +1 -2
- package/dist/core/to/teachers.js.map +1 -1
- package/dist/core/to/util.d.ts +2 -0
- package/dist/core/to/util.js +1 -2
- package/dist/core/to/util.js.map +1 -1
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/util.js +1 -2
- package/dist/core/util.js.map +1 -1
- package/dist/identify/constants/index.js.map +1 -1
- package/dist/identify/index.js +1 -2
- package/dist/identify/index.js.map +1 -1
- package/dist/sdui/from/classes.js.map +1 -1
- package/dist/sdui/from/courses.js.map +1 -1
- package/dist/sdui/from/holidays.js.map +1 -1
- package/dist/sdui/from/index.js.map +1 -1
- package/dist/sdui/from/lessons.js.map +1 -1
- package/dist/sdui/from/rooms.js.map +1 -1
- package/dist/sdui/from/schedules.d.ts +2 -0
- package/dist/sdui/from/schedules.js.map +1 -1
- package/dist/sdui/from/school-years.js.map +1 -1
- package/dist/sdui/from/substitution-plans.js.map +1 -1
- package/dist/sdui/from/teachers.js.map +1 -1
- package/dist/sdui/to/classes.js.map +1 -1
- package/dist/sdui/to/courses.js.map +1 -1
- package/dist/sdui/to/holidays.js.map +1 -1
- package/dist/sdui/to/hours.js.map +1 -1
- package/dist/sdui/to/index.d.ts +2 -0
- package/dist/sdui/to/lessons.js.map +1 -1
- package/dist/sdui/to/rooms.js.map +1 -1
- package/dist/sdui/to/schedules.js.map +1 -1
- package/dist/sdui/to/school-years.js.map +1 -1
- package/dist/sdui/to/substitution-plans.js +3 -6
- package/dist/sdui/to/substitution-plans.js.map +1 -1
- package/dist/sdui/to/teachers.js.map +1 -1
- package/dist/vKlass/from/index.js.map +1 -1
- package/dist/vKlass/from/schedule.d.ts +1 -0
- package/dist/vKlass/from/schedule.js.map +1 -1
- package/dist/vKlass/to/schedules.js +6 -17
- package/dist/vKlass/to/schedules.js.map +1 -1
- package/package.json +1 -1
|
@@ -38,11 +38,9 @@ function parsePeriod(period, scheduleStart, warnings) {
|
|
|
38
38
|
}
|
|
39
39
|
return acc;
|
|
40
40
|
}, []).map((x) => {
|
|
41
|
-
const start = x.start.startOf("isoWeek");
|
|
42
|
-
const end = x.end.endOf("isoWeek");
|
|
43
41
|
return {
|
|
44
|
-
start,
|
|
45
|
-
end
|
|
42
|
+
start: x.start.startOf("isoWeek"),
|
|
43
|
+
end: x.end.endOf("isoWeek")
|
|
46
44
|
};
|
|
47
45
|
}).filter((x, i, arr) => {
|
|
48
46
|
for (let j = i + 1; j < arr.length; j++) if (x.start.isSame(arr[j].start) && x.end.isSame(arr[j].end)) return false;
|
|
@@ -57,39 +55,38 @@ function parsePeriod(period, scheduleStart, warnings) {
|
|
|
57
55
|
function fromWeekNumberRange(ids, weekNumberRange, scheduleStart) {
|
|
58
56
|
const startYear = scheduleStart.year();
|
|
59
57
|
const scheduleStartWeek = scheduleStart.startOf("isoWeek");
|
|
60
|
-
const ranges = weekNumberRange.split(",").map((x) => {
|
|
61
|
-
const interval = x.split("-").map((x$1) => parseInt(x$1.trim()));
|
|
62
|
-
const startWeekNumber = interval[0];
|
|
63
|
-
const endWeekNumber = interval[1] ?? startWeekNumber;
|
|
64
|
-
const start = moment.utc().isoWeekYear(startYear).isoWeek(startWeekNumber).startOf("isoWeek");
|
|
65
|
-
if (start.isBefore(scheduleStartWeek)) start.add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
|
|
66
|
-
const end = moment.utc().isoWeekYear(start.year()).isoWeek(endWeekNumber).endOf("isoWeek");
|
|
67
|
-
if (end.isBefore(start)) end.add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
|
|
68
|
-
return [start, end];
|
|
69
|
-
}).reduce((acc, x) => {
|
|
70
|
-
const prev = acc.at(-1);
|
|
71
|
-
if (!prev) acc.push({
|
|
72
|
-
start: x[0],
|
|
73
|
-
end: x[1]
|
|
74
|
-
});
|
|
75
|
-
else {
|
|
76
|
-
while (prev.end.isAfter(x[0])) {
|
|
77
|
-
const startWeekNumber = x[0].isoWeek();
|
|
78
|
-
const endWeekNumber = x[1].isoWeek();
|
|
79
|
-
x[0].add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
|
|
80
|
-
x[1].add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
|
|
81
|
-
}
|
|
82
|
-
acc.push({
|
|
83
|
-
start: x[0],
|
|
84
|
-
end: x[1]
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
return acc;
|
|
88
|
-
}, []);
|
|
89
58
|
return {
|
|
90
59
|
ids,
|
|
91
60
|
displayName: weekNumberRange,
|
|
92
|
-
ranges
|
|
61
|
+
ranges: weekNumberRange.split(",").map((x) => {
|
|
62
|
+
const interval = x.split("-").map((x$1) => parseInt(x$1.trim()));
|
|
63
|
+
const startWeekNumber = interval[0];
|
|
64
|
+
const endWeekNumber = interval[1] ?? startWeekNumber;
|
|
65
|
+
const start = moment.utc().isoWeekYear(startYear).isoWeek(startWeekNumber).startOf("isoWeek");
|
|
66
|
+
if (start.isBefore(scheduleStartWeek)) start.add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
|
|
67
|
+
const end = moment.utc().isoWeekYear(start.year()).isoWeek(endWeekNumber).endOf("isoWeek");
|
|
68
|
+
if (end.isBefore(start)) end.add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
|
|
69
|
+
return [start, end];
|
|
70
|
+
}).reduce((acc, x) => {
|
|
71
|
+
const prev = acc.at(-1);
|
|
72
|
+
if (!prev) acc.push({
|
|
73
|
+
start: x[0],
|
|
74
|
+
end: x[1]
|
|
75
|
+
});
|
|
76
|
+
else {
|
|
77
|
+
while (prev.end.isAfter(x[0])) {
|
|
78
|
+
const startWeekNumber = x[0].isoWeek();
|
|
79
|
+
const endWeekNumber = x[1].isoWeek();
|
|
80
|
+
x[0].add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
|
|
81
|
+
x[1].add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
|
|
82
|
+
}
|
|
83
|
+
acc.push({
|
|
84
|
+
start: x[0],
|
|
85
|
+
end: x[1]
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return acc;
|
|
89
|
+
}, [])
|
|
93
90
|
};
|
|
94
91
|
}
|
|
95
92
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"period.js","names":["x"],"sources":["../../../../src/Skola24/txt/from/period.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types, Warning } from '../types';\nimport { extractId } from './util';\nimport type { OutTypes } from './schedules';\n\nexport function parsePeriod (\n period: Types.period,\n scheduleStart: moment.Moment,\n warnings: Warning[]\n): OutTypes.period {\n // should warn only once\n let warned = false;\n\n // parse range\n const ranges = (period.Calendar ?? '')\n .split(',')\n // parse each range\n .map(x => {\n // date ranges on the form \"20/8-23/8\"\n const [_start, _end] = x.split('-');\n if (!_start || !_end) return;\n\n const start = moment.utc(`${_start}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n const end = moment.utc(`${_end}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n if (!start.isValid() || !end.isValid()) {\n if (warned) return;\n warned = true;\n warnings.push({\n code: 'period.problem_parsing_range',\n context: period\n });\n return;\n }\n\n // add one year to the range if it is before the schedule start\n if (start.isBefore(scheduleStart)) {\n start.add(1, 'year');\n end .add(1, 'year');\n }\n\n return { start, end };\n })\n .filter((x): x is NonNullable<typeof x> => !!x)\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push(x);\n } else {\n while (prev.end.isAfter(x.start)) {\n x.start.add(1, 'year');\n x.end .add(1, 'year');\n }\n acc.push(x);\n }\n return acc;\n }, [])\n // convert to whole week\n .map(x => {\n const start = x.start.startOf('isoWeek');\n const end = x.end .endOf ('isoWeek');\n return { start, end };\n })\n // remove duplicates (if a week was split into two ranges)\n .filter((x, i, arr) => {\n for (let j = i + 1; j < arr.length; j++) {\n if (x.start.isSame(arr[j].start) && x.end.isSame(arr[j].end)) return false;\n }\n return true;\n });\n\n return {\n ids: extractId(period.GUID),\n displayName: period.TextBelowSchedule,\n ranges\n };\n}\n\n\nexport function fromWeekNumberRange (\n ids: string,\n weekNumberRange: string,\n scheduleStart: moment.Moment\n): OutTypes.period {\n const startYear = scheduleStart.year();\n const scheduleStartWeek = scheduleStart.startOf('isoWeek');\n\n const ranges = weekNumberRange\n // parse the range to positive intervals that lie after the schedule start\n .split(',')\n .map(x => {\n const interval = x.split('-').map(x => parseInt(x.trim()));\n const startWeekNumber = interval[0];\n const endWeekNumber = interval[1] ?? startWeekNumber;\n\n const start = moment.utc()\n .isoWeekYear(startYear)\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n if (start.isBefore(scheduleStartWeek)) {\n start.add(1, 'year')\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n }\n\n const end = moment.utc()\n .isoWeekYear(start.year())\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n if (end.isBefore(start)) {\n end.add(1, 'year')\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n }\n\n return [ start, end ];\n })\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push({ start: x[0], end: x[1] });\n } else {\n while (prev.end.isAfter(x[0])) {\n const startWeekNumber = x[0].isoWeek();\n const endWeekNumber = x[1].isoWeek();\n // preserve the week number\n x[0].add(1, 'year').isoWeek(startWeekNumber).startOf('isoWeek');\n x[1].add(1, 'year').isoWeek(endWeekNumber ).endOf ('isoWeek');\n }\n acc.push({ start: x[0], end: x[1] });\n }\n return acc;\n }, []);\n\n return {\n ids,\n displayName: weekNumberRange,\n ranges: ranges\n };\n}"],"mappings":";;;;AAKA,SAAgB,YACd,QACA,eACA,UACiB;CAEjB,IAAI,SAAS;CAGb,MAAM,UAAU,OAAO,YAAY,IAChC,MAAM,
|
|
1
|
+
{"version":3,"file":"period.js","names":["x"],"sources":["../../../../src/Skola24/txt/from/period.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types, Warning } from '../types';\nimport { extractId } from './util';\nimport type { OutTypes } from './schedules';\n\nexport function parsePeriod (\n period: Types.period,\n scheduleStart: moment.Moment,\n warnings: Warning[]\n): OutTypes.period {\n // should warn only once\n let warned = false;\n\n // parse range\n const ranges = (period.Calendar ?? '')\n .split(',')\n // parse each range\n .map(x => {\n // date ranges on the form \"20/8-23/8\"\n const [_start, _end] = x.split('-');\n if (!_start || !_end) return;\n\n const start = moment.utc(`${_start}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n const end = moment.utc(`${_end}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n if (!start.isValid() || !end.isValid()) {\n if (warned) return;\n warned = true;\n warnings.push({\n code: 'period.problem_parsing_range',\n context: period\n });\n return;\n }\n\n // add one year to the range if it is before the schedule start\n if (start.isBefore(scheduleStart)) {\n start.add(1, 'year');\n end .add(1, 'year');\n }\n\n return { start, end };\n })\n .filter((x): x is NonNullable<typeof x> => !!x)\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push(x);\n } else {\n while (prev.end.isAfter(x.start)) {\n x.start.add(1, 'year');\n x.end .add(1, 'year');\n }\n acc.push(x);\n }\n return acc;\n }, [])\n // convert to whole week\n .map(x => {\n const start = x.start.startOf('isoWeek');\n const end = x.end .endOf ('isoWeek');\n return { start, end };\n })\n // remove duplicates (if a week was split into two ranges)\n .filter((x, i, arr) => {\n for (let j = i + 1; j < arr.length; j++) {\n if (x.start.isSame(arr[j].start) && x.end.isSame(arr[j].end)) return false;\n }\n return true;\n });\n\n return {\n ids: extractId(period.GUID),\n displayName: period.TextBelowSchedule,\n ranges\n };\n}\n\n\nexport function fromWeekNumberRange (\n ids: string,\n weekNumberRange: string,\n scheduleStart: moment.Moment\n): OutTypes.period {\n const startYear = scheduleStart.year();\n const scheduleStartWeek = scheduleStart.startOf('isoWeek');\n\n const ranges = weekNumberRange\n // parse the range to positive intervals that lie after the schedule start\n .split(',')\n .map(x => {\n const interval = x.split('-').map(x => parseInt(x.trim()));\n const startWeekNumber = interval[0];\n const endWeekNumber = interval[1] ?? startWeekNumber;\n\n const start = moment.utc()\n .isoWeekYear(startYear)\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n if (start.isBefore(scheduleStartWeek)) {\n start.add(1, 'year')\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n }\n\n const end = moment.utc()\n .isoWeekYear(start.year())\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n if (end.isBefore(start)) {\n end.add(1, 'year')\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n }\n\n return [ start, end ];\n })\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push({ start: x[0], end: x[1] });\n } else {\n while (prev.end.isAfter(x[0])) {\n const startWeekNumber = x[0].isoWeek();\n const endWeekNumber = x[1].isoWeek();\n // preserve the week number\n x[0].add(1, 'year').isoWeek(startWeekNumber).startOf('isoWeek');\n x[1].add(1, 'year').isoWeek(endWeekNumber ).endOf ('isoWeek');\n }\n acc.push({ start: x[0], end: x[1] });\n }\n return acc;\n }, []);\n\n return {\n ids,\n displayName: weekNumberRange,\n ranges: ranges\n };\n}"],"mappings":"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"}
|
|
@@ -32,23 +32,19 @@ const parseConfig = {
|
|
|
32
32
|
skipEmptyLines: false
|
|
33
33
|
};
|
|
34
34
|
function extractTables(input, warnings) {
|
|
35
|
-
const
|
|
36
|
-
const tables = split.at(1);
|
|
35
|
+
const tables = input.split("[Tables]").at(1);
|
|
37
36
|
if (!tables) throw new Error("Unable to extract tables from input");
|
|
38
|
-
|
|
39
|
-
const matches = [...tables.trim().matchAll(regex)];
|
|
40
|
-
return matches.map((x) => {
|
|
37
|
+
return [...tables.trim().matchAll(/([^\r\n]+)(?:\r\n|\r|\n)\[Rows\](?:\r\n|\r|\n)((?:[^\r\n].+(?:(?:\r\n|\r|\n)|$))*)/gm)].map((x) => {
|
|
41
38
|
const tableName = x.at(1)?.trim().match(/(.*?)(?:\s*\(\d+\))$/m)?.at(1);
|
|
42
39
|
if (!tableName) return;
|
|
43
40
|
const tableContent = x.at(2)?.trim();
|
|
44
41
|
if (!tableContent) return;
|
|
45
|
-
const parsed = Papa.parse(tableContent, {
|
|
46
|
-
...parseConfig,
|
|
47
|
-
transformHeader
|
|
48
|
-
});
|
|
49
42
|
return {
|
|
50
43
|
tableName,
|
|
51
|
-
parsed:
|
|
44
|
+
parsed: Papa.parse(tableContent, {
|
|
45
|
+
...parseConfig,
|
|
46
|
+
transformHeader
|
|
47
|
+
}).data
|
|
52
48
|
};
|
|
53
49
|
}).filter((x) => x != null).reduce((acc, { tableName, parsed }) => {
|
|
54
50
|
acc[tableName] = parsed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.js","names":["warnings: Warning[]","settings: OutTypes.settings","x","uuidv4","teachers","groups","getDate","newCourse: OutTypes.course"],"sources":["../../../../src/Skola24/txt/from/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport { v4 as uuidv4 } from 'uuid'; // as we cannot use crypto's randomUUID in browser\nimport moment from 'moment';\nimport getDate from '../../../common/get-date';\nimport type { CoreTypes } from '../../../core';\nimport type { Data, Options, Types as Skola24Types, Warning } from '../types';\nimport { extractId } from './util';\nimport { fromWeekNumberRange, parsePeriod } from './period';\nimport { parseCalendarExceptions } from './calendar-exceptions';\nimport { extractStartAndEnd } from './division';\n\n\nconst daysToIndex = {\n 'Måndag': 0,\n 'Tisdag': 1,\n 'Onsdag': 2,\n 'Torsdag': 3,\n 'Fredag': 4,\n 'Lördag': 5,\n 'Söndag': 6,\n\n // and if ÅÄÖ is loaded correctly\n 'M�ndag': 0,\n 'L�rdag': 5,\n 'S�ndag': 6,\n} as Record<string, number | undefined>;\n\n\nfunction transformHeader (header: string) {\n return header.split(/[^a-zA-Z]+/g)[0];\n}\nconst parseConfig = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n // newline: \"\\r\\n\",\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n} as Papa.ParseConfig;\n\n\nfunction extractTables (input: string, warnings: Warning[]) {\n // split at [Tables] to get meta section and table section\n const split = input.split('[Tables]');\n const tables = split.at(1);\n if (!tables) throw new Error('Unable to extract tables from input');\n\n ////\n //// Capture the TABLE NAME and the TABLE CONTENT using regex\n ////\n //// TABLE NAME\n //// [Rows]\n //// TABLE CONTENT\n ////\n const regex = /([^\\r\\n]+)(?:\\r\\n|\\r|\\n)\\[Rows\\](?:\\r\\n|\\r|\\n)((?:[^\\r\\n].+(?:(?:\\r\\n|\\r|\\n)|$))*)/gm;\n const matches = [...tables.trim().matchAll(regex)];\n\n return matches\n .map(x => {\n // extract only the true table name \"<table name> (<number>)\", i.e., ignore the brackets and the preceding space\n const tableName = x.at(1)\n ?.trim()\n .match(/(.*?)(?:\\s*\\(\\d+\\))$/m)\n ?.at(1);\n if (!tableName) return;\n\n const tableContent = x.at(2)?.trim();\n if (!tableContent) return;\n const parsed = Papa.parse(tableContent, { ...parseConfig, transformHeader });\n return {\n tableName: tableName as keyof Data,\n parsed: parsed.data\n };\n })\n .filter((x): x is NonNullable<typeof x> => x != null)\n .reduce<Data>((acc, { tableName, parsed }) => {\n acc[tableName] = parsed;\n return acc;\n }, {} as Data);\n}\n\n\nfunction parseColor (colorValue: string | undefined) {\n if (colorValue == null) return;\n\n const integerValue = parseInt(colorValue);\n if (isNaN(integerValue)) return;\n\n // convert to decimal string\n const hex = integerValue.toString(16);\n\n // ensure its a valid color\n if (!/^(?:[0-9a-fA-F]{3}){1,2}$/.test(hex)) return;\n return `#${ hex }`;\n}\n\n\nexport namespace OutTypes {\n export type settings = CoreTypes.SerializedWithOptionalId.Settings;\n export type teacher = CoreTypes.SerializedWithOptionalId.Teacher;\n export type person = CoreTypes.SerializedWithOptionalId.Person;\n export type group = CoreTypes.SerializedWithOptionalId.Group;\n export type course = CoreTypes.SerializedWithOptionalId.Course;\n export type location = CoreTypes.SerializedWithOptionalId.Location;\n export type event = CoreTypes.SerializedWithOptionalId.Event;\n export type period = CoreTypes.SerializedWithOptionalId.Period;\n}\n\ntype Out = {\n settings: OutTypes.settings;\n periods: OutTypes.period [];\n teachers: OutTypes.teacher [];\n persons: OutTypes.person [];\n groups: OutTypes.group [];\n locations: OutTypes.location[];\n courses: OutTypes.course [];\n events: OutTypes.event [];\n meta?: {\n warnings: Warning[]\n };\n};\n\n\nexport const schedules = (\n input: string,\n options: Options = {}\n): Out => {\n const warnings: Warning[] = [];\n\n const tables = extractTables(input, warnings);\n\n const _scheduleRange = extractStartAndEnd(input); // need whole input file\n if (!_scheduleRange) throw new Error('Unable to extract schedule range');\n\n const scheduleStart = moment.utc(_scheduleRange.start);\n const startYear = scheduleStart.year();\n\n const settings: OutTypes.settings = {\n discretization: 5,\n numDays: 5,\n dayStart: '8:00',\n potentialCenter: '12:00',\n dayEnd: '17:00',\n calendarExceptions: parseCalendarExceptions(tables.PeriodGeneral?.at(0), startYear, warnings)\n };\n\n\n // Map to core structure\n const teachers = tables.Teacher\n ?.map((x): OutTypes.teacher => ({\n ids: extractId(x.GUID),\n signature: x.Teacher,\n displayName: `${x.FirstName} ${x.LastName}`,\n ...x.Category && {\n tags: [\n {\n type: 'category',\n value: x.Category\n }\n ]\n },\n person: `teacher.${ extractId(x.GUID) }`\n }));\n const teacherPersons = tables.Teacher\n // Filter out where either of firstname, lastname i missing, else it gives invalid persons\n ?.filter(x => x.FirstName && x.LastName)\n ?.map((x): OutTypes.person => ({\n ids: `teacher.${ extractId(x.GUID) }`,\n firstName: x.FirstName,\n lastName: x.LastName,\n ...x.PersonalCode && {\n SSN: {\n value: x.PersonalCode,\n }\n },\n ...x.EMail && {\n emails: [{\n value: x.EMail,\n type: 'organization'\n }]\n },\n ...x.Phone && {\n phoneNumbers: [\n {\n value: x.Phone,\n type: 'organization'\n }\n ]\n }\n }));\n\n const studentMap = new Map<string, string>();\n // create map of student SSN to student GUID\n tables.Student?.forEach(x => {\n const id = extractId(x.GUID);\n if (id) studentMap.set(x.Student, id);\n });\n\n const students = tables.Student?.map((x): OutTypes.person => ({\n ids: extractId(x.GUID),\n firstName: x.FirstName,\n lastName: x.LastName,\n type: 'Student',\n ...x.Student && {\n SSN: {\n value: x.Student,\n }\n },\n ...x.EMail && {\n emails: [{\n value: x.EMail,\n type: 'organization'\n }]\n }\n }));\n\n const groups = tables.Group?.map((x): OutTypes.group => ({\n ids: extractId(x.GUID),\n displayName: x.Group,\n ...(x.Class == '1') && { species: 'class' },\n members: x.Student?.split(',').map(x => studentMap.get(x)).filter(x => x != null) ?? []\n }));\n\n const periodMap = new Map<string, string>();\n const periodsFromWeekRanges = new Set<string>();\n if (tables.Period) {\n tables.Period.forEach(period => {\n const id = extractId(period.GUID);\n if (id) periodMap.set(period.Period, id);\n });\n\n // create additional periods corresponding to the lessons' week/actual weeks\n const _createPeriodsFrom = options.createPeriodsFrom;\n if (_createPeriodsFrom) {\n tables.Lesson?.forEach(x => {\n const key = x[_createPeriodsFrom];\n if (key) periodsFromWeekRanges.add(key);\n });\n periodsFromWeekRanges.forEach(x => periodMap.set(x, uuidv4()));\n }\n }\n\n const teacherMap = new Map<string, string>();\n if (tables.Teacher) {\n tables.Teacher.forEach(teacher => {\n const id = extractId(teacher.GUID);\n if (id) teacherMap.set(teacher.Teacher, id);\n });\n }\n\n const groupMap = new Map<string, string>();\n if (tables.Group) {\n tables.Group.forEach(group => {\n const id = extractId(group.GUID);\n if (id) groupMap.set(group.Group, id);\n });\n }\n\n const locationMap = new Map<string, string>();\n if (tables.Room) {\n tables.Room.forEach(room => {\n const id = extractId(room.GUID);\n if (id) locationMap.set(room.Room, id);\n });\n }\n\n // subject contains BackgroundColor(decimal) and FullText\n const subjectMap = new Map<string, Skola24Types.subject>();\n if (tables.Subject) {\n tables.Subject.forEach(subject => {\n subjectMap.set(subject.Subject, subject);\n });\n }\n\n // Course can contain FullText and Subject\n const parentCourseMap = new Map<string, Skola24Types.course>();\n if (tables.Course) {\n tables.Course.forEach(course => {\n parentCourseMap.set(course.Course, course);\n });\n }\n\n const courseMap = new Map<string, string | undefined>();\n const courses = tables.TA?.map((x): OutTypes.course => {\n const color = parseColor(subjectMap.get(x.Subject)?.BackgroundColor);\n\n // Course name is most specific (eg Administration 1), then subject name (Administration), then course code (eg ADMADM01), then subject code (eg ADM)\n const displayName = parentCourseMap.get(x.Course)?.FullText || subjectMap.get(x.Subject)?.FullText || x.Course || x.Subject;\n\n const teachers = (x.Teacher ?? [])\n .split(',')\n .map(x => teacherMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n const groups = (x.Group ?? [])\n .split(',')\n .map(x => groupMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n\n return {\n ids: x.GUID ? extractId(x.GUID) : uuidv4(),\n displayName: displayName,\n color: color,\n subject: x.Subject || parentCourseMap.get(x.Course)?.Subject,\n teachers: teachers,\n groups: groups,\n plannedDuration: x.TotalHours ? `${x.TotalHours} hrs` : (x.Weektime ? `${x.Weektime} min/week` : undefined),\n ...x.Period && { period: periodMap.get(x.Period) },\n } satisfies OutTypes.course;\n }) ?? [];\n\n tables.TA?.forEach(x => {\n courseMap.set(`${x.Subject}.${x.Teacher}.${x.Group}`, x.GUID ? extractId(x.GUID) : undefined);\n });\n\n const locations = tables.Room?.map((x): OutTypes.location => ({\n ids: extractId(x.GUID),\n displayName: x.Room,\n maximumCapacity: x.SeatingCapacity ? parseInt(x.SeatingCapacity) : undefined,\n ...x.Category?.length && {\n tags: [\n {\n type: 'category',\n value: x.Category\n }\n ]\n }\n }));\n\n let lessonMissingCourseWarningsCount = 0;\n\n const events = tables.Lesson\n ?.filter(x => !isNaN(parseInt(x.Length)))\n .map(x => {\n\n const position = (() => {\n const dayIndex = daysToIndex[x.DayOfWeek];\n\n if (dayIndex == null) {\n warnings.push({ code: 'lesson.invalid_day', context: x } satisfies Warning);\n return;\n }\n\n return {\n start: getDate(dayIndex, x.Starttime),\n end: getDate(dayIndex, x.Starttime).add(x.Length, 'minutes'),\n };\n })();\n\n const periodName = options.createPeriodsFrom ? x[options.createPeriodsFrom] : x.Period;\n const periodId = periodMap.get(periodName);\n\n const courseKey = `${x.Subject}.${x.Teacher}.${x.Group}`;\n let courseId = courseMap.get(courseKey);\n\n const inLocations = (x.Room ?? [])\n .split(',')\n .map(x => locationMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x);\n\n // if there is a connected course use its display name\n let displayName = courseId\n ? undefined\n : parentCourseMap.get(x.Course)?.FullText || subjectMap.get(x.Subject)?.FullText || x.Course || x.Subject;\n\n // if there is a connected course use its teachers\n const teachers = courseId\n ? undefined\n : x.Teacher\n ?.split(',')\n .map(x => teacherMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n\n // if there is a connected course use its groups\n const groups = courseId\n ? undefined\n : x.Group\n ?.split(',')\n .map(x => groupMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n\n const duration = x.Length ? parseInt(x.Length) : undefined;\n\n // If no courseId found, we handle it according to options.includeEventsMissingCourse\n if (!courseId && options.includeEventsMissingCourse) {\n // Create a new course for this event\n courseId = uuidv4();\n const subject = subjectMap.get(x.Subject);\n const subjectName = subject?.FullText || x.Subject;\n displayName = displayName || subject?.FullText || x.Subject;\n const newCourse: OutTypes.course = {\n ids: courseId,\n displayName: displayName,\n subject: subjectName,\n teachers: teachers,\n groups: groups,\n };\n courses?.push(newCourse);\n } else if (!courseId) {\n lessonMissingCourseWarningsCount += 1;\n return null; // will be filtered out later\n }\n\n return {\n ids: extractId(x.GUID),\n displayName: displayName,\n ...position,\n duration: duration,\n preferredDuration: duration ?? 0,\n course: courseId,\n period: periodId,\n inLocations,\n ...(!options.includeEventsMissingCourse ? { teachers, groups } : undefined),\n } satisfies OutTypes.event;\n }).filter((x): x is NonNullable<typeof x> => x != null);\n\n const periods = tables.Period\n ?.map(x => parsePeriod(x, scheduleStart, warnings))\n .filter(x => x.ranges.length > 0);\n\n periodsFromWeekRanges.forEach(x => {\n const ids = periodMap.get(x);\n if (!ids) {\n throw new Error(`Unable to find period for ${x}`);\n return;\n }\n periods?.push(fromWeekNumberRange(ids, x, scheduleStart));\n });\n\n if (lessonMissingCourseWarningsCount > 0 && !options.includeEventsMissingCourse) {\n warnings.unshift({\n code: 'ignoring_lessons_missing_course',\n context: { count: lessonMissingCourseWarningsCount }\n } satisfies Warning);\n }\n\n return {\n settings,\n periods: periods ?? [],\n teachers: teachers ?? [],\n persons: (students ?? []).concat(teacherPersons ?? []),\n groups: groups ?? [],\n locations: locations ?? [],\n courses: courses ?? [],\n events: events ?? [],\n\n meta: { warnings }\n } satisfies Out;\n};"],"mappings":";;;;;;;;;;AAYA,MAAM,cAAc;CAClB,UAAW;CACX,UAAW;CACX,UAAW;CACX,WAAW;CACX,UAAW;CACX,UAAW;CACX,UAAW;CAGX,UAAU;CACV,UAAU;CACV,UAAU;;AAIZ,SAAS,gBAAiB,QAAgB;AACxC,QAAO,OAAO,MAAM,eAAe;;AAErC,MAAM,cAAc;CAClB,QAAgB;CAChB,WAAgB;CAChB,YAAgB;CAChB,WAAgB;CAChB,QAAgB;CAEhB,gBAAgB;;AAIlB,SAAS,cAAe,OAAe,UAAqB;CAE1D,MAAM,QAAQ,MAAM,MAAM;CAC1B,MAAM,SAAS,MAAM,GAAG;AACxB,KAAI,CAAC,OAAQ,OAAM,IAAI,MAAM;CAS7B,MAAM,QAAQ;CACd,MAAM,UAAU,CAAC,GAAG,OAAO,OAAO,SAAS;AAE3C,QAAO,QACJ,KAAI,MAAK;EAER,MAAM,YAAY,EAAE,GAAG,IACnB,OACD,MAAM,0BACL,GAAG;AACP,MAAI,CAAC,UAAW;EAEhB,MAAM,eAAe,EAAE,GAAG,IAAI;AAC9B,MAAI,CAAC,aAAc;EACnB,MAAM,SAAS,KAAK,MAAM,cAAc;GAAE,GAAG;GAAa;;AAC1D,SAAO;GACM;GACX,QAAW,OAAO;;IAGrB,QAAQ,MAAkC,KAAK,MAC/C,QAAc,KAAK,EAAE,WAAW,aAAa;AAC5C,MAAI,aAAa;AACjB,SAAO;IACN;;AAIP,SAAS,WAAY,YAAgC;AACnD,KAAI,cAAc,KAAM;CAExB,MAAM,eAAe,SAAS;AAC9B,KAAI,MAAM,cAAe;CAGzB,MAAM,MAAM,aAAa,SAAS;AAGlC,KAAI,CAAC,4BAA4B,KAAK,KAAM;AAC5C,QAAO,IAAK;;AA8Bd,MAAa,aACX,OACA,UAAmB,OACX;CACR,MAAMA,WAAsB;CAE5B,MAAM,SAAS,cAAc,OAAO;CAEpC,MAAM,iBAAiB,mBAAmB;AAC1C,KAAI,CAAC,eAAgB,OAAM,IAAI,MAAM;CAErC,MAAM,gBAAgB,OAAO,IAAI,eAAe;CAChD,MAAM,YAAgB,cAAc;CAEpC,MAAMC,WAA8B;EAClC,gBAAoB;EACpB,SAAoB;EACpB,UAAoB;EACpB,iBAAoB;EACpB,QAAoB;EACpB,oBAAoB,wBAAwB,OAAO,eAAe,GAAG,IAAI,WAAW;;CAKtF,MAAM,WAAW,OAAO,SACpB,KAAK,OAAyB;EAC9B,KAAa,UAAU,EAAE;EACzB,WAAa,EAAE;EACf,aAAa,GAAG,EAAE,UAAU,GAAG,EAAE;EACjC,GAAG,EAAE,YAAY,EACf,MAAM,CACJ;GACE,MAAO;GACP,OAAO,EAAE;;EAIf,QAAQ,WAAY,UAAU,EAAE;;CAEpC,MAAM,iBAAiB,OAAO,SAE1B,QAAO,MAAK,EAAE,aAAa,EAAE,WAC7B,KAAK,OAAwB;EAC7B,KAAW,WAAY,UAAU,EAAE;EACnC,WAAW,EAAE;EACb,UAAW,EAAE;EACb,GAAG,EAAE,gBAAgB,EACnB,KAAK,EACH,OAAO,EAAE;EAGb,GAAG,EAAE,SAAS,EACZ,QAAQ,CAAC;GACP,OAAO,EAAE;GACT,MAAO;;EAGX,GAAG,EAAE,SAAS,EACZ,cAAc,CACZ;GACE,OAAO,EAAE;GACT,MAAO;;;CAMjB,MAAM,6BAAa,IAAI;AAEvB,QAAO,SAAS,SAAQ,MAAK;EAC3B,MAAM,KAAK,UAAU,EAAE;AACvB,MAAI,GAAI,YAAW,IAAI,EAAE,SAAS;;CAGpC,MAAM,WAAW,OAAO,SAAS,KAAK,OAAwB;EAC5D,KAAW,UAAU,EAAE;EACvB,WAAW,EAAE;EACb,UAAW,EAAE;EACb,MAAW;EACX,GAAG,EAAE,WAAW,EACd,KAAK,EACH,OAAO,EAAE;EAGb,GAAG,EAAE,SAAS,EACZ,QAAQ,CAAC;GACP,OAAO,EAAE;GACT,MAAO;;;CAKb,MAAM,SAAS,OAAO,OAAO,KAAK,OAAuB;EACvD,KAAa,UAAU,EAAE;EACzB,aAAa,EAAE;EACf,GAAI,EAAE,SAAS,OAAQ,EAAE,SAAS;EAClC,SAAa,EAAE,SAAS,MAAM,KAAK,KAAI,QAAK,WAAW,IAAIC,MAAI,QAAO,QAAKA,OAAK,SAAS;;CAG3F,MAAM,4BAAY,IAAI;CACtB,MAAM,wCAAwB,IAAI;AAClC,KAAI,OAAO,QAAQ;AACjB,SAAO,OAAO,SAAQ,WAAU;GAC9B,MAAM,KAAK,UAAU,OAAO;AAC5B,OAAI,GAAI,WAAU,IAAI,OAAO,QAAQ;;EAIvC,MAAM,qBAAqB,QAAQ;AACnC,MAAI,oBAAoB;AACtB,UAAO,QAAQ,SAAQ,MAAK;IAC1B,MAAM,MAAM,EAAE;AACd,QAAI,IAAK,uBAAsB,IAAI;;AAErC,yBAAsB,SAAQ,MAAK,UAAU,IAAI,GAAGC;;;CAIxD,MAAM,6BAAa,IAAI;AACvB,KAAI,OAAO,QACT,QAAO,QAAQ,SAAQ,YAAW;EAChC,MAAM,KAAK,UAAU,QAAQ;AAC7B,MAAI,GAAI,YAAW,IAAI,QAAQ,SAAS;;CAI5C,MAAM,2BAAW,IAAI;AACrB,KAAI,OAAO,MACT,QAAO,MAAM,SAAQ,UAAS;EAC5B,MAAM,KAAK,UAAU,MAAM;AAC3B,MAAI,GAAI,UAAS,IAAI,MAAM,OAAO;;CAItC,MAAM,8BAAc,IAAI;AACxB,KAAI,OAAO,KACT,QAAO,KAAK,SAAQ,SAAQ;EAC1B,MAAM,KAAK,UAAU,KAAK;AAC1B,MAAI,GAAI,aAAY,IAAI,KAAK,MAAM;;CAKvC,MAAM,6BAAa,IAAI;AACvB,KAAI,OAAO,QACT,QAAO,QAAQ,SAAQ,YAAW;AAChC,aAAW,IAAI,QAAQ,SAAS;;CAKpC,MAAM,kCAAkB,IAAI;AAC5B,KAAI,OAAO,OACT,QAAO,OAAO,SAAQ,WAAU;AAC9B,kBAAgB,IAAI,OAAO,QAAQ;;CAIvC,MAAM,4BAAY,IAAI;CACtB,MAAM,UAAU,OAAO,IAAI,KAAK,MAAuB;EACrD,MAAM,QAAQ,WAAW,WAAW,IAAI,EAAE,UAAU;EAGpD,MAAM,cAAc,gBAAgB,IAAI,EAAE,SAAS,YAAY,WAAW,IAAI,EAAE,UAAU,YAAY,EAAE,UAAU,EAAE;EAEpH,MAAMC,cAAY,EAAE,WAAW,IAC5B,MAAM,KACN,KAAI,QAAK,WAAW,IAAIF,IAAE,SAC1B,QAAQ,QAAkC,CAAC,CAACA,KAC5C,KAAI,QAAO,EAAE;EAChB,MAAMG,YAAU,EAAE,SAAS,IACxB,MAAM,KACN,KAAI,QAAK,SAAS,IAAIH,IAAE,SACxB,QAAQ,QAAkC,CAAC,CAACA,KAC5C,KAAI,QAAO,EAAE;AAEhB,SAAO;GACL,KAAiB,EAAE,OAAO,UAAU,EAAE,QAAQC;GAC7B;GACA;GACjB,SAAiB,EAAE,WAAW,gBAAgB,IAAI,EAAE,SAAS;GAC7D,UAAiBC;GACjB,QAAiBC;GACjB,iBAAiB,EAAE,aAAa,GAAG,EAAE,WAAW,QAAS,EAAE,WAAW,GAAG,EAAE,SAAS,aAAa;GACjG,GAAG,EAAE,UAAU,EAAE,QAAQ,UAAU,IAAI,EAAE;;OAEvC;AAEN,QAAO,IAAI,SAAQ,MAAK;AACtB,YAAU,IAAI,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAO,UAAU,EAAE,QAAQ;;CAGrF,MAAM,YAAY,OAAO,MAAM,KAAK,OAA0B;EAC5D,KAAiB,UAAU,EAAE;EAC7B,aAAiB,EAAE;EACnB,iBAAiB,EAAE,kBAAkB,SAAS,EAAE,mBAAmB;EACnE,GAAG,EAAE,UAAU,UAAU,EACvB,MAAM,CACJ;GACE,MAAO;GACP,OAAO,EAAE;;;CAMjB,IAAI,mCAAmC;CAEvC,MAAM,SAAS,OAAO,QAClB,QAAO,MAAK,CAAC,MAAM,SAAS,EAAE,UAC/B,KAAI,MAAK;EAER,MAAM,kBAAkB;GACtB,MAAM,WAAW,YAAY,EAAE;AAE/B,OAAI,YAAY,MAAM;AACpB,aAAS,KAAK;KAAE,MAAM;KAAsB,SAAS;;AACrD;;AAGF,UAAO;IACL,OAAOC,iBAAQ,UAAU,EAAE;IAC3B,KAAOA,iBAAQ,UAAU,EAAE,WAAW,IAAI,EAAE,QAAQ;;;EAIxD,MAAM,aAAa,QAAQ,oBAAoB,EAAE,QAAQ,qBAAqB,EAAE;EAChF,MAAM,WAAa,UAAU,IAAI;EAEjC,MAAM,YAAY,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,GAAG,EAAE;EACjD,IAAI,WAAY,UAAU,IAAI;EAE9B,MAAM,eAAe,EAAE,QAAQ,IAC5B,MAAM,KACN,KAAI,QAAK,YAAY,IAAIJ,IAAE,SAC3B,QAAQ,QAAkC,CAAC,CAACA;EAG/C,IAAI,cAAc,WACd,SACA,gBAAgB,IAAI,EAAE,SAAS,YAAY,WAAW,IAAI,EAAE,UAAU,YAAY,EAAE,UAAU,EAAE;EAGpG,MAAME,aAAW,WACb,SACA,EAAE,SACA,MAAM,KACP,KAAI,QAAK,WAAW,IAAIF,IAAE,SAC1B,QAAQ,QAAkC,CAAC,CAACA,KAC5C,KAAI,QAAO,EAAE;EAGlB,MAAMG,WAAS,WACX,SACA,EAAE,OACA,MAAM,KACP,KAAI,QAAK,SAAS,IAAIH,IAAE,SACxB,QAAQ,QAAkC,CAAC,CAACA,KAC5C,KAAI,QAAO,EAAE;EAElB,MAAM,WAAW,EAAE,SAAS,SAAS,EAAE,UAAU;AAGjD,MAAI,CAAC,YAAY,QAAQ,4BAA4B;AAEnD,cAAWC;GACX,MAAM,UAAU,WAAW,IAAI,EAAE;GACjC,MAAM,cAAc,SAAS,YAAY,EAAE;AAC3C,iBAAc,eAAe,SAAS,YAAY,EAAE;GACpD,MAAMI,YAA6B;IACjC,KAAa;IACA;IACb,SAAa;IACb,UAAaH;IACb,QAAaC;;AAEf,YAAS,KAAK;aACL,CAAC,UAAU;AACpB,uCAAoC;AACpC,UAAO;;AAGT,SAAO;GACL,KAAmB,UAAU,EAAE;GACZ;GACnB,GAAG;GACgB;GACnB,mBAAmB,YAAY;GAC/B,QAAmB;GACnB,QAAmB;GACnB;GACA,GAAI,CAAC,QAAQ,6BAA6B;IAAE;IAAU;OAAW;;IAElE,QAAQ,MAAkC,KAAK;CAEpD,MAAM,UAAU,OAAO,QACnB,KAAI,MAAK,YAAY,GAAG,eAAe,WACxC,QAAO,MAAK,EAAE,OAAO,SAAS;AAEjC,uBAAsB,SAAQ,MAAK;EACjC,MAAM,MAAM,UAAU,IAAI;AAC1B,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,6BAA6B;AAG/C,WAAS,KAAK,oBAAoB,KAAK,GAAG;;AAG5C,KAAI,mCAAmC,KAAK,CAAC,QAAQ,2BACnD,UAAS,QAAQ;EACf,MAAS;EACT,SAAS,EAAE,OAAO;;AAItB,QAAO;EACL;EACA,SAAW,WAAa;EACxB,UAAW,YAAa;EACxB,UAAY,YAAa,IAAI,OAAO,kBAAkB;EACtD,QAAW,UAAa;EACxB,WAAW,aAAa;EACxB,SAAW,WAAa;EACxB,QAAW,UAAa;EAExB,MAAM,EAAE"}
|
|
1
|
+
{"version":3,"file":"schedules.js","names":["warnings: Warning[]","settings: OutTypes.settings","x","uuidv4","teachers","groups","getDate","newCourse: OutTypes.course"],"sources":["../../../../src/Skola24/txt/from/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport { v4 as uuidv4 } from 'uuid'; // as we cannot use crypto's randomUUID in browser\nimport moment from 'moment';\nimport getDate from '../../../common/get-date';\nimport type { CoreTypes } from '../../../core';\nimport type { Data, Options, Types as Skola24Types, Warning } from '../types';\nimport { extractId } from './util';\nimport { fromWeekNumberRange, parsePeriod } from './period';\nimport { parseCalendarExceptions } from './calendar-exceptions';\nimport { extractStartAndEnd } from './division';\n\n\nconst daysToIndex = {\n 'Måndag': 0,\n 'Tisdag': 1,\n 'Onsdag': 2,\n 'Torsdag': 3,\n 'Fredag': 4,\n 'Lördag': 5,\n 'Söndag': 6,\n\n // and if ÅÄÖ is loaded correctly\n 'M�ndag': 0,\n 'L�rdag': 5,\n 'S�ndag': 6,\n} as Record<string, number | undefined>;\n\n\nfunction transformHeader (header: string) {\n return header.split(/[^a-zA-Z]+/g)[0];\n}\nconst parseConfig = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n // newline: \"\\r\\n\",\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n} as Papa.ParseConfig;\n\n\nfunction extractTables (input: string, warnings: Warning[]) {\n // split at [Tables] to get meta section and table section\n const split = input.split('[Tables]');\n const tables = split.at(1);\n if (!tables) throw new Error('Unable to extract tables from input');\n\n ////\n //// Capture the TABLE NAME and the TABLE CONTENT using regex\n ////\n //// TABLE NAME\n //// [Rows]\n //// TABLE CONTENT\n ////\n const regex = /([^\\r\\n]+)(?:\\r\\n|\\r|\\n)\\[Rows\\](?:\\r\\n|\\r|\\n)((?:[^\\r\\n].+(?:(?:\\r\\n|\\r|\\n)|$))*)/gm;\n const matches = [...tables.trim().matchAll(regex)];\n\n return matches\n .map(x => {\n // extract only the true table name \"<table name> (<number>)\", i.e., ignore the brackets and the preceding space\n const tableName = x.at(1)\n ?.trim()\n .match(/(.*?)(?:\\s*\\(\\d+\\))$/m)\n ?.at(1);\n if (!tableName) return;\n\n const tableContent = x.at(2)?.trim();\n if (!tableContent) return;\n const parsed = Papa.parse(tableContent, { ...parseConfig, transformHeader });\n return {\n tableName: tableName as keyof Data,\n parsed: parsed.data\n };\n })\n .filter((x): x is NonNullable<typeof x> => x != null)\n .reduce<Data>((acc, { tableName, parsed }) => {\n acc[tableName] = parsed;\n return acc;\n }, {} as Data);\n}\n\n\nfunction parseColor (colorValue: string | undefined) {\n if (colorValue == null) return;\n\n const integerValue = parseInt(colorValue);\n if (isNaN(integerValue)) return;\n\n // convert to decimal string\n const hex = integerValue.toString(16);\n\n // ensure its a valid color\n if (!/^(?:[0-9a-fA-F]{3}){1,2}$/.test(hex)) return;\n return `#${ hex }`;\n}\n\n\nexport namespace OutTypes {\n export type settings = CoreTypes.SerializedWithOptionalId.Settings;\n export type teacher = CoreTypes.SerializedWithOptionalId.Teacher;\n export type person = CoreTypes.SerializedWithOptionalId.Person;\n export type group = CoreTypes.SerializedWithOptionalId.Group;\n export type course = CoreTypes.SerializedWithOptionalId.Course;\n export type location = CoreTypes.SerializedWithOptionalId.Location;\n export type event = CoreTypes.SerializedWithOptionalId.Event;\n export type period = CoreTypes.SerializedWithOptionalId.Period;\n}\n\ntype Out = {\n settings: OutTypes.settings;\n periods: OutTypes.period [];\n teachers: OutTypes.teacher [];\n persons: OutTypes.person [];\n groups: OutTypes.group [];\n locations: OutTypes.location[];\n courses: OutTypes.course [];\n events: OutTypes.event [];\n meta?: {\n warnings: Warning[]\n };\n};\n\n\nexport const schedules = (\n input: string,\n options: Options = {}\n): Out => {\n const warnings: Warning[] = [];\n\n const tables = extractTables(input, warnings);\n\n const _scheduleRange = extractStartAndEnd(input); // need whole input file\n if (!_scheduleRange) throw new Error('Unable to extract schedule range');\n\n const scheduleStart = moment.utc(_scheduleRange.start);\n const startYear = scheduleStart.year();\n\n const settings: OutTypes.settings = {\n discretization: 5,\n numDays: 5,\n dayStart: '8:00',\n potentialCenter: '12:00',\n dayEnd: '17:00',\n calendarExceptions: parseCalendarExceptions(tables.PeriodGeneral?.at(0), startYear, warnings)\n };\n\n\n // Map to core structure\n const teachers = tables.Teacher\n ?.map((x): OutTypes.teacher => ({\n ids: extractId(x.GUID),\n signature: x.Teacher,\n displayName: `${x.FirstName} ${x.LastName}`,\n ...x.Category && {\n tags: [\n {\n type: 'category',\n value: x.Category\n }\n ]\n },\n person: `teacher.${ extractId(x.GUID) }`\n }));\n const teacherPersons = tables.Teacher\n // Filter out where either of firstname, lastname i missing, else it gives invalid persons\n ?.filter(x => x.FirstName && x.LastName)\n ?.map((x): OutTypes.person => ({\n ids: `teacher.${ extractId(x.GUID) }`,\n firstName: x.FirstName,\n lastName: x.LastName,\n ...x.PersonalCode && {\n SSN: {\n value: x.PersonalCode,\n }\n },\n ...x.EMail && {\n emails: [{\n value: x.EMail,\n type: 'organization'\n }]\n },\n ...x.Phone && {\n phoneNumbers: [\n {\n value: x.Phone,\n type: 'organization'\n }\n ]\n }\n }));\n\n const studentMap = new Map<string, string>();\n // create map of student SSN to student GUID\n tables.Student?.forEach(x => {\n const id = extractId(x.GUID);\n if (id) studentMap.set(x.Student, id);\n });\n\n const students = tables.Student?.map((x): OutTypes.person => ({\n ids: extractId(x.GUID),\n firstName: x.FirstName,\n lastName: x.LastName,\n type: 'Student',\n ...x.Student && {\n SSN: {\n value: x.Student,\n }\n },\n ...x.EMail && {\n emails: [{\n value: x.EMail,\n type: 'organization'\n }]\n }\n }));\n\n const groups = tables.Group?.map((x): OutTypes.group => ({\n ids: extractId(x.GUID),\n displayName: x.Group,\n ...(x.Class == '1') && { species: 'class' },\n members: x.Student?.split(',').map(x => studentMap.get(x)).filter(x => x != null) ?? []\n }));\n\n const periodMap = new Map<string, string>();\n const periodsFromWeekRanges = new Set<string>();\n if (tables.Period) {\n tables.Period.forEach(period => {\n const id = extractId(period.GUID);\n if (id) periodMap.set(period.Period, id);\n });\n\n // create additional periods corresponding to the lessons' week/actual weeks\n const _createPeriodsFrom = options.createPeriodsFrom;\n if (_createPeriodsFrom) {\n tables.Lesson?.forEach(x => {\n const key = x[_createPeriodsFrom];\n if (key) periodsFromWeekRanges.add(key);\n });\n periodsFromWeekRanges.forEach(x => periodMap.set(x, uuidv4()));\n }\n }\n\n const teacherMap = new Map<string, string>();\n if (tables.Teacher) {\n tables.Teacher.forEach(teacher => {\n const id = extractId(teacher.GUID);\n if (id) teacherMap.set(teacher.Teacher, id);\n });\n }\n\n const groupMap = new Map<string, string>();\n if (tables.Group) {\n tables.Group.forEach(group => {\n const id = extractId(group.GUID);\n if (id) groupMap.set(group.Group, id);\n });\n }\n\n const locationMap = new Map<string, string>();\n if (tables.Room) {\n tables.Room.forEach(room => {\n const id = extractId(room.GUID);\n if (id) locationMap.set(room.Room, id);\n });\n }\n\n // subject contains BackgroundColor(decimal) and FullText\n const subjectMap = new Map<string, Skola24Types.subject>();\n if (tables.Subject) {\n tables.Subject.forEach(subject => {\n subjectMap.set(subject.Subject, subject);\n });\n }\n\n // Course can contain FullText and Subject\n const parentCourseMap = new Map<string, Skola24Types.course>();\n if (tables.Course) {\n tables.Course.forEach(course => {\n parentCourseMap.set(course.Course, course);\n });\n }\n\n const courseMap = new Map<string, string | undefined>();\n const courses = tables.TA?.map((x): OutTypes.course => {\n const color = parseColor(subjectMap.get(x.Subject)?.BackgroundColor);\n\n // Course name is most specific (eg Administration 1), then subject name (Administration), then course code (eg ADMADM01), then subject code (eg ADM)\n const displayName = parentCourseMap.get(x.Course)?.FullText || subjectMap.get(x.Subject)?.FullText || x.Course || x.Subject;\n\n const teachers = (x.Teacher ?? [])\n .split(',')\n .map(x => teacherMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n const groups = (x.Group ?? [])\n .split(',')\n .map(x => groupMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n\n return {\n ids: x.GUID ? extractId(x.GUID) : uuidv4(),\n displayName: displayName,\n color: color,\n subject: x.Subject || parentCourseMap.get(x.Course)?.Subject,\n teachers: teachers,\n groups: groups,\n plannedDuration: x.TotalHours ? `${x.TotalHours} hrs` : (x.Weektime ? `${x.Weektime} min/week` : undefined),\n ...x.Period && { period: periodMap.get(x.Period) },\n } satisfies OutTypes.course;\n }) ?? [];\n\n tables.TA?.forEach(x => {\n courseMap.set(`${x.Subject}.${x.Teacher}.${x.Group}`, x.GUID ? extractId(x.GUID) : undefined);\n });\n\n const locations = tables.Room?.map((x): OutTypes.location => ({\n ids: extractId(x.GUID),\n displayName: x.Room,\n maximumCapacity: x.SeatingCapacity ? parseInt(x.SeatingCapacity) : undefined,\n ...x.Category?.length && {\n tags: [\n {\n type: 'category',\n value: x.Category\n }\n ]\n }\n }));\n\n let lessonMissingCourseWarningsCount = 0;\n\n const events = tables.Lesson\n ?.filter(x => !isNaN(parseInt(x.Length)))\n .map(x => {\n\n const position = (() => {\n const dayIndex = daysToIndex[x.DayOfWeek];\n\n if (dayIndex == null) {\n warnings.push({ code: 'lesson.invalid_day', context: x } satisfies Warning);\n return;\n }\n\n return {\n start: getDate(dayIndex, x.Starttime),\n end: getDate(dayIndex, x.Starttime).add(x.Length, 'minutes'),\n };\n })();\n\n const periodName = options.createPeriodsFrom ? x[options.createPeriodsFrom] : x.Period;\n const periodId = periodMap.get(periodName);\n\n const courseKey = `${x.Subject}.${x.Teacher}.${x.Group}`;\n let courseId = courseMap.get(courseKey);\n\n const inLocations = (x.Room ?? [])\n .split(',')\n .map(x => locationMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x);\n\n // if there is a connected course use its display name\n let displayName = courseId\n ? undefined\n : parentCourseMap.get(x.Course)?.FullText || subjectMap.get(x.Subject)?.FullText || x.Course || x.Subject;\n\n // if there is a connected course use its teachers\n const teachers = courseId\n ? undefined\n : x.Teacher\n ?.split(',')\n .map(x => teacherMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n\n // if there is a connected course use its groups\n const groups = courseId\n ? undefined\n : x.Group\n ?.split(',')\n .map(x => groupMap.get(x.trim()))\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(to => ({ to }));\n\n const duration = x.Length ? parseInt(x.Length) : undefined;\n\n // If no courseId found, we handle it according to options.includeEventsMissingCourse\n if (!courseId && options.includeEventsMissingCourse) {\n // Create a new course for this event\n courseId = uuidv4();\n const subject = subjectMap.get(x.Subject);\n const subjectName = subject?.FullText || x.Subject;\n displayName = displayName || subject?.FullText || x.Subject;\n const newCourse: OutTypes.course = {\n ids: courseId,\n displayName: displayName,\n subject: subjectName,\n teachers: teachers,\n groups: groups,\n };\n courses?.push(newCourse);\n } else if (!courseId) {\n lessonMissingCourseWarningsCount += 1;\n return null; // will be filtered out later\n }\n\n return {\n ids: extractId(x.GUID),\n displayName: displayName,\n ...position,\n duration: duration,\n preferredDuration: duration ?? 0,\n course: courseId,\n period: periodId,\n inLocations,\n ...(!options.includeEventsMissingCourse ? { teachers, groups } : undefined),\n } satisfies OutTypes.event;\n }).filter((x): x is NonNullable<typeof x> => x != null);\n\n const periods = tables.Period\n ?.map(x => parsePeriod(x, scheduleStart, warnings))\n .filter(x => x.ranges.length > 0);\n\n periodsFromWeekRanges.forEach(x => {\n const ids = periodMap.get(x);\n if (!ids) {\n throw new Error(`Unable to find period for ${x}`);\n return;\n }\n periods?.push(fromWeekNumberRange(ids, x, scheduleStart));\n });\n\n if (lessonMissingCourseWarningsCount > 0 && !options.includeEventsMissingCourse) {\n warnings.unshift({\n code: 'ignoring_lessons_missing_course',\n context: { count: lessonMissingCourseWarningsCount }\n } satisfies Warning);\n }\n\n return {\n settings,\n periods: periods ?? [],\n teachers: teachers ?? [],\n persons: (students ?? []).concat(teacherPersons ?? []),\n groups: groups ?? [],\n locations: locations ?? [],\n courses: courses ?? [],\n events: events ?? [],\n\n meta: { warnings }\n } satisfies Out;\n};"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","names":[],"sources":["../../../../src/Skola24/txt/from/util.ts"],"sourcesContent":["\nexport function extractId (id: string) {\n // ensure the id is on the form \"{...}\" where ... is the value to be extracted\n if (id.startsWith('{') && id.endsWith('}')) {\n return id.slice(1, -1);\n }\n throw new Error(`Invalid ID format: ${id}`);\n}\n\n\nexport function getStartYear (input: string): undefined | number {\n // extract base and offset year\n const _baseYear = input.match(/^BaseYear=(\\d{4})$/m) ?.at(1);\n const _offsetYear = input.match(/^OffsetYear=(\\d{1,2})$/m)?.at(1);\n if (_baseYear == null || _offsetYear == null) return;\n\n // the year of the start date\n const startYear = parseInt(_baseYear, 10) + parseInt(_offsetYear, 10);\n if (isNaN(startYear)) return;\n\n return startYear;\n}"],"mappings":";AACA,SAAgB,UAAW,IAAY;AAErC,KAAI,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"util.js","names":[],"sources":["../../../../src/Skola24/txt/from/util.ts"],"sourcesContent":["\nexport function extractId (id: string) {\n // ensure the id is on the form \"{...}\" where ... is the value to be extracted\n if (id.startsWith('{') && id.endsWith('}')) {\n return id.slice(1, -1);\n }\n throw new Error(`Invalid ID format: ${id}`);\n}\n\n\nexport function getStartYear (input: string): undefined | number {\n // extract base and offset year\n const _baseYear = input.match(/^BaseYear=(\\d{4})$/m) ?.at(1);\n const _offsetYear = input.match(/^OffsetYear=(\\d{1,2})$/m)?.at(1);\n if (_baseYear == null || _offsetYear == null) return;\n\n // the year of the start date\n const startYear = parseInt(_baseYear, 10) + parseInt(_offsetYear, 10);\n if (isNaN(startYear)) return;\n\n return startYear;\n}"],"mappings":";AACA,SAAgB,UAAW,IAAY;AAErC,KAAI,GAAG,WAAW,IAAI,IAAI,GAAG,SAAS,IAAI,CACxC,QAAO,GAAG,MAAM,GAAG,GAAG;AAExB,OAAM,IAAI,MAAM,sBAAsB,KAAK;;AAI7C,SAAgB,aAAc,OAAmC;CAE/D,MAAM,YAAc,MAAM,MAAM,sBAAsB,EAAM,GAAG,EAAE;CACjE,MAAM,cAAc,MAAM,MAAM,0BAA0B,EAAE,GAAG,EAAE;AACjE,KAAI,aAAa,QAAQ,eAAe,KAAM;CAG9C,MAAM,YAAY,SAAS,WAAW,GAAG,GAAG,SAAS,aAAa,GAAG;AACrE,KAAI,MAAM,UAAU,CAAE;AAEtB,QAAO"}
|
|
@@ -2,6 +2,7 @@ import { Options, Types, Warning } from "./types/index.js";
|
|
|
2
2
|
import { Types as Types$1 } from "../../core/types/index.js";
|
|
3
3
|
import { OutTypes } from "./from/schedules.js";
|
|
4
4
|
import { export_default } from "./to/index.js";
|
|
5
|
+
import "../../index.js";
|
|
5
6
|
|
|
6
7
|
//#region src/Skola24/txt/index.d.ts
|
|
7
8
|
declare class Map {
|
|
@@ -151,14 +151,9 @@ var schedules_default = (data, options = {}) => {
|
|
|
151
151
|
let period = event.period == null ? course?.period : event.period;
|
|
152
152
|
if (isString(period)) period = periodMap.get(period);
|
|
153
153
|
if (period && !("ranges" in period)) period = void 0;
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
const g$1 = event.groups == null ? course?.groups : event.groups;
|
|
158
|
-
const groupIds = g$1?.map((x) => getVertexId(x.to, options));
|
|
159
|
-
const groups$1 = groupIds?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
|
|
160
|
-
const locationIds = event.inLocations?.map((x) => x ? getVertexId(x, options) : null).filter((x) => x != null);
|
|
161
|
-
const locations$1 = locationIds?.map((id) => locationMap.get(id)).filter(Boolean) ?? [];
|
|
154
|
+
const teachers$1 = ((event.teachers == null ? course?.teachers : event.teachers)?.map((x) => getVertexId(x.to, options)))?.map((id) => teacherMap.get(id)).filter(Boolean) ?? [];
|
|
155
|
+
const groups$1 = ((event.groups == null ? course?.groups : event.groups)?.map((x) => getVertexId(x.to, options)))?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
|
|
156
|
+
const locations$1 = (event.inLocations?.map((x) => x ? getVertexId(x, options) : null).filter((x) => x != null))?.map((id) => locationMap.get(id)).filter(Boolean) ?? [];
|
|
162
157
|
const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString("sv-SE", {
|
|
163
158
|
weekday: "long",
|
|
164
159
|
timeZone: "UTC"
|
|
@@ -249,10 +244,8 @@ var schedules_default = (data, options = {}) => {
|
|
|
249
244
|
const totalHoursRegex = /(\d+) hrs/;
|
|
250
245
|
const weekTimeRegex = /(\d+) min\/week/;
|
|
251
246
|
const c = courses?.map((course) => {
|
|
252
|
-
const
|
|
253
|
-
const
|
|
254
|
-
const groupIds = course.groups?.map((x) => getVertexId(x.to, options)).filter(Boolean);
|
|
255
|
-
const groups$1 = groupIds?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
|
|
247
|
+
const teachers$1 = (course.teachers?.map((x) => getVertexId(x.to, options)).filter(Boolean))?.map((id) => teacherMap.get(id)).filter(Boolean) ?? [];
|
|
248
|
+
const groups$1 = (course.groups?.map((x) => getVertexId(x.to, options)).filter(Boolean))?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
|
|
256
249
|
const syllabusId = isString(course?.syllabus) ? course.syllabus : course?.syllabus && isObjectIdOrHexString(course?.syllabus) ? (course?.syllabus).toString() : void 0;
|
|
257
250
|
const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus;
|
|
258
251
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.js","names":["t","teachers","g","groups","locations"],"sources":["../../../../src/Skola24/txt/to/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport moment from 'moment';\nimport { isString } from 'lodash-es';\nimport type { Types as MongooseTypes } from 'mongoose';\nimport { isObjectIdOrHexString } from 'mongoose';\nimport type { CoreTypes } from '../../../core';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\nconst papaOptions = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n newline: '\\r\\n',\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n // columns: null //or array of strings\n} as Papa.UnparseConfig;\n\nconst uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport default (\n data: CoreTypes.Mixed.Schedule,\n options: BaseOptions = {}\n): string => {\n const { locations, teachers, groups, persons, events, courses, periods, syllabuses, divisions } = data;\n const { start, /* end, */ displayName } = divisions ?? data as unknown as CoreTypes.Mixed.Division;\n\n const startYear = moment.utc(start).year();\n const startMonth = moment.utc(start).month();\n\n // Set cvs to the source section\n let csv = `[Source]${papaOptions.newline}ApplicationVerMajor=4${papaOptions.newline}ApplicationVerMinor=0${papaOptions.newline}DatabaseRevNo=527${papaOptions.newline}CurrentNovaschemDatabase=${papaOptions.newline}User=${papaOptions.newline}`;\n csv += `SchoolID=RS${papaOptions.newline}School=${displayName}${papaOptions.newline}County=RS${papaOptions.newline}`;\n csv += `BaseYear=${startYear}${papaOptions.newline}OffsetYear=0${papaOptions.newline}OffsetMonth=${startMonth}${papaOptions.newline}CreationDate=${moment().format('YYYY-MM-DD')}${papaOptions.newline}${papaOptions.newline}`;\n // add destination section to csv\n csv += `[Destination]${papaOptions.newline}Application=${papaOptions.newline}ApplicationID=${papaOptions.newline}${papaOptions.newline}`;\n\n // add database options to csv\n csv += `[DatabaseOptions]${papaOptions.newline}Update=TRUE${papaOptions.newline}AddNew=TRUE${papaOptions.newline}${papaOptions.newline}`;\n\n // start tables section\n csv += `[Tables]${papaOptions.newline}${papaOptions.newline}`;\n\n // append teachers to csv\n const t = teachers?.map(teacher => {\n return {\n 'Teacher (6001)': teacher.signature,\n 'GUID (5800)': (teacher.ids && uuid.test(teacher.ids)) ? `{${teacher.ids}}` : '',\n 'Category (6002)': '',\n 'Title (6006)': '',\n 'Phone (6033)': '',\n 'EvaluationNumber (6014)': '',\n ... 'person' in teacher && typeof teacher.person == 'object'\n ? {\n 'PersonalCode (6028)': 'SSN' in teacher.person ? (teacher.person?.SSN?.value ?? '') : '',\n 'LastName (6003)': 'lastName' in teacher.person ? (teacher.person?.lastName ?? '') : '',\n 'FirstName (6004)': 'firstName' in teacher.person ? (teacher.person?.firstName ?? '') : '',\n 'EMail (6034)': 'emails' in teacher.person ? (teacher.person?.emails?.[0]?.value ?? '') : '',\n }\n : null\n };\n }) ?? [];\n csv += `${papaOptions.newline}Teacher (6000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (t.length) {\n csv += Papa.unparse(t, papaOptions);\n } else {\n csv += ['Teacher (6001)', 'GUID (5800)', 'Category (6002)', 'PersonalCode (6028)', 'LastName (6003)', 'Title (6006)', 'FirstName (6004)', 'Phone (6033)', 'EMail (6034)', 'EvaluationNumber (6014)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append students to csv\n const s = persons?.filter(person => {\n return person.type != 'Teacher';\n }).map(person => {\n return {\n 'Student (7201)': person.SSN?.value,\n 'GUID (5800)': (person.ids && uuid.test(person.ids)) ? `{${person.ids}}` : '',\n 'Category (7305)': '',\n 'LastName (7202)': person.lastName ?? '',\n 'FirstName (7211)': person.firstName ?? '',\n 'EMail (7215)': person.emails?.[0]?.value ?? ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Student (7200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (s.length) {\n csv += Papa.unparse(s, papaOptions);\n } else {\n csv += ['Student (7201)', 'GUID (5800)', 'Category (7305)', 'LastName (7202)', 'FirstName (7211)', 'EMail (7215)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // create a map of students.id to students.SSN\n const studentMap = new Map(persons?.filter(x => x.type != 'Teacher').map(x => [getVertexId(x, options), x.SSN?.value ?? '']));\n\n // append groups to csv\n const g = groups?.map(group => {\n return {\n 'Group (6201)': group.displayName!,\n 'GUID (5800)': (group.ids && uuid.test(group.ids)) ? `{${group.ids}}` : '',\n 'Class (6210)': group.species == 'class' ? 1 : 0,\n 'Teacher (6204)': '',\n 'IClass (6206)': '',\n 'Student (6205)': group.members?.map(x => getVertexId(x, options)).map(x => studentMap.get(x)).filter(Boolean).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Group (6200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (g.length) {\n csv += Papa.unparse(g, papaOptions);\n } else {\n csv += ['Group (6201)', 'GUID (5800)', 'Class (6210)', 'Teacher (6204)', 'IClass (6206)', 'Student (6205)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append locations to csv\n const l = locations?.map(location => {\n return {\n 'Room (6601)': location.displayName!,\n 'GUID (5800)': (location.ids && uuid.test(location.ids)) ? `{${location.ids}}` : '',\n 'Category (6602)': location.tags?.find(tag => tag.type == 'category')?.value ?? '',\n 'SeatingCapacity (6607)': location.maximumCapacity,\n };\n }) ?? [];\n csv += `${papaOptions.newline}Room (6600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (l.length) {\n csv += Papa.unparse(l, papaOptions);\n } else {\n csv += ['Room (6601)', 'GUID (5800)', 'Category (6602)', 'SeatingCapacity (6607)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append periods to csv\n const p = periods?.map(period => {\n return {\n 'Period (8001)': period.displayName!,\n 'GUID (5800)': (period.ids && uuid.test(period.ids)) ? `{${period.ids}}` : '',\n 'TextBelowSchedule (8002)': period.displayName!,\n 'Category (8006)': '',\n 'Calendar (8005)': period.ranges?.map(range => `${moment.utc(range.start).format('D/M')}-${moment.utc(range.end).format('D/M')}`).join(', ')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Period (8000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (p.length) {\n csv += Papa.unparse(p, papaOptions);\n } else {\n csv += ['Period (8001)', 'GUID (5800)', 'TextBelowSchedule (8002)', 'Category (8006)', 'Calendar (8005)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n const courseMap = new Map(data.courses ?.map(x => [getVertexId(x, options), x]));\n const periodMap = new Map(data.periods ?.map(x => [getVertexId(x, options), x]));\n const teacherMap = new Map(data.teachers ?.map(x => [getVertexId(x, options), x]));\n const groupMap = new Map(data.groups ?.map(x => [getVertexId(x, options), x]));\n const locationMap = new Map(data.locations ?.map(x => [getVertexId(x, options), x]));\n const syllabusMap = new Map(data.syllabuses?.map(x => [getVertexId(x, options), x]));\n\n // append lessons to csv\n const e = events\n // ?.filter(x => !isNaN(Date.parse(x.start?.toString() ?? '')))\n .map((event, index) => {\n if (!event.start || !event.end) return;\n\n const courseId = event.course ? getVertexId(event.course, options) : undefined;\n const course = courseId ? courseMap.get(courseId) : undefined;\n\n // Only use deserialize period\n let period = event.period == null ? course?.period : event.period;\n if (isString(period))\n period = periodMap.get(period);\n if ((period && !('ranges' in period)))\n period = undefined;\n\n // Only use deserialize teachers\n const t = event.teachers == null ? course?.teachers : event.teachers;\n const teacherIds = t?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const g = event.groups == null ? course?.groups : event.groups;\n const groupIds = g?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize locations\n const locationIds = event.inLocations?.map(x => x ? getVertexId(x, options) : null).filter(x => x != null);\n const locations = locationIds?.map(id => locationMap.get(id)).filter(Boolean) ?? [];\n const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString('sv-SE', { weekday: 'long', timeZone: 'UTC' });\n\n // Syllabus of the course\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.Deep.Syllabus | undefined;\n\n // capitalize first letter of dayOfWeek\n const dayOfWeekCapitalized = dayOfWeek.charAt(0).toUpperCase() + dayOfWeek.slice(1);\n return {\n 'PK (7100)': index + 1,\n 'GUID (5800)': (event.ids && uuid.test(event.ids)) ? `{${event.ids}}` : '',\n 'DayOfWeek (7101)': dayOfWeekCapitalized,\n 'Starttime (7102)': moment.utc(event.start).format('HH:mm'),\n 'Length (7115)': event.duration,\n 'Course (7106)': syllabus?.courseCode,\n 'Subject (7103)': syllabus?.subjectCode ?? course?.subject ?? '',\n 'Teacher (7104)': teachers ?.map(x => x?.signature ).filter(Boolean).join(','),\n 'Group (7105)': groups ?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Room (7107)': locations?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Period (7108)': '',\n 'Week (7109)': '',\n 'ActualWeeks (7167)': period?.ranges?.map(range => `${moment.utc(range.start).week()}-${moment.utc(range.end).week()}`).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Lesson (7100)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (e.length) {\n csv += Papa.unparse(e, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append subjects to csv, is empty for now\n // csv += `Subject (6400)${options.newline}[Rows]${options.newline}`;\n // csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(options.delimiter);\n // csv += options.newline;\n\n // append syllabus to csv\n const courseSyllabuses = syllabuses?.filter(syllabus => !!syllabus.courseName).map(syllabus => {\n return {\n 'Course (7601)': syllabus.courseCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (7602)': syllabus.courseName,\n 'Subject (7603)': syllabus.subjectCode ?? '',\n 'Points (7604)': syllabus.points\n };\n }) ?? [];\n csv += `${papaOptions.newline}Course (7600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (courseSyllabuses.length) {\n csv += Papa.unparse(courseSyllabuses, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n const subjectSyllabuses = syllabuses?.reduce((unique, syllabus) => {\n if (syllabus.subjectCode && !unique.seen.has(syllabus.subjectCode)) {\n unique.seen.add(syllabus.subjectCode);\n unique.result.push({\n 'Subject (6401)': syllabus.subjectCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (6403)': syllabus.subjectName,\n });\n }\n return unique;\n }, {\n seen: new Set<string>(),\n result: [] as Array<{\n 'Subject (6401)': string;\n 'GUID (5800)': string | undefined;\n 'FullText (6403)': string;\n }>\n })?.result ?? [];\n csv += `Subject (6400)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (subjectSyllabuses.length) {\n csv += Papa.unparse(subjectSyllabuses, papaOptions);\n } else {\n csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(papaOptions.delimiter);\n }\n\n const totalHoursRegex = /(\\d+) hrs/;\n const weekTimeRegex = /(\\d+) min\\/week/;\n const c = courses?.map(course => {\n // Only use deserialize teachers\n const teacherIds = course.teachers?.map(x => getVertexId(x.to, options)).filter(Boolean);\n const teachers = teacherIds?.map(id => teacherMap.get(id)!).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const groupIds = course.groups?.map(x => getVertexId(x.to, options)).filter(Boolean);\n const groups = groupIds?.map(id => groupMap.get(id)!).filter(Boolean) ?? [];\n\n // Only use deserialize syllabus\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.Deep.Syllabus | undefined;\n\n return {\n 'PK (8200)': '',\n 'GUID (5800)': course.ids,\n 'OriginalRecord (8224)': '1',\n 'CreateLesson (8227)': '1',\n 'Course (8202)': syllabus?.courseCode,\n 'Subject (8209)': syllabus?.subjectCode ?? course.subject, // Nikos ansvarig för framtida buggar\n 'Teacher (8210)': teachers?.map(teacher => teacher.signature).filter(Boolean).join(','),\n 'Group (8203)': groups?.map(group => group.displayName).filter(Boolean).join(','),\n 'TotalHours (8204)': (course.plannedDuration && totalHoursRegex.test(course.plannedDuration)) ? totalHoursRegex.exec(course.plannedDuration)![1] : '',\n 'Weektime (8208)': (course.plannedDuration && weekTimeRegex.test(course.plannedDuration)) ? weekTimeRegex.exec(course.plannedDuration)![1] : '',\n 'Blockname (8215)': '',\n 'Period (8206)': '',\n 'Week (8207)': '',\n 'NotPeriod (8212)': '',\n 'NotWeek (8213)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}TA (8200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (c.length) {\n csv += Papa.unparse(c, papaOptions);\n } else {\n csv += ['Course (8202)', 'GUID (5800)', 'Subject (8209)', 'Teacher (8210)', 'Group (8203)', 'TotalHours (8204)', 'Weektime (8208)', 'Blockname (8215)', 'Period (8206)', 'Week (8207)', 'NotPeriod (8212)', 'NotWeek (8213)'].join(papaOptions.delimiter);\n }\n\n return csv;\n};"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schedules.js","names":["teachers","groups","locations"],"sources":["../../../../src/Skola24/txt/to/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport moment from 'moment';\nimport { isString } from 'lodash-es';\nimport type { Types as MongooseTypes } from 'mongoose';\nimport { isObjectIdOrHexString } from 'mongoose';\nimport type { CoreTypes } from '../../../core';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\nconst papaOptions = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n newline: '\\r\\n',\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n // columns: null //or array of strings\n} as Papa.UnparseConfig;\n\nconst uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport default (\n data: CoreTypes.Mixed.Schedule,\n options: BaseOptions = {}\n): string => {\n const { locations, teachers, groups, persons, events, courses, periods, syllabuses, divisions } = data;\n const { start, /* end, */ displayName } = divisions ?? data as unknown as CoreTypes.Mixed.Division;\n\n const startYear = moment.utc(start).year();\n const startMonth = moment.utc(start).month();\n\n // Set cvs to the source section\n let csv = `[Source]${papaOptions.newline}ApplicationVerMajor=4${papaOptions.newline}ApplicationVerMinor=0${papaOptions.newline}DatabaseRevNo=527${papaOptions.newline}CurrentNovaschemDatabase=${papaOptions.newline}User=${papaOptions.newline}`;\n csv += `SchoolID=RS${papaOptions.newline}School=${displayName}${papaOptions.newline}County=RS${papaOptions.newline}`;\n csv += `BaseYear=${startYear}${papaOptions.newline}OffsetYear=0${papaOptions.newline}OffsetMonth=${startMonth}${papaOptions.newline}CreationDate=${moment().format('YYYY-MM-DD')}${papaOptions.newline}${papaOptions.newline}`;\n // add destination section to csv\n csv += `[Destination]${papaOptions.newline}Application=${papaOptions.newline}ApplicationID=${papaOptions.newline}${papaOptions.newline}`;\n\n // add database options to csv\n csv += `[DatabaseOptions]${papaOptions.newline}Update=TRUE${papaOptions.newline}AddNew=TRUE${papaOptions.newline}${papaOptions.newline}`;\n\n // start tables section\n csv += `[Tables]${papaOptions.newline}${papaOptions.newline}`;\n\n // append teachers to csv\n const t = teachers?.map(teacher => {\n return {\n 'Teacher (6001)': teacher.signature,\n 'GUID (5800)': (teacher.ids && uuid.test(teacher.ids)) ? `{${teacher.ids}}` : '',\n 'Category (6002)': '',\n 'Title (6006)': '',\n 'Phone (6033)': '',\n 'EvaluationNumber (6014)': '',\n ... 'person' in teacher && typeof teacher.person == 'object'\n ? {\n 'PersonalCode (6028)': 'SSN' in teacher.person ? (teacher.person?.SSN?.value ?? '') : '',\n 'LastName (6003)': 'lastName' in teacher.person ? (teacher.person?.lastName ?? '') : '',\n 'FirstName (6004)': 'firstName' in teacher.person ? (teacher.person?.firstName ?? '') : '',\n 'EMail (6034)': 'emails' in teacher.person ? (teacher.person?.emails?.[0]?.value ?? '') : '',\n }\n : null\n };\n }) ?? [];\n csv += `${papaOptions.newline}Teacher (6000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (t.length) {\n csv += Papa.unparse(t, papaOptions);\n } else {\n csv += ['Teacher (6001)', 'GUID (5800)', 'Category (6002)', 'PersonalCode (6028)', 'LastName (6003)', 'Title (6006)', 'FirstName (6004)', 'Phone (6033)', 'EMail (6034)', 'EvaluationNumber (6014)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append students to csv\n const s = persons?.filter(person => {\n return person.type != 'Teacher';\n }).map(person => {\n return {\n 'Student (7201)': person.SSN?.value,\n 'GUID (5800)': (person.ids && uuid.test(person.ids)) ? `{${person.ids}}` : '',\n 'Category (7305)': '',\n 'LastName (7202)': person.lastName ?? '',\n 'FirstName (7211)': person.firstName ?? '',\n 'EMail (7215)': person.emails?.[0]?.value ?? ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Student (7200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (s.length) {\n csv += Papa.unparse(s, papaOptions);\n } else {\n csv += ['Student (7201)', 'GUID (5800)', 'Category (7305)', 'LastName (7202)', 'FirstName (7211)', 'EMail (7215)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // create a map of students.id to students.SSN\n const studentMap = new Map(persons?.filter(x => x.type != 'Teacher').map(x => [getVertexId(x, options), x.SSN?.value ?? '']));\n\n // append groups to csv\n const g = groups?.map(group => {\n return {\n 'Group (6201)': group.displayName!,\n 'GUID (5800)': (group.ids && uuid.test(group.ids)) ? `{${group.ids}}` : '',\n 'Class (6210)': group.species == 'class' ? 1 : 0,\n 'Teacher (6204)': '',\n 'IClass (6206)': '',\n 'Student (6205)': group.members?.map(x => getVertexId(x, options)).map(x => studentMap.get(x)).filter(Boolean).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Group (6200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (g.length) {\n csv += Papa.unparse(g, papaOptions);\n } else {\n csv += ['Group (6201)', 'GUID (5800)', 'Class (6210)', 'Teacher (6204)', 'IClass (6206)', 'Student (6205)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append locations to csv\n const l = locations?.map(location => {\n return {\n 'Room (6601)': location.displayName!,\n 'GUID (5800)': (location.ids && uuid.test(location.ids)) ? `{${location.ids}}` : '',\n 'Category (6602)': location.tags?.find(tag => tag.type == 'category')?.value ?? '',\n 'SeatingCapacity (6607)': location.maximumCapacity,\n };\n }) ?? [];\n csv += `${papaOptions.newline}Room (6600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (l.length) {\n csv += Papa.unparse(l, papaOptions);\n } else {\n csv += ['Room (6601)', 'GUID (5800)', 'Category (6602)', 'SeatingCapacity (6607)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append periods to csv\n const p = periods?.map(period => {\n return {\n 'Period (8001)': period.displayName!,\n 'GUID (5800)': (period.ids && uuid.test(period.ids)) ? `{${period.ids}}` : '',\n 'TextBelowSchedule (8002)': period.displayName!,\n 'Category (8006)': '',\n 'Calendar (8005)': period.ranges?.map(range => `${moment.utc(range.start).format('D/M')}-${moment.utc(range.end).format('D/M')}`).join(', ')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Period (8000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (p.length) {\n csv += Papa.unparse(p, papaOptions);\n } else {\n csv += ['Period (8001)', 'GUID (5800)', 'TextBelowSchedule (8002)', 'Category (8006)', 'Calendar (8005)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n const courseMap = new Map(data.courses ?.map(x => [getVertexId(x, options), x]));\n const periodMap = new Map(data.periods ?.map(x => [getVertexId(x, options), x]));\n const teacherMap = new Map(data.teachers ?.map(x => [getVertexId(x, options), x]));\n const groupMap = new Map(data.groups ?.map(x => [getVertexId(x, options), x]));\n const locationMap = new Map(data.locations ?.map(x => [getVertexId(x, options), x]));\n const syllabusMap = new Map(data.syllabuses?.map(x => [getVertexId(x, options), x]));\n\n // append lessons to csv\n const e = events\n // ?.filter(x => !isNaN(Date.parse(x.start?.toString() ?? '')))\n .map((event, index) => {\n if (!event.start || !event.end) return;\n\n const courseId = event.course ? getVertexId(event.course, options) : undefined;\n const course = courseId ? courseMap.get(courseId) : undefined;\n\n // Only use deserialize period\n let period = event.period == null ? course?.period : event.period;\n if (isString(period))\n period = periodMap.get(period);\n if ((period && !('ranges' in period)))\n period = undefined;\n\n // Only use deserialize teachers\n const t = event.teachers == null ? course?.teachers : event.teachers;\n const teacherIds = t?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const g = event.groups == null ? course?.groups : event.groups;\n const groupIds = g?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize locations\n const locationIds = event.inLocations?.map(x => x ? getVertexId(x, options) : null).filter(x => x != null);\n const locations = locationIds?.map(id => locationMap.get(id)).filter(Boolean) ?? [];\n const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString('sv-SE', { weekday: 'long', timeZone: 'UTC' });\n\n // Syllabus of the course\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.Deep.Syllabus | undefined;\n\n // capitalize first letter of dayOfWeek\n const dayOfWeekCapitalized = dayOfWeek.charAt(0).toUpperCase() + dayOfWeek.slice(1);\n return {\n 'PK (7100)': index + 1,\n 'GUID (5800)': (event.ids && uuid.test(event.ids)) ? `{${event.ids}}` : '',\n 'DayOfWeek (7101)': dayOfWeekCapitalized,\n 'Starttime (7102)': moment.utc(event.start).format('HH:mm'),\n 'Length (7115)': event.duration,\n 'Course (7106)': syllabus?.courseCode,\n 'Subject (7103)': syllabus?.subjectCode ?? course?.subject ?? '',\n 'Teacher (7104)': teachers ?.map(x => x?.signature ).filter(Boolean).join(','),\n 'Group (7105)': groups ?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Room (7107)': locations?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Period (7108)': '',\n 'Week (7109)': '',\n 'ActualWeeks (7167)': period?.ranges?.map(range => `${moment.utc(range.start).week()}-${moment.utc(range.end).week()}`).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Lesson (7100)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (e.length) {\n csv += Papa.unparse(e, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append subjects to csv, is empty for now\n // csv += `Subject (6400)${options.newline}[Rows]${options.newline}`;\n // csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(options.delimiter);\n // csv += options.newline;\n\n // append syllabus to csv\n const courseSyllabuses = syllabuses?.filter(syllabus => !!syllabus.courseName).map(syllabus => {\n return {\n 'Course (7601)': syllabus.courseCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (7602)': syllabus.courseName,\n 'Subject (7603)': syllabus.subjectCode ?? '',\n 'Points (7604)': syllabus.points\n };\n }) ?? [];\n csv += `${papaOptions.newline}Course (7600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (courseSyllabuses.length) {\n csv += Papa.unparse(courseSyllabuses, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n const subjectSyllabuses = syllabuses?.reduce((unique, syllabus) => {\n if (syllabus.subjectCode && !unique.seen.has(syllabus.subjectCode)) {\n unique.seen.add(syllabus.subjectCode);\n unique.result.push({\n 'Subject (6401)': syllabus.subjectCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (6403)': syllabus.subjectName,\n });\n }\n return unique;\n }, {\n seen: new Set<string>(),\n result: [] as Array<{\n 'Subject (6401)': string;\n 'GUID (5800)': string | undefined;\n 'FullText (6403)': string;\n }>\n })?.result ?? [];\n csv += `Subject (6400)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (subjectSyllabuses.length) {\n csv += Papa.unparse(subjectSyllabuses, papaOptions);\n } else {\n csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(papaOptions.delimiter);\n }\n\n const totalHoursRegex = /(\\d+) hrs/;\n const weekTimeRegex = /(\\d+) min\\/week/;\n const c = courses?.map(course => {\n // Only use deserialize teachers\n const teacherIds = course.teachers?.map(x => getVertexId(x.to, options)).filter(Boolean);\n const teachers = teacherIds?.map(id => teacherMap.get(id)!).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const groupIds = course.groups?.map(x => getVertexId(x.to, options)).filter(Boolean);\n const groups = groupIds?.map(id => groupMap.get(id)!).filter(Boolean) ?? [];\n\n // Only use deserialize syllabus\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.Deep.Syllabus | undefined;\n\n return {\n 'PK (8200)': '',\n 'GUID (5800)': course.ids,\n 'OriginalRecord (8224)': '1',\n 'CreateLesson (8227)': '1',\n 'Course (8202)': syllabus?.courseCode,\n 'Subject (8209)': syllabus?.subjectCode ?? course.subject, // Nikos ansvarig för framtida buggar\n 'Teacher (8210)': teachers?.map(teacher => teacher.signature).filter(Boolean).join(','),\n 'Group (8203)': groups?.map(group => group.displayName).filter(Boolean).join(','),\n 'TotalHours (8204)': (course.plannedDuration && totalHoursRegex.test(course.plannedDuration)) ? totalHoursRegex.exec(course.plannedDuration)![1] : '',\n 'Weektime (8208)': (course.plannedDuration && weekTimeRegex.test(course.plannedDuration)) ? weekTimeRegex.exec(course.plannedDuration)![1] : '',\n 'Blockname (8215)': '',\n 'Period (8206)': '',\n 'Week (8207)': '',\n 'NotPeriod (8212)': '',\n 'NotWeek (8213)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}TA (8200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (c.length) {\n csv += Papa.unparse(c, papaOptions);\n } else {\n csv += ['Course (8202)', 'GUID (5800)', 'Subject (8209)', 'Teacher (8210)', 'Group (8203)', 'TotalHours (8204)', 'Weektime (8208)', 'Blockname (8215)', 'Period (8206)', 'Week (8207)', 'NotPeriod (8212)', 'NotWeek (8213)'].join(papaOptions.delimiter);\n }\n\n return csv;\n};"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":[],"sources":["../../src/common/constants.ts"],"sourcesContent":["import moment from 'moment';\n\nexport const Constants = {\n FIRST_DAY: moment.utc('1970-01-05')\n};"],"mappings":";;;AAEA,MAAa,YAAY,EACvB,WAAW,OAAO,IAAI"}
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../src/common/constants.ts"],"sourcesContent":["import moment from 'moment';\n\nexport const Constants = {\n FIRST_DAY: moment.utc('1970-01-05')\n};"],"mappings":";;;AAEA,MAAa,YAAY,EACvB,WAAW,OAAO,IAAI,aAAa,EACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","names":["MongooseTypes","range"],"sources":["../../src/common/functions.ts"],"sourcesContent":["import moment from 'moment';\nimport type { DateType } from './types';\nimport { Types as MongooseTypes } from 'mongoose';\n\nexport function toISOString (\n date: DateType | null | undefined\n): string | null {\n if (typeof date === 'string') return date;\n if (date instanceof Date ) return date.toISOString();\n if (moment.isMoment(date) ) return date.toISOString();\n return null;\n}\n\n\n/**\n * Check if value is a Mongoose ObjectId.\n */\nexport function isMongooseObjectId (value: unknown): value is MongooseTypes.ObjectId {\n return value instanceof MongooseTypes.ObjectId;\n}\n\nexport type Range = {\n start: moment.Moment;\n end: moment.Moment;\n};\n\nexport namespace range {\n export type Type = Range;\n\n /**\n * Create a date range.\n */\n export function create (start: DateType, end: DateType): Range {\n return {\n start: moment(start),\n end: moment(end ),\n };\n }\n\n /**\n * Clone a date range.\n */\n export function clone (range: Range): Range {\n return {\n start: range.start.clone(),\n end: range.end .clone(),\n };\n }\n\n /**\n * Check if a date is contained within a date range.\n */\n export function contains (range: Range, date: moment.Moment) {\n return !date.isBefore(range.start) && !date.isAfter(range.end);\n }\n\n /**\n * Check if two date ranges overlap.\n */\n export function overlaps (a: Range, b: Range): boolean;\n /**\n * Checks if there is any overlap between two arrays of date ranges.\n */\n export function overlaps (a: Range[], b: Range[]): boolean;\n export function overlaps (a: Range | Range[], b: Range | Range[]) {\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.some(x => b.some(y => overlaps(x, y)));\n }\n if (!Array.isArray(a) && !Array.isArray(b)) {\n return !(a.end.isBefore(b.start) || a.start.isAfter(b.end));\n }\n throw new Error('Invalid arguments for range.overlaps');\n }\n\n\n\n /**\n * Check if two date ranges are equal.\n */\n export function isEqual (a: Range, b: Range) {\n return a.start.isSame(b.start) && a.end.isSame(b.end);\n }\n\n /**\n * Get intersection of two ranges, or null if they do not overlap.\n */\n export function intersect (a: Range, b: Range): Range | null {\n const start = moment.max(a.start, b.start);\n const end = moment.min(a.end, b.end );\n if (start.isAfter(end)) return null;\n return { start, end };\n }\n}"],"mappings":";;;;AAIA,SAAgB,YACd,MACe;AACf,KAAI,OAAO,SAAS,SAAU,QAAO;AACrC,KAAI,gBAAgB,KAAU,QAAO,KAAK;
|
|
1
|
+
{"version":3,"file":"functions.js","names":["MongooseTypes","range"],"sources":["../../src/common/functions.ts"],"sourcesContent":["import moment from 'moment';\nimport type { DateType } from './types';\nimport { Types as MongooseTypes } from 'mongoose';\n\nexport function toISOString (\n date: DateType | null | undefined\n): string | null {\n if (typeof date === 'string') return date;\n if (date instanceof Date ) return date.toISOString();\n if (moment.isMoment(date) ) return date.toISOString();\n return null;\n}\n\n\n/**\n * Check if value is a Mongoose ObjectId.\n */\nexport function isMongooseObjectId (value: unknown): value is MongooseTypes.ObjectId {\n return value instanceof MongooseTypes.ObjectId;\n}\n\nexport type Range = {\n start: moment.Moment;\n end: moment.Moment;\n};\n\nexport namespace range {\n export type Type = Range;\n\n /**\n * Create a date range.\n */\n export function create (start: DateType, end: DateType): Range {\n return {\n start: moment(start),\n end: moment(end ),\n };\n }\n\n /**\n * Clone a date range.\n */\n export function clone (range: Range): Range {\n return {\n start: range.start.clone(),\n end: range.end .clone(),\n };\n }\n\n /**\n * Check if a date is contained within a date range.\n */\n export function contains (range: Range, date: moment.Moment) {\n return !date.isBefore(range.start) && !date.isAfter(range.end);\n }\n\n /**\n * Check if two date ranges overlap.\n */\n export function overlaps (a: Range, b: Range): boolean;\n /**\n * Checks if there is any overlap between two arrays of date ranges.\n */\n export function overlaps (a: Range[], b: Range[]): boolean;\n export function overlaps (a: Range | Range[], b: Range | Range[]) {\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.some(x => b.some(y => overlaps(x, y)));\n }\n if (!Array.isArray(a) && !Array.isArray(b)) {\n return !(a.end.isBefore(b.start) || a.start.isAfter(b.end));\n }\n throw new Error('Invalid arguments for range.overlaps');\n }\n\n\n\n /**\n * Check if two date ranges are equal.\n */\n export function isEqual (a: Range, b: Range) {\n return a.start.isSame(b.start) && a.end.isSame(b.end);\n }\n\n /**\n * Get intersection of two ranges, or null if they do not overlap.\n */\n export function intersect (a: Range, b: Range): Range | null {\n const start = moment.max(a.start, b.start);\n const end = moment.min(a.end, b.end );\n if (start.isAfter(end)) return null;\n return { start, end };\n }\n}"],"mappings":";;;;AAIA,SAAgB,YACd,MACe;AACf,KAAI,OAAO,SAAS,SAAU,QAAO;AACrC,KAAI,gBAAgB,KAAU,QAAO,KAAK,aAAa;AACvD,KAAI,OAAO,SAAS,KAAK,CAAK,QAAO,KAAK,aAAa;AACvD,QAAO;;;;;AAOT,SAAgB,mBAAoB,OAAiD;AACnF,QAAO,iBAAiBA,MAAc;;;;CAc/B,SAAS,OAAQ,OAAiB,KAAsB;AAC7D,SAAO;GACL,OAAO,OAAO,MAAM;GACpB,KAAO,OAAO,IAAM;GACrB;;;CAMI,SAAS,MAAO,SAAqB;AAC1C,SAAO;GACL,OAAOC,QAAM,MAAM,OAAO;GAC1B,KAAOA,QAAM,IAAM,OAAO;GAC3B;;;CAMI,SAAS,SAAU,SAAc,MAAqB;AAC3D,SAAO,CAAC,KAAK,SAASA,QAAM,MAAM,IAAI,CAAC,KAAK,QAAQA,QAAM,IAAI;;;CAWzD,SAAS,SAAU,GAAoB,GAAoB;AAChE,MAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,CACtC,QAAO,EAAE,MAAK,MAAK,EAAE,MAAK,MAAK,SAAS,GAAG,EAAE,CAAC,CAAC;AAEjD,MAAI,CAAC,MAAM,QAAQ,EAAE,IAAI,CAAC,MAAM,QAAQ,EAAE,CACxC,QAAO,EAAE,EAAE,IAAI,SAAS,EAAE,MAAM,IAAI,EAAE,MAAM,QAAQ,EAAE,IAAI;AAE5D,QAAM,IAAI,MAAM,uCAAuC;;;CAQlD,SAAS,QAAS,GAAU,GAAU;AAC3C,SAAO,EAAE,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,OAAO,EAAE,IAAI;;;CAMhD,SAAS,UAAW,GAAU,GAAwB;EAC3D,MAAM,QAAQ,OAAO,IAAI,EAAE,OAAO,EAAE,MAAM;EAC1C,MAAM,MAAQ,OAAO,IAAI,EAAE,KAAO,EAAE,IAAM;AAC1C,MAAI,MAAM,QAAQ,IAAI,CAAE,QAAO;AAC/B,SAAO;GAAE;GAAO;GAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-date.js","names":[],"sources":["../../src/common/get-date.ts"],"sourcesContent":["import type { Moment } from 'moment';\nimport type { CoreTypes } from '../core';\nimport { Constants } from './constants';\n\nexport default (day: number | CoreTypes.day, time: string): Moment => {\n if (day == null) throw new Error('Day is null or undefined');\n\n const _day = typeof day == 'number' ? day : day.day;\n const [hours, minutes] = time.split(':').map(x => parseInt(x));\n\n const date = Constants.FIRST_DAY.clone()\n .add(_day, 'day')\n .set('hour', hours)\n .set('minute', minutes);\n\n if (!date.isValid()) throw new Error(`Day ${ _day } and time ${ time } is not a valid date`);\n\n return date;\n};"],"mappings":";;;AAIA,wBAAgB,KAA6B,SAAyB;AACpE,KAAI,OAAO,KAAM,OAAM,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"get-date.js","names":[],"sources":["../../src/common/get-date.ts"],"sourcesContent":["import type { Moment } from 'moment';\nimport type { CoreTypes } from '../core';\nimport { Constants } from './constants';\n\nexport default (day: number | CoreTypes.day, time: string): Moment => {\n if (day == null) throw new Error('Day is null or undefined');\n\n const _day = typeof day == 'number' ? day : day.day;\n const [hours, minutes] = time.split(':').map(x => parseInt(x));\n\n const date = Constants.FIRST_DAY.clone()\n .add(_day, 'day')\n .set('hour', hours)\n .set('minute', minutes);\n\n if (!date.isValid()) throw new Error(`Day ${ _day } and time ${ time } is not a valid date`);\n\n return date;\n};"],"mappings":";;;AAIA,wBAAgB,KAA6B,SAAyB;AACpE,KAAI,OAAO,KAAM,OAAM,IAAI,MAAM,2BAA2B;CAE5D,MAAM,OAAO,OAAO,OAAO,WAAW,MAAM,IAAI;CAChD,MAAM,CAAC,OAAO,WAAW,KAAK,MAAM,IAAI,CAAC,KAAI,MAAK,SAAS,EAAE,CAAC;CAE9D,MAAM,OAAO,UAAU,UAAU,OAAO,CACrC,IAAI,MAAM,MAAM,CAChB,IAAI,QAAQ,MAAM,CAClB,IAAI,UAAU,QAAQ;AAEzB,KAAI,CAAC,KAAK,SAAS,CAAE,OAAM,IAAI,MAAM,OAAQ,KAAM,YAAa,KAAM,sBAAsB;AAE5F,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_value: T"],"sources":["../../../src/common/make-chainable/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype Fn<In, Out> = (x: In) => Out;\n\nclass Chainable<T> {\n constructor (private _value: T) {}\n\n get value () { return this._value }\n\n chain (): Chainable<T>;\n chain<A1>(fn1: Fn<T, A1>): Chainable<A1>;\n chain<A1, A2>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>): Chainable<A2>;\n chain<A1, A2, A3>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>): Chainable<A3>;\n chain<A1, A2, A3, A4>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>): Chainable<A4>;\n chain<A1, A2, A3, A4, A5>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>): Chainable<A5>;\n chain<A1, A2, A3, A4, A5, A6>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>): Chainable<A6>;\n chain<A1, A2, A3, A4, A5, A6, A7>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>): Chainable<A7>;\n chain<A1, A2, A3, A4, A5, A6, A7, A8>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>, fn8: Fn<A7, A8>): Chainable<A8>;\n chain<A1, A2, A3, A4, A5, A6, A7, A8, A9>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>, fn8: Fn<A7, A8>, fn9: Fn<A8, A9>): Chainable<A9>;\n chain<A1, A2, A3, A4, A5, A6, A7, A8, A9>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>, fn8: Fn<A7, A8>, fn9: Fn<A8, A9>, ...fns: Fn<any, any>[]): Chainable<unknown>;\n chain (...fns: Fn<any, any>[]): Chainable<any> {\n if (fns.length === 0) return this;\n return new Chainable(fns.reduce((prev, fn) => fn(prev), this.value));\n }\n}\n\n/**\n * Wraps a value in a Chainable to build a strongly-typed function pipeline with .chain().\n * Each chained function is applied in order, and the final result is available via .value.\n *\n * @param x - The value to wrap.\n * @returns A Chainable<T> around the given value.\n *\n * @example\n * const result = makeChainable([1, 2, 3])\n * .chain(\n * xs => xs.map(x => x * 2)), // [2, 4, 6]\n * xs => xs.reduce((acc, x) => acc + x, 0) // 12\n * );\n *\n * console.log(result.value); // 12\n */\nexport function makeChainable<T> (x: T) { return new Chainable(x) }\n"],"mappings":";AAIA,IAAM,YAAN,MAAM,UAAa;CACjB,YAAa,AAAQA,QAAW;EAAX;;CAErB,IAAI,QAAS;AAAE,SAAO,KAAK;;CAa3B,MAAO,GAAG,KAAqC;AAC7C,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,SAAO,IAAI,UAAU,IAAI,QAAQ,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","names":["_value: T"],"sources":["../../../src/common/make-chainable/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype Fn<In, Out> = (x: In) => Out;\n\nclass Chainable<T> {\n constructor (private _value: T) {}\n\n get value () { return this._value }\n\n chain (): Chainable<T>;\n chain<A1>(fn1: Fn<T, A1>): Chainable<A1>;\n chain<A1, A2>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>): Chainable<A2>;\n chain<A1, A2, A3>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>): Chainable<A3>;\n chain<A1, A2, A3, A4>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>): Chainable<A4>;\n chain<A1, A2, A3, A4, A5>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>): Chainable<A5>;\n chain<A1, A2, A3, A4, A5, A6>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>): Chainable<A6>;\n chain<A1, A2, A3, A4, A5, A6, A7>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>): Chainable<A7>;\n chain<A1, A2, A3, A4, A5, A6, A7, A8>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>, fn8: Fn<A7, A8>): Chainable<A8>;\n chain<A1, A2, A3, A4, A5, A6, A7, A8, A9>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>, fn8: Fn<A7, A8>, fn9: Fn<A8, A9>): Chainable<A9>;\n chain<A1, A2, A3, A4, A5, A6, A7, A8, A9>(fn1: Fn<T, A1>, fn2: Fn<A1, A2>, fn3: Fn<A2, A3>, fn4: Fn<A3, A4>, fn5: Fn<A4, A5>, fn6: Fn<A5, A6>, fn7: Fn<A6, A7>, fn8: Fn<A7, A8>, fn9: Fn<A8, A9>, ...fns: Fn<any, any>[]): Chainable<unknown>;\n chain (...fns: Fn<any, any>[]): Chainable<any> {\n if (fns.length === 0) return this;\n return new Chainable(fns.reduce((prev, fn) => fn(prev), this.value));\n }\n}\n\n/**\n * Wraps a value in a Chainable to build a strongly-typed function pipeline with .chain().\n * Each chained function is applied in order, and the final result is available via .value.\n *\n * @param x - The value to wrap.\n * @returns A Chainable<T> around the given value.\n *\n * @example\n * const result = makeChainable([1, 2, 3])\n * .chain(\n * xs => xs.map(x => x * 2)), // [2, 4, 6]\n * xs => xs.reduce((acc, x) => acc + x, 0) // 12\n * );\n *\n * console.log(result.value); // 12\n */\nexport function makeChainable<T> (x: T) { return new Chainable(x) }\n"],"mappings":";AAIA,IAAM,YAAN,MAAM,UAAa;CACjB,YAAa,AAAQA,QAAW;EAAX;;CAErB,IAAI,QAAS;AAAE,SAAO,KAAK;;CAa3B,MAAO,GAAG,KAAqC;AAC7C,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,SAAO,IAAI,UAAU,IAAI,QAAQ,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,MAAM,CAAC;;;;;;;;;;;;;;;;;;;AAoBxE,SAAgB,cAAkB,GAAM;AAAE,QAAO,IAAI,UAAU,EAAE"}
|
package/dist/common/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { IdKey } from "../core/types/common/index.js";
|
|
2
|
+
import "../core/index.js";
|
|
2
3
|
import { Moment } from "moment";
|
|
3
4
|
|
|
4
5
|
//#region src/common/types.d.ts
|
|
@@ -10,9 +11,6 @@ type Intersect<T> = (T extends any ? ((x: T) => 0) : never) extends ((x: infer R
|
|
|
10
11
|
type BaseOptions = {
|
|
11
12
|
idKey?: IdKey;
|
|
12
13
|
};
|
|
13
|
-
/**
|
|
14
|
-
* The interface required for the "from" mapping functions.
|
|
15
|
-
*/
|
|
16
14
|
//#endregion
|
|
17
15
|
export { BaseOptions, Intersect };
|
|
18
16
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configurations.js","names":[],"sources":["../../../src/core/from/configurations.ts"],"sourcesContent":["import type transform from '../to/configurations';\n\nexport default (configurations: ReturnType<typeof transform>) => {\n if (configurations.length != new Set(configurations.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Configurations) Configuration array have two or more configurations with the same ID');\n\n return configurations\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Configurations) Configuration id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,8BAAgB,mBAAiD;AAC/D,KAAI,eAAe,UAAU,IAAI,IAAI,eAAe,KAAI,MAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"configurations.js","names":[],"sources":["../../../src/core/from/configurations.ts"],"sourcesContent":["import type transform from '../to/configurations';\n\nexport default (configurations: ReturnType<typeof transform>) => {\n if (configurations.length != new Set(configurations.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Configurations) Configuration array have two or more configurations with the same ID');\n\n return configurations\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Configurations) Configuration id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,8BAAgB,mBAAiD;AAC/D,KAAI,eAAe,UAAU,IAAI,IAAI,eAAe,KAAI,MAAK,EAAE,GAAG,CAAC,CAAC,KAClE,OAAM,IAAI,MAAM,wGAAwG;AAE1H,QAAO,eACJ,KAAI,MAAK;AACR,MAAI,CAAC,EAAE,GACL,OAAM,IAAI,MAAM,iEAAiE;AAEnF,SAAO,EAAE,GAAG,GAAG;GACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"courses.js","names":[],"sources":["../../../src/core/from/courses.ts"],"sourcesContent":["import type transform from '../to/courses';\n\nexport default (courses: ReturnType<typeof transform>) => {\n if (courses.length != new Set(courses.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Courses) Course array have two or more courses with the same ID');\n\n return courses\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Courses) Course id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,uBAAgB,YAA0C;AACxD,KAAI,QAAQ,UAAU,IAAI,IAAI,QAAQ,KAAI,MAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"courses.js","names":[],"sources":["../../../src/core/from/courses.ts"],"sourcesContent":["import type transform from '../to/courses';\n\nexport default (courses: ReturnType<typeof transform>) => {\n if (courses.length != new Set(courses.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Courses) Course array have two or more courses with the same ID');\n\n return courses\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Courses) Course id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,uBAAgB,YAA0C;AACxD,KAAI,QAAQ,UAAU,IAAI,IAAI,QAAQ,KAAI,MAAK,EAAE,GAAG,CAAC,CAAC,KACpD,OAAM,IAAI,MAAM,mFAAmF;AAErG,QAAO,QACJ,KAAI,MAAK;AACR,MAAI,CAAC,EAAE,GACL,OAAM,IAAI,MAAM,mDAAmD;AAErE,SAAO,EAAE,GAAG,GAAG;GACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","names":[],"sources":["../../../src/core/from/events.ts"],"sourcesContent":["import type transform from '../to/events';\n\nexport default (events: ReturnType<typeof transform>) => {\n if (events.length != new Set(events.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Events) Events array have two or more events with the same ID');\n\n return events\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Events) Event id is undefined');\n\n // backwards compatibility for file upload: use duration if preferredDuration does not exist\n if (x.duration) x.preferredDuration ??= x.duration;\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,sBAAgB,WAAyC;AACvD,KAAI,OAAO,UAAU,IAAI,IAAI,OAAO,KAAI,MAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"events.js","names":[],"sources":["../../../src/core/from/events.ts"],"sourcesContent":["import type transform from '../to/events';\n\nexport default (events: ReturnType<typeof transform>) => {\n if (events.length != new Set(events.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Events) Events array have two or more events with the same ID');\n\n return events\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Events) Event id is undefined');\n\n // backwards compatibility for file upload: use duration if preferredDuration does not exist\n if (x.duration) x.preferredDuration ??= x.duration;\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,sBAAgB,WAAyC;AACvD,KAAI,OAAO,UAAU,IAAI,IAAI,OAAO,KAAI,MAAK,EAAE,GAAG,CAAC,CAAC,KAClD,OAAM,IAAI,MAAM,iFAAiF;AAEnG,QAAO,OACJ,KAAI,MAAK;AACR,MAAI,CAAC,EAAE,GACL,OAAM,IAAI,MAAM,iDAAiD;AAGnE,MAAI,EAAE,SAAU,GAAE,sBAAsB,EAAE;AAE1C,SAAO,EAAE,GAAG,GAAG;GACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exceptions.js","names":[],"sources":["../../../src/core/from/exceptions.ts"],"sourcesContent":["import type transform from '../to/exceptions';\n\nexport default (exceptions: ReturnType<typeof transform>) => {\n if (exceptions.length != new Set(exceptions.map(x => x.id)).size)\n throw new Error('(Core::From::V2::exceptions) exceptions array have two or more exceptions with the same ID');\n\n return exceptions\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::exceptions) Calendar exceptions id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,0BAAgB,eAA6C;AAC3D,KAAI,WAAW,UAAU,IAAI,IAAI,WAAW,KAAI,MAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"exceptions.js","names":[],"sources":["../../../src/core/from/exceptions.ts"],"sourcesContent":["import type transform from '../to/exceptions';\n\nexport default (exceptions: ReturnType<typeof transform>) => {\n if (exceptions.length != new Set(exceptions.map(x => x.id)).size)\n throw new Error('(Core::From::V2::exceptions) exceptions array have two or more exceptions with the same ID');\n\n return exceptions\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::exceptions) Calendar exceptions id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,0BAAgB,eAA6C;AAC3D,KAAI,WAAW,UAAU,IAAI,IAAI,WAAW,KAAI,MAAK,EAAE,GAAG,CAAC,CAAC,KAC1D,OAAM,IAAI,MAAM,6FAA6F;AAE/G,QAAO,WACJ,KAAI,MAAK;AACR,MAAI,CAAC,EAAE,GACL,OAAM,IAAI,MAAM,mEAAmE;AAErF,SAAO,EAAE,GAAG,GAAG;GACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups.js","names":[],"sources":["../../../src/core/from/groups.ts"],"sourcesContent":["import type transform from '../to/groups';\n\nexport default (groups: ReturnType<typeof transform>) => {\n if (groups.length != new Set(groups.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Groups) Groups array have two or more groups with the same ID');\n\n return groups\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Groups) Group id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,sBAAgB,WAAyC;AACvD,KAAI,OAAO,UAAU,IAAI,IAAI,OAAO,KAAI,MAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"groups.js","names":[],"sources":["../../../src/core/from/groups.ts"],"sourcesContent":["import type transform from '../to/groups';\n\nexport default (groups: ReturnType<typeof transform>) => {\n if (groups.length != new Set(groups.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Groups) Groups array have two or more groups with the same ID');\n\n return groups\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Groups) Group id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,sBAAgB,WAAyC;AACvD,KAAI,OAAO,UAAU,IAAI,IAAI,OAAO,KAAI,MAAK,EAAE,GAAG,CAAC,CAAC,KAClD,OAAM,IAAI,MAAM,iFAAiF;AAEnG,QAAO,OACJ,KAAI,MAAK;AACR,MAAI,CAAC,EAAE,GACL,OAAM,IAAI,MAAM,iDAAiD;AAEnE,SAAO,EAAE,GAAG,GAAG;GACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/core/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport type { Types } from '../types';\nimport _schedules from './schedules';\n\n\nfunction division (data: unknown): Pick<Types.Serialized.Division, 'displayName' | 'start' | 'end'> | undefined {\n\n if ( !data || typeof data !== 'object'\n || !('division' in data) || !data.division || typeof data.division !== 'object'\n ) return;\n\n const d = data.division;\n if (!('displayName' in d && typeof d.displayName == 'string')) return;\n if (!('start' in d && typeof d.start == 'string')) return;\n if (!('end' in d && typeof d.end == 'string')) return;\n\n return {\n displayName: d.displayName,\n start: d.start,\n end: d.end\n };\n}\n\nexport default {\n division: division,\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":";;;AAKA,SAAS,SAAU,MAA6F;AAE9G,KAA8B,CAAC,QAAiB,OAAO,SAAkB,YACpE,EAAE,cAAc,SAAS,CAAC,KAAK,YAAY,OAAO,KAAK,aAAa,SACvE;CAEF,MAAM,IAAI,KAAK;AACf,KAAI,EAAE,iBAAiB,KAAK,OAAO,EAAE,eAAe,UAAW;AAC/D,KAAI,EAAE,WAAiB,KAAK,OAAO,EAAE,SAAe,UAAW;AAC/D,KAAI,EAAE,SAAiB,KAAK,OAAO,EAAE,OAAe,UAAW;AAE/D,QAAO;EACL,aAAa,EAAE;EACf,OAAa,EAAE;EACf,KAAa,EAAE
|
|
1
|
+
{"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/core/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport type { Types } from '../types';\nimport _schedules from './schedules';\n\n\nfunction division (data: unknown): Pick<Types.Serialized.Division, 'displayName' | 'start' | 'end'> | undefined {\n\n if ( !data || typeof data !== 'object'\n || !('division' in data) || !data.division || typeof data.division !== 'object'\n ) return;\n\n const d = data.division;\n if (!('displayName' in d && typeof d.displayName == 'string')) return;\n if (!('start' in d && typeof d.start == 'string')) return;\n if (!('end' in d && typeof d.end == 'string')) return;\n\n return {\n displayName: d.displayName,\n start: d.start,\n end: d.end\n };\n}\n\nexport default {\n division: division,\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":";;;AAKA,SAAS,SAAU,MAA6F;AAE9G,KAA8B,CAAC,QAAiB,OAAO,SAAkB,YACpE,EAAE,cAAc,SAAS,CAAC,KAAK,YAAY,OAAO,KAAK,aAAa,SACvE;CAEF,MAAM,IAAI,KAAK;AACf,KAAI,EAAE,iBAAiB,KAAK,OAAO,EAAE,eAAe,UAAW;AAC/D,KAAI,EAAE,WAAiB,KAAK,OAAO,EAAE,SAAe,UAAW;AAC/D,KAAI,EAAE,SAAiB,KAAK,OAAO,EAAE,OAAe,UAAW;AAE/D,QAAO;EACL,aAAa,EAAE;EACf,OAAa,EAAE;EACf,KAAa,EAAE;EAChB;;AAGH,mBAAe;CACF;CACX,WAAWA;CACZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locations.js","names":[],"sources":["../../../src/core/from/locations.ts"],"sourcesContent":["import type transform from '../to/locations';\n\nexport default (locations: ReturnType<typeof transform>) => {\n if (locations.length != new Set(locations.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Locations) Location array have two or more locations with the same ID');\n\n return locations\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Locations) Location id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,yBAAgB,cAA4C;AAC1D,KAAI,UAAU,UAAU,IAAI,IAAI,UAAU,KAAI,MAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"locations.js","names":[],"sources":["../../../src/core/from/locations.ts"],"sourcesContent":["import type transform from '../to/locations';\n\nexport default (locations: ReturnType<typeof transform>) => {\n if (locations.length != new Set(locations.map(x => x.id)).size)\n throw new Error('(Core::From::V2::Locations) Location array have two or more locations with the same ID');\n\n return locations\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::Locations) Location id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,yBAAgB,cAA4C;AAC1D,KAAI,UAAU,UAAU,IAAI,IAAI,UAAU,KAAI,MAAK,EAAE,GAAG,CAAC,CAAC,KACxD,OAAM,IAAI,MAAM,yFAAyF;AAE3G,QAAO,UACJ,KAAI,MAAK;AACR,MAAI,CAAC,EAAE,GACL,OAAM,IAAI,MAAM,uDAAuD;AAEzE,SAAO,EAAE,GAAG,GAAG;GACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locked-times.js","names":[],"sources":["../../../src/core/from/locked-times.ts"],"sourcesContent":["import type transform from '../to/locked-times';\n\nexport default (LockedTimes: ReturnType<typeof transform>) => {\n if (LockedTimes.length != new Set(LockedTimes.map(x => x.id)).size)\n throw new Error('(Core::From::V2::LockedTimes) LockedTimes array have two or more LockedTimes with the same ID');\n\n return LockedTimes\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::LockedTimes) Locked time id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,4BAAgB,gBAA8C;AAC5D,KAAI,YAAY,UAAU,IAAI,IAAI,YAAY,KAAI,MAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"locked-times.js","names":[],"sources":["../../../src/core/from/locked-times.ts"],"sourcesContent":["import type transform from '../to/locked-times';\n\nexport default (LockedTimes: ReturnType<typeof transform>) => {\n if (LockedTimes.length != new Set(LockedTimes.map(x => x.id)).size)\n throw new Error('(Core::From::V2::LockedTimes) LockedTimes array have two or more LockedTimes with the same ID');\n\n return LockedTimes\n .map(x => {\n if (!x.id)\n throw new Error('(Core::From::V2::LockedTimes) Locked time id is undefined');\n\n return { ...x };\n });\n};\n"],"mappings":";AAEA,4BAAgB,gBAA8C;AAC5D,KAAI,YAAY,UAAU,IAAI,IAAI,YAAY,KAAI,MAAK,EAAE,GAAG,CAAC,CAAC,KAC5D,OAAM,IAAI,MAAM,gGAAgG;AAElH,QAAO,YACJ,KAAI,MAAK;AACR,MAAI,CAAC,EAAE,GACL,OAAM,IAAI,MAAM,4DAA4D;AAE9E,SAAO,EAAE,GAAG,GAAG;GACf"}
|