@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
JavaScript
;
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;