insee-municipality-code
Version:
🇫🇷 Get the INSEE municipality code from postal code and name of French municipality
73 lines (62 loc) • 2.35 kB
JavaScript
;
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;
};