UNPKG

@gouvfr-anct/mednum

Version:

✨ Permet de transformer une source de données vers le schéma des lieux de mediation numerique

44 lines (43 loc) 3.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.findCommune = exports.slugify = void 0; const slugify = (text) => text .normalize('NFKD') .trim() .toLowerCase() .replace(/œ/gu, 'oe') .replace(/[^a-z0-9 '-]/gu, '') .replace(/'+/gu, '-') .replace(/\s+/gu, '-') .replace(/-+/gu, '-'); exports.slugify = slugify; const toCommunesCountMap = (communeCountMap, commune) => communeCountMap.set((0, exports.slugify)(commune.nom), (communeCountMap.get((0, exports.slugify)(commune.nom)) ?? 0) + 1); const toCommuneByNameMap = (communesCountMap) => (communeByNameMap, commune) => communesCountMap.get((0, exports.slugify)(commune.nom)) === 1 ? communeByNameMap.set((0, exports.slugify)(commune.nom), commune) : communeByNameMap; const toEveryCodePostalCountFromCommuneMap = (codesPostauxForCommuneCountMap, codePostal) => codesPostauxForCommuneCountMap.set(codePostal, (codesPostauxForCommuneCountMap.get(codePostal) ?? 0) + 1); const toCodePostalCountMap = (codesPostauxCountMap, commune) => commune.codesPostaux.reduce(toEveryCodePostalCountFromCommuneMap, codesPostauxCountMap); const toEveryCodePostalFromCommuneMap = (codesPostauxCountMap, commune) => (everyCodePostalFromCommuneMap, codePostal) => codesPostauxCountMap.get(codePostal) === 1 ? everyCodePostalFromCommuneMap.set(codePostal, commune) : everyCodePostalFromCommuneMap; const toCommunesByCodePostalMap = (codesPostauxCountMap) => (communesByCodePostalMap, commune) => commune.codesPostaux.reduce(toEveryCodePostalFromCommuneMap(codesPostauxCountMap, commune), communesByCodePostalMap); const communesParNomMap = (communes) => communes.reduce(toCommuneByNameMap(communes.reduce(toCommunesCountMap, new Map())), new Map()); const communesParCodePostalMap = (communes) => communes.reduce(toCommunesByCodePostalMap(communes.reduce(toCodePostalCountMap, new Map())), new Map()); const communeParCodePostal = (communesByCodePostalMap) => (codePostal) => communesByCodePostalMap.get(codePostal); const communeParNom = (communesByNameMap) => (nom) => communesByNameMap.get((0, exports.slugify)(nom)); const codePostalEtNomExactes = (codePostal, nom) => (commune) => commune.codesPostaux.includes(codePostal) && (0, exports.slugify)(commune.nom) === (0, exports.slugify)(nom); const communeUniqueOuRien = (communesFound) => communesFound.length === 1 ? communesFound[0] : undefined; const codePostalExactEtNomAvecMemeDebut = (codePostal, nom) => (commune) => commune.codesPostaux.includes(codePostal) && ((0, exports.slugify)(commune.nom).startsWith((0, exports.slugify)(nom)) || (0, exports.slugify)(nom).startsWith((0, exports.slugify)(commune.nom))); const communeParNomEtCodePostal = (communes) => (nom, codePostal) => communes.find(codePostalEtNomExactes(codePostal, nom)) ?? communeUniqueOuRien(communes.filter(codePostalExactEtNomAvecMemeDebut(codePostal, nom))); const onlySameNameInCodePostalDepartement = (nom, codePostal) => (commune) => commune.nom === nom && codePostal.startsWith(commune.codeDepartement); const parNomEtCodePostalLePlusProcheDuDepartement = (communes) => (nom, codePostal) => { const communesFound = communes.filter(onlySameNameInCodePostalDepartement(nom, codePostal)); return communesFound.length === 1 ? communesFound.at(0) : undefined; }; const findCommune = (communes) => ({ parNom: communeParNom(communesParNomMap(communes)), parCodePostal: communeParCodePostal(communesParCodePostalMap(communes)), parNomEtCodePostal: communeParNomEtCodePostal(communes), parNomEtCodePostalLePlusProcheDuDepartement: parNomEtCodePostalLePlusProcheDuDepartement(communes) }); exports.findCommune = findCommune;