@gouvfr-anct/timetable-to-osm-opening-hours
Version:
📚 Bibliothèque pour la transformation d'une série de plages horaires représentant un format emploi du temps vers le standard OSM pour les horaires d'ouverture.
72 lines (71 loc) • 4.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromTimetableOsmOpeningHours = void 0;
/* eslint-disable-next-line @typescript-eslint/sort-type-union-intersection-members */
const utilities_1 = require("../utilities");
const daysBetween = (startDayIndex, endDayIndex) => utilities_1.OSM_DAYS_OF_WEEK.filter((_, index) => index > startDayIndex && index < endDayIndex);
const ofDay = (previousLastDay) => (day) => day === previousLastDay;
const daysOffHours = (days) => ({
days,
osmHours: 'off'
});
const openingHoursDaysOffIfAny = (newDaysOff) => newDaysOff.length > 0 ? [daysOffHours(newDaysOff)] : [];
const workingDays = (currentOpeningHour) => (day) => !currentOpeningHour.days.includes(day);
const daysOffToAdd = (currentOpeningHours) => daysBetween(utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(currentOpeningHours.days[0])), utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(currentOpeningHours.days.slice(-1)[0]))).filter(workingDays(currentOpeningHours));
const isDaysRange = (days) => days.length > 2;
const getDaysOff = (currentOpeningHour, previousOpeningHoursDaysOff) => {
if (isDaysRange(currentOpeningHour.days)) {
return openingHoursDaysOffIfAny([
...(previousOpeningHoursDaysOff?.days.filter(workingDays(currentOpeningHour)) ?? []),
...daysOffToAdd(currentOpeningHour)
]);
}
if (previousOpeningHoursDaysOff != null) {
return openingHoursDaysOffIfAny(previousOpeningHoursDaysOff.days.filter(workingDays(currentOpeningHour)));
}
return [];
};
const withoutDaysOff = (group) => group.osmHours !== 'off';
const withDaysOff = (group) => group.osmHours === 'off';
const appendOffHours = (openingHoursGroupDaysByHours, currentOpeningHours) => [
...openingHoursGroupDaysByHours.filter(withoutDaysOff),
currentOpeningHours,
...getDaysOff(currentOpeningHours, openingHoursGroupDaysByHours.find(withDaysOff))
];
const appendToExistingOpeningHoursGroup = (existingOpeningHoursGroup, currentOpeningHours) => [
{
days: [...existingOpeningHoursGroup.days, currentOpeningHours.day],
osmHours: currentOpeningHours.osmHours
}
];
const newOpeningHoursGroup = (currentOpeningHours) => [
{
days: [currentOpeningHours.day],
osmHours: currentOpeningHours.osmHours
}
];
const updateOpeningHoursGroupDaysByHours = (currentOpeningHours, existingOpeningHoursGroup) => existingOpeningHoursGroup == null
? newOpeningHoursGroup(currentOpeningHours)
: appendToExistingOpeningHoursGroup(existingOpeningHoursGroup, currentOpeningHours);
const updatingOpeningHoursGroups = (currentOpeningHour) => (openingHours) => openingHours.osmHours !== currentOpeningHour.osmHours && !openingHours.osmHours.includes('off');
const existingOpeningHoursGroupFor = (currentOpeningHours) => (openingHours) => openingHours.osmHours === currentOpeningHours.osmHours;
const formatDays = (days) => isDaysRange(days) ? [days[0], days[days.length - 1]].join('-') : days.join(',');
const toOSMOpeningHoursStrings = (osmOpeningHours, openingHours) => [
...osmOpeningHours,
`${formatDays(openingHours.days)} ${openingHours.osmHours}`
];
const byDayOfWeek = (osmOpeningHours1, osmOpeningHours2) => utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(osmOpeningHours1.days[0])) - utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(osmOpeningHours2.days[0]));
const byRange = (osmOpeningHours1, osmOpeningHours2) => osmOpeningHours2.days.length - osmOpeningHours1.days.length;
const groupOpeningHoursDaysByHours = (openingHoursGroupDaysByHours, currentOpeningHours) => [
...openingHoursGroupDaysByHours.filter(updatingOpeningHoursGroups(currentOpeningHours)),
...updateOpeningHoursGroupDaysByHours(currentOpeningHours, openingHoursGroupDaysByHours.find(existingOpeningHoursGroupFor(currentOpeningHours)))
];
const fromTimetableOsmOpeningHours = (horaires) => horaires
.reduce(groupOpeningHoursDaysByHours, [])
.sort(byDayOfWeek)
.sort(byRange)
.reduce(appendOffHours, [])
.reduce(toOSMOpeningHoursStrings, [])
.join('; ')
.replace('Mo-Su ', '');
exports.fromTimetableOsmOpeningHours = fromTimetableOsmOpeningHours;