@gouvfr-anct/mednum
Version:
✨ Permet de transformer une source de données vers le schéma des lieux de mediation numerique
51 lines (50 loc) • 3.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.openingHoursFromWeek = void 0;
const timetable_to_osm_opening_hours_1 = require("@gouvfr-anct/timetable-to-osm-opening-hours");
const merge_hours_ranges_1 = require("../../merge-hours-ranges/merge-hours-ranges");
const horaires_field_extract_operations_1 = require("./horaires.field.extract-operations");
const horaires_field_clean_operations_1 = require("./horaires.field.clean-operations");
const process_horaires_field_1 = require("./process-horaires.field");
const OSM_DAYS_OF_WEEK = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
const toMergedHoursRanges = (wideHoursRange, hoursRange, index) => index === 0 ? hoursRange : (0, merge_hours_ranges_1.mergeMultipleHoursRanges)(wideHoursRange, hoursRange);
const mergeDuplicatedDaysOpeningHours = (daysToMerge) => daysToMerge.reduce(toMergedHoursRanges, '');
const byDayOfWeek = (valueA, valueB) => OSM_DAYS_OF_WEEK.indexOf(valueA.day) - OSM_DAYS_OF_WEEK.indexOf(valueB.day);
const toDayWithOsmHours = (openingHoursToMerge) => ({
osmHours: mergeDuplicatedDaysOpeningHours(openingHoursToMerge.osmHours),
day: openingHoursToMerge.day
});
const matchingDay = (day) => (openingHoursToMerge) => openingHoursToMerge.day === day;
const isMatchingDay = (dayWithOsmHoursToMerge, day) => dayWithOsmHoursToMerge.find(matchingDay(day)) != null;
const appendOsmHoursToMerge = (dayWithOsmHoursToMerge, dayWithOsmHours) => [
...dayWithOsmHoursToMerge.filter((openingHoursToMerge) => openingHoursToMerge.day !== dayWithOsmHours.day),
{
day: dayWithOsmHours.day,
osmHours: [dayWithOsmHours.osmHours, ...(dayWithOsmHoursToMerge.find(matchingDay(dayWithOsmHours.day))?.osmHours ?? [])]
}
];
const addNewOsmHoursToMerge = (dayWithOsmHoursToMerge, dayWithOsmHours) => [
...dayWithOsmHoursToMerge,
{
osmHours: [dayWithOsmHours.osmHours],
day: dayWithOsmHours.day
}
];
const toDayWithOsmHoursToMerge = (dayWithOsmHoursToMerge, dayWithOsmHours) => isMatchingDay(dayWithOsmHoursToMerge, dayWithOsmHours.day)
? appendOsmHoursToMerge(dayWithOsmHoursToMerge, dayWithOsmHours)
: addNewOsmHoursToMerge(dayWithOsmHoursToMerge, dayWithOsmHours);
const toExtractedOsmOpeningHours = (singleStringOpeningHours) => (previousValue, openingHoursExtraction) => {
if (!openingHoursExtraction.selector.test(singleStringOpeningHours))
return previousValue;
const matches = openingHoursExtraction.selector.exec(singleStringOpeningHours);
return openingHoursExtraction.extract(previousValue, ...(matches == null ? [] : matches));
};
const processOpeningHours = (singleStringOpeningHours) => singleStringOpeningHours == null
? []
: horaires_field_extract_operations_1.OPENING_HOURS_EXTRACTION.reduce(toExtractedOsmOpeningHours(singleStringOpeningHours), [])
.reduce(toDayWithOsmHoursToMerge, [])
.map(toDayWithOsmHours)
.sort(byDayOfWeek);
const isValidOdmHours = (osmOpeningHours) => /(?:Mo|Tu|We|Th|Fr|Sa|Su)\s?;|(?:Mo|Tu|We|Th|Fr|Sa|Su)\s?$/g.test(osmOpeningHours ?? '');
const openingHoursFromWeek = (horairesSingleField) => ((singleStringOpeningHours) => isValidOdmHours(singleStringOpeningHours) ? process_horaires_field_1.NO_OSM_OPENING_HOURS : singleStringOpeningHours)((0, process_horaires_field_1.osmOpeningHoursString)((0, timetable_to_osm_opening_hours_1.fromTimetableOsmOpeningHours)(processOpeningHours(horaires_field_clean_operations_1.HORAIRES_FIELD_CLEAN_OPERATIONS.reduce((horaires, cleanOperation) => horaires?.replace(cleanOperation.selector, cleanOperation.fix), horairesSingleField?.toLowerCase().trim())))));
exports.openingHoursFromWeek = openingHoursFromWeek;