UNPKG

@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
"use strict"; 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;