UNPKG

insee-municipality-code

Version:

🇫🇷 Get the INSEE municipality code from postal code and name of French municipality

73 lines (62 loc) • 2.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _fuse = require("fuse.js"); var _fuse2 = _interopRequireDefault(_fuse); var _cities = require("../data/cities.json"); var _cities2 = _interopRequireDefault(_cities); var _normalize = require("./normalize"); var _normalize2 = _interopRequireDefault(_normalize); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const getCitiesByPostalCode = ({ postalCode, cities }) => cities.filter(city => city.postalCode == postalCode); const getCitiesByName = ({ name, cities }) => { const regex = new RegExp((0, _normalize2.default)(name)); return cities.filter(city => regex.test((0, _normalize2.default)(city.name))); }; let nameFuse, postalCodeFuse; exports.default = ({ name = "", postalCode = "" } = {}) => { if (!name && !postalCode) { throw new Error("Please provide either name or postalCode"); } if (!nameFuse || !postalCodeFuse) { nameFuse = new _fuse2.default(_cities2.default, { id: "insee", keys: ["name"], threshold: 1.0, includeScore: true }); postalCodeFuse = new _fuse2.default(_cities2.default, { id: "insee", keys: ["postalCode"], threshold: 0.8, includeScore: true }); } if (postalCode) { const postalCodeCities = getCitiesByPostalCode({ postalCode, cities: _cities2.default }); if (postalCodeCities.length && name) { const exactCities = getCitiesByName({ name, cities: postalCodeCities }); if (exactCities.length) { return exactCities[0].insee; } } } if (name) { const nameCities = getCitiesByName({ name, cities: _cities2.default }); if (nameCities.length === 1) { return nameCities[0].insee; } } const nameCities = nameFuse.search(name); const postalCodeCities = postalCodeFuse.search(postalCode); const allCities = new Map(); const addCityWithCoefficient = coefficient => ({ item: insee, score }) => { const existingScore = allCities.get(insee) || 0; allCities.set(insee, existingScore + score * coefficient); }; nameCities.forEach(addCityWithCoefficient(1)); postalCodeCities.forEach(addCityWithCoefficient(1)); const [[insee]] = [...allCities.entries()].sort(([, score1], [, score2]) => score1 - score2); return insee; };