@ban-team/validateur-bal
Advanced tools
Comparing version 2.18.3 to 2.18.4
"use strict"; | ||
const communes = require('../minicog.json'); | ||
const communes = require("../minicog.json"); | ||
@@ -5,0 +5,0 @@ const codesCommunesActuelles = new Set(communes.filter(c => !c.chefLieu).map(c => c.code)); |
"use strict"; | ||
const profiles = require('./schema/profiles'); | ||
const profiles = require("./schema/profiles"); | ||
const errorLabels = require('./schema/error-labels'); | ||
const errorLabels = require("./schema/error-labels"); | ||
@@ -10,6 +10,6 @@ const { | ||
allowedLocales | ||
} = require('./schema'); | ||
} = require("./schema"); | ||
function parseLocalizedField(fieldName) { | ||
const locale = allowedLocales.find(l => fieldName.endsWith('_' + l)); | ||
const locale = allowedLocales.find(l => fieldName.endsWith("_" + l)); | ||
@@ -31,7 +31,7 @@ if (!locale) { | ||
function parseErrorCode(code) { | ||
const parts = code.split('.'); | ||
const parts = code.split("."); | ||
if (parts[0] === 'file') { | ||
if (parts[0] === "file") { | ||
return { | ||
prefix: 'file', | ||
prefix: "file", | ||
code | ||
@@ -41,5 +41,5 @@ }; | ||
if (parts[0] === 'row') { | ||
if (parts[0] === "row") { | ||
return { | ||
prefix: 'row', | ||
prefix: "row", | ||
code | ||
@@ -49,5 +49,5 @@ }; | ||
if (parts[0] === 'field') { | ||
if (parts[0] === "field") { | ||
return { | ||
prefix: 'field', | ||
prefix: "field", | ||
code | ||
@@ -57,5 +57,5 @@ }; | ||
if (parts[0] === 'rows') { | ||
if (parts[0] === "rows") { | ||
return { | ||
prefix: 'rows', | ||
prefix: "rows", | ||
code | ||
@@ -78,3 +78,3 @@ }; | ||
if (!fields[fieldName]) { | ||
throw new Error('Unknown fieldName: ' + fieldName); | ||
throw new Error("Unknown fieldName: " + fieldName); | ||
} | ||
@@ -98,10 +98,10 @@ | ||
if (profile.errors.includes(codeToCompare)) { | ||
return 'E'; | ||
return "E"; | ||
} | ||
if (profile.warnings.includes(codeToCompare)) { | ||
return 'W'; | ||
return "W"; | ||
} | ||
return 'I'; | ||
return "I"; | ||
} | ||
@@ -112,6 +112,6 @@ | ||
for (const c of Object.keys(errorLabels)) { | ||
if (c.includes('*') && c.startsWith('*.')) { | ||
if (c.includes("*") && c.startsWith("*.")) { | ||
endsWithErrorLabels[c.slice(2)] = submittedCode => { | ||
const [value] = submittedCode.split('.'); | ||
return errorLabels[c].replace('{}', value); | ||
const [value] = submittedCode.split("."); | ||
return errorLabels[c].replace("{}", value); | ||
}; | ||
@@ -122,5 +122,5 @@ } | ||
function getIfMissingColumn(code) { | ||
const parts = code.split('.'); | ||
const parts = code.split("."); | ||
if (parts[0] === 'field' && parts[2] === 'missing') { | ||
if (parts[0] === "field" && parts[2] === "missing") { | ||
return "La colonne ".concat(parts[1], " n\u2019existe pas"); | ||
@@ -141,3 +141,3 @@ } | ||
if (codeToUser in errorLabels) { | ||
return errorLabels[codeToUser] + (locale ? " [".concat(locale, "]") : ''); | ||
return errorLabels[codeToUser] + (locale ? " [".concat(locale, "]") : ""); | ||
} | ||
@@ -144,0 +144,0 @@ |
@@ -7,7 +7,7 @@ "use strict"; | ||
prevalidate | ||
} = require('./validate'); | ||
} = require("./validate"); | ||
const { | ||
readValue | ||
} = require('./validate/row'); | ||
} = require("./validate/row"); | ||
@@ -17,5 +17,5 @@ const { | ||
getLabel | ||
} = require('./helpers'); | ||
} = require("./helpers"); | ||
const profiles = require('./schema/profiles'); | ||
const profiles = require("./schema/profiles"); | ||
@@ -22,0 +22,0 @@ module.exports = { |
@@ -6,69 +6,72 @@ "use strict"; | ||
// * | ||
'*.valeur_manquante': 'Le champ {} ne doit pas être vide', | ||
'*.valeur_invalide': 'La valeur du champ {} est incorrecte', | ||
'*.espaces_debut_fin': 'La valeur du champ {} ne doit pas avoir d’espaces en début ou en fin de chaîne de caractère', | ||
'*.enum_fuzzy': 'La valeur du champ {} a été acceptée mais n’est pas conforme à la spécification', | ||
'*.caractere_invalide': 'Le champ {} contient des caractères non valides', | ||
"*.valeur_manquante": "Le champ {} ne doit pas être vide", | ||
"*.valeur_invalide": "La valeur du champ {} est incorrecte", | ||
"*.espaces_debut_fin": "La valeur du champ {} ne doit pas avoir d’espaces en début ou en fin de chaîne de caractère", | ||
"*.enum_fuzzy": "La valeur du champ {} a été acceptée mais n’est pas conforme à la spécification", | ||
"*.caractere_invalide": "Le champ {} contient des caractères non valides", | ||
// cle_interop | ||
'cle_interop.casse_invalide': 'La clé d’interopérabilité doit être en minuscules', | ||
'cle_interop.structure_invalide': 'La clé d’interopérabilité doit contenir au moins 3 segments', | ||
'cle_interop.commune_invalide': 'Clé d’interopérabilité invalide (commune)', | ||
'cle_interop.commune_ancienne': 'La commune référencée est une commune ancienne', | ||
'cle_interop.voie_invalide': 'Clé d’interopérabilité invalide (voie)', | ||
'cle_interop.numero_invalide': 'Clé d’interopérabilité invalide (numéro)', | ||
'cle_interop.numero_prefixe_manquant': 'La partie numéro de la clé d’interopérabilité doit contenir 5 caractères', | ||
'cle_interop.voie_non_renseignee': 'La partie voie de la clé d’interopératibilité a été laissée à nul (0000 ou xxxx)', | ||
"cle_interop.casse_invalide": "La clé d’interopérabilité doit être en minuscules", | ||
"cle_interop.structure_invalide": "La clé d’interopérabilité doit contenir au moins 3 segments", | ||
"cle_interop.commune_invalide": "Clé d’interopérabilité invalide (commune)", | ||
"cle_interop.commune_ancienne": "La commune référencée est une commune ancienne", | ||
"cle_interop.voie_invalide": "Clé d’interopérabilité invalide (voie)", | ||
"cle_interop.numero_invalide": "Clé d’interopérabilité invalide (numéro)", | ||
"cle_interop.numero_prefixe_manquant": "La partie numéro de la clé d’interopérabilité doit contenir 5 caractères", | ||
"cle_interop.voie_non_renseignee": "La partie voie de la clé d’interopératibilité a été laissée à nul (0000 ou xxxx)", | ||
// uid_adresse | ||
"uid_adresse.type_invalide": "La valeur de uid_adresse n’est pas valide", | ||
"uid_adresse.incoherence_ids_ban": "Les ids ban renseignés ne sont pas cohérents", | ||
// id_ban_commune | ||
'id_ban_commune.type_invalide': 'La valeur de id_ban_commune n’est pas un uuidv4 valide', | ||
"id_ban_commune.type_invalide": "La valeur de id_ban_commune n’est pas un uuidv4 valide", | ||
// id_ban_toponyme | ||
'id_ban_toponyme.type_invalide': 'La valeur de id_ban_toponyme n’est pas un uuidv4 valide', | ||
"id_ban_toponyme.type_invalide": "La valeur de id_ban_toponyme n’est pas un uuidv4 valide", | ||
// id_ban_adresse | ||
'id_ban_adresse.type_invalide': 'La valeur de id_ban_adresse n’est pas un uuidv4 valide', | ||
"id_ban_adresse.type_invalide": "La valeur de id_ban_adresse n’est pas un uuidv4 valide", | ||
// numero | ||
'numero.type_invalide': 'La valeur du champ numéro doit être un nombre entier', | ||
'numero.contient_prefixe': 'La valeur du champ numéro ne doit pas être préfixée par des zéros', | ||
'numero.trop_grand': 'Le numéro doit être compris entre 0 et 9999 (sauf toponyme)', | ||
"numero.type_invalide": "La valeur du champ numéro doit être un nombre entier", | ||
"numero.contient_prefixe": "La valeur du champ numéro ne doit pas être préfixée par des zéros", | ||
"numero.trop_grand": "Le numéro doit être compris entre 0 et 9999 (sauf toponyme)", | ||
// suffixe | ||
'suffixe.debut_invalide': 'La valeur du champ suffixe doit commencer par un caractère alphanumérique.', | ||
'suffixe.trop_long': 'La valeur du champ suffixe est trop longue', | ||
"suffixe.debut_invalide": "La valeur du champ suffixe doit commencer par un caractère alphanumérique.", | ||
"suffixe.trop_long": "La valeur du champ suffixe est trop longue", | ||
// voie_nom | ||
'voie_nom.trop_court': 'Le nom de la voie est trop court (3 caractères minimum)', | ||
'voie_nom.trop_long': 'Le nom de la voie est trop long (200 caractères maximum)', | ||
'voie_nom.casse_incorrecte': 'Le nom de la voie est en majuscules', | ||
'voie_nom.contient_tiret_bas': 'Le nom de la voie contient un caractère tiret bas', | ||
"voie_nom.trop_court": "Le nom de la voie est trop court (3 caractères minimum)", | ||
"voie_nom.trop_long": "Le nom de la voie est trop long (200 caractères maximum)", | ||
"voie_nom.casse_incorrecte": "Le nom de la voie est en majuscules", | ||
"voie_nom.contient_tiret_bas": "Le nom de la voie contient un caractère tiret bas", | ||
// commune_insee | ||
'commune_insee.commune_invalide': 'Le code INSEE de la commune n’est pas un code ayant existé', | ||
'commune_insee.commune_ancienne': 'Le code INSEE de la commune est le code d’une commune ancienne', | ||
"commune_insee.commune_invalide": "Le code INSEE de la commune n’est pas un code ayant existé", | ||
"commune_insee.commune_ancienne": "Le code INSEE de la commune est le code d’une commune ancienne", | ||
// commune_deleguee_insee | ||
'commune_deleguee_insee.commune_invalide': 'Le code INSEE renseigné n’est pas un code valide ou n’a jamais existé', | ||
'commune_deleguee_insee.commune_actuelle_non_deleguee': 'Le code INSEE renseigné correspond au code d’une commune actuelle dont le chef lieu n’est pas une commune déléguée', | ||
'commune_deleguee_insee.commune_ancienne_non_deleguee': 'Le code INSEE renseigné correspond au code d’une commune ancienne qui n’a pas le statut de commune déléguée', | ||
"commune_deleguee_insee.commune_invalide": "Le code INSEE renseigné n’est pas un code valide ou n’a jamais existé", | ||
"commune_deleguee_insee.commune_actuelle_non_deleguee": "Le code INSEE renseigné correspond au code d’une commune actuelle dont le chef lieu n’est pas une commune déléguée", | ||
"commune_deleguee_insee.commune_ancienne_non_deleguee": "Le code INSEE renseigné correspond au code d’une commune ancienne qui n’a pas le statut de commune déléguée", | ||
// x | ||
'x.separateur_decimal_invalide': 'Le séparateur des décimales du champ x doit être le point', | ||
"x.separateur_decimal_invalide": "Le séparateur des décimales du champ x doit être le point", | ||
// y | ||
'y.separateur_decimal_invalide': 'Le séparateur des décimales du champ y doit être le point', | ||
"y.separateur_decimal_invalide": "Le séparateur des décimales du champ y doit être le point", | ||
// long | ||
'long.separateur_decimal_invalide': 'Le séparateur des décimales du champ long doit être le point', | ||
"long.separateur_decimal_invalide": "Le séparateur des décimales du champ long doit être le point", | ||
// lat | ||
'lat.separateur_decimal_invalide': 'Le séparateur des décimales du champ lat doit être le point', | ||
"lat.separateur_decimal_invalide": "Le séparateur des décimales du champ lat doit être le point", | ||
// date_der_maj | ||
'date_der_maj.date_invalide': 'Date invalide', | ||
'date_der_maj.date_ancienne': 'Date trop ancienne', | ||
'date_der_maj.date_future': 'Date dans le futur', | ||
"date_der_maj.date_invalide": "Date invalide", | ||
"date_der_maj.date_ancienne": "Date trop ancienne", | ||
"date_der_maj.date_future": "Date dans le futur", | ||
// cad_parcelles | ||
'cad_parcelles.pipe_debut_fin': 'Le symbole | ne doit pas être utilisé en début ou fin de chaîne', | ||
"cad_parcelles.pipe_debut_fin": "Le symbole | ne doit pas être utilisé en début ou fin de chaîne", | ||
// row-level errors | ||
'row.incoherence_numero': 'Le numéro ne correspond pas à la valeur présente dans la clé', | ||
'row.position_manquante': 'Position nulle', | ||
'row.chef_lieu_invalide': 'La code INSEE de la commune courante ne correspond pas au chef lieu de la commune disparue renseignée', | ||
'row.commune_manquante': 'Aucun code commune valide n’est renseigné', | ||
'row.longlat_vides': 'Les coordonnées long/lat ne sont pas renseignées', | ||
'row.longlat_invalides': 'Les coordonnées long/lat sont en dehors du territoire ou invalides', | ||
'row.longlat_xy_incoherents': 'Les coordonnées long/lat et x/y ne sont pas cohérentes', | ||
'row.adresse_incomplete': 'L’adresse est incomplète (numéro ou nom de la voie non renseignés)', | ||
'row.incoherence_ids_ban': 'Les ids ban renseignés ne sont pas cohérents', | ||
'row.id_ban_adresses_required': 'id_ban_adresses est requis les ids ban et le numero sont renseigné', | ||
"row.incoherence_numero": "Le numéro ne correspond pas à la valeur présente dans la clé", | ||
"row.position_manquante": "Position nulle", | ||
"row.chef_lieu_invalide": "La code INSEE de la commune courante ne correspond pas au chef lieu de la commune disparue renseignée", | ||
"row.commune_manquante": "Aucun code commune valide n’est renseigné", | ||
"row.longlat_vides": "Les coordonnées long/lat ne sont pas renseignées", | ||
"row.longlat_invalides": "Les coordonnées long/lat sont en dehors du territoire ou invalides", | ||
"row.longlat_xy_incoherents": "Les coordonnées long/lat et x/y ne sont pas cohérentes", | ||
"row.adresse_incomplete": "L’adresse est incomplète (numéro ou nom de la voie non renseignés)", | ||
"row.incoherence_ids_ban": "Les ids ban renseignés ne sont pas cohérents", | ||
"row.id_ban_adresses_required": "id_ban_adresses est requis les ids ban et le numero sont renseigné", | ||
// rows | ||
'rows.empty': 'Aucune ligne détecté', | ||
'rows.ids_required_every': 'Les ids ban sont requis pour toutes les lignes si ils sont utlisés' | ||
"rows.empty": "Aucune ligne détecté", | ||
"rows.ids_required_every": "Les ids ban sont requis pour toutes les lignes si ils sont utlisés" | ||
}; |
@@ -7,3 +7,3 @@ "use strict"; | ||
parseISO | ||
} = require('date-fns'); | ||
} = require("date-fns"); | ||
@@ -14,11 +14,11 @@ const { | ||
deburr | ||
} = require('lodash'); | ||
} = require("lodash"); | ||
const { | ||
isUuid | ||
} = require('uuidv4'); | ||
} = require("uuidv4"); | ||
const languesRegionales = require('@ban-team/shared-data/langues-regionales.json'); | ||
const languesRegionales = require("@ban-team/shared-data/langues-regionales.json"); | ||
const proj = require('@etalab/project-legal'); | ||
const proj = require("@etalab/project-legal"); | ||
@@ -31,3 +31,3 @@ const { | ||
getCommuneActuelle | ||
} = require('../cog'); | ||
} = require("../cog"); | ||
@@ -43,3 +43,3 @@ function isValidFloat(str) { | ||
function includesInvalidChar(str) { | ||
return str.includes('�'); | ||
return str.includes("�"); | ||
} | ||
@@ -52,3 +52,4 @@ | ||
trim: true, | ||
aliases: ['cle_intero', 'cle_interro'], | ||
aliases: ["cle_intero", "cle_interro"], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
@@ -62,13 +63,13 @@ parse(v, _ref) { | ||
if (v.toLowerCase() !== v) { | ||
addError('casse_invalide'); | ||
addError("casse_invalide"); | ||
} | ||
const splitted = v.split('_'); | ||
const splitted = v.split("_"); | ||
if (splitted.length < 3) { | ||
return addError('structure_invalide'); | ||
return addError("structure_invalide"); | ||
} | ||
if (splitted.some(part => !part)) { | ||
return addError('structure_invalide'); | ||
return addError("structure_invalide"); | ||
} | ||
@@ -80,5 +81,5 @@ | ||
if (!isCommune(codeCommune)) { | ||
addError('commune_invalide'); | ||
addError("commune_invalide"); | ||
} else if (isCommuneAncienne(codeCommune)) { | ||
addError('commune_ancienne'); | ||
addError("commune_ancienne"); | ||
} | ||
@@ -89,6 +90,6 @@ | ||
if (codeVoie.length !== 4) { | ||
addError('voie_invalide'); | ||
addError("voie_invalide"); | ||
codeVoieError = true; | ||
} else if (codeVoie.toUpperCase() === 'XXXX' || codeVoie === '0000') { | ||
addError('voie_non_renseignee'); | ||
} else if (codeVoie.toUpperCase() === "XXXX" || codeVoie === "0000") { | ||
addError("voie_non_renseignee"); | ||
codeVoieError = true; | ||
@@ -99,7 +100,7 @@ } // Clé d'interopérabilité - Numéro de voie | ||
if (!/^\d+$/.test(numeroVoie)) { | ||
return addError('numero_invalide'); | ||
return addError("numero_invalide"); | ||
} | ||
if (numeroVoie.length !== 5) { | ||
addError('numero_prefixe_manquant'); | ||
addError("numero_prefixe_manquant"); | ||
} | ||
@@ -110,6 +111,6 @@ | ||
codeVoie: codeVoieError ? undefined : codeVoie.toUpperCase(), | ||
numeroVoie: trimStart(numeroVoie, '0'), | ||
numeroVoie: trimStart(numeroVoie, "0"), | ||
suffixes | ||
}); | ||
return [codeCommune, codeVoie, numeroVoie.padStart(5, '0'), ...suffixes].join('_').toLowerCase(); | ||
return [codeCommune, codeVoie, numeroVoie.padStart(5, "0"), ...suffixes].join("_").toLowerCase(); | ||
} | ||
@@ -120,14 +121,55 @@ | ||
trim: true, | ||
aliases: ['uid_adress'] | ||
formats: ["1.1", "1.2", "1.3"], | ||
aliases: ["uid_adress"], | ||
parse(v, _ref2) { | ||
let { | ||
addError, | ||
setAdditionnalValues | ||
} = _ref2; | ||
const regUuidCommune = /@c([A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12})/gi; | ||
const regUuidToponyme = /@v[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}/gi; | ||
const regUuidAdresse = /@a[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}/gi; | ||
const [uuidCommune] = v.match(regUuidCommune) || []; | ||
const [uuidToponyme] = v.match(regUuidToponyme) || []; | ||
const [uuidAdresse] = v.match(regUuidAdresse) || []; | ||
const idBanCommune = (uuidCommune === null || uuidCommune === void 0 ? void 0 : uuidCommune.substr(2)) || null; | ||
const idBanToponyme = (uuidToponyme === null || uuidToponyme === void 0 ? void 0 : uuidToponyme.substr(2)) || null; | ||
const idBanAdresse = (uuidAdresse === null || uuidAdresse === void 0 ? void 0 : uuidAdresse.substr(2)) || null; | ||
if (!isUuid(idBanCommune) || !isUuid(idBanToponyme) || idBanAdresse === null || !isUuid(idBanAdresse)) { | ||
return addError("type_invalide"); | ||
} | ||
if (!idBanCommune || !idBanToponyme) { | ||
addError("incoherence_ids_ban"); | ||
} // LES IDS id_ban_commune / id_ban_toponyme / id_ban_adresse NE PEUVENT PAS ËTRE IDENTIQUES | ||
if (idBanCommune && idBanToponyme && idBanCommune === idBanToponyme || idBanCommune && idBanAdresse && idBanCommune === idBanAdresse || idBanAdresse && idBanToponyme && idBanToponyme === idBanAdresse) { | ||
addError("incoherence_ids_ban"); | ||
} // SI IL Y A UN id_ban_toponyme, IL Y A UN id_ban_commune | ||
// SI IL Y A UN id_ban_adresse, IL Y A UN id_ban_toponyme ET DONC IL Y A IL Y A UN id_ban_commune | ||
setAdditionnalValues({ | ||
idBanCommune, | ||
idBanToponyme, | ||
idBanAdresse | ||
}); | ||
return v; | ||
} | ||
}, | ||
id_ban_commune: { | ||
formats: ["1.4"], | ||
trim: true, | ||
parse(v, _ref2) { | ||
parse(v, _ref3) { | ||
let { | ||
addError | ||
} = _ref2; | ||
} = _ref3; | ||
if (!isUuid(v)) { | ||
return addError('type_invalide'); | ||
return addError("type_invalide"); | ||
} | ||
@@ -140,11 +182,12 @@ | ||
id_ban_toponyme: { | ||
formats: ["1.4"], | ||
trim: true, | ||
parse(v, _ref3) { | ||
parse(v, _ref4) { | ||
let { | ||
addError | ||
} = _ref3; | ||
} = _ref4; | ||
if (!isUuid(v)) { | ||
return addError('type_invalide'); | ||
return addError("type_invalide"); | ||
} | ||
@@ -157,11 +200,12 @@ | ||
id_ban_adresse: { | ||
formats: ["1.4"], | ||
trim: true, | ||
parse(v, _ref4) { | ||
parse(v, _ref5) { | ||
let { | ||
addError | ||
} = _ref4; | ||
} = _ref5; | ||
if (!isUuid(v)) { | ||
return addError('type_invalide'); | ||
return addError("type_invalide"); | ||
} | ||
@@ -175,29 +219,30 @@ | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
allowLocales: true, | ||
parse(v, _ref5) { | ||
parse(v, _ref6) { | ||
let { | ||
addError | ||
} = _ref5; | ||
} = _ref6; | ||
if (v.length < 3) { | ||
return addError('trop_court'); | ||
return addError("trop_court"); | ||
} | ||
if (v.length > 200) { | ||
return addError('trop_long'); | ||
return addError("trop_long"); | ||
} | ||
if (includesInvalidChar(v)) { | ||
return addError('caractere_invalide'); | ||
return addError("caractere_invalide"); | ||
} | ||
if (v.includes('_')) { | ||
addError('contient_tiret_bas'); | ||
v = v.replace(/_/g, ' '); | ||
if (v.includes("_")) { | ||
addError("contient_tiret_bas"); | ||
v = v.replace(/_/g, " "); | ||
} | ||
if (v.toUpperCase() === v) { | ||
addError('casse_incorrecte'); | ||
addError("casse_incorrecte"); | ||
} | ||
@@ -210,23 +255,24 @@ | ||
lieudit_complement_nom: { | ||
version: '1.2', | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
allowLocales: true, | ||
aliases: ['lieudit_co'] | ||
aliases: ["lieudit_co"] | ||
}, | ||
numero: { | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
aliases: ['nulmero'], | ||
aliases: ["nulmero"], | ||
parse(v, _ref6) { | ||
parse(v, _ref7) { | ||
let { | ||
addError | ||
} = _ref6; | ||
} = _ref7; | ||
if (!/^\d+$/.test(v)) { | ||
return addError('type_invalide'); | ||
return addError("type_invalide"); | ||
} | ||
if (v.startsWith('0') && v !== '0') { | ||
addError('contient_prefixe'); | ||
if (v.startsWith("0") && v !== "0") { | ||
addError("contient_prefixe"); | ||
} | ||
@@ -237,3 +283,3 @@ | ||
if (n > 9999 && n !== 99999) { | ||
return addError('trop_grand'); | ||
return addError("trop_grand"); | ||
} | ||
@@ -246,15 +292,16 @@ | ||
suffixe: { | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
parse(v, _ref7) { | ||
parse(v, _ref8) { | ||
let { | ||
addError | ||
} = _ref7; | ||
} = _ref8; | ||
if (!/^[\da-z]/i.test(v)) { | ||
return addError('debut_invalide'); | ||
return addError("debut_invalide"); | ||
} | ||
if (v.length > 9) { | ||
return addError('trop_long'); | ||
return addError("trop_long"); | ||
} | ||
@@ -267,15 +314,15 @@ | ||
commune_insee: { | ||
version: '1.2', | ||
required: true, | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
aliases: ['commune_in'], | ||
aliases: ["commune_in"], | ||
parse(v, _ref8) { | ||
parse(v, _ref9) { | ||
let { | ||
addError | ||
} = _ref8; | ||
} = _ref9; | ||
const code = v.toUpperCase(); | ||
if (!isCommune(code)) { | ||
addError('commune_invalide'); | ||
addError("commune_invalide"); | ||
return; | ||
@@ -285,3 +332,3 @@ } | ||
if (isCommuneAncienne(code)) { | ||
addError('commune_ancienne'); | ||
addError("commune_ancienne"); | ||
} | ||
@@ -295,18 +342,19 @@ | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
allowLocales: true, | ||
aliases: ['commune_no'] | ||
aliases: ["commune_no"] | ||
}, | ||
commune_deleguee_insee: { | ||
version: '1.2', | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
parse(v, _ref9) { | ||
parse(v, _ref10) { | ||
let { | ||
addError | ||
} = _ref9; | ||
} = _ref10; | ||
const code = v.toUpperCase(); | ||
if (!isCommune(code)) { | ||
addError('commune_invalide'); | ||
addError("commune_invalide"); | ||
return; | ||
@@ -317,5 +365,5 @@ } | ||
if (isCommuneActuelle(code)) { | ||
addError('commune_actuelle_non_deleguee'); | ||
addError("commune_actuelle_non_deleguee"); | ||
} else { | ||
addError('commune_ancienne_non_deleguee'); | ||
addError("commune_ancienne_non_deleguee"); | ||
} | ||
@@ -329,3 +377,3 @@ } | ||
commune_deleguee_nom: { | ||
version: '1.2', | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
@@ -335,13 +383,15 @@ allowLocales: true | ||
position: { | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
enum: ['délivrance postale', 'entrée', 'bâtiment', 'cage d’escalier', 'logement', 'parcelle', 'segment', 'service technique'] | ||
enum: ["délivrance postale", "entrée", "bâtiment", "cage d’escalier", "logement", "parcelle", "segment", "service technique"] | ||
}, | ||
x: { | ||
aliases: ['x_l93'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["x_l93"], | ||
trim: true, | ||
parse(v, _ref10) { | ||
parse(v, _ref11) { | ||
let { | ||
addError | ||
} = _ref10; | ||
} = _ref11; | ||
@@ -353,7 +403,7 @@ if (isValidFloat(v)) { | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide'); | ||
return Number.parseFloat(v.replace(',', '.')); | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide'); | ||
addError("valeur_invalide"); | ||
} | ||
@@ -363,9 +413,10 @@ | ||
y: { | ||
aliases: ['y_l93'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["y_l93"], | ||
trim: true, | ||
parse(v, _ref11) { | ||
parse(v, _ref12) { | ||
let { | ||
addError | ||
} = _ref11; | ||
} = _ref12; | ||
@@ -377,7 +428,7 @@ if (isValidFloat(v)) { | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide'); | ||
return Number.parseFloat(v.replace(',', '.')); | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide'); | ||
addError("valeur_invalide"); | ||
} | ||
@@ -387,9 +438,10 @@ | ||
long: { | ||
aliases: ['long_wgs84', 'lon'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["long_wgs84", "lon"], | ||
trim: true, | ||
parse(v, _ref12) { | ||
parse(v, _ref13) { | ||
let { | ||
addError | ||
} = _ref12; | ||
} = _ref13; | ||
@@ -401,7 +453,7 @@ if (isValidFloat(v)) { | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide'); | ||
return Number.parseFloat(v.replace(',', '.')); | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide'); | ||
addError("valeur_invalide"); | ||
} | ||
@@ -411,9 +463,10 @@ | ||
lat: { | ||
aliases: ['lat_wgs84'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["lat_wgs84"], | ||
trim: true, | ||
parse(v, _ref13) { | ||
parse(v, _ref14) { | ||
let { | ||
addError | ||
} = _ref13; | ||
} = _ref14; | ||
@@ -425,7 +478,7 @@ if (isValidFloat(v)) { | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide'); | ||
return Number.parseFloat(v.replace(',', '.')); | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide'); | ||
addError("valeur_invalide"); | ||
} | ||
@@ -435,25 +488,25 @@ | ||
cad_parcelles: { | ||
version: '1.2', | ||
aliases: ['cad_parcel'], | ||
formats: ["1.2", "1.3", "1.4"], | ||
aliases: ["cad_parcel"], | ||
trim: true, | ||
parse(v, _ref14) { | ||
parse(v, _ref15) { | ||
let { | ||
addError | ||
} = _ref14; | ||
const pTrimmedValue = trim(v, '|'); | ||
} = _ref15; | ||
const pTrimmedValue = trim(v, "|"); | ||
if (pTrimmedValue !== v) { | ||
addError('pipe_debut_fin'); | ||
addError("pipe_debut_fin"); | ||
} | ||
if (!pTrimmedValue) { | ||
addError('valeur_invalide'); | ||
addError("valeur_invalide"); | ||
return; | ||
} | ||
const parcelles = pTrimmedValue.includes('|') ? pTrimmedValue.split('|') : [pTrimmedValue]; | ||
const parcelles = pTrimmedValue.includes("|") ? pTrimmedValue.split("|") : [pTrimmedValue]; | ||
if (parcelles.some(p => p.length !== 14 && p.length !== 15)) { | ||
addError('valeur_invalide'); | ||
addError("valeur_invalide"); | ||
return; | ||
@@ -467,2 +520,3 @@ } | ||
source: { | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
required: true, | ||
@@ -473,12 +527,13 @@ trim: true | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
aliases: ['date_der_m', 'dmaj', 'date_maj'], | ||
aliases: ["date_der_m", "dmaj", "date_maj"], | ||
parse(v, _ref15) { | ||
parse(v, _ref16) { | ||
let { | ||
addError | ||
} = _ref15; | ||
} = _ref16; | ||
if (!/^(\d{4}-\d{2}-\d{2})$/.test(v)) { | ||
return addError('date_invalide'); | ||
return addError("date_invalide"); | ||
} | ||
@@ -489,14 +544,14 @@ | ||
if (Number.isNaN(parsedDate.getTime())) { | ||
return addError('date_invalide'); | ||
return addError("date_invalide"); | ||
} | ||
if (parsedDate < new Date('2010-01-01')) { | ||
addError('date_ancienne'); | ||
if (parsedDate < new Date("2010-01-01")) { | ||
addError("date_ancienne"); | ||
} | ||
if (parsedDate > new Date()) { | ||
return addError('date_future'); | ||
return addError("date_future"); | ||
} | ||
return format(parsedDate, 'yyyy-MM-dd'); | ||
return format(parsedDate, "yyyy-MM-dd"); | ||
} | ||
@@ -506,21 +561,21 @@ | ||
certification_commune: { | ||
version: '1.3', | ||
formats: ["1.3", "1.4"], | ||
required: false, | ||
trim: true, | ||
aliases: ['certification_adresse'], | ||
aliases: ["certification_adresse"], | ||
parse(v, _ref16) { | ||
parse(v, _ref17) { | ||
let { | ||
addError | ||
} = _ref16; | ||
} = _ref17; | ||
if (v === '1') { | ||
if (v === "1") { | ||
return true; | ||
} | ||
if (v === '0') { | ||
if (v === "0") { | ||
return false; | ||
} | ||
return addError('valeur_invalide'); | ||
return addError("valeur_invalide"); | ||
} | ||
@@ -532,3 +587,3 @@ | ||
function getNormalizedEnumValue(value) { | ||
return deburr(value.normalize()).replace(/\W+/g, ' ').trim().toLowerCase().normalize(); | ||
return deburr(value.normalize()).replace(/\W+/g, " ").trim().toLowerCase().normalize(); | ||
} | ||
@@ -548,12 +603,13 @@ | ||
return proj(coordinates); | ||
} catch {} | ||
} catch {// empty | ||
} | ||
} | ||
function validateCoords(row, _ref17) { | ||
function validateCoords(row, _ref18) { | ||
let { | ||
addError | ||
} = _ref17; | ||
} = _ref18; | ||
if (row.parsedValues.numero && row.parsedValues.numero !== 99999 && (!row.rawValues.long || !row.rawValues.lat)) { | ||
addError('longlat_vides'); | ||
addError("longlat_vides"); | ||
} | ||
@@ -577,3 +633,3 @@ | ||
if (distance > tolerance) { | ||
addError('longlat_xy_incoherents'); | ||
addError("longlat_xy_incoherents"); | ||
} | ||
@@ -583,3 +639,3 @@ } | ||
// Not in France or error | ||
addError('longlat_invalides'); | ||
addError("longlat_invalides"); | ||
} | ||
@@ -593,3 +649,3 @@ } | ||
if (!row.parsedValues.id_ban_commune && row.parsedValues.id_ban_toponyme || (!row.parsedValues.id_ban_commune || !row.parsedValues.id_ban_toponyme) && row.parsedValues.id_ban_adresse) { | ||
addError('incoherence_ids_ban'); | ||
addError("incoherence_ids_ban"); | ||
} // LES IDS id_ban_commune / id_ban_toponyme / id_ban_adresse NE PEUVENT PAS ËTRE IDENTIQUES | ||
@@ -599,3 +655,3 @@ | ||
if (row.parsedValues.id_ban_commune && row.parsedValues.id_ban_toponyme && row.parsedValues.id_ban_commune === row.parsedValues.id_ban_toponyme || row.parsedValues.id_ban_commune && row.parsedValues.id_ban_adresse && row.parsedValues.id_ban_commune === row.parsedValues.id_ban_adresse || row.parsedValues.id_ban_adresse && row.parsedValues.id_ban_toponyme && row.parsedValues.id_ban_toponyme === row.parsedValues.id_ban_adresse) { | ||
addError('incoherence_ids_ban'); | ||
addError("incoherence_ids_ban"); | ||
} // SI IL Y A UN id_ban_toponyme, id_ban_commune ET UN numero, IL FAUT UN id_ban_adresse | ||
@@ -605,10 +661,10 @@ | ||
if (row.parsedValues.id_ban_commune && row.parsedValues.id_ban_toponyme && row.parsedValues.numero && row.parsedValues.numero !== 99999 && !row.parsedValues.id_ban_adresse) { | ||
addError('id_ban_adresses_required'); | ||
addError("id_ban_adresses_required"); | ||
} | ||
} | ||
exports.row = (row, _ref18) => { | ||
exports.row = (row, _ref19) => { | ||
let { | ||
addError | ||
} = _ref18; | ||
} = _ref19; | ||
@@ -621,3 +677,3 @@ if (row.parsedValues.cle_interop && row.parsedValues.numero) { | ||
if (Number.parseInt(numeroVoie, 10) !== row.parsedValues.numero) { | ||
addError('incoherence_numero'); | ||
addError("incoherence_numero"); | ||
} | ||
@@ -627,7 +683,7 @@ } | ||
if (!row.parsedValues.cle_interop && !row.parsedValues.commune_insee) { | ||
addError('commune_manquante'); | ||
addError("commune_manquante"); | ||
} | ||
if (row.parsedValues.numero && row.parsedValues.numero !== 99999 && !row.rawValues.position) { | ||
addError('position_manquante'); | ||
addError("position_manquante"); | ||
} | ||
@@ -640,3 +696,3 @@ | ||
if (row.parsedValues.numero === undefined || !row.parsedValues.voie_nom) { | ||
addError('adresse_incomplete'); | ||
addError("adresse_incomplete"); | ||
} | ||
@@ -650,3 +706,3 @@ | ||
if (communeActuelle && communeActuelle.code !== codeCommune) { | ||
addError('chef_lieu_invalide'); | ||
addError("chef_lieu_invalide"); | ||
} | ||
@@ -653,0 +709,0 @@ } |
"use strict"; | ||
const errors = ['cle_interop.valeur_manquante', 'cle_interop.casse_invalide', 'cle_interop.structure_invalide', 'cle_interop.commune_invalide', 'cle_interop.voie_invalide', 'cle_interop.voie_non_renseignee', 'cle_interop.numero_invalide', 'cle_interop.numero_prefixe_manquant', 'voie_nom.valeur_manquante', 'voie_nom.caractere_invalide', 'voie_nom_@@.caractere_invalide', 'numero.valeur_manquante', 'numero.contient_prefixe', 'numero.type_invalide', 'suffixe.debut_invalide', 'position.valeur_invalide', 'x.valeur_invalide', 'x.separateur_decimal_invalide', 'y.valeur_invalide', 'y.separateur_decimal_invalide', 'long.valeur_invalide', 'long.separateur_decimal_invalide', 'lat.valeur_invalide', 'lat.separateur_decimal_invalide', 'source.valeur_manquante', 'date_der_maj.valeur_manquante', 'date_der_maj.date_invalide', 'row.incoherence_numero', 'row.position_manquante', 'row.adresse_incomplete', 'field.cle_interop.missing', 'field.commune_nom.missing', 'field.uid_adresse.missing', 'field.voie_nom.missing', 'field.numero.missing', 'field.suffixe.missing', 'field.position.missing', 'field.long.missing', 'field.lat.missing', 'field.x.missing', 'field.y.missing', 'field.source.missing', 'field.date_der_maj.missing', 'field.cle_interop.fuzzy', 'field.commune_nom.fuzzy', 'field.uid_adresse.fuzzy', 'field.voie_nom.fuzzy', 'field.numero.fuzzy', 'field.suffixe.fuzzy', 'field.position.fuzzy', 'field.long.fuzzy', 'field.lat.fuzzy', 'field.x.fuzzy', 'field.y.fuzzy', 'field.source.fuzzy', 'field.date_der_maj.fuzzy', 'file.encoding.non_standard', 'file.delimiter.non_standard', 'file.linebreak.non_standard']; | ||
const warnings = ['position.enum_fuzzy']; | ||
const errors = ["cle_interop.valeur_manquante", "cle_interop.casse_invalide", "cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.voie_invalide", "cle_interop.voie_non_renseignee", "cle_interop.numero_invalide", "cle_interop.numero_prefixe_manquant", "voie_nom.valeur_manquante", "voie_nom.caractere_invalide", "voie_nom_@@.caractere_invalide", "numero.valeur_manquante", "numero.contient_prefixe", "numero.type_invalide", "suffixe.debut_invalide", "position.valeur_invalide", "x.valeur_invalide", "x.separateur_decimal_invalide", "y.valeur_invalide", "y.separateur_decimal_invalide", "long.valeur_invalide", "long.separateur_decimal_invalide", "lat.valeur_invalide", "lat.separateur_decimal_invalide", "source.valeur_manquante", "date_der_maj.valeur_manquante", "date_der_maj.date_invalide", "row.incoherence_numero", "row.position_manquante", "row.adresse_incomplete", "field.cle_interop.missing", "field.commune_nom.missing", "field.uid_adresse.missing", "field.voie_nom.missing", "field.numero.missing", "field.suffixe.missing", "field.position.missing", "field.long.missing", "field.lat.missing", "field.x.missing", "field.y.missing", "field.source.missing", "field.date_der_maj.missing", "field.cle_interop.fuzzy", "field.commune_nom.fuzzy", "field.uid_adresse.fuzzy", "field.voie_nom.fuzzy", "field.numero.fuzzy", "field.suffixe.fuzzy", "field.position.fuzzy", "field.long.fuzzy", "field.lat.fuzzy", "field.x.fuzzy", "field.y.fuzzy", "field.source.fuzzy", "field.date_der_maj.fuzzy", "file.encoding.non_standard", "file.delimiter.non_standard", "file.linebreak.non_standard"]; | ||
const warnings = ["position.enum_fuzzy"]; | ||
module.exports = { | ||
code: '1.1-strict', | ||
name: 'BAL 1.1 Strict', | ||
code: "1.1-strict", | ||
name: "BAL 1.1 Strict", | ||
isUsed: false, | ||
relax: false, | ||
errors, | ||
warnings | ||
warnings, | ||
format: "1.1" | ||
}; |
"use strict"; | ||
const errors = ['cle_interop.valeur_manquante', 'cle_interop.casse_invalide', 'cle_interop.structure_invalide', 'cle_interop.commune_invalide', 'cle_interop.voie_invalide', 'cle_interop.voie_non_renseignee', 'cle_interop.numero_invalide', 'cle_interop.numero_prefixe_manquant', 'voie_nom.valeur_manquante', 'voie_nom.caractere_invalide', 'voie_nom_@@.caractere_invalide', 'numero.valeur_manquante', 'numero.contient_prefixe', 'numero.type_invalide', 'suffixe.debut_invalide', 'commune_insee.commune_invalide', 'commune_deleguee_insee.commune_invalide', 'position.valeur_invalide', 'x.valeur_invalide', 'x.separateur_decimal_invalide', 'y.valeur_invalide', 'y.separateur_decimal_invalide', 'long.valeur_invalide', 'long.separateur_decimal_invalide', 'lat.valeur_invalide', 'lat.separateur_decimal_invalide', 'cad_parcelles.valeur_invalide', 'cad_parcelles.pipe_debut_fin', 'source.valeur_manquante', 'date_der_maj.valeur_manquante', 'date_der_maj.date_invalide', 'row.incoherence_numero', 'row.position_manquante', 'row.adresse_incomplete', 'field.cle_interop.missing', 'field.commune_insee.missing', 'field.commune_nom.missing', 'field.commune_deleguee_insee.missing', 'field.commune_deleguee_nom.missing', 'field.uid_adresse.missing', 'field.voie_nom.missing', 'field.lieudit_complement_nom.missing', 'field.numero.missing', 'field.suffixe.missing', 'field.position.missing', 'field.long.missing', 'field.lat.missing', 'field.x.missing', 'field.y.missing', 'field.cad_parcelles.missing', 'field.source.missing', 'field.date_der_maj.missing', 'field.cle_interop.fuzzy', 'field.commune_insee.fuzzy', 'field.commune_nom.fuzzy', 'field.commune_deleguee_insee.fuzzy', 'field.commune_deleguee_nom.fuzzy', 'field.uid_adresse.fuzzy', 'field.voie_nom.fuzzy', 'field.lieudit_complement_nom.fuzzy', 'field.numero.fuzzy', 'field.suffixe.fuzzy', 'field.position.fuzzy', 'field.long.fuzzy', 'field.lat.fuzzy', 'field.x.fuzzy', 'field.y.fuzzy', 'field.cad_parcelles.fuzzy', 'field.source.fuzzy', 'field.date_der_maj.fuzzy', 'file.encoding.non_standard', 'file.delimiter.non_standard', 'file.linebreak.non_standard']; | ||
const warnings = ['position.enum_fuzzy']; | ||
const errors = ["cle_interop.valeur_manquante", "cle_interop.casse_invalide", "cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.voie_invalide", "cle_interop.voie_non_renseignee", "cle_interop.numero_invalide", "cle_interop.numero_prefixe_manquant", "voie_nom.valeur_manquante", "voie_nom.caractere_invalide", "voie_nom_@@.caractere_invalide", "numero.valeur_manquante", "numero.contient_prefixe", "numero.type_invalide", "suffixe.debut_invalide", "commune_insee.commune_invalide", "commune_deleguee_insee.commune_invalide", "position.valeur_invalide", "x.valeur_invalide", "x.separateur_decimal_invalide", "y.valeur_invalide", "y.separateur_decimal_invalide", "long.valeur_invalide", "long.separateur_decimal_invalide", "lat.valeur_invalide", "lat.separateur_decimal_invalide", "cad_parcelles.valeur_invalide", "cad_parcelles.pipe_debut_fin", "source.valeur_manquante", "date_der_maj.valeur_manquante", "date_der_maj.date_invalide", "row.incoherence_numero", "row.position_manquante", "row.adresse_incomplete", "field.cle_interop.missing", "field.commune_insee.missing", "field.commune_nom.missing", "field.commune_deleguee_insee.missing", "field.commune_deleguee_nom.missing", "field.uid_adresse.missing", "field.voie_nom.missing", "field.lieudit_complement_nom.missing", "field.numero.missing", "field.suffixe.missing", "field.position.missing", "field.long.missing", "field.lat.missing", "field.x.missing", "field.y.missing", "field.cad_parcelles.missing", "field.source.missing", "field.date_der_maj.missing", "field.cle_interop.fuzzy", "field.commune_insee.fuzzy", "field.commune_nom.fuzzy", "field.commune_deleguee_insee.fuzzy", "field.commune_deleguee_nom.fuzzy", "field.uid_adresse.fuzzy", "field.voie_nom.fuzzy", "field.lieudit_complement_nom.fuzzy", "field.numero.fuzzy", "field.suffixe.fuzzy", "field.position.fuzzy", "field.long.fuzzy", "field.lat.fuzzy", "field.x.fuzzy", "field.y.fuzzy", "field.cad_parcelles.fuzzy", "field.source.fuzzy", "field.date_der_maj.fuzzy", "file.encoding.non_standard", "file.delimiter.non_standard", "file.linebreak.non_standard"]; | ||
const warnings = ["position.enum_fuzzy"]; | ||
module.exports = { | ||
code: '1.2-strict', | ||
name: 'BAL 1.2 Strict', | ||
code: "1.2-strict", | ||
name: "BAL 1.2 Strict", | ||
isUsed: false, | ||
relax: false, | ||
errors, | ||
warnings | ||
warnings, | ||
format: "1.2" | ||
}; |
"use strict"; | ||
const errors = ['cle_interop.structure_invalide', 'cle_interop.commune_invalide', 'cle_interop.numero_invalide', 'voie_nom.valeur_manquante', 'voie_nom.trop_court', 'voie_nom.trop_long', 'voie_nom.caractere_invalide', 'numero.valeur_manquante', 'numero.type_invalide', 'numero.trop_grand', 'suffixe.debut_invalide', 'suffixe.trop_long', 'commune_insee.commune_invalide', 'x.valeur_invalide', 'y.valeur_invalide', 'long.valeur_invalide', 'lat.valeur_invalide', 'row.incoherence_numero', 'row.commune_manquante', 'row.longlat_vides', 'row.longlat_invalides', 'row.adresse_incomplete', 'field.voie_nom.missing', 'field.numero.missing', 'rows.empty']; | ||
const warnings = ['cle_interop.valeur_manquante', 'cle_interop.casse_invalide', 'cle_interop.voie_invalide', 'cle_interop.numero_prefixe_manquant', 'cle_interop.commune_ancienne', 'numero.contient_prefixe', 'voie_nom.casse_incorrecte', 'voie_nom.contient_tiret_bas', 'voie_nom_@@.casse_incorrecte', 'voie_nom_@@.contient_tiret_bas', 'voie_nom_@@.trop_court', 'voie_nom_@@.trop_long', 'voie_nom_@@.caractere_invalide', 'commune_insee.commune_ancienne', 'commune_deleguee_insee.commune_invalide', 'commune_deleguee_insee.commune_actuelle_non_deleguee', 'commune_deleguee_insee.commune_ancienne_non_deleguee', 'position.enum_fuzzy', 'position.valeur_invalide', 'x.separateur_decimal_invalide', 'y.separateur_decimal_invalide', 'long.separateur_decimal_invalide', 'lat.separateur_decimal_invalide', 'cad_parcelles.valeur_invalide', 'cad_parcelles.pipe_debut_fin', 'source.valeur_manquante', 'date_der_maj.valeur_manquante', 'date_der_maj.date_invalide', 'date_der_maj.date_ancienne', 'date_der_maj.date_future', 'certification_commune.valeur_invalide', 'row.position_manquante', 'row.chef_lieu_invalide', 'row.longlat_xy_incoherents', 'field.suffixe.missing', 'field.cle_interop.missing', 'field.commune_insee.missing', 'field.position.missing', 'field.long.missing', 'field.lat.missing', 'field.x.missing', 'field.y.missing', 'field.source.missing', 'field.date_der_maj.missing', 'field.certification_commune.missing', 'cle_interop.espaces_debut_fin', 'commune_insee.espaces_debut_fin', 'commune_nom.espaces_debut_fin', 'commune_deleguee_insee.espaces_debut_fin', 'commune_deleguee_nom.espaces_debut_fin', 'uid_adresse.espaces_debut_fin', 'voie_nom.espaces_debut_fin', 'voie_nom_@@.espaces_debut_fin', 'lieudit_complement_nom.espaces_debut_fin', 'lieudit_complement_nom_@@.espaces_debut_fin', 'numero.espaces_debut_fin', 'suffixe.espaces_debut_fin', 'position.espaces_debut_fin', 'long.espaces_debut_fin', 'lat.espaces_debut_fin', 'x.espaces_debut_fin', 'y.espaces_debut_fin', 'cad_parcelles.espaces_debut_fin', 'source.espaces_debut_fin', 'date_der_maj.espaces_debut_fin']; | ||
const infos = ['cle_interop.voie_non_renseignee']; | ||
const errors = ["cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.numero_invalide", "voie_nom.valeur_manquante", "voie_nom.trop_court", "voie_nom.trop_long", "voie_nom.caractere_invalide", "numero.valeur_manquante", "numero.type_invalide", "numero.trop_grand", "suffixe.debut_invalide", "suffixe.trop_long", "commune_insee.commune_invalide", "x.valeur_invalide", "y.valeur_invalide", "long.valeur_invalide", "lat.valeur_invalide", "row.incoherence_numero", "row.commune_manquante", "row.longlat_vides", "row.longlat_invalides", "row.adresse_incomplete", "field.voie_nom.missing", "field.numero.missing", "rows.empty"]; | ||
const warnings = ["cle_interop.valeur_manquante", "cle_interop.casse_invalide", "cle_interop.voie_invalide", "cle_interop.numero_prefixe_manquant", "cle_interop.commune_ancienne", "numero.contient_prefixe", "voie_nom.casse_incorrecte", "voie_nom.contient_tiret_bas", "voie_nom_@@.casse_incorrecte", "voie_nom_@@.contient_tiret_bas", "voie_nom_@@.trop_court", "voie_nom_@@.trop_long", "voie_nom_@@.caractere_invalide", "commune_insee.commune_ancienne", "commune_deleguee_insee.commune_invalide", "commune_deleguee_insee.commune_actuelle_non_deleguee", "commune_deleguee_insee.commune_ancienne_non_deleguee", "position.enum_fuzzy", "position.valeur_invalide", "x.separateur_decimal_invalide", "y.separateur_decimal_invalide", "long.separateur_decimal_invalide", "lat.separateur_decimal_invalide", "cad_parcelles.valeur_invalide", "cad_parcelles.pipe_debut_fin", "source.valeur_manquante", "date_der_maj.valeur_manquante", "date_der_maj.date_invalide", "date_der_maj.date_ancienne", "date_der_maj.date_future", "certification_commune.valeur_invalide", "row.position_manquante", "row.chef_lieu_invalide", "row.longlat_xy_incoherents", "field.suffixe.missing", "field.cle_interop.missing", "field.commune_insee.missing", "field.position.missing", "field.long.missing", "field.lat.missing", "field.x.missing", "field.y.missing", "field.source.missing", "field.date_der_maj.missing", "field.certification_commune.missing", "cle_interop.espaces_debut_fin", "commune_insee.espaces_debut_fin", "commune_nom.espaces_debut_fin", "commune_deleguee_insee.espaces_debut_fin", "commune_deleguee_nom.espaces_debut_fin", "uid_adresse.espaces_debut_fin", "voie_nom.espaces_debut_fin", "voie_nom_@@.espaces_debut_fin", "lieudit_complement_nom.espaces_debut_fin", "lieudit_complement_nom_@@.espaces_debut_fin", "numero.espaces_debut_fin", "suffixe.espaces_debut_fin", "position.espaces_debut_fin", "long.espaces_debut_fin", "lat.espaces_debut_fin", "x.espaces_debut_fin", "y.espaces_debut_fin", "cad_parcelles.espaces_debut_fin", "source.espaces_debut_fin", "date_der_maj.espaces_debut_fin", // ID BAN | ||
"uid_adresse.type_invalide", "uid_adresse.incoherence_ids_ban"]; | ||
const infos = ["cle_interop.voie_non_renseignee"]; | ||
module.exports = { | ||
code: '1.3-relax', | ||
name: 'BAL 1.3 Relax', | ||
code: "1.3-relax", | ||
name: "BAL 1.3 Relax", | ||
isUsed: false, | ||
@@ -13,3 +14,4 @@ relax: true, | ||
warnings, | ||
infos | ||
infos, | ||
format: "1.3" | ||
}; |
"use strict"; | ||
const errors = ['cle_interop.valeur_manquante', 'cle_interop.casse_invalide', 'cle_interop.structure_invalide', 'cle_interop.commune_invalide', 'cle_interop.voie_invalide', 'cle_interop.voie_non_renseignee', 'cle_interop.numero_invalide', 'cle_interop.numero_prefixe_manquant', 'voie_nom.valeur_manquante', 'voie_nom.caractere_invalide', 'voie_nom_@@.caractere_invalide', 'numero.valeur_manquante', 'numero.contient_prefixe', 'numero.type_invalide', 'suffixe.debut_invalide', 'commune_insee.commune_invalide', 'commune_deleguee_insee.commune_invalide', 'position.valeur_invalide', 'x.valeur_invalide', 'x.separateur_decimal_invalide', 'y.valeur_invalide', 'y.separateur_decimal_invalide', 'long.valeur_invalide', 'long.separateur_decimal_invalide', 'lat.valeur_invalide', 'lat.separateur_decimal_invalide', 'cad_parcelles.valeur_invalide', 'cad_parcelles.pipe_debut_fin', 'source.valeur_manquante', 'date_der_maj.valeur_manquante', 'date_der_maj.date_invalide', 'certification_commune.valeur_invalide', 'row.incoherence_numero', 'row.position_manquante', 'row.adresse_incomplete', 'field.cle_interop.missing', 'field.commune_insee.missing', 'field.commune_nom.missing', 'field.commune_deleguee_insee.missing', 'field.commune_deleguee_nom.missing', 'field.uid_adresse.missing', 'field.voie_nom.missing', 'field.lieudit_complement_nom.missing', 'field.numero.missing', 'field.suffixe.missing', 'field.position.missing', 'field.long.missing', 'field.lat.missing', 'field.x.missing', 'field.y.missing', 'field.cad_parcelles.missing', 'field.source.missing', 'field.date_der_maj.missing', 'field.certification_commune.missing', 'field.cle_interop.fuzzy', 'field.commune_insee.fuzzy', 'field.commune_nom.fuzzy', 'field.commune_deleguee_insee.fuzzy', 'field.commune_deleguee_nom.fuzzy', 'field.uid_adresse.fuzzy', 'field.voie_nom.fuzzy', 'field.lieudit_complement_nom.fuzzy', 'field.numero.fuzzy', 'field.suffixe.fuzzy', 'field.position.fuzzy', 'field.long.fuzzy', 'field.lat.fuzzy', 'field.x.fuzzy', 'field.y.fuzzy', 'field.cad_parcelles.fuzzy', 'field.source.fuzzy', 'field.date_der_maj.fuzzy', 'field.certification_commune.fuzzy', 'file.encoding.non_standard', 'file.delimiter.non_standard', 'file.linebreak.non_standard']; | ||
const warnings = ['position.enum_fuzzy']; | ||
const errors = ["cle_interop.valeur_manquante", "cle_interop.casse_invalide", "cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.voie_invalide", "cle_interop.voie_non_renseignee", "cle_interop.numero_invalide", "cle_interop.numero_prefixe_manquant", "voie_nom.valeur_manquante", "voie_nom.caractere_invalide", "voie_nom_@@.caractere_invalide", "numero.valeur_manquante", "numero.contient_prefixe", "numero.type_invalide", "suffixe.debut_invalide", "commune_insee.commune_invalide", "commune_deleguee_insee.commune_invalide", "position.valeur_invalide", "x.valeur_invalide", "x.separateur_decimal_invalide", "y.valeur_invalide", "y.separateur_decimal_invalide", "long.valeur_invalide", "long.separateur_decimal_invalide", "lat.valeur_invalide", "lat.separateur_decimal_invalide", "cad_parcelles.valeur_invalide", "cad_parcelles.pipe_debut_fin", "source.valeur_manquante", "date_der_maj.valeur_manquante", "date_der_maj.date_invalide", "certification_commune.valeur_invalide", "row.incoherence_numero", "row.position_manquante", "row.adresse_incomplete", "field.cle_interop.missing", "field.commune_insee.missing", "field.commune_nom.missing", "field.commune_deleguee_insee.missing", "field.commune_deleguee_nom.missing", "field.uid_adresse.missing", "field.voie_nom.missing", "field.lieudit_complement_nom.missing", "field.numero.missing", "field.suffixe.missing", "field.position.missing", "field.long.missing", "field.lat.missing", "field.x.missing", "field.y.missing", "field.cad_parcelles.missing", "field.source.missing", "field.date_der_maj.missing", "field.certification_commune.missing", "field.cle_interop.fuzzy", "field.commune_insee.fuzzy", "field.commune_nom.fuzzy", "field.commune_deleguee_insee.fuzzy", "field.commune_deleguee_nom.fuzzy", "field.uid_adresse.fuzzy", "field.voie_nom.fuzzy", "field.lieudit_complement_nom.fuzzy", "field.numero.fuzzy", "field.suffixe.fuzzy", "field.position.fuzzy", "field.long.fuzzy", "field.lat.fuzzy", "field.x.fuzzy", "field.y.fuzzy", "field.cad_parcelles.fuzzy", "field.source.fuzzy", "field.date_der_maj.fuzzy", "field.certification_commune.fuzzy", "file.encoding.non_standard", "file.delimiter.non_standard", "file.linebreak.non_standard"]; | ||
const warnings = ["position.enum_fuzzy"]; | ||
module.exports = { | ||
code: '1.3-strict', | ||
name: 'BAL 1.3 Strict', | ||
isUsed: true, | ||
code: "1.3-strict", | ||
name: "BAL 1.3 Strict", | ||
isUsed: false, | ||
relax: false, | ||
errors, | ||
warnings | ||
warnings, | ||
format: "1.3" | ||
}; |
"use strict"; | ||
const errors = ['cle_interop.structure_invalide', 'cle_interop.commune_invalide', 'cle_interop.numero_invalide', 'cle_interop.valeur_manquante', 'cle_interop.numero_prefixe_manquant', 'cle_interop.casse_invalide', 'voie_nom.valeur_manquante', 'voie_nom.trop_court', 'voie_nom.trop_long', 'voie_nom.caractere_invalide', 'numero.valeur_manquante', 'numero.type_invalide', 'numero.trop_grand', 'numero.contient_prefixe', 'suffixe.debut_invalide', 'suffixe.trop_long', 'date_der_maj.date_invalide', 'commune_insee.commune_invalide', 'commune_insee.valeur_manquante', 'commune_insee.espaces_debut_fin', 'x.valeur_invalide', 'y.valeur_invalide', 'x.separateur_decimal_invalide', 'y.separateur_decimal_invalide', 'long.valeur_invalide', 'lat.valeur_invalide', 'long.separateur_decimal_invalide', 'lat.separateur_decimal_invalide', 'row.incoherence_numero', 'row.commune_manquante', 'row.longlat_vides', 'row.longlat_invalides', 'row.adresse_incomplete', 'field.commune_insee.missing', 'field.voie_nom.missing', 'field.numero.missing', 'field.commune_nom.long', 'field.commune_nom.lat', 'suffixe.espaces_debut_fin', 'file.encoding.non_standard', 'file.delimiter.non_standard', 'file.linebreak.non_standard', 'rows.empty']; | ||
const warnings = ['cle_interop.voie_invalide', 'cle_interop.commune_ancienne', 'voie_nom.casse_incorrecte', 'voie_nom.contient_tiret_bas', 'voie_nom_@@.casse_incorrecte', 'voie_nom_@@.contient_tiret_bas', 'voie_nom_@@.trop_court', 'voie_nom_@@.trop_long', 'voie_nom_@@.caractere_invalide', 'commune_insee.commune_ancienne', 'commune_deleguee_insee.commune_invalide', 'commune_deleguee_insee.commune_actuelle_non_deleguee', 'commune_deleguee_insee.commune_ancienne_non_deleguee', 'position.enum_fuzzy', 'position.valeur_invalide', 'cad_parcelles.valeur_invalide', 'cad_parcelles.pipe_debut_fin', 'source.valeur_manquante', 'date_der_maj.valeur_manquante', 'date_der_maj.date_ancienne', 'date_der_maj.date_future', 'certification_commune.valeur_invalide', 'row.position_manquante', 'row.chef_lieu_invalide', 'row.longlat_xy_incoherents', 'field.suffixe.missing', 'field.cle_interop.missing', 'field.position.missing', 'field.long.missing', 'field.lat.missing', 'field.x.missing', 'field.y.missing', 'field.source.missing', 'field.date_der_maj.missing', 'field.certification_commune.missing', 'cle_interop.espaces_debut_fin', 'commune_nom.espaces_debut_fin', 'commune_deleguee_insee.espaces_debut_fin', 'commune_deleguee_nom.espaces_debut_fin', 'uid_adresse.espaces_debut_fin', 'voie_nom.espaces_debut_fin', 'voie_nom_@@.espaces_debut_fin', 'lieudit_complement_nom.espaces_debut_fin', 'lieudit_complement_nom_@@.espaces_debut_fin', 'numero.espaces_debut_fin', 'position.espaces_debut_fin', 'long.espaces_debut_fin', 'lat.espaces_debut_fin', 'x.espaces_debut_fin', 'y.espaces_debut_fin', 'cad_parcelles.espaces_debut_fin', 'source.espaces_debut_fin', 'date_der_maj.espaces_debut_fin']; | ||
const infos = ['cle_interop.voie_non_renseignee']; | ||
const errors = ["cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.numero_invalide", "cle_interop.valeur_manquante", "cle_interop.numero_prefixe_manquant", "cle_interop.casse_invalide", "voie_nom.valeur_manquante", "voie_nom.trop_court", "voie_nom.trop_long", "voie_nom.caractere_invalide", "numero.valeur_manquante", "numero.type_invalide", "numero.trop_grand", "numero.contient_prefixe", "suffixe.debut_invalide", "suffixe.trop_long", "date_der_maj.date_invalide", "commune_insee.commune_invalide", "commune_insee.valeur_manquante", "commune_insee.espaces_debut_fin", "x.valeur_invalide", "y.valeur_invalide", "x.separateur_decimal_invalide", "y.separateur_decimal_invalide", "long.valeur_invalide", "lat.valeur_invalide", "long.separateur_decimal_invalide", "lat.separateur_decimal_invalide", "row.incoherence_numero", "row.commune_manquante", "row.longlat_vides", "row.longlat_invalides", "row.adresse_incomplete", "field.commune_insee.missing", "field.voie_nom.missing", "field.numero.missing", "field.commune_nom.long", "field.commune_nom.lat", "suffixe.espaces_debut_fin", "file.encoding.non_standard", "file.delimiter.non_standard", "file.linebreak.non_standard", "rows.empty"]; | ||
const warnings = ["cle_interop.voie_invalide", "cle_interop.commune_ancienne", "voie_nom.casse_incorrecte", "voie_nom.contient_tiret_bas", "voie_nom_@@.casse_incorrecte", "voie_nom_@@.contient_tiret_bas", "voie_nom_@@.trop_court", "voie_nom_@@.trop_long", "voie_nom_@@.caractere_invalide", "commune_insee.commune_ancienne", "commune_deleguee_insee.commune_invalide", "commune_deleguee_insee.commune_actuelle_non_deleguee", "commune_deleguee_insee.commune_ancienne_non_deleguee", "position.enum_fuzzy", "position.valeur_invalide", "cad_parcelles.valeur_invalide", "cad_parcelles.pipe_debut_fin", "source.valeur_manquante", "date_der_maj.valeur_manquante", "date_der_maj.date_ancienne", "date_der_maj.date_future", "certification_commune.valeur_invalide", "row.position_manquante", "row.chef_lieu_invalide", "row.longlat_xy_incoherents", "field.suffixe.missing", "field.cle_interop.missing", "field.position.missing", "field.long.missing", "field.lat.missing", "field.x.missing", "field.y.missing", "field.source.missing", "field.date_der_maj.missing", "field.certification_commune.missing", "cle_interop.espaces_debut_fin", "commune_nom.espaces_debut_fin", "commune_deleguee_insee.espaces_debut_fin", "commune_deleguee_nom.espaces_debut_fin", "uid_adresse.espaces_debut_fin", "voie_nom.espaces_debut_fin", "voie_nom_@@.espaces_debut_fin", "lieudit_complement_nom.espaces_debut_fin", "lieudit_complement_nom_@@.espaces_debut_fin", "numero.espaces_debut_fin", "position.espaces_debut_fin", "long.espaces_debut_fin", "lat.espaces_debut_fin", "x.espaces_debut_fin", "y.espaces_debut_fin", "cad_parcelles.espaces_debut_fin", "source.espaces_debut_fin", "date_der_maj.espaces_debut_fin", // ID BAN | ||
"uid_adresse.type_invalide", "uid_adresse.incoherence_ids_ban"]; | ||
const infos = ["cle_interop.voie_non_renseignee"]; | ||
module.exports = { | ||
code: '1.3', | ||
name: 'BAL 1.3 (défaut)', | ||
code: "1.3", | ||
name: "BAL 1.3 (défaut)", | ||
isUsed: true, | ||
@@ -13,3 +14,4 @@ relax: false, | ||
warnings, | ||
infos | ||
infos, | ||
format: "1.3" | ||
}; |
"use strict"; | ||
const errors = ['cle_interop.structure_invalide', 'cle_interop.commune_invalide', 'cle_interop.numero_invalide', 'voie_nom.valeur_manquante', 'voie_nom.trop_court', 'voie_nom.trop_long', 'voie_nom.caractere_invalide', 'numero.valeur_manquante', 'numero.type_invalide', 'numero.trop_grand', 'suffixe.debut_invalide', 'suffixe.trop_long', 'commune_insee.commune_invalide', 'x.valeur_invalide', 'y.valeur_invalide', 'long.valeur_invalide', 'lat.valeur_invalide', 'row.incoherence_numero', 'row.commune_manquante', 'row.longlat_vides', 'row.longlat_invalides', 'row.adresse_incomplete', 'field.voie_nom.missing', 'field.numero.missing', 'rows.empty']; | ||
const warnings = ['cle_interop.valeur_manquante', 'cle_interop.casse_invalide', 'cle_interop.voie_invalide', 'cle_interop.numero_prefixe_manquant', 'cle_interop.commune_ancienne', 'numero.contient_prefixe', 'voie_nom.casse_incorrecte', 'voie_nom.contient_tiret_bas', 'voie_nom_@@.casse_incorrecte', 'voie_nom_@@.contient_tiret_bas', 'voie_nom_@@.trop_court', 'voie_nom_@@.trop_long', 'voie_nom_@@.caractere_invalide', 'commune_insee.commune_ancienne', 'commune_deleguee_insee.commune_invalide', 'commune_deleguee_insee.commune_actuelle_non_deleguee', 'commune_deleguee_insee.commune_ancienne_non_deleguee', 'position.enum_fuzzy', 'position.valeur_invalide', 'x.separateur_decimal_invalide', 'y.separateur_decimal_invalide', 'long.separateur_decimal_invalide', 'lat.separateur_decimal_invalide', 'cad_parcelles.valeur_invalide', 'cad_parcelles.pipe_debut_fin', 'source.valeur_manquante', 'date_der_maj.valeur_manquante', 'date_der_maj.date_invalide', 'date_der_maj.date_ancienne', 'date_der_maj.date_future', 'certification_commune.valeur_invalide', 'row.position_manquante', 'row.chef_lieu_invalide', 'row.longlat_xy_incoherents', 'field.suffixe.missing', 'field.cle_interop.missing', 'field.commune_insee.missing', 'field.position.missing', 'field.long.missing', 'field.lat.missing', 'field.x.missing', 'field.y.missing', 'field.source.missing', 'field.date_der_maj.missing', 'field.certification_commune.missing', 'cle_interop.espaces_debut_fin', 'commune_insee.espaces_debut_fin', 'commune_nom.espaces_debut_fin', 'commune_deleguee_insee.espaces_debut_fin', 'commune_deleguee_nom.espaces_debut_fin', 'uid_adresse.espaces_debut_fin', 'voie_nom.espaces_debut_fin', 'voie_nom_@@.espaces_debut_fin', 'lieudit_complement_nom.espaces_debut_fin', 'lieudit_complement_nom_@@.espaces_debut_fin', 'numero.espaces_debut_fin', 'suffixe.espaces_debut_fin', 'position.espaces_debut_fin', 'long.espaces_debut_fin', 'lat.espaces_debut_fin', 'x.espaces_debut_fin', 'y.espaces_debut_fin', 'cad_parcelles.espaces_debut_fin', 'source.espaces_debut_fin', 'date_der_maj.espaces_debut_fin', // ID BAN | ||
'field.id_ban_commune.missing', 'field.id_ban_toponyme.missing', 'field.id_ban_adresse.missing', 'id_ban_commune.type_invalide', 'id_ban_toponyme.type_invalide', 'id_ban_adresse.type_invalide', 'row.incoherence_ids_ban', 'row.id_ban_adresses_required', 'rows.ids_required_every']; | ||
const infos = ['cle_interop.voie_non_renseignee']; | ||
const errors = ["cle_interop.structure_invalide", "cle_interop.commune_invalide", "cle_interop.numero_invalide", "cle_interop.valeur_manquante", "cle_interop.numero_prefixe_manquant", "cle_interop.casse_invalide", "voie_nom.valeur_manquante", "voie_nom.trop_court", "voie_nom.trop_long", "voie_nom.caractere_invalide", "numero.valeur_manquante", "numero.type_invalide", "numero.trop_grand", "numero.contient_prefixe", "suffixe.debut_invalide", "suffixe.trop_long", "date_der_maj.date_invalide", "commune_insee.commune_invalide", "commune_insee.valeur_manquante", "commune_insee.espaces_debut_fin", "x.valeur_invalide", "y.valeur_invalide", "x.separateur_decimal_invalide", "y.separateur_decimal_invalide", "long.valeur_invalide", "lat.valeur_invalide", "long.separateur_decimal_invalide", "lat.separateur_decimal_invalide", "row.incoherence_numero", "row.commune_manquante", "row.longlat_vides", "row.longlat_invalides", "row.adresse_incomplete", "field.commune_insee.missing", "field.voie_nom.missing", "field.numero.missing", "field.commune_nom.long", "field.commune_nom.lat", "suffixe.espaces_debut_fin", "file.encoding.non_standard", "file.delimiter.non_standard", "file.linebreak.non_standard", "rows.empty", "id_ban_commune.type_invalide", "id_ban_toponyme.type_invalide", "id_ban_adresse.type_invalide", "row.incoherence_ids_ban", "row.id_ban_adresses_required", "rows.ids_required_every"]; | ||
const warnings = ["cle_interop.voie_invalide", "cle_interop.commune_ancienne", "voie_nom.casse_incorrecte", "voie_nom.contient_tiret_bas", "voie_nom_@@.casse_incorrecte", "voie_nom_@@.contient_tiret_bas", "voie_nom_@@.trop_court", "voie_nom_@@.trop_long", "voie_nom_@@.caractere_invalide", "commune_insee.commune_ancienne", "commune_deleguee_insee.commune_invalide", "commune_deleguee_insee.commune_actuelle_non_deleguee", "commune_deleguee_insee.commune_ancienne_non_deleguee", "position.enum_fuzzy", "position.valeur_invalide", "cad_parcelles.valeur_invalide", "cad_parcelles.pipe_debut_fin", "source.valeur_manquante", "date_der_maj.valeur_manquante", "date_der_maj.date_ancienne", "date_der_maj.date_future", "certification_commune.valeur_invalide", "row.position_manquante", "row.chef_lieu_invalide", "row.longlat_xy_incoherents", "field.suffixe.missing", "field.cle_interop.missing", "field.position.missing", "field.long.missing", "field.lat.missing", "field.x.missing", "field.y.missing", "field.source.missing", "field.date_der_maj.missing", "field.certification_commune.missing", "cle_interop.espaces_debut_fin", "commune_nom.espaces_debut_fin", "commune_deleguee_insee.espaces_debut_fin", "commune_deleguee_nom.espaces_debut_fin", "uid_adresse.espaces_debut_fin", "voie_nom.espaces_debut_fin", "voie_nom_@@.espaces_debut_fin", "lieudit_complement_nom.espaces_debut_fin", "lieudit_complement_nom_@@.espaces_debut_fin", "numero.espaces_debut_fin", "position.espaces_debut_fin", "long.espaces_debut_fin", "lat.espaces_debut_fin", "x.espaces_debut_fin", "y.espaces_debut_fin", "cad_parcelles.espaces_debut_fin", "source.espaces_debut_fin", "date_der_maj.espaces_debut_fin", // ID BAN | ||
"field.id_ban_commune.missing", "field.id_ban_toponyme.missing", "field.id_ban_adresse.missing", "uid_adresse.type_invalide", "uid_adresse.incoherence_ids_ban"]; | ||
const infos = ["cle_interop.voie_non_renseignee"]; | ||
module.exports = { | ||
code: '1.4', | ||
name: 'BAL 1.4 (beta)', | ||
isUsed: false, | ||
relax: true, | ||
code: "1.4", | ||
name: "BAL 1.4 (beta)", | ||
isUsed: true, | ||
relax: false, | ||
errors, | ||
warnings, | ||
infos | ||
infos, | ||
format: "1.4" | ||
}; |
"use strict"; | ||
const profiles = { | ||
1.4: require('./1.4'), | ||
'1.4-strict': require('./1.4-strict'), | ||
1.3: require('./1.3'), | ||
'1.3-relax': require('./1.3-relax'), | ||
'1.3-strict': require('./1.3-strict'), | ||
'1.2-strict': require('./1.2-strict'), | ||
'1.1-strict': require('./1.1-strict') | ||
1.4: require("./1.4"), | ||
"1.4-relax": require("./1.4-relax"), | ||
1.3: require("./1.3"), | ||
"1.3-relax": require("./1.3-relax"), | ||
"1.3-strict": require("./1.3-strict"), | ||
"1.2-strict": require("./1.2-strict"), | ||
"1.1-strict": require("./1.1-strict") | ||
}; | ||
module.exports = profiles; |
"use strict"; | ||
/* eslint no-inner-declarations: off */ | ||
const schema = require('../schema'); | ||
const schema = require("../schema"); | ||
function getSchemaVersion(schemaName) { | ||
return schema.fields[schemaName].version || '1.1'; | ||
return schema.fields[schemaName].version || "1.1"; | ||
} | ||
function computeFields(originalFields, _ref) { | ||
function computeFields(originalFields, format, _ref) { | ||
let { | ||
@@ -30,3 +30,2 @@ relaxFieldsDetection, | ||
candidate.schemaName = schemaName; | ||
candidate.version = getSchemaVersion(schemaName); | ||
foundFields.add(schemaName); | ||
@@ -51,3 +50,3 @@ | ||
if (!foundFields.has(schemaName)) { | ||
if (!foundFields.has(schemaName) && schema.fields[schemaName].formats.includes(format)) { | ||
notFoundFields.add(schemaName); | ||
@@ -54,0 +53,0 @@ globalErrors.add("field.".concat(schemaName, ".missing")); |
"use strict"; | ||
const bluebird = require('bluebird'); | ||
const bluebird = require("bluebird"); | ||
@@ -9,23 +9,23 @@ const { | ||
uniq | ||
} = require('lodash'); | ||
} = require("lodash"); | ||
const { | ||
getErrorLevel | ||
} = require('../helpers'); | ||
} = require("../helpers"); | ||
const profiles = require('../schema/profiles'); | ||
const profiles = require("../schema/profiles"); | ||
const { | ||
computeFields | ||
} = require('./fields'); | ||
} = require("./fields"); | ||
const { | ||
parse | ||
} = require('./parse'); | ||
} = require("./parse"); | ||
const { | ||
validateRow | ||
} = require('./row'); | ||
} = require("./row"); | ||
const FATAL_PARSE_ERRORS = new Set(['MissingQuotes', 'UndetectableDelimiter', 'TooFewFields', 'TooManyFields']); | ||
const FATAL_PARSE_ERRORS = new Set(["MissingQuotes", "UndetectableDelimiter", "TooFewFields", "TooManyFields"]); | ||
@@ -61,3 +61,3 @@ async function parseFile(file, relaxFieldsDetection) { | ||
} = _ref; | ||
const indexedFields = keyBy(fields, 'name'); | ||
const indexedFields = keyBy(fields, "name"); | ||
const computedRows = await bluebird.map(parsedRows, async (parsedRow, line) => { | ||
@@ -89,7 +89,7 @@ const computedRow = await validateRow(parsedRow, { | ||
value: detectedParams.encoding, | ||
isValid: detectedParams.encoding === 'utf-8' | ||
isValid: detectedParams.encoding === "utf-8" | ||
}; | ||
if (!encoding.isValid) { | ||
globalErrors.add('file.encoding.non_standard'); | ||
globalErrors.add("file.encoding.non_standard"); | ||
} | ||
@@ -99,7 +99,7 @@ | ||
value: detectedParams.delimiter, | ||
isValid: detectedParams.delimiter === ';' | ||
isValid: detectedParams.delimiter === ";" | ||
}; | ||
if (!delimiter.isValid) { | ||
globalErrors.add('file.delimiter.non_standard'); | ||
globalErrors.add("file.delimiter.non_standard"); | ||
} | ||
@@ -109,7 +109,7 @@ | ||
value: humanizedLinebreak, | ||
isValid: ['Unix', 'Windows'].includes(humanizedLinebreak) | ||
isValid: ["Unix", "Windows"].includes(humanizedLinebreak) | ||
}; | ||
if (!linebreak.isValid) { | ||
globalErrors.add('file.linebreak.non_standard'); | ||
globalErrors.add("file.linebreak.non_standard"); | ||
} | ||
@@ -130,7 +130,7 @@ | ||
if (parsedRows.length > 0) { | ||
const useBanIds = ('id_ban_commune' in parsedRows[0]); | ||
const useBanIds = ("id_ban_commune" in parsedRows[0]); | ||
for (const row of parsedRows) { | ||
if (useBanIds && row.id_ban_commune === '' || !useBanIds && row.id_ban_commune !== undefined && row.id_ban_commune !== '') { | ||
globalErrors.add('rows.ids_required_every'); | ||
if (useBanIds && row.id_ban_commune === "" || !useBanIds && row.id_ban_commune !== undefined && row.id_ban_commune !== "") { | ||
globalErrors.add("rows.ids_required_every"); | ||
return; | ||
@@ -148,3 +148,3 @@ } | ||
if (parsedRows.length <= 0) { | ||
globalErrors.add('rows.empty'); | ||
globalErrors.add("rows.empty"); | ||
} | ||
@@ -157,3 +157,3 @@ | ||
async function prevalidate(file, relaxFieldsDetection) { | ||
async function prevalidate(file, format, relaxFieldsDetection) { | ||
const globalErrors = new Set(); | ||
@@ -186,3 +186,3 @@ const rowsErrors = new Set(); | ||
notFoundFields | ||
} = computeFields(originalFields, { | ||
} = computeFields(originalFields, format, { | ||
globalErrors, | ||
@@ -213,3 +213,3 @@ relaxFieldsDetection | ||
} = profile; | ||
const isValid = ![...uniqueErrors].some(e => getErrorLevel(profile.code, e) === 'E'); | ||
const isValid = ![...uniqueErrors].some(e => getErrorLevel(profile.code, e) === "E"); | ||
return { | ||
@@ -244,3 +244,3 @@ code, | ||
})); | ||
const isValid = !errors.some(e => e.level === 'E'); | ||
const isValid = !errors.some(e => e.level === "E"); | ||
return { ...row, | ||
@@ -283,3 +283,3 @@ errors, | ||
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
const profile = options.profile || '1.3'; | ||
const profile = options.profile || "1.3"; | ||
let { | ||
@@ -293,3 +293,6 @@ relaxFieldsDetection | ||
const prevalidateResult = await prevalidate(file, relaxFieldsDetection); | ||
const { | ||
format | ||
} = profiles[profile]; | ||
const prevalidateResult = await prevalidate(file, format, relaxFieldsDetection); | ||
return validateProfile(prevalidateResult, profile); | ||
@@ -299,15 +302,15 @@ } | ||
function humanizeLinebreak(linebreak) { | ||
if (linebreak === '\n') { | ||
return 'Unix'; | ||
if (linebreak === "\n") { | ||
return "Unix"; | ||
} | ||
if (linebreak === '\r\n') { | ||
return 'Windows'; | ||
if (linebreak === "\r\n") { | ||
return "Windows"; | ||
} | ||
if (linebreak === '\r') { | ||
return 'Old Mac/BSD'; | ||
if (linebreak === "\r") { | ||
return "Old Mac/BSD"; | ||
} | ||
return 'Inconnu'; | ||
return "Inconnu"; | ||
} | ||
@@ -317,4 +320,3 @@ | ||
validate, | ||
validateProfile, | ||
prevalidate | ||
validateProfile | ||
}; |
"use strict"; | ||
const toBuffer = require('blob-to-buffer'); | ||
const toBuffer = require("blob-to-buffer"); | ||
const { | ||
detectBufferEncoding | ||
} = require('./detect-encoding'); | ||
} = require("./detect-encoding"); | ||
const { | ||
parseCsv | ||
} = require('./csv'); | ||
} = require("./csv"); | ||
@@ -13,0 +13,0 @@ function detectBlobEncoding(blob) { |
"use strict"; | ||
const iconv = require('iconv-lite'); | ||
const iconv = require("iconv-lite"); | ||
const { | ||
detectBufferEncoding | ||
} = require('./detect-encoding'); | ||
} = require("./detect-encoding"); | ||
const { | ||
parseCsv | ||
} = require('./csv'); // Copied from strip-bom package which contains ES6 syntax | ||
} = require("./csv"); // Copied from strip-bom package which contains ES6 syntax | ||
@@ -17,3 +17,3 @@ | ||
// conversion translates it to FEFF (UTF-16 BOM) | ||
return str.codePointAt(0) === 0xFEFF ? str.slice(1) : str; | ||
return str.codePointAt(0) === 0xfeff ? str.slice(1) : str; | ||
} | ||
@@ -20,0 +20,0 @@ |
"use strict"; | ||
const Papa = require('papaparse'); | ||
const Papa = require("papaparse"); | ||
const PAPA_OPTIONS = { | ||
delimitersToGuess: [',', '\t', ';'], | ||
delimitersToGuess: [",", "\t", ";"], | ||
skipEmptyLines: true, | ||
@@ -8,0 +8,0 @@ header: true |
"use strict"; | ||
const chardet = require('chardet'); | ||
const chardet = require("chardet"); | ||
const fileType = require('file-type'); | ||
const fileType = require("file-type"); | ||
const CHARDET_TO_NORMALIZED_ENCODINGS = { | ||
'iso-8859-1': 'windows-1252', | ||
'iso-8859-15': 'windows-1252', | ||
'windows-1252': 'windows-1252', | ||
'utf-8': 'utf-8' | ||
"iso-8859-1": "windows-1252", | ||
"iso-8859-15": "windows-1252", | ||
"windows-1252": "windows-1252", | ||
"utf-8": "utf-8" | ||
}; | ||
@@ -18,3 +18,3 @@ | ||
if (!(lcEncoding in CHARDET_TO_NORMALIZED_ENCODINGS)) { | ||
throw new Error('Encoding currently not supported: ' + encoding); | ||
throw new Error("Encoding currently not supported: " + encoding); | ||
} | ||
@@ -27,3 +27,3 @@ | ||
if (fileType(buffer)) { | ||
throw new Error('Non-text file cannot be processed'); | ||
throw new Error("Non-text file cannot be processed"); | ||
} | ||
@@ -34,9 +34,9 @@ | ||
if (analyseResults.length === 0) { | ||
throw new Error('Unable to detect encoding'); | ||
throw new Error("Unable to detect encoding"); | ||
} | ||
const utf8Result = analyseResults.find(r => r.name === 'UTF-8'); | ||
const utf8Result = analyseResults.find(r => r.name === "UTF-8"); | ||
if (utf8Result && utf8Result.confidence >= 80) { | ||
return 'utf-8'; | ||
return "utf-8"; | ||
} // Pure ASCII | ||
@@ -46,3 +46,3 @@ | ||
if (utf8Result && utf8Result.confidence === 10) { | ||
return 'utf-8'; | ||
return "utf-8"; | ||
} | ||
@@ -49,0 +49,0 @@ |
"use strict"; | ||
module.exports = require('./buffer'); | ||
module.exports = require("./buffer"); |
"use strict"; | ||
const schema = require('../schema'); | ||
const schema = require("../schema"); | ||
@@ -23,7 +23,7 @@ const { | ||
if (def.trim && trimmedValue !== rawValue) { | ||
result.errors.push('espaces_debut_fin'); | ||
result.errors.push("espaces_debut_fin"); | ||
} | ||
if (def.required && !trimmedValue) { | ||
result.errors.push('valeur_manquante'); | ||
result.errors.push("valeur_manquante"); | ||
} else if (!trimmedValue) {// Ne rien faire | ||
@@ -48,3 +48,3 @@ } else if (def.parse) { | ||
if (schemaValue !== trimmedValue.normalize()) { | ||
result.errors.push('enum_fuzzy'); | ||
result.errors.push("enum_fuzzy"); | ||
} | ||
@@ -54,3 +54,3 @@ | ||
} else { | ||
result.errors.push('valeur_invalide'); | ||
result.errors.push("valeur_invalide"); | ||
} | ||
@@ -57,0 +57,0 @@ } else { |
@@ -1,23 +0,45 @@ | ||
const test = require('ava') | ||
const {parseLocalizedField, parseErrorCode, getLabel, getErrorLevel} = require('../helpers') | ||
const test = require("ava"); | ||
const { | ||
parseLocalizedField, | ||
parseErrorCode, | ||
getLabel, | ||
getErrorLevel, | ||
} = require("../helpers"); | ||
test('parseLocalizedField', t => { | ||
t.is(parseLocalizedField('voie_nom'), undefined) | ||
t.deepEqual(parseLocalizedField('voie_nom_bre'), {schemaName: 'voie_nom', locale: 'bre'}) | ||
}) | ||
test("parseLocalizedField", (t) => { | ||
t.is(parseLocalizedField("voie_nom"), undefined); | ||
t.deepEqual(parseLocalizedField("voie_nom_bre"), { | ||
schemaName: "voie_nom", | ||
locale: "bre", | ||
}); | ||
}); | ||
test('parseErrorCode', t => { | ||
t.deepEqual(parseErrorCode('voie_nom.trop_long'), {schemaName: 'voie_nom', fieldError: 'trop_long'}) | ||
t.deepEqual(parseErrorCode('voie_nom_bre.trop_long'), {schemaName: 'voie_nom', locale: 'bre', fieldName: 'voie_nom_bre', fieldError: 'trop_long'}) | ||
}) | ||
test("parseErrorCode", (t) => { | ||
t.deepEqual(parseErrorCode("voie_nom.trop_long"), { | ||
schemaName: "voie_nom", | ||
fieldError: "trop_long", | ||
}); | ||
t.deepEqual(parseErrorCode("voie_nom_bre.trop_long"), { | ||
schemaName: "voie_nom", | ||
locale: "bre", | ||
fieldName: "voie_nom_bre", | ||
fieldError: "trop_long", | ||
}); | ||
}); | ||
test('getLabel', t => { | ||
t.is(getLabel('voie_nom.trop_court'), 'Le nom de la voie est trop court (3 caractères minimum)') | ||
t.is(getLabel('voie_nom_bre.trop_court'), 'Le nom de la voie est trop court (3 caractères minimum) [bre]') | ||
t.throws(() => getLabel('voie_nom_toto.trop_court')) | ||
}) | ||
test("getLabel", (t) => { | ||
t.is( | ||
getLabel("voie_nom.trop_court"), | ||
"Le nom de la voie est trop court (3 caractères minimum)", | ||
); | ||
t.is( | ||
getLabel("voie_nom_bre.trop_court"), | ||
"Le nom de la voie est trop court (3 caractères minimum) [bre]", | ||
); | ||
t.throws(() => getLabel("voie_nom_toto.trop_court")); | ||
}); | ||
test('getErrorLevel', t => { | ||
t.is(getErrorLevel('1.3-relax', 'voie_nom.trop_court'), 'E') | ||
t.is(getErrorLevel('1.3-relax', 'voie_nom_bre.trop_court'), 'W') | ||
}) | ||
test("getErrorLevel", (t) => { | ||
t.is(getErrorLevel("1.3-relax", "voie_nom.trop_court"), "E"); | ||
t.is(getErrorLevel("1.3-relax", "voie_nom_bre.trop_court"), "W"); | ||
}); |
@@ -1,11 +0,15 @@ | ||
const communes = require('../minicog.json') | ||
const communes = require("../minicog.json"); | ||
const codesCommunesActuelles = new Set(communes.filter(c => !c.chefLieu).map(c => c.code)) | ||
const codesCommunesDeleguees = new Set(communes.filter(c => c.chefLieu).map(c => c.code)) | ||
const codesCommunesActuelles = new Set( | ||
communes.filter((c) => !c.chefLieu).map((c) => c.code), | ||
); | ||
const codesCommunesDeleguees = new Set( | ||
communes.filter((c) => c.chefLieu).map((c) => c.code), | ||
); | ||
const anciensCodesIndex = new Map() | ||
const anciensCodesIndex = new Map(); | ||
for (const commune of communes) { | ||
const anciensCodes = commune.anciensCodes || [] | ||
const anciensCodes = commune.anciensCodes || []; | ||
for (const ancienCode of anciensCodes) { | ||
anciensCodesIndex.set(ancienCode, commune) | ||
anciensCodesIndex.set(ancienCode, commune); | ||
} | ||
@@ -15,15 +19,15 @@ } | ||
function isCommune(codeCommune) { | ||
return isCommuneActuelle(codeCommune) || isCommuneAncienne(codeCommune) | ||
return isCommuneActuelle(codeCommune) || isCommuneAncienne(codeCommune); | ||
} | ||
function isCommuneAncienne(codeCommune) { | ||
return anciensCodesIndex.has(codeCommune) | ||
return anciensCodesIndex.has(codeCommune); | ||
} | ||
function isCommuneActuelle(codeCommune) { | ||
return codesCommunesActuelles.has(codeCommune) | ||
return codesCommunesActuelles.has(codeCommune); | ||
} | ||
function isCommuneDeleguee(codeCommune) { | ||
return codesCommunesDeleguees.has(codeCommune) | ||
return codesCommunesDeleguees.has(codeCommune); | ||
} | ||
@@ -34,5 +38,11 @@ | ||
? anciensCodesIndex.get(codeCommune) | ||
: communes.find(c => c.code === codeCommune && !c.chefLieu) | ||
: communes.find((c) => c.code === codeCommune && !c.chefLieu); | ||
} | ||
module.exports = {isCommune, isCommuneAncienne, isCommuneActuelle, isCommuneDeleguee, getCommuneActuelle} | ||
module.exports = { | ||
isCommune, | ||
isCommuneAncienne, | ||
isCommuneActuelle, | ||
isCommuneDeleguee, | ||
getCommuneActuelle, | ||
}; |
@@ -1,49 +0,51 @@ | ||
const {readFile} = require('fs-extra') | ||
const chalk = require('chalk') | ||
const {validate, getLabel} = require('..') | ||
const { readFile } = require("fs-extra"); | ||
const chalk = require("chalk"); | ||
const { validate, getLabel } = require(".."); | ||
module.exports = { | ||
command: 'validate [options] <file>', | ||
describe: 'Valider une base Adresse locale', | ||
command: "validate [options] <file>", | ||
describe: "Valider une base Adresse locale", | ||
builder: { | ||
'relax-fields-detection': { | ||
type: 'boolean', | ||
"relax-fields-detection": { | ||
type: "boolean", | ||
default: false, | ||
describe: 'Désactive la sensibilisé à la casse et accepte des variantes pour les noms des champs' | ||
describe: | ||
"Désactive la sensibilisé à la casse et accepte des variantes pour les noms des champs", | ||
}, | ||
profile: { | ||
type: 'string', | ||
default: '1.3', | ||
describe: 'Permet de choisir la version du profil de validation à utiliser' | ||
} | ||
type: "string", | ||
default: "1.3", | ||
describe: | ||
"Permet de choisir la version du profil de validation à utiliser", | ||
}, | ||
}, | ||
async handler(argv) { | ||
const file = await readFile(argv.file) | ||
const file = await readFile(argv.file); | ||
try { | ||
const report = await validate(file, { | ||
relaxFieldsDetection: argv.relaxFieldsDetection, | ||
profile: argv.profile | ||
}) | ||
printReport(report) | ||
profile: argv.profile, | ||
}); | ||
printReport(report); | ||
} catch (error) { | ||
console.error(error) | ||
console.error(error); | ||
} | ||
} | ||
} | ||
}, | ||
}; | ||
function getDelimiterName(delimiter) { | ||
if (delimiter === ';') { | ||
return 'point-virgule' | ||
if (delimiter === ";") { | ||
return "point-virgule"; | ||
} | ||
if (delimiter === ',') { | ||
return 'virgule' | ||
if (delimiter === ",") { | ||
return "virgule"; | ||
} | ||
if (delimiter === '\t') { | ||
return 'tabulation' | ||
if (delimiter === "\t") { | ||
return "tabulation"; | ||
} | ||
if (delimiter === '|') { | ||
return 'pipe' | ||
if (delimiter === "|") { | ||
return "pipe"; | ||
} | ||
@@ -53,12 +55,12 @@ } | ||
function printSeverity(severity) { | ||
if (severity === 'E') { | ||
return chalk.red('E') | ||
if (severity === "E") { | ||
return chalk.red("E"); | ||
} | ||
if (severity === 'W') { | ||
return chalk.yellow('W') | ||
if (severity === "W") { | ||
return chalk.yellow("W"); | ||
} | ||
if (severity === 'I') { | ||
return chalk.blue('I') | ||
if (severity === "I") { | ||
return chalk.blue("I"); | ||
} | ||
@@ -68,11 +70,20 @@ } | ||
function printReport(report) { | ||
const {fileValidation, parseOk, parseErrors, notFoundFields, fields, rows, profilesValidation, profilErrors} = report | ||
const { | ||
fileValidation, | ||
parseOk, | ||
parseErrors, | ||
notFoundFields, | ||
fields, | ||
rows, | ||
profilesValidation, | ||
profilErrors, | ||
} = report; | ||
// Erreurs dans la structure | ||
if (parseErrors.length > 0) { | ||
console.log('') | ||
console.log('* Erreurs de lecture du fichier') | ||
console.log('') | ||
console.log(""); | ||
console.log("* Erreurs de lecture du fichier"); | ||
console.log(""); | ||
for (const err of parseErrors) { | ||
console.log(err) | ||
console.log(err); | ||
} | ||
@@ -82,45 +93,57 @@ } | ||
if (!parseOk) { | ||
console.log('') | ||
console.log('Le fichier n’est pas structuré correctement. La validation est abandonnée.') | ||
console.log('') | ||
return | ||
console.log(""); | ||
console.log( | ||
"Le fichier n’est pas structuré correctement. La validation est abandonnée.", | ||
); | ||
console.log(""); | ||
return; | ||
} | ||
const {encoding, linebreak, delimiter} = fileValidation | ||
const { encoding, linebreak, delimiter } = fileValidation; | ||
// Validation de la structure | ||
console.log('') | ||
console.log('* Validation de la structure du fichier') | ||
console.log('') | ||
console.log(`Encodage : ${encoding.value.toUpperCase()} => ${encoding.isValid ? 'OK' : 'Pas OK !'}`) | ||
console.log(`Séparateur de ligne : ${linebreak.value} => ${linebreak.isValid ? 'OK' : 'Pas OK'}`) | ||
console.log(`Séparateur de colonne : ${getDelimiterName(delimiter.value)} => ${delimiter.isValid ? 'OK' : 'Pas OK'}`) | ||
console.log(""); | ||
console.log("* Validation de la structure du fichier"); | ||
console.log(""); | ||
console.log( | ||
`Encodage : ${encoding.value.toUpperCase()} => ${encoding.isValid ? "OK" : "Pas OK !"}`, | ||
); | ||
console.log( | ||
`Séparateur de ligne : ${linebreak.value} => ${linebreak.isValid ? "OK" : "Pas OK"}`, | ||
); | ||
console.log( | ||
`Séparateur de colonne : ${getDelimiterName(delimiter.value)} => ${delimiter.isValid ? "OK" : "Pas OK"}`, | ||
); | ||
// Validation des champs | ||
console.log('') | ||
console.log('* Validation du modèle') | ||
console.log('') | ||
console.log(""); | ||
console.log("* Validation du modèle"); | ||
console.log(""); | ||
if (notFoundFields.length === 0) { | ||
console.log('Tous les champs du modèle ont été trouvés !') | ||
console.log("Tous les champs du modèle ont été trouvés !"); | ||
} else { | ||
console.log('/!\\ Les champs suivants n’ont pas été trouvés:') | ||
console.log("/!\\ Les champs suivants n’ont pas été trouvés:"); | ||
for (const f of notFoundFields) { | ||
console.log(`[${printSeverity(f.level)}] ${f.schemaName}`) | ||
console.log(`[${printSeverity(f.level)}] ${f.schemaName}`); | ||
} | ||
} | ||
const unknownFields = fields.filter(f => !f.schemaName) | ||
const unknownFields = fields.filter((f) => !f.schemaName); | ||
if (unknownFields.length > 0) { | ||
console.log('') | ||
console.log('Les champs suivants sont inconnus, ils ont été ignorés :') | ||
console.log(""); | ||
console.log("Les champs suivants sont inconnus, ils ont été ignorés :"); | ||
for (const f of unknownFields) { | ||
console.log(f.name) | ||
console.log(f.name); | ||
} | ||
} | ||
const aliasedFields = fields.filter(f => f.schemaName && f.schemaName !== f.name && !f.localizedSchemaName) | ||
const aliasedFields = fields.filter( | ||
(f) => f.schemaName && f.schemaName !== f.name && !f.localizedSchemaName, | ||
); | ||
if (aliasedFields.length > 0) { | ||
console.log('') | ||
console.log(""); | ||
for (const f of aliasedFields) { | ||
console.log(`/!\\ Le champ ${f.schemaName} est mal orthographié mais a été pris en compte`) | ||
console.log( | ||
`/!\\ Le champ ${f.schemaName} est mal orthographié mais a été pris en compte`, | ||
); | ||
} | ||
@@ -130,7 +153,7 @@ } | ||
// Validation des données | ||
console.log('') | ||
console.log('* Validation des données') | ||
console.log('') | ||
console.log(""); | ||
console.log("* Validation des données"); | ||
console.log(""); | ||
const rowsWithIssues = rows.filter(r => r.errors.length > 0) | ||
const rowsWithIssues = rows.filter((r) => r.errors.length > 0); | ||
if (rowsWithIssues.length > 0) { | ||
@@ -140,3 +163,5 @@ for (const row of rowsWithIssues) { | ||
for (const err of row.errors) { | ||
console.log(`[${printSeverity(err.level)}] #${row.line} ${getLabel(err.code)}`) | ||
console.log( | ||
`[${printSeverity(err.level)}] #${row.line} ${getLabel(err.code)}`, | ||
); | ||
} | ||
@@ -146,30 +171,32 @@ } | ||
console.log('') | ||
console.log(""); | ||
} | ||
console.log(`${rows.length} données vérifiées !`) | ||
console.log(`${rows.length} données vérifiées !`); | ||
// Validation général | ||
if (profilErrors.length > 0) { | ||
console.log('') | ||
console.log('* Validation général du profil') | ||
console.log('') | ||
console.log(""); | ||
console.log("* Validation général du profil"); | ||
console.log(""); | ||
for (const err of profilErrors) { | ||
console.log(`[${printSeverity(err.level)}] ${getLabel(err.code)}`) | ||
console.log(`[${printSeverity(err.level)}] ${getLabel(err.code)}`); | ||
} | ||
} | ||
console.log('') | ||
console.log('* Validité') | ||
console.log(""); | ||
console.log("* Validité"); | ||
for (const profileValidation of Object.values(profilesValidation)) { | ||
console.log(` - ${profileValidation.name} : ${profileValidation.isValid ? '✅' : '❌'}`) | ||
console.log( | ||
` - ${profileValidation.name} : ${profileValidation.isValid ? "✅" : "❌"}`, | ||
); | ||
} | ||
console.log('') | ||
console.log(""); | ||
// On est content | ||
console.log('') | ||
console.log('Terminé !') | ||
console.log('') | ||
console.log(""); | ||
console.log("Terminé !"); | ||
console.log(""); | ||
} |
@@ -1,15 +0,15 @@ | ||
const profiles = require('./schema/profiles') | ||
const errorLabels = require('./schema/error-labels') | ||
const {fields, allowedLocales} = require('./schema') | ||
const profiles = require("./schema/profiles"); | ||
const errorLabels = require("./schema/error-labels"); | ||
const { fields, allowedLocales } = require("./schema"); | ||
function parseLocalizedField(fieldName) { | ||
const locale = allowedLocales.find(l => fieldName.endsWith('_' + l)) | ||
const locale = allowedLocales.find((l) => fieldName.endsWith("_" + l)); | ||
if (!locale) { | ||
return | ||
return; | ||
} | ||
const schemaName = fieldName.slice(0, -(locale.length + 1)) | ||
const schemaName = fieldName.slice(0, -(locale.length + 1)); | ||
if (fields[schemaName] && fields[schemaName].allowLocales) { | ||
return {locale, schemaName} | ||
return { locale, schemaName }; | ||
} | ||
@@ -19,60 +19,60 @@ } | ||
function parseErrorCode(code) { | ||
const parts = code.split('.') | ||
const parts = code.split("."); | ||
if (parts[0] === 'file') { | ||
return {prefix: 'file', code} | ||
if (parts[0] === "file") { | ||
return { prefix: "file", code }; | ||
} | ||
if (parts[0] === 'row') { | ||
return {prefix: 'row', code} | ||
if (parts[0] === "row") { | ||
return { prefix: "row", code }; | ||
} | ||
if (parts[0] === 'field') { | ||
return {prefix: 'field', code} | ||
if (parts[0] === "field") { | ||
return { prefix: "field", code }; | ||
} | ||
if (parts[0] === 'rows') { | ||
return {prefix: 'rows', code} | ||
if (parts[0] === "rows") { | ||
return { prefix: "rows", code }; | ||
} | ||
const fieldName = parts[0] | ||
const fieldError = parts[1] | ||
const fieldName = parts[0]; | ||
const fieldError = parts[1]; | ||
const localizedField = parseLocalizedField(fieldName) | ||
const localizedField = parseLocalizedField(fieldName); | ||
if (localizedField) { | ||
return {fieldName, fieldError, ...localizedField} | ||
return { fieldName, fieldError, ...localizedField }; | ||
} | ||
if (!fields[fieldName]) { | ||
throw new Error('Unknown fieldName: ' + fieldName) | ||
throw new Error("Unknown fieldName: " + fieldName); | ||
} | ||
return {schemaName: fieldName, fieldError} | ||
return { schemaName: fieldName, fieldError }; | ||
} | ||
function getErrorLevel(profileName, code) { | ||
const profile = profiles[profileName] | ||
const {schemaName, locale, fieldError} = parseErrorCode(code) | ||
const codeToCompare = locale ? `${schemaName}_@@.${fieldError}` : code | ||
const profile = profiles[profileName]; | ||
const { schemaName, locale, fieldError } = parseErrorCode(code); | ||
const codeToCompare = locale ? `${schemaName}_@@.${fieldError}` : code; | ||
if (profile.errors.includes(codeToCompare)) { | ||
return 'E' | ||
return "E"; | ||
} | ||
if (profile.warnings.includes(codeToCompare)) { | ||
return 'W' | ||
return "W"; | ||
} | ||
return 'I' | ||
return "I"; | ||
} | ||
const endsWithErrorLabels = {} | ||
const endsWithErrorLabels = {}; | ||
for (const c of Object.keys(errorLabels)) { | ||
if (c.includes('*') && c.startsWith('*.')) { | ||
endsWithErrorLabels[c.slice(2)] = submittedCode => { | ||
const [value] = submittedCode.split('.') | ||
return errorLabels[c].replace('{}', value) | ||
} | ||
if (c.includes("*") && c.startsWith("*.")) { | ||
endsWithErrorLabels[c.slice(2)] = (submittedCode) => { | ||
const [value] = submittedCode.split("."); | ||
return errorLabels[c].replace("{}", value); | ||
}; | ||
} | ||
@@ -82,32 +82,39 @@ } | ||
function getIfMissingColumn(code) { | ||
const parts = code.split('.') | ||
if (parts[0] === 'field' && parts[2] === 'missing') { | ||
return `La colonne ${parts[1]} n’existe pas` | ||
const parts = code.split("."); | ||
if (parts[0] === "field" && parts[2] === "missing") { | ||
return `La colonne ${parts[1]} n’existe pas`; | ||
} | ||
return null | ||
return null; | ||
} | ||
function getLabel(code) { | ||
const {schemaName, locale, fieldError} = parseErrorCode(code) | ||
const codeToUser = locale ? `${schemaName}.${fieldError}` : code | ||
const { schemaName, locale, fieldError } = parseErrorCode(code); | ||
const codeToUser = locale ? `${schemaName}.${fieldError}` : code; | ||
if (codeToUser in errorLabels) { | ||
return errorLabels[codeToUser] + (locale ? ` [${locale}]` : '') | ||
return errorLabels[codeToUser] + (locale ? ` [${locale}]` : ""); | ||
} | ||
const endsWithCandidate = Object.keys(endsWithErrorLabels).find(pattern => codeToUser.endsWith(pattern)) | ||
const endsWithCandidate = Object.keys(endsWithErrorLabels).find((pattern) => | ||
codeToUser.endsWith(pattern), | ||
); | ||
if (endsWithCandidate) { | ||
return endsWithErrorLabels[endsWithCandidate](codeToUser) | ||
return endsWithErrorLabels[endsWithCandidate](codeToUser); | ||
} | ||
const missingColumn = getIfMissingColumn(code) | ||
const missingColumn = getIfMissingColumn(code); | ||
if (missingColumn) { | ||
return missingColumn | ||
return missingColumn; | ||
} | ||
return code | ||
return code; | ||
} | ||
module.exports = {getErrorLevel, getLabel, parseLocalizedField, parseErrorCode} | ||
module.exports = { | ||
getErrorLevel, | ||
getLabel, | ||
parseLocalizedField, | ||
parseErrorCode, | ||
}; |
@@ -1,6 +0,14 @@ | ||
const {validate, validateProfile, prevalidate} = require('./validate') | ||
const {readValue} = require('./validate/row') | ||
const {getErrorLevel, getLabel} = require('./helpers') | ||
const profiles = require('./schema/profiles') | ||
const { validate, validateProfile, prevalidate } = require("./validate"); | ||
const { readValue } = require("./validate/row"); | ||
const { getErrorLevel, getLabel } = require("./helpers"); | ||
const profiles = require("./schema/profiles"); | ||
module.exports = {validate, validateProfile, prevalidate, getLabel, readValue, getErrorLevel, profiles} | ||
module.exports = { | ||
validate, | ||
validateProfile, | ||
prevalidate, | ||
getLabel, | ||
readValue, | ||
getErrorLevel, | ||
profiles, | ||
}; |
@@ -1,92 +0,98 @@ | ||
const test = require('ava') | ||
const {readValue} = require('../../validate/row') | ||
const test = require("ava"); | ||
const { readValue } = require("../../validate/row"); | ||
test('validate suffixe', async t => { | ||
const result = await readValue('suffixe', 'ter') | ||
t.is(result.parsedValue, 'ter') | ||
t.deepEqual(result.errors, []) | ||
}) | ||
test("validate suffixe", async (t) => { | ||
const result = await readValue("suffixe", "ter"); | ||
t.is(result.parsedValue, "ter"); | ||
t.deepEqual(result.errors, []); | ||
}); | ||
test('validate suffixe / debut_invalide', async t => { | ||
const result = await readValue('suffixe', '.') | ||
t.is(result.parsedValue, undefined) | ||
t.deepEqual(result.errors, ['debut_invalide']) | ||
}) | ||
test("validate suffixe / debut_invalide", async (t) => { | ||
const result = await readValue("suffixe", "."); | ||
t.is(result.parsedValue, undefined); | ||
t.deepEqual(result.errors, ["debut_invalide"]); | ||
}); | ||
test('validate suffixe / trop_long', async t => { | ||
const result = await readValue('suffixe', 'azertyuiopazertyuiop') | ||
t.is(result.parsedValue, undefined) | ||
t.deepEqual(result.errors, ['trop_long']) | ||
}) | ||
test("validate suffixe / trop_long", async (t) => { | ||
const result = await readValue("suffixe", "azertyuiopazertyuiop"); | ||
t.is(result.parsedValue, undefined); | ||
t.deepEqual(result.errors, ["trop_long"]); | ||
}); | ||
test('validate cad_parcelles', async t => { | ||
const result = await readValue('cad_parcelles', '12345000AA0001') | ||
t.deepEqual(result.parsedValue, ['12345000AA0001']) | ||
t.deepEqual(result.errors, []) | ||
}) | ||
test("validate cad_parcelles", async (t) => { | ||
const result = await readValue("cad_parcelles", "12345000AA0001"); | ||
t.deepEqual(result.parsedValue, ["12345000AA0001"]); | ||
t.deepEqual(result.errors, []); | ||
}); | ||
test('validate cad_parcelles / multiple', async t => { | ||
const result = await readValue('cad_parcelles', '12345000AA0001|12345000AA0002') | ||
t.deepEqual(result.parsedValue, ['12345000AA0001', '12345000AA0002']) | ||
t.deepEqual(result.errors, []) | ||
}) | ||
test("validate cad_parcelles / multiple", async (t) => { | ||
const result = await readValue( | ||
"cad_parcelles", | ||
"12345000AA0001|12345000AA0002", | ||
); | ||
t.deepEqual(result.parsedValue, ["12345000AA0001", "12345000AA0002"]); | ||
t.deepEqual(result.errors, []); | ||
}); | ||
test('validate certification_commune / 1', async t => { | ||
const result = await readValue('certification_commune', '1') | ||
t.is(result.parsedValue, true) | ||
t.deepEqual(result.errors, []) | ||
}) | ||
test("validate certification_commune / 1", async (t) => { | ||
const result = await readValue("certification_commune", "1"); | ||
t.is(result.parsedValue, true); | ||
t.deepEqual(result.errors, []); | ||
}); | ||
test('validate certification_commune / 0', async t => { | ||
const result = await readValue('certification_commune', '0') | ||
t.is(result.parsedValue, false) | ||
t.deepEqual(result.errors, []) | ||
}) | ||
test("validate certification_commune / 0", async (t) => { | ||
const result = await readValue("certification_commune", "0"); | ||
t.is(result.parsedValue, false); | ||
t.deepEqual(result.errors, []); | ||
}); | ||
test('validate certification_commune / valeur_invalide', async t => { | ||
const result = await readValue('certification_commune', 'toto') | ||
t.is(result.parsedValue, undefined) | ||
t.deepEqual(result.errors, ['valeur_invalide']) | ||
}) | ||
test("validate certification_commune / valeur_invalide", async (t) => { | ||
const result = await readValue("certification_commune", "toto"); | ||
t.is(result.parsedValue, undefined); | ||
t.deepEqual(result.errors, ["valeur_invalide"]); | ||
}); | ||
test('validate date_der_maj / date ancienne', async t => { | ||
const result = await readValue('date_der_maj', '2000-01-01') | ||
t.is(result.parsedValue, '2000-01-01') | ||
t.deepEqual(result.errors, ['date_ancienne']) | ||
}) | ||
test("validate date_der_maj / date ancienne", async (t) => { | ||
const result = await readValue("date_der_maj", "2000-01-01"); | ||
t.is(result.parsedValue, "2000-01-01"); | ||
t.deepEqual(result.errors, ["date_ancienne"]); | ||
}); | ||
test('validate date_der_maj / date future', async t => { | ||
const result = await readValue('date_der_maj', '2050-01-01') | ||
t.is(result.parsedValue, undefined) | ||
t.deepEqual(result.errors, ['date_future']) | ||
}) | ||
test("validate date_der_maj / date future", async (t) => { | ||
const result = await readValue("date_der_maj", "2050-01-01"); | ||
t.is(result.parsedValue, undefined); | ||
t.deepEqual(result.errors, ["date_future"]); | ||
}); | ||
test('validate voie_nom / trop_court', async t => { | ||
const result = await readValue('voie_nom', 'Aa') | ||
t.is(result.parsedValue, undefined) | ||
t.deepEqual(result.errors, ['trop_court']) | ||
}) | ||
test("validate voie_nom / trop_court", async (t) => { | ||
const result = await readValue("voie_nom", "Aa"); | ||
t.is(result.parsedValue, undefined); | ||
t.deepEqual(result.errors, ["trop_court"]); | ||
}); | ||
test('validate voie_nom / trop_long', async t => { | ||
const result = await readValue('voie_nom', 'Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf') | ||
t.is(result.parsedValue, undefined) | ||
t.deepEqual(result.errors, ['trop_long']) | ||
}) | ||
test("validate voie_nom / trop_long", async (t) => { | ||
const result = await readValue( | ||
"voie_nom", | ||
"Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf Abcededf", | ||
); | ||
t.is(result.parsedValue, undefined); | ||
t.deepEqual(result.errors, ["trop_long"]); | ||
}); | ||
test('validate voie_nom / casse_incorrecte', async t => { | ||
const result = await readValue('voie_nom', 'ALLEE DES RUISSEAUX') | ||
t.is(result.parsedValue, 'ALLEE DES RUISSEAUX') | ||
t.deepEqual(result.errors, ['casse_incorrecte']) | ||
}) | ||
test("validate voie_nom / casse_incorrecte", async (t) => { | ||
const result = await readValue("voie_nom", "ALLEE DES RUISSEAUX"); | ||
t.is(result.parsedValue, "ALLEE DES RUISSEAUX"); | ||
t.deepEqual(result.errors, ["casse_incorrecte"]); | ||
}); | ||
test('validate voie_nom / caractere_invalide', async t => { | ||
const result = await readValue('voie_nom', 'All�e des roses') | ||
t.is(result.parsedValue, undefined) | ||
t.deepEqual(result.errors, ['caractere_invalide']) | ||
}) | ||
test("validate voie_nom / caractere_invalide", async (t) => { | ||
const result = await readValue("voie_nom", "All�e des roses"); | ||
t.is(result.parsedValue, undefined); | ||
t.deepEqual(result.errors, ["caractere_invalide"]); | ||
}); | ||
test('validate voie_nom / contient_tiret_bas', async t => { | ||
const result = await readValue('voie_nom', 'Allée_des_roseaux') | ||
t.is(result.parsedValue, 'Allée des roseaux') | ||
t.deepEqual(result.errors, ['contient_tiret_bas']) | ||
}) | ||
test("validate voie_nom / contient_tiret_bas", async (t) => { | ||
const result = await readValue("voie_nom", "Allée_des_roseaux"); | ||
t.is(result.parsedValue, "Allée des roseaux"); | ||
t.deepEqual(result.errors, ["contient_tiret_bas"]); | ||
}); |
@@ -5,85 +5,124 @@ /* eslint capitalized-comments: off */ | ||
// * | ||
'*.valeur_manquante': 'Le champ {} ne doit pas être vide', | ||
'*.valeur_invalide': 'La valeur du champ {} est incorrecte', | ||
'*.espaces_debut_fin': 'La valeur du champ {} ne doit pas avoir d’espaces en début ou en fin de chaîne de caractère', | ||
'*.enum_fuzzy': 'La valeur du champ {} a été acceptée mais n’est pas conforme à la spécification', | ||
'*.caractere_invalide': 'Le champ {} contient des caractères non valides', | ||
"*.valeur_manquante": "Le champ {} ne doit pas être vide", | ||
"*.valeur_invalide": "La valeur du champ {} est incorrecte", | ||
"*.espaces_debut_fin": | ||
"La valeur du champ {} ne doit pas avoir d’espaces en début ou en fin de chaîne de caractère", | ||
"*.enum_fuzzy": | ||
"La valeur du champ {} a été acceptée mais n’est pas conforme à la spécification", | ||
"*.caractere_invalide": "Le champ {} contient des caractères non valides", | ||
// cle_interop | ||
'cle_interop.casse_invalide': 'La clé d’interopérabilité doit être en minuscules', | ||
'cle_interop.structure_invalide': 'La clé d’interopérabilité doit contenir au moins 3 segments', | ||
'cle_interop.commune_invalide': 'Clé d’interopérabilité invalide (commune)', | ||
'cle_interop.commune_ancienne': 'La commune référencée est une commune ancienne', | ||
'cle_interop.voie_invalide': 'Clé d’interopérabilité invalide (voie)', | ||
'cle_interop.numero_invalide': 'Clé d’interopérabilité invalide (numéro)', | ||
'cle_interop.numero_prefixe_manquant': 'La partie numéro de la clé d’interopérabilité doit contenir 5 caractères', | ||
'cle_interop.voie_non_renseignee': 'La partie voie de la clé d’interopératibilité a été laissée à nul (0000 ou xxxx)', | ||
"cle_interop.casse_invalide": | ||
"La clé d’interopérabilité doit être en minuscules", | ||
"cle_interop.structure_invalide": | ||
"La clé d’interopérabilité doit contenir au moins 3 segments", | ||
"cle_interop.commune_invalide": "Clé d’interopérabilité invalide (commune)", | ||
"cle_interop.commune_ancienne": | ||
"La commune référencée est une commune ancienne", | ||
"cle_interop.voie_invalide": "Clé d’interopérabilité invalide (voie)", | ||
"cle_interop.numero_invalide": "Clé d’interopérabilité invalide (numéro)", | ||
"cle_interop.numero_prefixe_manquant": | ||
"La partie numéro de la clé d’interopérabilité doit contenir 5 caractères", | ||
"cle_interop.voie_non_renseignee": | ||
"La partie voie de la clé d’interopératibilité a été laissée à nul (0000 ou xxxx)", | ||
// uid_adresse | ||
"uid_adresse.type_invalide": "La valeur de uid_adresse n’est pas valide", | ||
"uid_adresse.incoherence_ids_ban": | ||
"Les ids ban renseignés ne sont pas cohérents", | ||
// id_ban_commune | ||
'id_ban_commune.type_invalide': 'La valeur de id_ban_commune n’est pas un uuidv4 valide', | ||
"id_ban_commune.type_invalide": | ||
"La valeur de id_ban_commune n’est pas un uuidv4 valide", | ||
// id_ban_toponyme | ||
'id_ban_toponyme.type_invalide': 'La valeur de id_ban_toponyme n’est pas un uuidv4 valide', | ||
"id_ban_toponyme.type_invalide": | ||
"La valeur de id_ban_toponyme n’est pas un uuidv4 valide", | ||
// id_ban_adresse | ||
'id_ban_adresse.type_invalide': 'La valeur de id_ban_adresse n’est pas un uuidv4 valide', | ||
"id_ban_adresse.type_invalide": | ||
"La valeur de id_ban_adresse n’est pas un uuidv4 valide", | ||
// numero | ||
'numero.type_invalide': 'La valeur du champ numéro doit être un nombre entier', | ||
'numero.contient_prefixe': 'La valeur du champ numéro ne doit pas être préfixée par des zéros', | ||
'numero.trop_grand': 'Le numéro doit être compris entre 0 et 9999 (sauf toponyme)', | ||
"numero.type_invalide": | ||
"La valeur du champ numéro doit être un nombre entier", | ||
"numero.contient_prefixe": | ||
"La valeur du champ numéro ne doit pas être préfixée par des zéros", | ||
"numero.trop_grand": | ||
"Le numéro doit être compris entre 0 et 9999 (sauf toponyme)", | ||
// suffixe | ||
'suffixe.debut_invalide': 'La valeur du champ suffixe doit commencer par un caractère alphanumérique.', | ||
'suffixe.trop_long': 'La valeur du champ suffixe est trop longue', | ||
"suffixe.debut_invalide": | ||
"La valeur du champ suffixe doit commencer par un caractère alphanumérique.", | ||
"suffixe.trop_long": "La valeur du champ suffixe est trop longue", | ||
// voie_nom | ||
'voie_nom.trop_court': 'Le nom de la voie est trop court (3 caractères minimum)', | ||
'voie_nom.trop_long': 'Le nom de la voie est trop long (200 caractères maximum)', | ||
'voie_nom.casse_incorrecte': 'Le nom de la voie est en majuscules', | ||
'voie_nom.contient_tiret_bas': 'Le nom de la voie contient un caractère tiret bas', | ||
"voie_nom.trop_court": | ||
"Le nom de la voie est trop court (3 caractères minimum)", | ||
"voie_nom.trop_long": | ||
"Le nom de la voie est trop long (200 caractères maximum)", | ||
"voie_nom.casse_incorrecte": "Le nom de la voie est en majuscules", | ||
"voie_nom.contient_tiret_bas": | ||
"Le nom de la voie contient un caractère tiret bas", | ||
// commune_insee | ||
'commune_insee.commune_invalide': 'Le code INSEE de la commune n’est pas un code ayant existé', | ||
'commune_insee.commune_ancienne': 'Le code INSEE de la commune est le code d’une commune ancienne', | ||
"commune_insee.commune_invalide": | ||
"Le code INSEE de la commune n’est pas un code ayant existé", | ||
"commune_insee.commune_ancienne": | ||
"Le code INSEE de la commune est le code d’une commune ancienne", | ||
// commune_deleguee_insee | ||
'commune_deleguee_insee.commune_invalide': 'Le code INSEE renseigné n’est pas un code valide ou n’a jamais existé', | ||
'commune_deleguee_insee.commune_actuelle_non_deleguee': 'Le code INSEE renseigné correspond au code d’une commune actuelle dont le chef lieu n’est pas une commune déléguée', | ||
'commune_deleguee_insee.commune_ancienne_non_deleguee': 'Le code INSEE renseigné correspond au code d’une commune ancienne qui n’a pas le statut de commune déléguée', | ||
"commune_deleguee_insee.commune_invalide": | ||
"Le code INSEE renseigné n’est pas un code valide ou n’a jamais existé", | ||
"commune_deleguee_insee.commune_actuelle_non_deleguee": | ||
"Le code INSEE renseigné correspond au code d’une commune actuelle dont le chef lieu n’est pas une commune déléguée", | ||
"commune_deleguee_insee.commune_ancienne_non_deleguee": | ||
"Le code INSEE renseigné correspond au code d’une commune ancienne qui n’a pas le statut de commune déléguée", | ||
// x | ||
'x.separateur_decimal_invalide': 'Le séparateur des décimales du champ x doit être le point', | ||
"x.separateur_decimal_invalide": | ||
"Le séparateur des décimales du champ x doit être le point", | ||
// y | ||
'y.separateur_decimal_invalide': 'Le séparateur des décimales du champ y doit être le point', | ||
"y.separateur_decimal_invalide": | ||
"Le séparateur des décimales du champ y doit être le point", | ||
// long | ||
'long.separateur_decimal_invalide': 'Le séparateur des décimales du champ long doit être le point', | ||
"long.separateur_decimal_invalide": | ||
"Le séparateur des décimales du champ long doit être le point", | ||
// lat | ||
'lat.separateur_decimal_invalide': 'Le séparateur des décimales du champ lat doit être le point', | ||
"lat.separateur_decimal_invalide": | ||
"Le séparateur des décimales du champ lat doit être le point", | ||
// date_der_maj | ||
'date_der_maj.date_invalide': 'Date invalide', | ||
'date_der_maj.date_ancienne': 'Date trop ancienne', | ||
'date_der_maj.date_future': 'Date dans le futur', | ||
"date_der_maj.date_invalide": "Date invalide", | ||
"date_der_maj.date_ancienne": "Date trop ancienne", | ||
"date_der_maj.date_future": "Date dans le futur", | ||
// cad_parcelles | ||
'cad_parcelles.pipe_debut_fin': 'Le symbole | ne doit pas être utilisé en début ou fin de chaîne', | ||
"cad_parcelles.pipe_debut_fin": | ||
"Le symbole | ne doit pas être utilisé en début ou fin de chaîne", | ||
// row-level errors | ||
'row.incoherence_numero': 'Le numéro ne correspond pas à la valeur présente dans la clé', | ||
'row.position_manquante': 'Position nulle', | ||
'row.chef_lieu_invalide': 'La code INSEE de la commune courante ne correspond pas au chef lieu de la commune disparue renseignée', | ||
'row.commune_manquante': 'Aucun code commune valide n’est renseigné', | ||
'row.longlat_vides': 'Les coordonnées long/lat ne sont pas renseignées', | ||
'row.longlat_invalides': 'Les coordonnées long/lat sont en dehors du territoire ou invalides', | ||
'row.longlat_xy_incoherents': 'Les coordonnées long/lat et x/y ne sont pas cohérentes', | ||
'row.adresse_incomplete': 'L’adresse est incomplète (numéro ou nom de la voie non renseignés)', | ||
'row.incoherence_ids_ban': 'Les ids ban renseignés ne sont pas cohérents', | ||
'row.id_ban_adresses_required': 'id_ban_adresses est requis les ids ban et le numero sont renseigné', | ||
"row.incoherence_numero": | ||
"Le numéro ne correspond pas à la valeur présente dans la clé", | ||
"row.position_manquante": "Position nulle", | ||
"row.chef_lieu_invalide": | ||
"La code INSEE de la commune courante ne correspond pas au chef lieu de la commune disparue renseignée", | ||
"row.commune_manquante": "Aucun code commune valide n’est renseigné", | ||
"row.longlat_vides": "Les coordonnées long/lat ne sont pas renseignées", | ||
"row.longlat_invalides": | ||
"Les coordonnées long/lat sont en dehors du territoire ou invalides", | ||
"row.longlat_xy_incoherents": | ||
"Les coordonnées long/lat et x/y ne sont pas cohérentes", | ||
"row.adresse_incomplete": | ||
"L’adresse est incomplète (numéro ou nom de la voie non renseignés)", | ||
"row.incoherence_ids_ban": "Les ids ban renseignés ne sont pas cohérents", | ||
"row.id_ban_adresses_required": | ||
"id_ban_adresses est requis les ids ban et le numero sont renseigné", | ||
// rows | ||
'rows.empty': 'Aucune ligne détecté', | ||
'rows.ids_required_every': 'Les ids ban sont requis pour toutes les lignes si ils sont utlisés' | ||
} | ||
"rows.empty": "Aucune ligne détecté", | ||
"rows.ids_required_every": | ||
"Les ids ban sont requis pour toutes les lignes si ils sont utlisés", | ||
}; |
/* eslint camelcase: off */ | ||
const {format, parseISO} = require('date-fns') | ||
const {trim, trimStart, deburr} = require('lodash') | ||
const {isUuid} = require('uuidv4') | ||
const languesRegionales = require('@ban-team/shared-data/langues-regionales.json') | ||
const proj = require('@etalab/project-legal') | ||
const {isCommune, isCommuneActuelle, isCommuneDeleguee, isCommuneAncienne, getCommuneActuelle} = require('../cog') | ||
const { format, parseISO } = require("date-fns"); | ||
const { trim, trimStart, deburr } = require("lodash"); | ||
const { isUuid } = require("uuidv4"); | ||
const languesRegionales = require("@ban-team/shared-data/langues-regionales.json"); | ||
const proj = require("@etalab/project-legal"); | ||
const { | ||
isCommune, | ||
isCommuneActuelle, | ||
isCommuneDeleguee, | ||
isCommuneAncienne, | ||
getCommuneActuelle, | ||
} = require("../cog"); | ||
function isValidFloat(str) { | ||
return Boolean(/^-?(0|[1-9]\d*)(\.\d+)?\d?$/.test(str)) | ||
return Boolean(/^-?(0|[1-9]\d*)(\.\d+)?\d?$/.test(str)); | ||
} | ||
function isValidFrenchFloat(str) { | ||
return Boolean(/^-?(0|[1-9]\d*)(,\d+)?\d?$/.test(str)) | ||
return Boolean(/^-?(0|[1-9]\d*)(,\d+)?\d?$/.test(str)); | ||
} | ||
function includesInvalidChar(str) { | ||
return str.includes('�') | ||
return str.includes("�"); | ||
} | ||
exports.allowedLocales = languesRegionales.map(l => l.code) | ||
exports.allowedLocales = languesRegionales.map((l) => l.code); | ||
exports.fields = { | ||
cle_interop: { | ||
required: true, | ||
trim: true, | ||
aliases: ['cle_intero', 'cle_interro'], | ||
parse(v, {addError, setAdditionnalValues}) { | ||
aliases: ["cle_intero", "cle_interro"], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
parse(v, { addError, setAdditionnalValues }) { | ||
if (v.toLowerCase() !== v) { | ||
addError('casse_invalide') | ||
addError("casse_invalide"); | ||
} | ||
const splitted = v.split('_') | ||
const splitted = v.split("_"); | ||
if (splitted.length < 3) { | ||
return addError('structure_invalide') | ||
return addError("structure_invalide"); | ||
} | ||
if (splitted.some(part => !part)) { | ||
return addError('structure_invalide') | ||
if (splitted.some((part) => !part)) { | ||
return addError("structure_invalide"); | ||
} | ||
const [, codeVoie, numeroVoie, ...suffixes] = splitted | ||
const codeCommune = splitted[0].toUpperCase() | ||
const [, codeVoie, numeroVoie, ...suffixes] = splitted; | ||
const codeCommune = splitted[0].toUpperCase(); | ||
if (!isCommune(codeCommune)) { | ||
addError('commune_invalide') | ||
addError("commune_invalide"); | ||
} else if (isCommuneAncienne(codeCommune)) { | ||
addError('commune_ancienne') | ||
addError("commune_ancienne"); | ||
} | ||
let codeVoieError = false | ||
let codeVoieError = false; | ||
if (codeVoie.length !== 4) { | ||
addError('voie_invalide') | ||
codeVoieError = true | ||
} else if (codeVoie.toUpperCase() === 'XXXX' || codeVoie === '0000') { | ||
addError('voie_non_renseignee') | ||
codeVoieError = true | ||
addError("voie_invalide"); | ||
codeVoieError = true; | ||
} else if (codeVoie.toUpperCase() === "XXXX" || codeVoie === "0000") { | ||
addError("voie_non_renseignee"); | ||
codeVoieError = true; | ||
} | ||
@@ -65,7 +71,7 @@ | ||
if (!/^\d+$/.test(numeroVoie)) { | ||
return addError('numero_invalide') | ||
return addError("numero_invalide"); | ||
} | ||
if (numeroVoie.length !== 5) { | ||
addError('numero_prefixe_manquant') | ||
addError("numero_prefixe_manquant"); | ||
} | ||
@@ -76,8 +82,10 @@ | ||
codeVoie: codeVoieError ? undefined : codeVoie.toUpperCase(), | ||
numeroVoie: trimStart(numeroVoie, '0'), | ||
suffixes | ||
}) | ||
numeroVoie: trimStart(numeroVoie, "0"), | ||
suffixes, | ||
}); | ||
return [codeCommune, codeVoie, numeroVoie.padStart(5, '0'), ...suffixes].join('_').toLowerCase() | ||
} | ||
return [codeCommune, codeVoie, numeroVoie.padStart(5, "0"), ...suffixes] | ||
.join("_") | ||
.toLowerCase(); | ||
}, | ||
}, | ||
@@ -87,36 +95,89 @@ | ||
trim: true, | ||
aliases: ['uid_adress'] | ||
formats: ["1.1", "1.2", "1.3"], | ||
aliases: ["uid_adress"], | ||
parse(v, { addError, setAdditionnalValues }) { | ||
const regUuidCommune = | ||
/@c([A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12})/gi; | ||
const regUuidToponyme = | ||
/@v[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}/gi; | ||
const regUuidAdresse = | ||
/@a[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}/gi; | ||
const [uuidCommune] = v.match(regUuidCommune) || []; | ||
const [uuidToponyme] = v.match(regUuidToponyme) || []; | ||
const [uuidAdresse] = v.match(regUuidAdresse) || []; | ||
const idBanCommune = uuidCommune?.substr(2) || null; | ||
const idBanToponyme = uuidToponyme?.substr(2) || null; | ||
const idBanAdresse = uuidAdresse?.substr(2) || null; | ||
if ( | ||
!isUuid(idBanCommune) || | ||
!isUuid(idBanToponyme) || | ||
idBanAdresse === null || | ||
!isUuid(idBanAdresse) | ||
) { | ||
return addError("type_invalide"); | ||
} | ||
if (!idBanCommune || !idBanToponyme) { | ||
addError("incoherence_ids_ban"); | ||
} | ||
// LES IDS id_ban_commune / id_ban_toponyme / id_ban_adresse NE PEUVENT PAS ËTRE IDENTIQUES | ||
if ( | ||
(idBanCommune && idBanToponyme && idBanCommune === idBanToponyme) || | ||
(idBanCommune && idBanAdresse && idBanCommune === idBanAdresse) || | ||
(idBanAdresse && idBanToponyme && idBanToponyme === idBanAdresse) | ||
) { | ||
addError("incoherence_ids_ban"); | ||
} | ||
// SI IL Y A UN id_ban_toponyme, IL Y A UN id_ban_commune | ||
// SI IL Y A UN id_ban_adresse, IL Y A UN id_ban_toponyme ET DONC IL Y A IL Y A UN id_ban_commune | ||
setAdditionnalValues({ | ||
idBanCommune, | ||
idBanToponyme, | ||
idBanAdresse, | ||
}); | ||
return v; | ||
}, | ||
}, | ||
id_ban_commune: { | ||
formats: ["1.4"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (!isUuid(v)) { | ||
return addError('type_invalide') | ||
return addError("type_invalide"); | ||
} | ||
return v | ||
} | ||
return v; | ||
}, | ||
}, | ||
id_ban_toponyme: { | ||
formats: ["1.4"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (!isUuid(v)) { | ||
return addError('type_invalide') | ||
return addError("type_invalide"); | ||
} | ||
return v | ||
} | ||
return v; | ||
}, | ||
}, | ||
id_ban_adresse: { | ||
formats: ["1.4"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (!isUuid(v)) { | ||
return addError('type_invalide') | ||
return addError("type_invalide"); | ||
} | ||
return v | ||
} | ||
return v; | ||
}, | ||
}, | ||
@@ -126,35 +187,36 @@ | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
allowLocales: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (v.length < 3) { | ||
return addError('trop_court') | ||
return addError("trop_court"); | ||
} | ||
if (v.length > 200) { | ||
return addError('trop_long') | ||
return addError("trop_long"); | ||
} | ||
if (includesInvalidChar(v)) { | ||
return addError('caractere_invalide') | ||
return addError("caractere_invalide"); | ||
} | ||
if (v.includes('_')) { | ||
addError('contient_tiret_bas') | ||
v = v.replace(/_/g, ' ') | ||
if (v.includes("_")) { | ||
addError("contient_tiret_bas"); | ||
v = v.replace(/_/g, " "); | ||
} | ||
if (v.toUpperCase() === v) { | ||
addError('casse_incorrecte') | ||
addError("casse_incorrecte"); | ||
} | ||
return v | ||
} | ||
return v; | ||
}, | ||
}, | ||
lieudit_complement_nom: { | ||
version: '1.2', | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
allowLocales: true, | ||
aliases: ['lieudit_co'] | ||
aliases: ["lieudit_co"], | ||
}, | ||
@@ -164,57 +226,59 @@ | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
aliases: ['nulmero'], | ||
parse(v, {addError}) { | ||
aliases: ["nulmero"], | ||
parse(v, { addError }) { | ||
if (!/^\d+$/.test(v)) { | ||
return addError('type_invalide') | ||
return addError("type_invalide"); | ||
} | ||
if (v.startsWith('0') && v !== '0') { | ||
addError('contient_prefixe') | ||
if (v.startsWith("0") && v !== "0") { | ||
addError("contient_prefixe"); | ||
} | ||
const n = Number.parseInt(v, 10) | ||
const n = Number.parseInt(v, 10); | ||
if (n > 9999 && n !== 99_999) { | ||
return addError('trop_grand') | ||
return addError("trop_grand"); | ||
} | ||
return n | ||
} | ||
return n; | ||
}, | ||
}, | ||
suffixe: { | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (!/^[\da-z]/i.test(v)) { | ||
return addError('debut_invalide') | ||
return addError("debut_invalide"); | ||
} | ||
if (v.length > 9) { | ||
return addError('trop_long') | ||
return addError("trop_long"); | ||
} | ||
return v | ||
} | ||
return v; | ||
}, | ||
}, | ||
commune_insee: { | ||
version: '1.2', | ||
required: true, | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
aliases: ['commune_in'], | ||
parse(v, {addError}) { | ||
const code = v.toUpperCase() | ||
aliases: ["commune_in"], | ||
parse(v, { addError }) { | ||
const code = v.toUpperCase(); | ||
if (!isCommune(code)) { | ||
addError('commune_invalide') | ||
return | ||
addError("commune_invalide"); | ||
return; | ||
} | ||
if (isCommuneAncienne(code)) { | ||
addError('commune_ancienne') | ||
addError("commune_ancienne"); | ||
} | ||
return code | ||
} | ||
return code; | ||
}, | ||
}, | ||
@@ -224,16 +288,17 @@ | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
allowLocales: true, | ||
aliases: ['commune_no'] | ||
aliases: ["commune_no"], | ||
}, | ||
commune_deleguee_insee: { | ||
version: '1.2', | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
const code = v.toUpperCase() | ||
parse(v, { addError }) { | ||
const code = v.toUpperCase(); | ||
if (!isCommune(code)) { | ||
addError('commune_invalide') | ||
return | ||
addError("commune_invalide"); | ||
return; | ||
} | ||
@@ -243,131 +308,141 @@ | ||
if (isCommuneActuelle(code)) { | ||
addError('commune_actuelle_non_deleguee') | ||
addError("commune_actuelle_non_deleguee"); | ||
} else { | ||
addError('commune_ancienne_non_deleguee') | ||
addError("commune_ancienne_non_deleguee"); | ||
} | ||
} | ||
return code | ||
} | ||
return code; | ||
}, | ||
}, | ||
commune_deleguee_nom: { | ||
version: '1.2', | ||
formats: ["1.2", "1.3", "1.4"], | ||
trim: true, | ||
allowLocales: true | ||
allowLocales: true, | ||
}, | ||
position: { | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
enum: [ | ||
'délivrance postale', | ||
'entrée', | ||
'bâtiment', | ||
'cage d’escalier', | ||
'logement', | ||
'parcelle', | ||
'segment', | ||
'service technique' | ||
] | ||
"délivrance postale", | ||
"entrée", | ||
"bâtiment", | ||
"cage d’escalier", | ||
"logement", | ||
"parcelle", | ||
"segment", | ||
"service technique", | ||
], | ||
}, | ||
x: { | ||
aliases: ['x_l93'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["x_l93"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (isValidFloat(v)) { | ||
return Number.parseFloat(v) | ||
return Number.parseFloat(v); | ||
} | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide') | ||
return Number.parseFloat(v.replace(',', '.')) | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide') | ||
} | ||
addError("valeur_invalide"); | ||
}, | ||
}, | ||
y: { | ||
aliases: ['y_l93'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["y_l93"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (isValidFloat(v)) { | ||
return Number.parseFloat(v) | ||
return Number.parseFloat(v); | ||
} | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide') | ||
return Number.parseFloat(v.replace(',', '.')) | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide') | ||
} | ||
addError("valeur_invalide"); | ||
}, | ||
}, | ||
long: { | ||
aliases: ['long_wgs84', 'lon'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["long_wgs84", "lon"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (isValidFloat(v)) { | ||
return Number.parseFloat(v) | ||
return Number.parseFloat(v); | ||
} | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide') | ||
return Number.parseFloat(v.replace(',', '.')) | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide') | ||
} | ||
addError("valeur_invalide"); | ||
}, | ||
}, | ||
lat: { | ||
aliases: ['lat_wgs84'], | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
aliases: ["lat_wgs84"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
parse(v, { addError }) { | ||
if (isValidFloat(v)) { | ||
return Number.parseFloat(v) | ||
return Number.parseFloat(v); | ||
} | ||
if (isValidFrenchFloat(v)) { | ||
addError('separateur_decimal_invalide') | ||
return Number.parseFloat(v.replace(',', '.')) | ||
addError("separateur_decimal_invalide"); | ||
return Number.parseFloat(v.replace(",", ".")); | ||
} | ||
addError('valeur_invalide') | ||
} | ||
addError("valeur_invalide"); | ||
}, | ||
}, | ||
cad_parcelles: { | ||
version: '1.2', | ||
aliases: ['cad_parcel'], | ||
formats: ["1.2", "1.3", "1.4"], | ||
aliases: ["cad_parcel"], | ||
trim: true, | ||
parse(v, {addError}) { | ||
const pTrimmedValue = trim(v, '|') | ||
parse(v, { addError }) { | ||
const pTrimmedValue = trim(v, "|"); | ||
if (pTrimmedValue !== v) { | ||
addError('pipe_debut_fin') | ||
addError("pipe_debut_fin"); | ||
} | ||
if (!pTrimmedValue) { | ||
addError('valeur_invalide') | ||
return | ||
addError("valeur_invalide"); | ||
return; | ||
} | ||
const parcelles = pTrimmedValue.includes('|') ? pTrimmedValue.split('|') : [pTrimmedValue] | ||
const parcelles = pTrimmedValue.includes("|") | ||
? pTrimmedValue.split("|") | ||
: [pTrimmedValue]; | ||
if (parcelles.some(p => p.length !== 14 && p.length !== 15)) { | ||
addError('valeur_invalide') | ||
return | ||
if (parcelles.some((p) => p.length !== 14 && p.length !== 15)) { | ||
addError("valeur_invalide"); | ||
return; | ||
} | ||
return parcelles.map(p => p.length === 14 ? p : p.slice(0, 2) + p.slice(3)) | ||
} | ||
return parcelles.map((p) => | ||
p.length === 14 ? p : p.slice(0, 2) + p.slice(3) | ||
); | ||
}, | ||
}, | ||
source: { | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
required: true, | ||
trim: true | ||
trim: true, | ||
}, | ||
@@ -377,83 +452,96 @@ | ||
required: true, | ||
formats: ["1.1", "1.2", "1.3", "1.4"], | ||
trim: true, | ||
aliases: ['date_der_m', 'dmaj', 'date_maj'], | ||
parse(v, {addError}) { | ||
aliases: ["date_der_m", "dmaj", "date_maj"], | ||
parse(v, { addError }) { | ||
if (!/^(\d{4}-\d{2}-\d{2})$/.test(v)) { | ||
return addError('date_invalide') | ||
return addError("date_invalide"); | ||
} | ||
const parsedDate = parseISO(v) | ||
const parsedDate = parseISO(v); | ||
if (Number.isNaN(parsedDate.getTime())) { | ||
return addError('date_invalide') | ||
return addError("date_invalide"); | ||
} | ||
if (parsedDate < new Date('2010-01-01')) { | ||
addError('date_ancienne') | ||
if (parsedDate < new Date("2010-01-01")) { | ||
addError("date_ancienne"); | ||
} | ||
if (parsedDate > new Date()) { | ||
return addError('date_future') | ||
return addError("date_future"); | ||
} | ||
return format(parsedDate, 'yyyy-MM-dd') | ||
} | ||
return format(parsedDate, "yyyy-MM-dd"); | ||
}, | ||
}, | ||
certification_commune: { | ||
version: '1.3', | ||
formats: ["1.3", "1.4"], | ||
required: false, | ||
trim: true, | ||
aliases: ['certification_adresse'], | ||
parse(v, {addError}) { | ||
if (v === '1') { | ||
return true | ||
aliases: ["certification_adresse"], | ||
parse(v, { addError }) { | ||
if (v === "1") { | ||
return true; | ||
} | ||
if (v === '0') { | ||
return false | ||
if (v === "0") { | ||
return false; | ||
} | ||
return addError('valeur_invalide') | ||
} | ||
} | ||
return addError("valeur_invalide"); | ||
}, | ||
}, | ||
}; | ||
} | ||
function getNormalizedEnumValue(value) { | ||
return deburr(value.normalize()).replace(/\W+/g, ' ').trim().toLowerCase().normalize() | ||
return deburr(value.normalize()) | ||
.replace(/\W+/g, " ") | ||
.trim() | ||
.toLowerCase() | ||
.normalize(); | ||
} | ||
const enumFuzzyMap = new Map() | ||
const enumFuzzyMap = new Map(); | ||
for (const value of exports.fields.position.enum) { | ||
enumFuzzyMap.set(getNormalizedEnumValue(value), value.normalize()) | ||
enumFuzzyMap.set(getNormalizedEnumValue(value), value.normalize()); | ||
} | ||
exports.fields.position.enumFuzzyMap = enumFuzzyMap | ||
exports.fields.position.enumFuzzyMap = enumFuzzyMap; | ||
exports.getNormalizedEnumValue = getNormalizedEnumValue | ||
exports.getNormalizedEnumValue = getNormalizedEnumValue; | ||
function harmlessProj(coordinates) { | ||
try { | ||
return proj(coordinates) | ||
} catch {} | ||
return proj(coordinates); | ||
} catch { | ||
// empty | ||
} | ||
} | ||
function validateCoords(row, {addError}) { | ||
if (row.parsedValues.numero && row.parsedValues.numero !== 99_999 && (!row.rawValues.long || !row.rawValues.lat)) { | ||
addError('longlat_vides') | ||
function validateCoords(row, { addError }) { | ||
if ( | ||
row.parsedValues.numero && | ||
row.parsedValues.numero !== 99_999 && | ||
(!row.rawValues.long || !row.rawValues.lat) | ||
) { | ||
addError("longlat_vides"); | ||
} | ||
const {long, lat, x, y} = row.parsedValues | ||
const { long, lat, x, y } = row.parsedValues; | ||
if (long !== undefined && lat !== undefined) { | ||
const projectedCoordInMeters = harmlessProj([long, lat]) | ||
const projectedCoordInMeters = harmlessProj([long, lat]); | ||
if (projectedCoordInMeters) { | ||
if (x !== undefined && y !== undefined) { | ||
const distance = Math.sqrt(((x - projectedCoordInMeters[0]) ** 2) + ((y - projectedCoordInMeters[1]) ** 2)) | ||
const tolerance = 10 | ||
const distance = Math.sqrt( | ||
(x - projectedCoordInMeters[0]) ** 2 + | ||
(y - projectedCoordInMeters[1]) ** 2 | ||
); | ||
const tolerance = 10; | ||
if (distance > tolerance) { | ||
addError('longlat_xy_incoherents') | ||
addError("longlat_xy_incoherents"); | ||
} | ||
@@ -463,3 +551,3 @@ } | ||
// Not in France or error | ||
addError('longlat_invalides') | ||
addError("longlat_invalides"); | ||
} | ||
@@ -473,6 +561,7 @@ } | ||
if ( | ||
(!row.parsedValues.id_ban_commune && row.parsedValues.id_ban_toponyme) | ||
|| ((!row.parsedValues.id_ban_commune || !row.parsedValues.id_ban_toponyme) && row.parsedValues.id_ban_adresse) | ||
(!row.parsedValues.id_ban_commune && row.parsedValues.id_ban_toponyme) || | ||
((!row.parsedValues.id_ban_commune || !row.parsedValues.id_ban_toponyme) && | ||
row.parsedValues.id_ban_adresse) | ||
) { | ||
addError('incoherence_ids_ban') | ||
addError("incoherence_ids_ban"); | ||
} | ||
@@ -482,17 +571,13 @@ | ||
if ( | ||
( | ||
row.parsedValues.id_ban_commune | ||
&& row.parsedValues.id_ban_toponyme | ||
&& row.parsedValues.id_ban_commune === row.parsedValues.id_ban_toponyme | ||
) || ( | ||
row.parsedValues.id_ban_commune | ||
&& row.parsedValues.id_ban_adresse | ||
&& row.parsedValues.id_ban_commune === row.parsedValues.id_ban_adresse | ||
) || ( | ||
row.parsedValues.id_ban_adresse | ||
&& row.parsedValues.id_ban_toponyme | ||
&& row.parsedValues.id_ban_toponyme === row.parsedValues.id_ban_adresse | ||
) | ||
(row.parsedValues.id_ban_commune && | ||
row.parsedValues.id_ban_toponyme && | ||
row.parsedValues.id_ban_commune === row.parsedValues.id_ban_toponyme) || | ||
(row.parsedValues.id_ban_commune && | ||
row.parsedValues.id_ban_adresse && | ||
row.parsedValues.id_ban_commune === row.parsedValues.id_ban_adresse) || | ||
(row.parsedValues.id_ban_adresse && | ||
row.parsedValues.id_ban_toponyme && | ||
row.parsedValues.id_ban_toponyme === row.parsedValues.id_ban_adresse) | ||
) { | ||
addError('incoherence_ids_ban') | ||
addError("incoherence_ids_ban"); | ||
} | ||
@@ -502,17 +587,17 @@ | ||
if ( | ||
row.parsedValues.id_ban_commune | ||
&& row.parsedValues.id_ban_toponyme | ||
&& row.parsedValues.numero | ||
&& row.parsedValues.numero !== 99_999 | ||
&& !row.parsedValues.id_ban_adresse | ||
row.parsedValues.id_ban_commune && | ||
row.parsedValues.id_ban_toponyme && | ||
row.parsedValues.numero && | ||
row.parsedValues.numero !== 99_999 && | ||
!row.parsedValues.id_ban_adresse | ||
) { | ||
addError('id_ban_adresses_required') | ||
addError("id_ban_adresses_required"); | ||
} | ||
} | ||
exports.row = (row, {addError}) => { | ||
exports.row = (row, { addError }) => { | ||
if (row.parsedValues.cle_interop && row.parsedValues.numero) { | ||
const {numeroVoie} = row.additionalValues.cle_interop | ||
const { numeroVoie } = row.additionalValues.cle_interop; | ||
if (Number.parseInt(numeroVoie, 10) !== row.parsedValues.numero) { | ||
addError('incoherence_numero') | ||
addError("incoherence_numero"); | ||
} | ||
@@ -522,26 +607,33 @@ } | ||
if (!row.parsedValues.cle_interop && !row.parsedValues.commune_insee) { | ||
addError('commune_manquante') | ||
addError("commune_manquante"); | ||
} | ||
if (row.parsedValues.numero && row.parsedValues.numero !== 99_999 && !row.rawValues.position) { | ||
addError('position_manquante') | ||
if ( | ||
row.parsedValues.numero && | ||
row.parsedValues.numero !== 99_999 && | ||
!row.rawValues.position | ||
) { | ||
addError("position_manquante"); | ||
} | ||
validateCoords(row, {addError}) | ||
validateCoords(row, { addError }); | ||
if (row.parsedValues.numero === undefined || !row.parsedValues.voie_nom) { | ||
addError('adresse_incomplete') | ||
addError("adresse_incomplete"); | ||
} | ||
if (row.parsedValues.commune_deleguee_insee && row.parsedValues.commune_insee) { | ||
const codeCommune = row.parsedValues.commune_insee | ||
const codeAncienneCommune = row.parsedValues.commune_deleguee_insee | ||
const communeActuelle = getCommuneActuelle(codeAncienneCommune) | ||
if ( | ||
row.parsedValues.commune_deleguee_insee && | ||
row.parsedValues.commune_insee | ||
) { | ||
const codeCommune = row.parsedValues.commune_insee; | ||
const codeAncienneCommune = row.parsedValues.commune_deleguee_insee; | ||
const communeActuelle = getCommuneActuelle(codeAncienneCommune); | ||
if (communeActuelle && communeActuelle.code !== codeCommune) { | ||
addError('chef_lieu_invalide') | ||
addError("chef_lieu_invalide"); | ||
} | ||
} | ||
checkBanIds(row, addError) | ||
} | ||
checkBanIds(row, addError); | ||
}; |
const errors = [ | ||
'cle_interop.valeur_manquante', | ||
'cle_interop.casse_invalide', | ||
'cle_interop.structure_invalide', | ||
'cle_interop.commune_invalide', | ||
'cle_interop.voie_invalide', | ||
'cle_interop.voie_non_renseignee', | ||
'cle_interop.numero_invalide', | ||
'cle_interop.numero_prefixe_manquant', | ||
'voie_nom.valeur_manquante', | ||
'voie_nom.caractere_invalide', | ||
'voie_nom_@@.caractere_invalide', | ||
'numero.valeur_manquante', | ||
'numero.contient_prefixe', | ||
'numero.type_invalide', | ||
'suffixe.debut_invalide', | ||
'position.valeur_invalide', | ||
'x.valeur_invalide', | ||
'x.separateur_decimal_invalide', | ||
'y.valeur_invalide', | ||
'y.separateur_decimal_invalide', | ||
'long.valeur_invalide', | ||
'long.separateur_decimal_invalide', | ||
'lat.valeur_invalide', | ||
'lat.separateur_decimal_invalide', | ||
'source.valeur_manquante', | ||
'date_der_maj.valeur_manquante', | ||
'date_der_maj.date_invalide', | ||
'row.incoherence_numero', | ||
'row.position_manquante', | ||
'row.adresse_incomplete', | ||
"cle_interop.valeur_manquante", | ||
"cle_interop.casse_invalide", | ||
"cle_interop.structure_invalide", | ||
"cle_interop.commune_invalide", | ||
"cle_interop.voie_invalide", | ||
"cle_interop.voie_non_renseignee", | ||
"cle_interop.numero_invalide", | ||
"cle_interop.numero_prefixe_manquant", | ||
"voie_nom.valeur_manquante", | ||
"voie_nom.caractere_invalide", | ||
"voie_nom_@@.caractere_invalide", | ||
"numero.valeur_manquante", | ||
"numero.contient_prefixe", | ||
"numero.type_invalide", | ||
"suffixe.debut_invalide", | ||
"position.valeur_invalide", | ||
"x.valeur_invalide", | ||
"x.separateur_decimal_invalide", | ||
"y.valeur_invalide", | ||
"y.separateur_decimal_invalide", | ||
"long.valeur_invalide", | ||
"long.separateur_decimal_invalide", | ||
"lat.valeur_invalide", | ||
"lat.separateur_decimal_invalide", | ||
"source.valeur_manquante", | ||
"date_der_maj.valeur_manquante", | ||
"date_der_maj.date_invalide", | ||
"row.incoherence_numero", | ||
"row.position_manquante", | ||
"row.adresse_incomplete", | ||
'field.cle_interop.missing', | ||
'field.commune_nom.missing', | ||
'field.uid_adresse.missing', | ||
'field.voie_nom.missing', | ||
'field.numero.missing', | ||
'field.suffixe.missing', | ||
'field.position.missing', | ||
'field.long.missing', | ||
'field.lat.missing', | ||
'field.x.missing', | ||
'field.y.missing', | ||
'field.source.missing', | ||
'field.date_der_maj.missing', | ||
"field.cle_interop.missing", | ||
"field.commune_nom.missing", | ||
"field.uid_adresse.missing", | ||
"field.voie_nom.missing", | ||
"field.numero.missing", | ||
"field.suffixe.missing", | ||
"field.position.missing", | ||
"field.long.missing", | ||
"field.lat.missing", | ||
"field.x.missing", | ||
"field.y.missing", | ||
"field.source.missing", | ||
"field.date_der_maj.missing", | ||
'field.cle_interop.fuzzy', | ||
'field.commune_nom.fuzzy', | ||
'field.uid_adresse.fuzzy', | ||
'field.voie_nom.fuzzy', | ||
'field.numero.fuzzy', | ||
'field.suffixe.fuzzy', | ||
'field.position.fuzzy', | ||
'field.long.fuzzy', | ||
'field.lat.fuzzy', | ||
'field.x.fuzzy', | ||
'field.y.fuzzy', | ||
'field.source.fuzzy', | ||
'field.date_der_maj.fuzzy', | ||
"field.cle_interop.fuzzy", | ||
"field.commune_nom.fuzzy", | ||
"field.uid_adresse.fuzzy", | ||
"field.voie_nom.fuzzy", | ||
"field.numero.fuzzy", | ||
"field.suffixe.fuzzy", | ||
"field.position.fuzzy", | ||
"field.long.fuzzy", | ||
"field.lat.fuzzy", | ||
"field.x.fuzzy", | ||
"field.y.fuzzy", | ||
"field.source.fuzzy", | ||
"field.date_der_maj.fuzzy", | ||
'file.encoding.non_standard', | ||
'file.delimiter.non_standard', | ||
'file.linebreak.non_standard' | ||
] | ||
"file.encoding.non_standard", | ||
"file.delimiter.non_standard", | ||
"file.linebreak.non_standard", | ||
]; | ||
const warnings = [ | ||
'position.enum_fuzzy' | ||
] | ||
const warnings = ["position.enum_fuzzy"]; | ||
module.exports = { | ||
code: '1.1-strict', | ||
name: 'BAL 1.1 Strict', | ||
code: "1.1-strict", | ||
name: "BAL 1.1 Strict", | ||
isUsed: false, | ||
relax: false, | ||
errors, | ||
warnings | ||
} | ||
warnings, | ||
format: "1.1", | ||
}; |
const errors = [ | ||
'cle_interop.valeur_manquante', | ||
'cle_interop.casse_invalide', | ||
'cle_interop.structure_invalide', | ||
'cle_interop.commune_invalide', | ||
'cle_interop.voie_invalide', | ||
'cle_interop.voie_non_renseignee', | ||
'cle_interop.numero_invalide', | ||
'cle_interop.numero_prefixe_manquant', | ||
'voie_nom.valeur_manquante', | ||
'voie_nom.caractere_invalide', | ||
'voie_nom_@@.caractere_invalide', | ||
'numero.valeur_manquante', | ||
'numero.contient_prefixe', | ||
'numero.type_invalide', | ||
'suffixe.debut_invalide', | ||
'commune_insee.commune_invalide', | ||
'commune_deleguee_insee.commune_invalide', | ||
'position.valeur_invalide', | ||
'x.valeur_invalide', | ||
'x.separateur_decimal_invalide', | ||
'y.valeur_invalide', | ||
'y.separateur_decimal_invalide', | ||
'long.valeur_invalide', | ||
'long.separateur_decimal_invalide', | ||
'lat.valeur_invalide', | ||
'lat.separateur_decimal_invalide', | ||
'cad_parcelles.valeur_invalide', | ||
'cad_parcelles.pipe_debut_fin', | ||
'source.valeur_manquante', | ||
'date_der_maj.valeur_manquante', | ||
'date_der_maj.date_invalide', | ||
'row.incoherence_numero', | ||
'row.position_manquante', | ||
'row.adresse_incomplete', | ||
"cle_interop.valeur_manquante", | ||
"cle_interop.casse_invalide", | ||
"cle_interop.structure_invalide", | ||
"cle_interop.commune_invalide", | ||
"cle_interop.voie_invalide", | ||
"cle_interop.voie_non_renseignee", | ||
"cle_interop.numero_invalide", | ||
"cle_interop.numero_prefixe_manquant", | ||
"voie_nom.valeur_manquante", | ||
"voie_nom.caractere_invalide", | ||
"voie_nom_@@.caractere_invalide", | ||
"numero.valeur_manquante", | ||
"numero.contient_prefixe", | ||
"numero.type_invalide", | ||
"suffixe.debut_invalide", | ||
"commune_insee.commune_invalide", | ||
"commune_deleguee_insee.commune_invalide", | ||
"position.valeur_invalide", | ||
"x.valeur_invalide", | ||
"x.separateur_decimal_invalide", | ||
"y.valeur_invalide", | ||
"y.separateur_decimal_invalide", | ||
"long.valeur_invalide", | ||
"long.separateur_decimal_invalide", | ||
"lat.valeur_invalide", | ||
"lat.separateur_decimal_invalide", | ||
"cad_parcelles.valeur_invalide", | ||
"cad_parcelles.pipe_debut_fin", | ||
"source.valeur_manquante", | ||
"date_der_maj.valeur_manquante", | ||
"date_der_maj.date_invalide", | ||
"row.incoherence_numero", | ||
"row.position_manquante", | ||
"row.adresse_incomplete", | ||
'field.cle_interop.missing', | ||
'field.commune_insee.missing', | ||
'field.commune_nom.missing', | ||
'field.commune_deleguee_insee.missing', | ||
'field.commune_deleguee_nom.missing', | ||
'field.uid_adresse.missing', | ||
'field.voie_nom.missing', | ||
'field.lieudit_complement_nom.missing', | ||
'field.numero.missing', | ||
'field.suffixe.missing', | ||
'field.position.missing', | ||
'field.long.missing', | ||
'field.lat.missing', | ||
'field.x.missing', | ||
'field.y.missing', | ||
'field.cad_parcelles.missing', | ||
'field.source.missing', | ||
'field.date_der_maj.missing', | ||
"field.cle_interop.missing", | ||
"field.commune_insee.missing", | ||
"field.commune_nom.missing", | ||
"field.commune_deleguee_insee.missing", | ||
"field.commune_deleguee_nom.missing", | ||
"field.uid_adresse.missing", | ||
"field.voie_nom.missing", | ||
"field.lieudit_complement_nom.missing", | ||
"field.numero.missing", | ||
"field.suffixe.missing", | ||
"field.position.missing", | ||
"field.long.missing", | ||
"field.lat.missing", | ||
"field.x.missing", | ||
"field.y.missing", | ||
"field.cad_parcelles.missing", | ||
"field.source.missing", | ||
"field.date_der_maj.missing", | ||
'field.cle_interop.fuzzy', | ||
'field.commune_insee.fuzzy', | ||
'field.commune_nom.fuzzy', | ||
'field.commune_deleguee_insee.fuzzy', | ||
'field.commune_deleguee_nom.fuzzy', | ||
'field.uid_adresse.fuzzy', | ||
'field.voie_nom.fuzzy', | ||
'field.lieudit_complement_nom.fuzzy', | ||
'field.numero.fuzzy', | ||
'field.suffixe.fuzzy', | ||
'field.position.fuzzy', | ||
'field.long.fuzzy', | ||
'field.lat.fuzzy', | ||
'field.x.fuzzy', | ||
'field.y.fuzzy', | ||
'field.cad_parcelles.fuzzy', | ||
'field.source.fuzzy', | ||
'field.date_der_maj.fuzzy', | ||
"field.cle_interop.fuzzy", | ||
"field.commune_insee.fuzzy", | ||
"field.commune_nom.fuzzy", | ||
"field.commune_deleguee_insee.fuzzy", | ||
"field.commune_deleguee_nom.fuzzy", | ||
"field.uid_adresse.fuzzy", | ||
"field.voie_nom.fuzzy", | ||
"field.lieudit_complement_nom.fuzzy", | ||
"field.numero.fuzzy", | ||
"field.suffixe.fuzzy", | ||
"field.position.fuzzy", | ||
"field.long.fuzzy", | ||
"field.lat.fuzzy", | ||
"field.x.fuzzy", | ||
"field.y.fuzzy", | ||
"field.cad_parcelles.fuzzy", | ||
"field.source.fuzzy", | ||
"field.date_der_maj.fuzzy", | ||
'file.encoding.non_standard', | ||
'file.delimiter.non_standard', | ||
'file.linebreak.non_standard' | ||
] | ||
"file.encoding.non_standard", | ||
"file.delimiter.non_standard", | ||
"file.linebreak.non_standard", | ||
]; | ||
const warnings = [ | ||
'position.enum_fuzzy' | ||
] | ||
const warnings = ["position.enum_fuzzy"]; | ||
module.exports = { | ||
code: '1.2-strict', | ||
name: 'BAL 1.2 Strict', | ||
code: "1.2-strict", | ||
name: "BAL 1.2 Strict", | ||
isUsed: false, | ||
relax: false, | ||
errors, | ||
warnings | ||
} | ||
warnings, | ||
format: "1.2", | ||
}; |
const errors = [ | ||
'cle_interop.structure_invalide', | ||
'cle_interop.commune_invalide', | ||
'cle_interop.numero_invalide', | ||
'voie_nom.valeur_manquante', | ||
'voie_nom.trop_court', | ||
'voie_nom.trop_long', | ||
'voie_nom.caractere_invalide', | ||
'numero.valeur_manquante', | ||
'numero.type_invalide', | ||
'numero.trop_grand', | ||
'suffixe.debut_invalide', | ||
'suffixe.trop_long', | ||
'commune_insee.commune_invalide', | ||
'x.valeur_invalide', | ||
'y.valeur_invalide', | ||
'long.valeur_invalide', | ||
'lat.valeur_invalide', | ||
'row.incoherence_numero', | ||
'row.commune_manquante', | ||
'row.longlat_vides', | ||
'row.longlat_invalides', | ||
'row.adresse_incomplete', | ||
'field.voie_nom.missing', | ||
'field.numero.missing', | ||
'rows.empty' | ||
] | ||
"cle_interop.structure_invalide", | ||
"cle_interop.commune_invalide", | ||
"cle_interop.numero_invalide", | ||
"voie_nom.valeur_manquante", | ||
"voie_nom.trop_court", | ||
"voie_nom.trop_long", | ||
"voie_nom.caractere_invalide", | ||
"numero.valeur_manquante", | ||
"numero.type_invalide", | ||
"numero.trop_grand", | ||
"suffixe.debut_invalide", | ||
"suffixe.trop_long", | ||
"commune_insee.commune_invalide", | ||
"x.valeur_invalide", | ||
"y.valeur_invalide", | ||
"long.valeur_invalide", | ||
"lat.valeur_invalide", | ||
"row.incoherence_numero", | ||
"row.commune_manquante", | ||
"row.longlat_vides", | ||
"row.longlat_invalides", | ||
"row.adresse_incomplete", | ||
"field.voie_nom.missing", | ||
"field.numero.missing", | ||
"rows.empty", | ||
]; | ||
const warnings = [ | ||
'cle_interop.valeur_manquante', | ||
'cle_interop.casse_invalide', | ||
'cle_interop.voie_invalide', | ||
'cle_interop.numero_prefixe_manquant', | ||
'cle_interop.commune_ancienne', | ||
'numero.contient_prefixe', | ||
'voie_nom.casse_incorrecte', | ||
'voie_nom.contient_tiret_bas', | ||
'voie_nom_@@.casse_incorrecte', | ||
'voie_nom_@@.contient_tiret_bas', | ||
'voie_nom_@@.trop_court', | ||
'voie_nom_@@.trop_long', | ||
'voie_nom_@@.caractere_invalide', | ||
'commune_insee.commune_ancienne', | ||
'commune_deleguee_insee.commune_invalide', | ||
'commune_deleguee_insee.commune_actuelle_non_deleguee', | ||
'commune_deleguee_insee.commune_ancienne_non_deleguee', | ||
'position.enum_fuzzy', | ||
'position.valeur_invalide', | ||
'x.separateur_decimal_invalide', | ||
'y.separateur_decimal_invalide', | ||
'long.separateur_decimal_invalide', | ||
'lat.separateur_decimal_invalide', | ||
'cad_parcelles.valeur_invalide', | ||
'cad_parcelles.pipe_debut_fin', | ||
'source.valeur_manquante', | ||
'date_der_maj.valeur_manquante', | ||
'date_der_maj.date_invalide', | ||
'date_der_maj.date_ancienne', | ||
'date_der_maj.date_future', | ||
'certification_commune.valeur_invalide', | ||
'row.position_manquante', | ||
'row.chef_lieu_invalide', | ||
'row.longlat_xy_incoherents', | ||
'field.suffixe.missing', | ||
'field.cle_interop.missing', | ||
'field.commune_insee.missing', | ||
'field.position.missing', | ||
'field.long.missing', | ||
'field.lat.missing', | ||
'field.x.missing', | ||
'field.y.missing', | ||
'field.source.missing', | ||
'field.date_der_maj.missing', | ||
'field.certification_commune.missing', | ||
"cle_interop.valeur_manquante", | ||
"cle_interop.casse_invalide", | ||
"cle_interop.voie_invalide", | ||
"cle_interop.numero_prefixe_manquant", | ||
"cle_interop.commune_ancienne", | ||
"numero.contient_prefixe", | ||
"voie_nom.casse_incorrecte", | ||
"voie_nom.contient_tiret_bas", | ||
"voie_nom_@@.casse_incorrecte", | ||
"voie_nom_@@.contient_tiret_bas", | ||
"voie_nom_@@.trop_court", | ||
"voie_nom_@@.trop_long", | ||
"voie_nom_@@.caractere_invalide", | ||
"commune_insee.commune_ancienne", | ||
"commune_deleguee_insee.commune_invalide", | ||
"commune_deleguee_insee.commune_actuelle_non_deleguee", | ||
"commune_deleguee_insee.commune_ancienne_non_deleguee", | ||
"position.enum_fuzzy", | ||
"position.valeur_invalide", | ||
"x.separateur_decimal_invalide", | ||
"y.separateur_decimal_invalide", | ||
"long.separateur_decimal_invalide", | ||
"lat.separateur_decimal_invalide", | ||
"cad_parcelles.valeur_invalide", | ||
"cad_parcelles.pipe_debut_fin", | ||
"source.valeur_manquante", | ||
"date_der_maj.valeur_manquante", | ||
"date_der_maj.date_invalide", | ||
"date_der_maj.date_ancienne", | ||
"date_der_maj.date_future", | ||
"certification_commune.valeur_invalide", | ||
"row.position_manquante", | ||
"row.chef_lieu_invalide", | ||
"row.longlat_xy_incoherents", | ||
"field.suffixe.missing", | ||
"field.cle_interop.missing", | ||
"field.commune_insee.missing", | ||
"field.position.missing", | ||
"field.long.missing", | ||
"field.lat.missing", | ||
"field.x.missing", | ||
"field.y.missing", | ||
"field.source.missing", | ||
"field.date_der_maj.missing", | ||
"field.certification_commune.missing", | ||
'cle_interop.espaces_debut_fin', | ||
'commune_insee.espaces_debut_fin', | ||
'commune_nom.espaces_debut_fin', | ||
'commune_deleguee_insee.espaces_debut_fin', | ||
'commune_deleguee_nom.espaces_debut_fin', | ||
'uid_adresse.espaces_debut_fin', | ||
'voie_nom.espaces_debut_fin', | ||
'voie_nom_@@.espaces_debut_fin', | ||
'lieudit_complement_nom.espaces_debut_fin', | ||
'lieudit_complement_nom_@@.espaces_debut_fin', | ||
'numero.espaces_debut_fin', | ||
'suffixe.espaces_debut_fin', | ||
'position.espaces_debut_fin', | ||
'long.espaces_debut_fin', | ||
'lat.espaces_debut_fin', | ||
'x.espaces_debut_fin', | ||
'y.espaces_debut_fin', | ||
'cad_parcelles.espaces_debut_fin', | ||
'source.espaces_debut_fin', | ||
'date_der_maj.espaces_debut_fin' | ||
] | ||
"cle_interop.espaces_debut_fin", | ||
"commune_insee.espaces_debut_fin", | ||
"commune_nom.espaces_debut_fin", | ||
"commune_deleguee_insee.espaces_debut_fin", | ||
"commune_deleguee_nom.espaces_debut_fin", | ||
"uid_adresse.espaces_debut_fin", | ||
"voie_nom.espaces_debut_fin", | ||
"voie_nom_@@.espaces_debut_fin", | ||
"lieudit_complement_nom.espaces_debut_fin", | ||
"lieudit_complement_nom_@@.espaces_debut_fin", | ||
"numero.espaces_debut_fin", | ||
"suffixe.espaces_debut_fin", | ||
"position.espaces_debut_fin", | ||
"long.espaces_debut_fin", | ||
"lat.espaces_debut_fin", | ||
"x.espaces_debut_fin", | ||
"y.espaces_debut_fin", | ||
"cad_parcelles.espaces_debut_fin", | ||
"source.espaces_debut_fin", | ||
"date_der_maj.espaces_debut_fin", | ||
// ID BAN | ||
"uid_adresse.type_invalide", | ||
"uid_adresse.incoherence_ids_ban", | ||
]; | ||
const infos = [ | ||
'cle_interop.voie_non_renseignee' | ||
] | ||
const infos = ["cle_interop.voie_non_renseignee"]; | ||
module.exports = { | ||
code: '1.3-relax', | ||
name: 'BAL 1.3 Relax', | ||
code: "1.3-relax", | ||
name: "BAL 1.3 Relax", | ||
isUsed: false, | ||
@@ -109,4 +110,4 @@ relax: true, | ||
warnings, | ||
infos | ||
} | ||
infos, | ||
format: "1.3", | ||
}; |
const errors = [ | ||
'cle_interop.valeur_manquante', | ||
'cle_interop.casse_invalide', | ||
'cle_interop.structure_invalide', | ||
'cle_interop.commune_invalide', | ||
'cle_interop.voie_invalide', | ||
'cle_interop.voie_non_renseignee', | ||
'cle_interop.numero_invalide', | ||
'cle_interop.numero_prefixe_manquant', | ||
'voie_nom.valeur_manquante', | ||
'voie_nom.caractere_invalide', | ||
'voie_nom_@@.caractere_invalide', | ||
'numero.valeur_manquante', | ||
'numero.contient_prefixe', | ||
'numero.type_invalide', | ||
'suffixe.debut_invalide', | ||
'commune_insee.commune_invalide', | ||
'commune_deleguee_insee.commune_invalide', | ||
'position.valeur_invalide', | ||
'x.valeur_invalide', | ||
'x.separateur_decimal_invalide', | ||
'y.valeur_invalide', | ||
'y.separateur_decimal_invalide', | ||
'long.valeur_invalide', | ||
'long.separateur_decimal_invalide', | ||
'lat.valeur_invalide', | ||
'lat.separateur_decimal_invalide', | ||
'cad_parcelles.valeur_invalide', | ||
'cad_parcelles.pipe_debut_fin', | ||
'source.valeur_manquante', | ||
'date_der_maj.valeur_manquante', | ||
'date_der_maj.date_invalide', | ||
'certification_commune.valeur_invalide', | ||
'row.incoherence_numero', | ||
'row.position_manquante', | ||
'row.adresse_incomplete', | ||
"cle_interop.valeur_manquante", | ||
"cle_interop.casse_invalide", | ||
"cle_interop.structure_invalide", | ||
"cle_interop.commune_invalide", | ||
"cle_interop.voie_invalide", | ||
"cle_interop.voie_non_renseignee", | ||
"cle_interop.numero_invalide", | ||
"cle_interop.numero_prefixe_manquant", | ||
"voie_nom.valeur_manquante", | ||
"voie_nom.caractere_invalide", | ||
"voie_nom_@@.caractere_invalide", | ||
"numero.valeur_manquante", | ||
"numero.contient_prefixe", | ||
"numero.type_invalide", | ||
"suffixe.debut_invalide", | ||
"commune_insee.commune_invalide", | ||
"commune_deleguee_insee.commune_invalide", | ||
"position.valeur_invalide", | ||
"x.valeur_invalide", | ||
"x.separateur_decimal_invalide", | ||
"y.valeur_invalide", | ||
"y.separateur_decimal_invalide", | ||
"long.valeur_invalide", | ||
"long.separateur_decimal_invalide", | ||
"lat.valeur_invalide", | ||
"lat.separateur_decimal_invalide", | ||
"cad_parcelles.valeur_invalide", | ||
"cad_parcelles.pipe_debut_fin", | ||
"source.valeur_manquante", | ||
"date_der_maj.valeur_manquante", | ||
"date_der_maj.date_invalide", | ||
"certification_commune.valeur_invalide", | ||
"row.incoherence_numero", | ||
"row.position_manquante", | ||
"row.adresse_incomplete", | ||
'field.cle_interop.missing', | ||
'field.commune_insee.missing', | ||
'field.commune_nom.missing', | ||
'field.commune_deleguee_insee.missing', | ||
'field.commune_deleguee_nom.missing', | ||
'field.uid_adresse.missing', | ||
'field.voie_nom.missing', | ||
'field.lieudit_complement_nom.missing', | ||
'field.numero.missing', | ||
'field.suffixe.missing', | ||
'field.position.missing', | ||
'field.long.missing', | ||
'field.lat.missing', | ||
'field.x.missing', | ||
'field.y.missing', | ||
'field.cad_parcelles.missing', | ||
'field.source.missing', | ||
'field.date_der_maj.missing', | ||
'field.certification_commune.missing', | ||
"field.cle_interop.missing", | ||
"field.commune_insee.missing", | ||
"field.commune_nom.missing", | ||
"field.commune_deleguee_insee.missing", | ||
"field.commune_deleguee_nom.missing", | ||
"field.uid_adresse.missing", | ||
"field.voie_nom.missing", | ||
"field.lieudit_complement_nom.missing", | ||
"field.numero.missing", | ||
"field.suffixe.missing", | ||
"field.position.missing", | ||
"field.long.missing", | ||
"field.lat.missing", | ||
"field.x.missing", | ||
"field.y.missing", | ||
"field.cad_parcelles.missing", | ||
"field.source.missing", | ||
"field.date_der_maj.missing", | ||
"field.certification_commune.missing", | ||
'field.cle_interop.fuzzy', | ||
'field.commune_insee.fuzzy', | ||
'field.commune_nom.fuzzy', | ||
'field.commune_deleguee_insee.fuzzy', | ||
'field.commune_deleguee_nom.fuzzy', | ||
'field.uid_adresse.fuzzy', | ||
'field.voie_nom.fuzzy', | ||
'field.lieudit_complement_nom.fuzzy', | ||
'field.numero.fuzzy', | ||
'field.suffixe.fuzzy', | ||
'field.position.fuzzy', | ||
'field.long.fuzzy', | ||
'field.lat.fuzzy', | ||
'field.x.fuzzy', | ||
'field.y.fuzzy', | ||
'field.cad_parcelles.fuzzy', | ||
'field.source.fuzzy', | ||
'field.date_der_maj.fuzzy', | ||
'field.certification_commune.fuzzy', | ||
"field.cle_interop.fuzzy", | ||
"field.commune_insee.fuzzy", | ||
"field.commune_nom.fuzzy", | ||
"field.commune_deleguee_insee.fuzzy", | ||
"field.commune_deleguee_nom.fuzzy", | ||
"field.uid_adresse.fuzzy", | ||
"field.voie_nom.fuzzy", | ||
"field.lieudit_complement_nom.fuzzy", | ||
"field.numero.fuzzy", | ||
"field.suffixe.fuzzy", | ||
"field.position.fuzzy", | ||
"field.long.fuzzy", | ||
"field.lat.fuzzy", | ||
"field.x.fuzzy", | ||
"field.y.fuzzy", | ||
"field.cad_parcelles.fuzzy", | ||
"field.source.fuzzy", | ||
"field.date_der_maj.fuzzy", | ||
"field.certification_commune.fuzzy", | ||
'file.encoding.non_standard', | ||
'file.delimiter.non_standard', | ||
'file.linebreak.non_standard' | ||
] | ||
"file.encoding.non_standard", | ||
"file.delimiter.non_standard", | ||
"file.linebreak.non_standard", | ||
]; | ||
const warnings = [ | ||
'position.enum_fuzzy' | ||
] | ||
const warnings = ["position.enum_fuzzy"]; | ||
module.exports = { | ||
code: '1.3-strict', | ||
name: 'BAL 1.3 Strict', | ||
isUsed: true, | ||
code: "1.3-strict", | ||
name: "BAL 1.3 Strict", | ||
isUsed: false, | ||
relax: false, | ||
errors, | ||
warnings | ||
} | ||
warnings, | ||
format: "1.3", | ||
}; |
@@ -1,112 +0,112 @@ | ||
const errors = [ | ||
'cle_interop.structure_invalide', | ||
'cle_interop.commune_invalide', | ||
'cle_interop.numero_invalide', | ||
'cle_interop.valeur_manquante', | ||
'cle_interop.numero_prefixe_manquant', | ||
'cle_interop.casse_invalide', | ||
'voie_nom.valeur_manquante', | ||
'voie_nom.trop_court', | ||
'voie_nom.trop_long', | ||
'voie_nom.caractere_invalide', | ||
'numero.valeur_manquante', | ||
'numero.type_invalide', | ||
'numero.trop_grand', | ||
'numero.contient_prefixe', | ||
'suffixe.debut_invalide', | ||
'suffixe.trop_long', | ||
'date_der_maj.date_invalide', | ||
'commune_insee.commune_invalide', | ||
'commune_insee.valeur_manquante', | ||
'commune_insee.espaces_debut_fin', | ||
'x.valeur_invalide', | ||
'y.valeur_invalide', | ||
'x.separateur_decimal_invalide', | ||
'y.separateur_decimal_invalide', | ||
'long.valeur_invalide', | ||
'lat.valeur_invalide', | ||
'long.separateur_decimal_invalide', | ||
'lat.separateur_decimal_invalide', | ||
'row.incoherence_numero', | ||
'row.commune_manquante', | ||
'row.longlat_vides', | ||
'row.longlat_invalides', | ||
'row.adresse_incomplete', | ||
'field.commune_insee.missing', | ||
'field.voie_nom.missing', | ||
'field.numero.missing', | ||
'field.commune_nom.long', | ||
'field.commune_nom.lat', | ||
'suffixe.espaces_debut_fin', | ||
'file.encoding.non_standard', | ||
'file.delimiter.non_standard', | ||
'file.linebreak.non_standard', | ||
'rows.empty' | ||
] | ||
"cle_interop.structure_invalide", | ||
"cle_interop.commune_invalide", | ||
"cle_interop.numero_invalide", | ||
"cle_interop.valeur_manquante", | ||
"cle_interop.numero_prefixe_manquant", | ||
"cle_interop.casse_invalide", | ||
"voie_nom.valeur_manquante", | ||
"voie_nom.trop_court", | ||
"voie_nom.trop_long", | ||
"voie_nom.caractere_invalide", | ||
"numero.valeur_manquante", | ||
"numero.type_invalide", | ||
"numero.trop_grand", | ||
"numero.contient_prefixe", | ||
"suffixe.debut_invalide", | ||
"suffixe.trop_long", | ||
"date_der_maj.date_invalide", | ||
"commune_insee.commune_invalide", | ||
"commune_insee.valeur_manquante", | ||
"commune_insee.espaces_debut_fin", | ||
"x.valeur_invalide", | ||
"y.valeur_invalide", | ||
"x.separateur_decimal_invalide", | ||
"y.separateur_decimal_invalide", | ||
"long.valeur_invalide", | ||
"lat.valeur_invalide", | ||
"long.separateur_decimal_invalide", | ||
"lat.separateur_decimal_invalide", | ||
"row.incoherence_numero", | ||
"row.commune_manquante", | ||
"row.longlat_vides", | ||
"row.longlat_invalides", | ||
"row.adresse_incomplete", | ||
"field.commune_insee.missing", | ||
"field.voie_nom.missing", | ||
"field.numero.missing", | ||
"field.commune_nom.long", | ||
"field.commune_nom.lat", | ||
"suffixe.espaces_debut_fin", | ||
"file.encoding.non_standard", | ||
"file.delimiter.non_standard", | ||
"file.linebreak.non_standard", | ||
"rows.empty", | ||
]; | ||
const warnings = [ | ||
'cle_interop.voie_invalide', | ||
'cle_interop.commune_ancienne', | ||
'voie_nom.casse_incorrecte', | ||
'voie_nom.contient_tiret_bas', | ||
'voie_nom_@@.casse_incorrecte', | ||
'voie_nom_@@.contient_tiret_bas', | ||
'voie_nom_@@.trop_court', | ||
'voie_nom_@@.trop_long', | ||
'voie_nom_@@.caractere_invalide', | ||
'commune_insee.commune_ancienne', | ||
'commune_deleguee_insee.commune_invalide', | ||
'commune_deleguee_insee.commune_actuelle_non_deleguee', | ||
'commune_deleguee_insee.commune_ancienne_non_deleguee', | ||
'position.enum_fuzzy', | ||
'position.valeur_invalide', | ||
'cad_parcelles.valeur_invalide', | ||
'cad_parcelles.pipe_debut_fin', | ||
'source.valeur_manquante', | ||
'date_der_maj.valeur_manquante', | ||
'date_der_maj.date_ancienne', | ||
'date_der_maj.date_future', | ||
'certification_commune.valeur_invalide', | ||
'row.position_manquante', | ||
'row.chef_lieu_invalide', | ||
'row.longlat_xy_incoherents', | ||
'field.suffixe.missing', | ||
'field.cle_interop.missing', | ||
'field.position.missing', | ||
'field.long.missing', | ||
'field.lat.missing', | ||
'field.x.missing', | ||
'field.y.missing', | ||
'field.source.missing', | ||
'field.date_der_maj.missing', | ||
'field.certification_commune.missing', | ||
"cle_interop.voie_invalide", | ||
"cle_interop.commune_ancienne", | ||
"voie_nom.casse_incorrecte", | ||
"voie_nom.contient_tiret_bas", | ||
"voie_nom_@@.casse_incorrecte", | ||
"voie_nom_@@.contient_tiret_bas", | ||
"voie_nom_@@.trop_court", | ||
"voie_nom_@@.trop_long", | ||
"voie_nom_@@.caractere_invalide", | ||
"commune_insee.commune_ancienne", | ||
"commune_deleguee_insee.commune_invalide", | ||
"commune_deleguee_insee.commune_actuelle_non_deleguee", | ||
"commune_deleguee_insee.commune_ancienne_non_deleguee", | ||
"position.enum_fuzzy", | ||
"position.valeur_invalide", | ||
"cad_parcelles.valeur_invalide", | ||
"cad_parcelles.pipe_debut_fin", | ||
"source.valeur_manquante", | ||
"date_der_maj.valeur_manquante", | ||
"date_der_maj.date_ancienne", | ||
"date_der_maj.date_future", | ||
"certification_commune.valeur_invalide", | ||
"row.position_manquante", | ||
"row.chef_lieu_invalide", | ||
"row.longlat_xy_incoherents", | ||
"field.suffixe.missing", | ||
"field.cle_interop.missing", | ||
"field.position.missing", | ||
"field.long.missing", | ||
"field.lat.missing", | ||
"field.x.missing", | ||
"field.y.missing", | ||
"field.source.missing", | ||
"field.date_der_maj.missing", | ||
"field.certification_commune.missing", | ||
'cle_interop.espaces_debut_fin', | ||
'commune_nom.espaces_debut_fin', | ||
'commune_deleguee_insee.espaces_debut_fin', | ||
'commune_deleguee_nom.espaces_debut_fin', | ||
'uid_adresse.espaces_debut_fin', | ||
'voie_nom.espaces_debut_fin', | ||
'voie_nom_@@.espaces_debut_fin', | ||
'lieudit_complement_nom.espaces_debut_fin', | ||
'lieudit_complement_nom_@@.espaces_debut_fin', | ||
'numero.espaces_debut_fin', | ||
'position.espaces_debut_fin', | ||
'long.espaces_debut_fin', | ||
'lat.espaces_debut_fin', | ||
'x.espaces_debut_fin', | ||
'y.espaces_debut_fin', | ||
'cad_parcelles.espaces_debut_fin', | ||
'source.espaces_debut_fin', | ||
'date_der_maj.espaces_debut_fin' | ||
] | ||
"cle_interop.espaces_debut_fin", | ||
"commune_nom.espaces_debut_fin", | ||
"commune_deleguee_insee.espaces_debut_fin", | ||
"commune_deleguee_nom.espaces_debut_fin", | ||
"uid_adresse.espaces_debut_fin", | ||
"voie_nom.espaces_debut_fin", | ||
"voie_nom_@@.espaces_debut_fin", | ||
"lieudit_complement_nom.espaces_debut_fin", | ||
"lieudit_complement_nom_@@.espaces_debut_fin", | ||
"numero.espaces_debut_fin", | ||
"position.espaces_debut_fin", | ||
"long.espaces_debut_fin", | ||
"lat.espaces_debut_fin", | ||
"x.espaces_debut_fin", | ||
"y.espaces_debut_fin", | ||
"cad_parcelles.espaces_debut_fin", | ||
"source.espaces_debut_fin", | ||
"date_der_maj.espaces_debut_fin", | ||
// ID BAN | ||
"uid_adresse.type_invalide", | ||
"uid_adresse.incoherence_ids_ban", | ||
]; | ||
const infos = [ | ||
'cle_interop.voie_non_renseignee' | ||
] | ||
const infos = ["cle_interop.voie_non_renseignee"]; | ||
module.exports = { | ||
code: '1.3', | ||
name: 'BAL 1.3 (défaut)', | ||
code: "1.3", | ||
name: "BAL 1.3 (défaut)", | ||
isUsed: true, | ||
@@ -116,4 +116,4 @@ relax: false, | ||
warnings, | ||
infos | ||
} | ||
infos, | ||
format: "1.3", | ||
}; |
const errors = [ | ||
'cle_interop.structure_invalide', | ||
'cle_interop.commune_invalide', | ||
'cle_interop.numero_invalide', | ||
'voie_nom.valeur_manquante', | ||
'voie_nom.trop_court', | ||
'voie_nom.trop_long', | ||
'voie_nom.caractere_invalide', | ||
'numero.valeur_manquante', | ||
'numero.type_invalide', | ||
'numero.trop_grand', | ||
'suffixe.debut_invalide', | ||
'suffixe.trop_long', | ||
'commune_insee.commune_invalide', | ||
'x.valeur_invalide', | ||
'y.valeur_invalide', | ||
'long.valeur_invalide', | ||
'lat.valeur_invalide', | ||
'row.incoherence_numero', | ||
'row.commune_manquante', | ||
'row.longlat_vides', | ||
'row.longlat_invalides', | ||
'row.adresse_incomplete', | ||
'field.voie_nom.missing', | ||
'field.numero.missing', | ||
'rows.empty' | ||
] | ||
"cle_interop.structure_invalide", | ||
"cle_interop.commune_invalide", | ||
"cle_interop.numero_invalide", | ||
"cle_interop.valeur_manquante", | ||
"cle_interop.numero_prefixe_manquant", | ||
"cle_interop.casse_invalide", | ||
"voie_nom.valeur_manquante", | ||
"voie_nom.trop_court", | ||
"voie_nom.trop_long", | ||
"voie_nom.caractere_invalide", | ||
"numero.valeur_manquante", | ||
"numero.type_invalide", | ||
"numero.trop_grand", | ||
"numero.contient_prefixe", | ||
"suffixe.debut_invalide", | ||
"suffixe.trop_long", | ||
"date_der_maj.date_invalide", | ||
"commune_insee.commune_invalide", | ||
"commune_insee.valeur_manquante", | ||
"commune_insee.espaces_debut_fin", | ||
"x.valeur_invalide", | ||
"y.valeur_invalide", | ||
"x.separateur_decimal_invalide", | ||
"y.separateur_decimal_invalide", | ||
"long.valeur_invalide", | ||
"lat.valeur_invalide", | ||
"long.separateur_decimal_invalide", | ||
"lat.separateur_decimal_invalide", | ||
"row.incoherence_numero", | ||
"row.commune_manquante", | ||
"row.longlat_vides", | ||
"row.longlat_invalides", | ||
"row.adresse_incomplete", | ||
"field.commune_insee.missing", | ||
"field.voie_nom.missing", | ||
"field.numero.missing", | ||
"field.commune_nom.long", | ||
"field.commune_nom.lat", | ||
"suffixe.espaces_debut_fin", | ||
"file.encoding.non_standard", | ||
"file.delimiter.non_standard", | ||
"file.linebreak.non_standard", | ||
"rows.empty", | ||
"id_ban_commune.type_invalide", | ||
"id_ban_toponyme.type_invalide", | ||
"id_ban_adresse.type_invalide", | ||
"row.incoherence_ids_ban", | ||
"row.id_ban_adresses_required", | ||
"rows.ids_required_every", | ||
]; | ||
const warnings = [ | ||
'cle_interop.valeur_manquante', | ||
'cle_interop.casse_invalide', | ||
'cle_interop.voie_invalide', | ||
'cle_interop.numero_prefixe_manquant', | ||
'cle_interop.commune_ancienne', | ||
'numero.contient_prefixe', | ||
'voie_nom.casse_incorrecte', | ||
'voie_nom.contient_tiret_bas', | ||
'voie_nom_@@.casse_incorrecte', | ||
'voie_nom_@@.contient_tiret_bas', | ||
'voie_nom_@@.trop_court', | ||
'voie_nom_@@.trop_long', | ||
'voie_nom_@@.caractere_invalide', | ||
'commune_insee.commune_ancienne', | ||
'commune_deleguee_insee.commune_invalide', | ||
'commune_deleguee_insee.commune_actuelle_non_deleguee', | ||
'commune_deleguee_insee.commune_ancienne_non_deleguee', | ||
'position.enum_fuzzy', | ||
'position.valeur_invalide', | ||
'x.separateur_decimal_invalide', | ||
'y.separateur_decimal_invalide', | ||
'long.separateur_decimal_invalide', | ||
'lat.separateur_decimal_invalide', | ||
'cad_parcelles.valeur_invalide', | ||
'cad_parcelles.pipe_debut_fin', | ||
'source.valeur_manquante', | ||
'date_der_maj.valeur_manquante', | ||
'date_der_maj.date_invalide', | ||
'date_der_maj.date_ancienne', | ||
'date_der_maj.date_future', | ||
'certification_commune.valeur_invalide', | ||
'row.position_manquante', | ||
'row.chef_lieu_invalide', | ||
'row.longlat_xy_incoherents', | ||
'field.suffixe.missing', | ||
'field.cle_interop.missing', | ||
'field.commune_insee.missing', | ||
'field.position.missing', | ||
'field.long.missing', | ||
'field.lat.missing', | ||
'field.x.missing', | ||
'field.y.missing', | ||
'field.source.missing', | ||
'field.date_der_maj.missing', | ||
'field.certification_commune.missing', | ||
"cle_interop.voie_invalide", | ||
"cle_interop.commune_ancienne", | ||
"voie_nom.casse_incorrecte", | ||
"voie_nom.contient_tiret_bas", | ||
"voie_nom_@@.casse_incorrecte", | ||
"voie_nom_@@.contient_tiret_bas", | ||
"voie_nom_@@.trop_court", | ||
"voie_nom_@@.trop_long", | ||
"voie_nom_@@.caractere_invalide", | ||
"commune_insee.commune_ancienne", | ||
"commune_deleguee_insee.commune_invalide", | ||
"commune_deleguee_insee.commune_actuelle_non_deleguee", | ||
"commune_deleguee_insee.commune_ancienne_non_deleguee", | ||
"position.enum_fuzzy", | ||
"position.valeur_invalide", | ||
"cad_parcelles.valeur_invalide", | ||
"cad_parcelles.pipe_debut_fin", | ||
"source.valeur_manquante", | ||
"date_der_maj.valeur_manquante", | ||
"date_der_maj.date_ancienne", | ||
"date_der_maj.date_future", | ||
"certification_commune.valeur_invalide", | ||
"row.position_manquante", | ||
"row.chef_lieu_invalide", | ||
"row.longlat_xy_incoherents", | ||
"field.suffixe.missing", | ||
"field.cle_interop.missing", | ||
"field.position.missing", | ||
"field.long.missing", | ||
"field.lat.missing", | ||
"field.x.missing", | ||
"field.y.missing", | ||
"field.source.missing", | ||
"field.date_der_maj.missing", | ||
"field.certification_commune.missing", | ||
'cle_interop.espaces_debut_fin', | ||
'commune_insee.espaces_debut_fin', | ||
'commune_nom.espaces_debut_fin', | ||
'commune_deleguee_insee.espaces_debut_fin', | ||
'commune_deleguee_nom.espaces_debut_fin', | ||
'uid_adresse.espaces_debut_fin', | ||
'voie_nom.espaces_debut_fin', | ||
'voie_nom_@@.espaces_debut_fin', | ||
'lieudit_complement_nom.espaces_debut_fin', | ||
'lieudit_complement_nom_@@.espaces_debut_fin', | ||
'numero.espaces_debut_fin', | ||
'suffixe.espaces_debut_fin', | ||
'position.espaces_debut_fin', | ||
'long.espaces_debut_fin', | ||
'lat.espaces_debut_fin', | ||
'x.espaces_debut_fin', | ||
'y.espaces_debut_fin', | ||
'cad_parcelles.espaces_debut_fin', | ||
'source.espaces_debut_fin', | ||
'date_der_maj.espaces_debut_fin', | ||
"cle_interop.espaces_debut_fin", | ||
"commune_nom.espaces_debut_fin", | ||
"commune_deleguee_insee.espaces_debut_fin", | ||
"commune_deleguee_nom.espaces_debut_fin", | ||
"uid_adresse.espaces_debut_fin", | ||
"voie_nom.espaces_debut_fin", | ||
"voie_nom_@@.espaces_debut_fin", | ||
"lieudit_complement_nom.espaces_debut_fin", | ||
"lieudit_complement_nom_@@.espaces_debut_fin", | ||
"numero.espaces_debut_fin", | ||
"position.espaces_debut_fin", | ||
"long.espaces_debut_fin", | ||
"lat.espaces_debut_fin", | ||
"x.espaces_debut_fin", | ||
"y.espaces_debut_fin", | ||
"cad_parcelles.espaces_debut_fin", | ||
"source.espaces_debut_fin", | ||
"date_der_maj.espaces_debut_fin", | ||
// ID BAN | ||
'field.id_ban_commune.missing', | ||
'field.id_ban_toponyme.missing', | ||
'field.id_ban_adresse.missing', | ||
'id_ban_commune.type_invalide', | ||
'id_ban_toponyme.type_invalide', | ||
'id_ban_adresse.type_invalide', | ||
'row.incoherence_ids_ban', | ||
'row.id_ban_adresses_required', | ||
'rows.ids_required_every' | ||
] | ||
"field.id_ban_commune.missing", | ||
"field.id_ban_toponyme.missing", | ||
"field.id_ban_adresse.missing", | ||
"uid_adresse.type_invalide", | ||
"uid_adresse.incoherence_ids_ban", | ||
]; | ||
const infos = [ | ||
'cle_interop.voie_non_renseignee' | ||
] | ||
const infos = ["cle_interop.voie_non_renseignee"]; | ||
module.exports = { | ||
code: '1.4', | ||
name: 'BAL 1.4 (beta)', | ||
isUsed: false, | ||
relax: true, | ||
code: "1.4", | ||
name: "BAL 1.4 (beta)", | ||
isUsed: true, | ||
relax: false, | ||
errors, | ||
warnings, | ||
infos | ||
} | ||
infos, | ||
format: "1.4", | ||
}; |
const profiles = { | ||
1.4: require('./1.4'), | ||
'1.4-strict': require('./1.4-strict'), | ||
1.3: require('./1.3'), | ||
'1.3-relax': require('./1.3-relax'), | ||
'1.3-strict': require('./1.3-strict'), | ||
'1.2-strict': require('./1.2-strict'), | ||
'1.1-strict': require('./1.1-strict') | ||
} | ||
1.4: require("./1.4"), | ||
"1.4-relax": require("./1.4-relax"), | ||
1.3: require("./1.3"), | ||
"1.3-relax": require("./1.3-relax"), | ||
"1.3-strict": require("./1.3-strict"), | ||
"1.2-strict": require("./1.2-strict"), | ||
"1.1-strict": require("./1.1-strict"), | ||
}; | ||
module.exports = profiles | ||
module.exports = profiles; |
@@ -1,205 +0,252 @@ | ||
const {join} = require('path') | ||
const fs = require('fs') | ||
const {promisify} = require('util') | ||
const test = require('ava') | ||
const { join } = require("path"); | ||
const fs = require("fs"); | ||
const { promisify } = require("util"); | ||
const test = require("ava"); | ||
const {validate} = require('../../index') | ||
const { validate } = require("../../index"); | ||
const readFile = promisify(fs.readFile) | ||
const readFile = promisify(fs.readFile); | ||
function readAsBuffer(relativePath) { | ||
const absolutePath = join(__dirname, 'data', relativePath) | ||
return readFile(absolutePath) | ||
const absolutePath = join(__dirname, "data", relativePath); | ||
return readFile(absolutePath); | ||
} | ||
test('Valid file 1.3', async t => { | ||
const buffer = await readAsBuffer('1.3-valid.csv') | ||
const report = await validate(buffer, {profile: '1.3'}) | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, true) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
}) | ||
test("Valid file 1.3", async (t) => { | ||
const buffer = await readAsBuffer("1.3-valid.csv"); | ||
const report = await validate(buffer, { profile: "1.3" }); | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, true); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
}); | ||
test('Valid file 1.4', async t => { | ||
const buffer = await readAsBuffer('1.4-valid.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, true) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
}) | ||
test("Valid file 1.4", async (t) => { | ||
const buffer = await readAsBuffer("1.4-valid.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, true); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
}); | ||
test('Valid file 1.4 with relaxFieldsDetection', async t => { | ||
const buffer = await readAsBuffer('1.4-valid-relax.csv') | ||
const report = await validate(buffer, {relaxFieldsDetection: true}) | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, true) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
}) | ||
test("Valid file 1.4 with relaxFieldsDetection", async (t) => { | ||
const buffer = await readAsBuffer("1.4-valid-relax.csv"); | ||
const report = await validate(buffer, { relaxFieldsDetection: true }); | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, true); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
}); | ||
test('Valid file 1.4 with profile relax', async t => { | ||
const buffer = await readAsBuffer('1.4-valid-relax.csv') | ||
const report = await validate(buffer, {profile: '1.4'}) | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, true) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
}) | ||
test("Valid file 1.4 with profile relax", async (t) => { | ||
const buffer = await readAsBuffer("1.4-valid-relax.csv"); | ||
const report = await validate(buffer, { | ||
profile: "1.4-relax", | ||
relaxFieldsDetection: true, | ||
}); | ||
test('Error file 1.4 without relaxFieldsDetection', async t => { | ||
const buffer = await readAsBuffer('1.4-valid-relax.csv') | ||
const report = await validate(buffer, {profile: '1.4', relaxFieldsDetection: false}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, true); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, false) | ||
}) | ||
test("Error file 1.4 without relaxFieldsDetection", async (t) => { | ||
const buffer = await readAsBuffer("1.4-valid-relax.csv"); | ||
const report = await validate(buffer, { | ||
profile: "1.4-relax", | ||
relaxFieldsDetection: false, | ||
}); | ||
test('Error file 1.4 with profile 1.4', async t => { | ||
const buffer = await readAsBuffer('1.4-valid-relax.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, false); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, false) | ||
}) | ||
test("Error file 1.4 with profile 1.4", async (t) => { | ||
const buffer = await readAsBuffer("1.4-valid-relax.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
test('Error bad id ban adresses (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-bad-id-ban-adresse.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, false); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Error bad id ban adresses (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-bad-id-ban-adresse.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
const error = report.profilErrors.filter(e => e.code === 'id_ban_adresse.type_invalide') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'E') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('Error bad id ban commune (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-bad-id-ban-commune.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "id_ban_adresse.type_invalide" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "E"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Error bad id ban commune (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-bad-id-ban-commune.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
const error = report.profilErrors.filter(e => e.code === 'id_ban_commune.type_invalide') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'E') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('Error bad id ban toponyme a (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-bad-id-ban-toponyme.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "id_ban_commune.type_invalide" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "E"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Error bad id ban toponyme a (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-bad-id-ban-toponyme.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
const error = report.profilErrors.filter(e => e.code === 'id_ban_toponyme.type_invalide') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'E') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('Error incoherent ban id (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-incoherent-id-ban.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "id_ban_toponyme.type_invalide" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "E"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Error incoherent ban id (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-incoherent-id-ban.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
const error = report.profilErrors.filter(e => e.code === 'row.incoherence_ids_ban') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'E') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('Good incoherent dependance ban id (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-good-dependance-id-ban.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "row.incoherence_ids_ban" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "E"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, true) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
}) | ||
test("Good incoherent dependance ban id (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-good-dependance-id-ban.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
test('Error incoherent dependance ban id (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-bad-dependance-id-ban.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, true); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Error incoherent dependance ban id (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-bad-dependance-id-ban.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
const error = report.profilErrors.filter(e => e.code === 'row.incoherence_ids_ban') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'E') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('Warning id_ban_adresses_required (file 1.4) with profile relax', async t => { | ||
const buffer = await readAsBuffer('1.4-without-ban-adresse.csv') | ||
const report = await validate(buffer, {profile: '1.4'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "row.incoherence_ids_ban" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "E"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Warning id_ban_adresses_required (file 1.4) with profile relax", async (t) => { | ||
const buffer = await readAsBuffer("1.4-without-ban-adresse.csv"); | ||
const report = await validate(buffer, { profile: "1.4-relax" }); | ||
const error = report.profilErrors.filter(e => e.code === 'row.id_ban_adresses_required') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'W') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('ERROR id_ban_adresses_required (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-without-ban-adresse.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "row.id_ban_adresses_required" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "W"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("ERROR id_ban_adresses_required (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-without-ban-adresse.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
const error = report.profilErrors.filter(e => e.code === 'row.id_ban_adresses_required') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'E') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('Warning rows.ids_required_every (file 1.4) with profile relax', async t => { | ||
const buffer = await readAsBuffer('1.4-no-ids-ban-every.csv') | ||
const report = await validate(buffer, {profile: '1.4'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "row.id_ban_adresses_required" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "E"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Warning rows.ids_required_every (file 1.4) with profile relax", async (t) => { | ||
const buffer = await readAsBuffer("1.4-no-ids-ban-every.csv"); | ||
const report = await validate(buffer, { profile: "1.4-relax" }); | ||
const error = report.profilErrors.filter(e => e.code === 'rows.ids_required_every') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'W') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
test('Warning rows.ids_required_every (file 1.4)', async t => { | ||
const buffer = await readAsBuffer('1.4-no-ids-ban-every.csv') | ||
const report = await validate(buffer, {profile: '1.4-strict'}) | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "rows.ids_required_every" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "W"); | ||
}); | ||
t.is(report.encoding, 'utf-8') | ||
t.is(report.parseOk, true) | ||
t.is(report.profilesValidation['1.4-strict'].isValid, false) | ||
t.is(report.profilesValidation[1.4].isValid, true) | ||
test("Warning rows.ids_required_every (file 1.4)", async (t) => { | ||
const buffer = await readAsBuffer("1.4-no-ids-ban-every.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
const error = report.profilErrors.filter(e => e.code === 'rows.ids_required_every') | ||
t.is(error.length, 1) | ||
t.is(error[0].level, 'E') | ||
}) | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, false); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
const error = report.profilErrors.filter( | ||
(e) => e.code === "rows.ids_required_every" | ||
); | ||
t.is(error.length, 1); | ||
t.is(error[0].level, "E"); | ||
}); | ||
test("Read uid_adresse", async (t) => { | ||
const buffer = await readAsBuffer("1.3-valid-uid_adresse.csv"); | ||
const report = await validate(buffer, { profile: "1.4" }); | ||
console.log(); | ||
t.is(report.encoding, "utf-8"); | ||
t.is(report.parseOk, true); | ||
t.is(report.profilesValidation["1.4"].isValid, true); | ||
t.is(report.profilesValidation["1.4-relax"].isValid, true); | ||
t.is( | ||
report.rows[0].additionalValues.uid_adresse.idBanCommune, | ||
"0246e48c-f33d-433a-8984-034219be842e" | ||
); | ||
t.is( | ||
report.rows[0].additionalValues.uid_adresse.idBanToponyme, | ||
"8a3bab10-f329-4ce3-9c7d-280d91a8053a" | ||
); | ||
t.is( | ||
report.rows[0].additionalValues.uid_adresse.idBanAdresse, | ||
"3c87abe4-887b-46ee-9192-5c1b35a06625" | ||
); | ||
}); |
/* eslint camelcase: off */ | ||
const {join} = require('path') | ||
const fs = require('fs') | ||
const {promisify} = require('util') | ||
const test = require('ava') | ||
const { join } = require("path"); | ||
const fs = require("fs"); | ||
const { promisify } = require("util"); | ||
const test = require("ava"); | ||
const {validate} = require('..') | ||
const { validate } = require(".."); | ||
const readFile = promisify(fs.readFile) | ||
const readFile = promisify(fs.readFile); | ||
function readAsBuffer(relativePath) { | ||
const absolutePath = join(__dirname, 'data', relativePath) | ||
return readFile(absolutePath) | ||
const absolutePath = join(__dirname, "data", relativePath); | ||
return readFile(absolutePath); | ||
} | ||
test('validate a file', async t => { | ||
const buffer = await readAsBuffer('sample.csv') | ||
const report = await validate(buffer) | ||
t.is(report.encoding, 'utf-8') | ||
}) | ||
test("validate a file", async (t) => { | ||
const buffer = await readAsBuffer("sample.csv"); | ||
const report = await validate(buffer); | ||
t.is(report.encoding, "utf-8"); | ||
}); | ||
test('validate a file with aliases / relaxFieldsDetection true', async t => { | ||
const buffer = await readAsBuffer('aliases.csv') | ||
const {fields, notFoundFields} = await validate(buffer, {relaxFieldsDetection: true}) | ||
test("validate a file with aliases / relaxFieldsDetection true", async (t) => { | ||
const buffer = await readAsBuffer("aliases.csv"); | ||
const { fields, notFoundFields } = await validate(buffer, { | ||
relaxFieldsDetection: true, | ||
}); | ||
const aliasedFields = { | ||
cle_interop: 'cle_intero', | ||
commune_nom: 'commune_no', | ||
commune_insee: 'commune_in', | ||
date_der_maj: 'date_der_m', | ||
lat: 'lat_wgs84', | ||
long: 'long_wgs84', | ||
uid_adresse: 'uid_adress', | ||
x: 'x_l93', | ||
y: 'y_l93' | ||
} | ||
cle_interop: "cle_intero", | ||
commune_nom: "commune_no", | ||
commune_insee: "commune_in", | ||
date_der_maj: "date_der_m", | ||
lat: "lat_wgs84", | ||
long: "long_wgs84", | ||
uid_adresse: "uid_adress", | ||
x: "x_l93", | ||
y: "y_l93", | ||
}; | ||
for (const schemaName of Object.keys(aliasedFields)) { | ||
const originalName = aliasedFields[schemaName] | ||
t.truthy(fields.find(f => f.name === originalName && f.schemaName === schemaName)) | ||
const originalName = aliasedFields[schemaName]; | ||
t.truthy( | ||
fields.find((f) => f.name === originalName && f.schemaName === schemaName) | ||
); | ||
} | ||
for (const field of [ | ||
'cle_interop', | ||
'uid_adresse', | ||
'voie_nom', | ||
'numero', | ||
'suffixe', | ||
'commune_nom', | ||
'position', | ||
'x', | ||
'y', | ||
'long', | ||
'lat', | ||
'source', | ||
'date_der_maj' | ||
"cle_interop", | ||
"uid_adresse", | ||
"voie_nom", | ||
"numero", | ||
"suffixe", | ||
"commune_nom", | ||
"position", | ||
"x", | ||
"y", | ||
"long", | ||
"lat", | ||
"source", | ||
"date_der_maj", | ||
]) { | ||
t.true(fields.some(f => f.schemaName === field)) | ||
t.true(fields.some((f) => f.schemaName === field)); | ||
} | ||
t.true(notFoundFields.length === 8) | ||
t.true(notFoundFields.length === 5); | ||
for (const field of [ | ||
'lieudit_complement_nom', | ||
'commune_deleguee_insee', | ||
'commune_deleguee_nom', | ||
'cad_parcelles' | ||
"lieudit_complement_nom", | ||
"commune_deleguee_insee", | ||
"commune_deleguee_nom", | ||
"cad_parcelles", | ||
]) { | ||
t.true(notFoundFields.some(f => f.schemaName === field)) | ||
t.true(notFoundFields.some((f) => f.schemaName === field)); | ||
} | ||
// Unknown fields | ||
t.true(fields.filter(f => !f.schemaName).length === 0) | ||
}) | ||
t.true(fields.filter((f) => !f.schemaName).length === 0); | ||
}); | ||
test('validate a file with aliases with 1.3-relax', async t => { | ||
const buffer = await readAsBuffer('aliases.csv') | ||
const {fields, notFoundFields} = await validate(buffer, {profile: '1.3-relax'}) | ||
test("validate a file with aliases with 1.3-relax", async (t) => { | ||
const buffer = await readAsBuffer("aliases.csv"); | ||
const { fields, notFoundFields } = await validate(buffer, { | ||
profile: "1.3-relax", | ||
}); | ||
const aliasedFields = { | ||
cle_interop: 'cle_intero', | ||
commune_nom: 'commune_no', | ||
commune_insee: 'commune_in', | ||
date_der_maj: 'date_der_m', | ||
lat: 'lat_wgs84', | ||
long: 'long_wgs84', | ||
uid_adresse: 'uid_adress', | ||
x: 'x_l93', | ||
y: 'y_l93' | ||
} | ||
cle_interop: "cle_intero", | ||
commune_nom: "commune_no", | ||
commune_insee: "commune_in", | ||
date_der_maj: "date_der_m", | ||
lat: "lat_wgs84", | ||
long: "long_wgs84", | ||
uid_adresse: "uid_adress", | ||
x: "x_l93", | ||
y: "y_l93", | ||
}; | ||
for (const schemaName of Object.keys(aliasedFields)) { | ||
const originalName = aliasedFields[schemaName] | ||
t.truthy(fields.find(f => f.name === originalName && f.schemaName === schemaName)) | ||
const originalName = aliasedFields[schemaName]; | ||
t.truthy( | ||
fields.find((f) => f.name === originalName && f.schemaName === schemaName) | ||
); | ||
} | ||
for (const field of [ | ||
'cle_interop', | ||
'uid_adresse', | ||
'voie_nom', | ||
'numero', | ||
'suffixe', | ||
'commune_nom', | ||
'position', | ||
'x', | ||
'y', | ||
'long', | ||
'lat', | ||
'source', | ||
'date_der_maj' | ||
"cle_interop", | ||
"uid_adresse", | ||
"voie_nom", | ||
"numero", | ||
"suffixe", | ||
"commune_nom", | ||
"position", | ||
"x", | ||
"y", | ||
"long", | ||
"lat", | ||
"source", | ||
"date_der_maj", | ||
]) { | ||
t.true(fields.some(f => f.schemaName === field)) | ||
t.true(fields.some((f) => f.schemaName === field)); | ||
} | ||
t.true(notFoundFields.length === 8) | ||
t.true(notFoundFields.length === 5); | ||
for (const field of [ | ||
'lieudit_complement_nom', | ||
'commune_deleguee_insee', | ||
'commune_deleguee_nom', | ||
'cad_parcelles' | ||
"lieudit_complement_nom", | ||
"commune_deleguee_insee", | ||
"commune_deleguee_nom", | ||
"cad_parcelles", | ||
]) { | ||
t.true(notFoundFields.some(f => f.schemaName === field)) | ||
t.true(notFoundFields.some((f) => f.schemaName === field)); | ||
} | ||
// Unknown fields | ||
t.true(fields.filter(f => !f.schemaName).length === 0) | ||
}) | ||
t.true(fields.filter((f) => !f.schemaName).length === 0); | ||
}); | ||
test('validate a file with aliases / profile relax and relaxFieldsDetection false', async t => { | ||
const buffer = await readAsBuffer('aliases.csv') | ||
const {fields, notFoundFields} = await validate(buffer, {profile: '1.3-relax', relaxFieldsDetection: false}) | ||
test("validate a file with aliases / profile relax and relaxFieldsDetection false", async (t) => { | ||
const buffer = await readAsBuffer("aliases.csv"); | ||
const { fields, notFoundFields } = await validate(buffer, { | ||
profile: "1.3-relax", | ||
relaxFieldsDetection: false, | ||
}); | ||
const unknownFields = fields.filter(f => !f.schemaName) | ||
const knownFields = fields.filter(f => f.schemaName) | ||
const aliasedFields = knownFields.filter(f => f.name !== f.schemaName) | ||
const unknownFields = fields.filter((f) => !f.schemaName); | ||
const knownFields = fields.filter((f) => f.schemaName); | ||
const aliasedFields = knownFields.filter((f) => f.name !== f.schemaName); | ||
for (const field of [ | ||
'voie_nom', | ||
'numero', | ||
'suffixe', | ||
'position', | ||
'source' | ||
]) { | ||
t.truthy(knownFields.find(f => f.schemaName === field)) | ||
for (const field of ["voie_nom", "numero", "suffixe", "position", "source"]) { | ||
t.truthy(knownFields.find((f) => f.schemaName === field)); | ||
} | ||
t.is(aliasedFields.length, 0) | ||
t.is(knownFields.length, 5) | ||
t.is(notFoundFields.length, 17) | ||
t.is(unknownFields.length, 9) | ||
}) | ||
t.is(aliasedFields.length, 0); | ||
t.is(knownFields.length, 5); | ||
t.is(notFoundFields.length, 14); | ||
t.is(unknownFields.length, 9); | ||
}); | ||
test('validate a file with aliases / relaxFieldsDetection false', async t => { | ||
const buffer = await readAsBuffer('aliases.csv') | ||
const {fields, notFoundFields} = await validate(buffer, {relaxFieldsDetection: false}) | ||
test("validate a file with aliases / relaxFieldsDetection false", async (t) => { | ||
const buffer = await readAsBuffer("aliases.csv"); | ||
const { fields, notFoundFields } = await validate(buffer, { | ||
relaxFieldsDetection: false, | ||
}); | ||
const unknownFields = fields.filter(f => !f.schemaName) | ||
const knownFields = fields.filter(f => f.schemaName) | ||
const aliasedFields = knownFields.filter(f => f.name !== f.schemaName) | ||
const unknownFields = fields.filter((f) => !f.schemaName); | ||
const knownFields = fields.filter((f) => f.schemaName); | ||
const aliasedFields = knownFields.filter((f) => f.name !== f.schemaName); | ||
for (const field of [ | ||
'voie_nom', | ||
'numero', | ||
'suffixe', | ||
'position', | ||
'source' | ||
]) { | ||
t.truthy(knownFields.find(f => f.schemaName === field)) | ||
for (const field of ["voie_nom", "numero", "suffixe", "position", "source"]) { | ||
t.truthy(knownFields.find((f) => f.schemaName === field)); | ||
} | ||
t.is(aliasedFields.length, 0) | ||
t.is(knownFields.length, 5) | ||
t.is(notFoundFields.length, 17) | ||
t.is(unknownFields.length, 9) | ||
}) | ||
t.is(aliasedFields.length, 0); | ||
t.is(knownFields.length, 5); | ||
t.is(notFoundFields.length, 14); | ||
t.is(unknownFields.length, 9); | ||
}); | ||
test('validate a binary file', async t => { | ||
const buffer = await readAsBuffer('troll.png') | ||
await t.throwsAsync(() => validate(buffer), {message: 'Non-text file cannot be processed'}) | ||
}) | ||
test("validate a binary file", async (t) => { | ||
const buffer = await readAsBuffer("troll.png"); | ||
await t.throwsAsync(() => validate(buffer), { | ||
message: "Non-text file cannot be processed", | ||
}); | ||
}); | ||
test('validate an arbitrary CSV file', async t => { | ||
const buffer = await readAsBuffer('junk.ascii.csv') | ||
const {notFoundFields} = await validate(buffer) | ||
t.is(notFoundFields.length, 22) | ||
}) | ||
test("validate an arbitrary CSV file", async (t) => { | ||
const buffer = await readAsBuffer("junk.ascii.csv"); | ||
const { notFoundFields } = await validate(buffer); | ||
t.is(notFoundFields.length, 19); | ||
}); | ||
test('validation avec locales', async t => { | ||
const buffer = await readAsBuffer('locales.csv') | ||
const {fields, rows, uniqueErrors} = await validate(buffer) | ||
t.true(uniqueErrors.includes('voie_nom_eus.trop_court')) | ||
t.true(rows[0].errors.some(e => e.code === 'voie_nom_eus.trop_court')) | ||
test("validation avec locales", async (t) => { | ||
const buffer = await readAsBuffer("locales.csv"); | ||
const { fields, rows, uniqueErrors } = await validate(buffer); | ||
t.true(uniqueErrors.includes("voie_nom_eus.trop_court")); | ||
t.true(rows[0].errors.some((e) => e.code === "voie_nom_eus.trop_court")); | ||
t.deepEqual(rows[1].localizedValues.voie_nom, { | ||
bre: 'Nom de la rue en breton', | ||
eus: 'Nom de la voie en basque' | ||
}) | ||
t.true(fields.some(f => f.schemaName === 'voie_nom' && f.locale === 'eus')) | ||
t.true(fields.some(f => f.schemaName === 'voie_nom' && f.locale === 'bre')) | ||
}) | ||
bre: "Nom de la rue en breton", | ||
eus: "Nom de la voie en basque", | ||
}); | ||
t.true(fields.some((f) => f.schemaName === "voie_nom" && f.locale === "eus")); | ||
t.true(fields.some((f) => f.schemaName === "voie_nom" && f.locale === "bre")); | ||
}); | ||
test('validation check profilErrors', async t => { | ||
const buffer = await readAsBuffer('locales.csv') | ||
const {profilErrors, uniqueErrors} = await validate(buffer) | ||
test("validation check profilErrors", async (t) => { | ||
const buffer = await readAsBuffer("locales.csv"); | ||
const { profilErrors, uniqueErrors } = await validate(buffer); | ||
for (const e of profilErrors) { | ||
t.true(uniqueErrors.includes(e.code)) | ||
t.true(['I', 'W', 'E'].includes(e.level)) | ||
t.true(uniqueErrors.includes(e.code)); | ||
t.true(["I", "W", "E"].includes(e.level)); | ||
} | ||
}) | ||
}); | ||
test('validation check notFoundFields', async t => { | ||
const buffer = await readAsBuffer('locales.csv') | ||
const {notFoundFields} = await validate(buffer) | ||
test("validation check notFoundFields", async (t) => { | ||
const buffer = await readAsBuffer("locales.csv"); | ||
const { notFoundFields } = await validate(buffer); | ||
for (const e of notFoundFields) { | ||
t.true(['I', 'W', 'E'].includes(e.level)) | ||
t.true(["I", "W", "E"].includes(e.level)); | ||
} | ||
}) | ||
}); | ||
test('validation check row empty', async t => { | ||
const buffer = await readAsBuffer('without_row.csv') | ||
const {profilesValidation, uniqueErrors, globalErrors} = await validate(buffer) | ||
t.true(uniqueErrors.includes('rows.empty')) | ||
t.true(globalErrors.includes('rows.empty')) | ||
t.true(!profilesValidation['1.3-relax'].isValid) | ||
t.true(!profilesValidation['1.3'].isValid) | ||
}) | ||
test("validation check row empty", async (t) => { | ||
const buffer = await readAsBuffer("without_row.csv"); | ||
const { profilesValidation, uniqueErrors, globalErrors } = | ||
await validate(buffer); | ||
t.true(uniqueErrors.includes("rows.empty")); | ||
t.true(globalErrors.includes("rows.empty")); | ||
t.true(!profilesValidation["1.3-relax"].isValid); | ||
t.true(!profilesValidation["1.3"].isValid); | ||
}); |
/* eslint no-inner-declarations: off */ | ||
const schema = require('../schema') | ||
const schema = require("../schema"); | ||
function getSchemaVersion(schemaName) { | ||
return schema.fields[schemaName].version || '1.1' | ||
return schema.fields[schemaName].version || "1.1"; | ||
} | ||
function computeFields(originalFields, {relaxFieldsDetection, globalErrors}) { | ||
const fields = originalFields.map(field => ({name: field})) | ||
const foundFields = new Set() | ||
const notFoundFields = new Set() | ||
function computeFields( | ||
originalFields, | ||
format, | ||
{ relaxFieldsDetection, globalErrors }, | ||
) { | ||
const fields = originalFields.map((field) => ({ name: field })); | ||
const foundFields = new Set(); | ||
const notFoundFields = new Set(); | ||
@@ -17,11 +21,10 @@ for (const schemaName of Object.keys(schema.fields)) { | ||
if (!foundFields.has(schemaName)) { | ||
const candidate = fields.find(f => f.name === field && !f.schemaName) | ||
const candidate = fields.find((f) => f.name === field && !f.schemaName); | ||
if (candidate) { | ||
const exactMatch = schemaName === field | ||
candidate.schemaName = schemaName | ||
candidate.version = getSchemaVersion(schemaName) | ||
foundFields.add(schemaName) | ||
const exactMatch = schemaName === field; | ||
candidate.schemaName = schemaName; | ||
foundFields.add(schemaName); | ||
if (!exactMatch) { | ||
globalErrors.add(`field.${schemaName}.fuzzy`) | ||
globalErrors.add(`field.${schemaName}.fuzzy`); | ||
} | ||
@@ -33,8 +36,12 @@ } | ||
// Exact match | ||
findField(schemaName) | ||
findField(schemaName); | ||
// Alias match | ||
if (relaxFieldsDetection && !foundFields.has(schemaName) && schema.fields[schemaName].aliases) { | ||
if ( | ||
relaxFieldsDetection && | ||
!foundFields.has(schemaName) && | ||
schema.fields[schemaName].aliases | ||
) { | ||
for (const alias of schema.fields[schemaName].aliases) { | ||
findField(alias) | ||
findField(alias); | ||
} | ||
@@ -44,5 +51,8 @@ } | ||
// Si le champ n'est pas trouvé on créé des erreurs | ||
if (!foundFields.has(schemaName)) { | ||
notFoundFields.add(schemaName) | ||
globalErrors.add(`field.${schemaName}.missing`) | ||
if ( | ||
!foundFields.has(schemaName) && | ||
schema.fields[schemaName].formats.includes(format) | ||
) { | ||
notFoundFields.add(schemaName); | ||
globalErrors.add(`field.${schemaName}.missing`); | ||
} | ||
@@ -52,11 +62,13 @@ | ||
function findLocalizedField(locale) { | ||
const localizedSchemaName = `${schemaName}_${locale}` | ||
const localizedSchemaName = `${schemaName}_${locale}`; | ||
if (!foundFields.has(localizedSchemaName)) { | ||
const candidate = fields.find(f => f.name === localizedSchemaName && !f.schemaName) | ||
const candidate = fields.find( | ||
(f) => f.name === localizedSchemaName && !f.schemaName, | ||
); | ||
if (candidate) { | ||
candidate.schemaName = schemaName | ||
candidate.localizedSchemaName = localizedSchemaName | ||
candidate.locale = locale | ||
candidate.version = getSchemaVersion(schemaName) | ||
foundFields.add(localizedSchemaName) | ||
candidate.schemaName = schemaName; | ||
candidate.localizedSchemaName = localizedSchemaName; | ||
candidate.locale = locale; | ||
candidate.version = getSchemaVersion(schemaName); | ||
foundFields.add(localizedSchemaName); | ||
} | ||
@@ -69,3 +81,3 @@ } | ||
for (const locale of schema.allowedLocales) { | ||
findLocalizedField(locale) | ||
findLocalizedField(locale); | ||
} | ||
@@ -78,9 +90,9 @@ } | ||
notFoundFields: [...notFoundFields].map(schemaName => { | ||
const schemaVersion = getSchemaVersion(schemaName) | ||
return {schemaName, schemaVersion} | ||
}) | ||
} | ||
notFoundFields: [...notFoundFields].map((schemaName) => { | ||
const schemaVersion = getSchemaVersion(schemaName); | ||
return { schemaName, schemaVersion }; | ||
}), | ||
}; | ||
} | ||
module.exports = {computeFields} | ||
module.exports = { computeFields }; |
@@ -1,26 +0,26 @@ | ||
const bluebird = require('bluebird') | ||
const {keyBy, mapValues, uniq} = require('lodash') | ||
const {getErrorLevel} = require('../helpers') | ||
const profiles = require('../schema/profiles') | ||
const {computeFields} = require('./fields') | ||
const {parse} = require('./parse') | ||
const {validateRow} = require('./row') | ||
const bluebird = require("bluebird"); | ||
const { keyBy, mapValues, uniq } = require("lodash"); | ||
const { getErrorLevel } = require("../helpers"); | ||
const profiles = require("../schema/profiles"); | ||
const { computeFields } = require("./fields"); | ||
const { parse } = require("./parse"); | ||
const { validateRow } = require("./row"); | ||
const FATAL_PARSE_ERRORS = new Set([ | ||
'MissingQuotes', | ||
'UndetectableDelimiter', | ||
'TooFewFields', | ||
'TooManyFields' | ||
]) | ||
"MissingQuotes", | ||
"UndetectableDelimiter", | ||
"TooFewFields", | ||
"TooManyFields", | ||
]); | ||
async function parseFile(file, relaxFieldsDetection) { | ||
const parseOptions = relaxFieldsDetection | ||
? {transformHeader: h => h.toLowerCase().trim()} | ||
: {} | ||
? { transformHeader: (h) => h.toLowerCase().trim() } | ||
: {}; | ||
// Must be a Blob for browser or a Buffer for Node.js | ||
const {meta, errors, data, encoding} = await parse(file, parseOptions) | ||
const { meta, errors, data, encoding } = await parse(file, parseOptions); | ||
const errorsKinds = uniq(errors.map(e => e.code)) | ||
const parseOk = !errorsKinds.some(e => FATAL_PARSE_ERRORS.has(e)) | ||
const errorsKinds = uniq(errors.map((e) => e.code)); | ||
const parseOk = !errorsKinds.some((e) => FATAL_PARSE_ERRORS.has(e)); | ||
@@ -34,30 +34,37 @@ return { | ||
parseErrors: errors, | ||
parsedRows: data | ||
} | ||
parsedRows: data, | ||
}; | ||
} | ||
async function computeRows(parsedRows, {fields, rowsErrors}) { | ||
const indexedFields = keyBy(fields, 'name') | ||
const computedRows = await bluebird.map(parsedRows, async (parsedRow, line) => { | ||
const computedRow = await validateRow(parsedRow, {indexedFields, line: line + 1}) | ||
for (const e of computedRow.errors) { | ||
rowsErrors.add(e.code) | ||
} | ||
async function computeRows(parsedRows, { fields, rowsErrors }) { | ||
const indexedFields = keyBy(fields, "name"); | ||
const computedRows = await bluebird.map( | ||
parsedRows, | ||
async (parsedRow, line) => { | ||
const computedRow = await validateRow(parsedRow, { | ||
indexedFields, | ||
line: line + 1, | ||
}); | ||
for (const e of computedRow.errors) { | ||
rowsErrors.add(e.code); | ||
} | ||
return computedRow | ||
}, {concurrency: 4}) | ||
return computedRow; | ||
}, | ||
{ concurrency: 4 }, | ||
); | ||
return {rows: computedRows} | ||
return { rows: computedRows }; | ||
} | ||
function validateFile(detectedParams, {globalErrors}) { | ||
const humanizedLinebreak = humanizeLinebreak(detectedParams.linebreak) | ||
function validateFile(detectedParams, { globalErrors }) { | ||
const humanizedLinebreak = humanizeLinebreak(detectedParams.linebreak); | ||
const encoding = { | ||
value: detectedParams.encoding, | ||
isValid: detectedParams.encoding === 'utf-8' | ||
} | ||
isValid: detectedParams.encoding === "utf-8", | ||
}; | ||
if (!encoding.isValid) { | ||
globalErrors.add('file.encoding.non_standard') | ||
globalErrors.add("file.encoding.non_standard"); | ||
} | ||
@@ -67,7 +74,7 @@ | ||
value: detectedParams.delimiter, | ||
isValid: detectedParams.delimiter === ';' | ||
} | ||
isValid: detectedParams.delimiter === ";", | ||
}; | ||
if (!delimiter.isValid) { | ||
globalErrors.add('file.delimiter.non_standard') | ||
globalErrors.add("file.delimiter.non_standard"); | ||
} | ||
@@ -77,21 +84,24 @@ | ||
value: humanizedLinebreak, | ||
isValid: ['Unix', 'Windows'].includes(humanizedLinebreak) | ||
} | ||
isValid: ["Unix", "Windows"].includes(humanizedLinebreak), | ||
}; | ||
if (!linebreak.isValid) { | ||
globalErrors.add('file.linebreak.non_standard') | ||
globalErrors.add("file.linebreak.non_standard"); | ||
} | ||
return {encoding, delimiter, linebreak} | ||
return { encoding, delimiter, linebreak }; | ||
} | ||
function checkUseBanIdsEveryRow(parsedRows, {globalErrors}) { | ||
function checkUseBanIdsEveryRow(parsedRows, { globalErrors }) { | ||
if (parsedRows.length > 0) { | ||
const useBanIds = 'id_ban_commune' in parsedRows[0] | ||
const useBanIds = "id_ban_commune" in parsedRows[0]; | ||
for (const row of parsedRows) { | ||
if ( | ||
(useBanIds && row.id_ban_commune === '') | ||
|| (!useBanIds && (row.id_ban_commune !== undefined && row.id_ban_commune !== ''))) { | ||
globalErrors.add('rows.ids_required_every') | ||
return | ||
(useBanIds && row.id_ban_commune === "") || | ||
(!useBanIds && | ||
row.id_ban_commune !== undefined && | ||
row.id_ban_commune !== "") | ||
) { | ||
globalErrors.add("rows.ids_required_every"); | ||
return; | ||
} | ||
@@ -102,32 +112,56 @@ } | ||
function validateRows(parsedRows, {globalErrors}) { | ||
function validateRows(parsedRows, { globalErrors }) { | ||
if (parsedRows.length <= 0) { | ||
globalErrors.add('rows.empty') | ||
globalErrors.add("rows.empty"); | ||
} | ||
checkUseBanIdsEveryRow(parsedRows, {globalErrors}) | ||
checkUseBanIdsEveryRow(parsedRows, { globalErrors }); | ||
} | ||
async function prevalidate(file, relaxFieldsDetection) { | ||
const globalErrors = new Set() | ||
const rowsErrors = new Set() | ||
async function prevalidate(file, format, relaxFieldsDetection) { | ||
const globalErrors = new Set(); | ||
const rowsErrors = new Set(); | ||
const {encoding, linebreak, delimiter, originalFields, parseOk, parseErrors, parsedRows} = await parseFile(file, relaxFieldsDetection) | ||
const { | ||
encoding, | ||
linebreak, | ||
delimiter, | ||
originalFields, | ||
parseOk, | ||
parseErrors, | ||
parsedRows, | ||
} = await parseFile(file, relaxFieldsDetection); | ||
if (!parseOk) { | ||
return {encoding, linebreak, delimiter, originalFields, parseOk, parseErrors, parsedRows} | ||
return { | ||
encoding, | ||
linebreak, | ||
delimiter, | ||
originalFields, | ||
parseOk, | ||
parseErrors, | ||
parsedRows, | ||
}; | ||
} | ||
const {fields, notFoundFields} = computeFields(originalFields, {globalErrors, relaxFieldsDetection}) | ||
const {rows} = await computeRows(parsedRows, {fields, rowsErrors}) | ||
const fileValidation = validateFile({linebreak, encoding, delimiter}, {globalErrors}) | ||
validateRows(parsedRows, {globalErrors}) | ||
const { fields, notFoundFields } = computeFields(originalFields, format, { | ||
globalErrors, | ||
relaxFieldsDetection, | ||
}); | ||
const { rows } = await computeRows(parsedRows, { fields, rowsErrors }); | ||
const fileValidation = validateFile( | ||
{ linebreak, encoding, delimiter }, | ||
{ globalErrors }, | ||
); | ||
validateRows(parsedRows, { globalErrors }); | ||
const uniqueErrors = new Set([...globalErrors, ...rowsErrors]) | ||
const uniqueErrors = new Set([...globalErrors, ...rowsErrors]); | ||
const profilesValidation = mapValues(profiles, profile => { | ||
const {code, name} = profile | ||
const isValid = ![...uniqueErrors].some(e => getErrorLevel(profile.code, e) === 'E') | ||
return {code, name, isValid} | ||
}) | ||
const profilesValidation = mapValues(profiles, (profile) => { | ||
const { code, name } = profile; | ||
const isValid = ![...uniqueErrors].some( | ||
(e) => getErrorLevel(profile.code, e) === "E", | ||
); | ||
return { code, name, isValid }; | ||
}); | ||
@@ -148,14 +182,14 @@ return { | ||
rowsErrors: [...rowsErrors], | ||
uniqueErrors: [...uniqueErrors] | ||
} | ||
uniqueErrors: [...uniqueErrors], | ||
}; | ||
} | ||
function validateProfileRows(computedRows, profileName) { | ||
return computedRows.map(row => { | ||
const errors = row.errors.map(e => ({ | ||
return computedRows.map((row) => { | ||
const errors = row.errors.map((e) => ({ | ||
...e, | ||
level: getErrorLevel(profileName, e.code) | ||
})) | ||
level: getErrorLevel(profileName, e.code), | ||
})); | ||
const isValid = !errors.some(e => e.level === 'E') | ||
const isValid = !errors.some((e) => e.level === "E"); | ||
@@ -165,19 +199,19 @@ return { | ||
errors, | ||
isValid | ||
} | ||
}) | ||
isValid, | ||
}; | ||
}); | ||
} | ||
function validateProfileUniqueErrors(uniqueErrors, profileName) { | ||
return uniqueErrors.map(code => ({ | ||
return uniqueErrors.map((code) => ({ | ||
code, | ||
level: getErrorLevel(profileName, code) | ||
})) | ||
level: getErrorLevel(profileName, code), | ||
})); | ||
} | ||
function validateProfileNotFoundFields(notFoundFields, profileName) { | ||
return notFoundFields.map(f => ({ | ||
return notFoundFields.map((f) => ({ | ||
...f, | ||
level: getErrorLevel(profileName, `field.${f.schemaName}.missing`) | ||
})) | ||
level: getErrorLevel(profileName, `field.${f.schemaName}.missing`), | ||
})); | ||
} | ||
@@ -187,8 +221,14 @@ | ||
if (!prevalidateResult.parseOk) { | ||
return prevalidateResult | ||
return prevalidateResult; | ||
} | ||
const rows = validateProfileRows(prevalidateResult.rows, profileName) | ||
const profilErrors = validateProfileUniqueErrors(prevalidateResult.uniqueErrors, profileName) | ||
const notFoundFields = validateProfileNotFoundFields(prevalidateResult.notFoundFields, profileName) | ||
const rows = validateProfileRows(prevalidateResult.rows, profileName); | ||
const profilErrors = validateProfileUniqueErrors( | ||
prevalidateResult.uniqueErrors, | ||
profileName, | ||
); | ||
const notFoundFields = validateProfileNotFoundFields( | ||
prevalidateResult.notFoundFields, | ||
profileName, | ||
); | ||
return { | ||
@@ -198,34 +238,39 @@ ...prevalidateResult, | ||
notFoundFields, | ||
profilErrors | ||
} | ||
profilErrors, | ||
}; | ||
} | ||
async function validate(file, options = {}) { | ||
const profile = options.profile || '1.3' | ||
let {relaxFieldsDetection} = options | ||
const profile = options.profile || "1.3"; | ||
let { relaxFieldsDetection } = options; | ||
if (options.relaxFieldsDetection === undefined) { | ||
relaxFieldsDetection = profiles[profile].relax | ||
relaxFieldsDetection = profiles[profile].relax; | ||
} | ||
const prevalidateResult = await prevalidate(file, relaxFieldsDetection) | ||
return validateProfile(prevalidateResult, profile) | ||
const { format } = profiles[profile]; | ||
const prevalidateResult = await prevalidate( | ||
file, | ||
format, | ||
relaxFieldsDetection, | ||
); | ||
return validateProfile(prevalidateResult, profile); | ||
} | ||
function humanizeLinebreak(linebreak) { | ||
if (linebreak === '\n') { | ||
return 'Unix' | ||
if (linebreak === "\n") { | ||
return "Unix"; | ||
} | ||
if (linebreak === '\r\n') { | ||
return 'Windows' | ||
if (linebreak === "\r\n") { | ||
return "Windows"; | ||
} | ||
if (linebreak === '\r') { | ||
return 'Old Mac/BSD' | ||
if (linebreak === "\r") { | ||
return "Old Mac/BSD"; | ||
} | ||
return 'Inconnu' | ||
return "Inconnu"; | ||
} | ||
module.exports = {validate, validateProfile, prevalidate} | ||
module.exports = { validate, validateProfile }; |
@@ -1,34 +0,34 @@ | ||
const {join} = require('path') | ||
const fs = require('fs') | ||
const {promisify} = require('util') | ||
const test = require('ava') | ||
const { join } = require("path"); | ||
const fs = require("fs"); | ||
const { promisify } = require("util"); | ||
const test = require("ava"); | ||
const {decodeBuffer} = require('../buffer') | ||
const { decodeBuffer } = require("../buffer"); | ||
const readFile = promisify(fs.readFile) | ||
const readFile = promisify(fs.readFile); | ||
function readAsBuffer(relativePath) { | ||
const absolutePath = join(__dirname, 'data', relativePath) | ||
return readFile(absolutePath) | ||
const absolutePath = join(__dirname, "data", relativePath); | ||
return readFile(absolutePath); | ||
} | ||
test('detect and decode UTF-8 from file', async t => { | ||
const buffer = await readAsBuffer('sample.csv') | ||
const {encoding, decodedString} = decodeBuffer(buffer) | ||
t.is(encoding, 'utf-8') | ||
t.true(decodedString.includes('bâtiment')) | ||
}) | ||
test("detect and decode UTF-8 from file", async (t) => { | ||
const buffer = await readAsBuffer("sample.csv"); | ||
const { encoding, decodedString } = decodeBuffer(buffer); | ||
t.is(encoding, "utf-8"); | ||
t.true(decodedString.includes("bâtiment")); | ||
}); | ||
test('detect and decode ASCI from file => default to UTF-8', async t => { | ||
const buffer = await readAsBuffer('junk.ascii.csv') | ||
const {encoding, decodedString} = decodeBuffer(buffer) | ||
t.is(encoding, 'utf-8') | ||
t.true(decodedString.includes('gml_id')) | ||
}) | ||
test("detect and decode ASCI from file => default to UTF-8", async (t) => { | ||
const buffer = await readAsBuffer("junk.ascii.csv"); | ||
const { encoding, decodedString } = decodeBuffer(buffer); | ||
t.is(encoding, "utf-8"); | ||
t.true(decodedString.includes("gml_id")); | ||
}); | ||
test('detect and decode ANSI from file', async t => { | ||
const buffer = await readAsBuffer('sample.ansi.csv') | ||
const {encoding, decodedString} = decodeBuffer(buffer) | ||
t.is(encoding, 'windows-1252') | ||
t.true(decodedString.includes('bâtiment')) | ||
}) | ||
test("detect and decode ANSI from file", async (t) => { | ||
const buffer = await readAsBuffer("sample.ansi.csv"); | ||
const { encoding, decodedString } = decodeBuffer(buffer); | ||
t.is(encoding, "windows-1252"); | ||
t.true(decodedString.includes("bâtiment")); | ||
}); |
@@ -1,4 +0,4 @@ | ||
const toBuffer = require('blob-to-buffer') | ||
const {detectBufferEncoding} = require('./detect-encoding') | ||
const {parseCsv} = require('./csv') | ||
const toBuffer = require("blob-to-buffer"); | ||
const { detectBufferEncoding } = require("./detect-encoding"); | ||
const { parseCsv } = require("./csv"); | ||
@@ -9,16 +9,16 @@ function detectBlobEncoding(blob) { | ||
if (err) { | ||
return reject(err) | ||
return reject(err); | ||
} | ||
resolve(detectBufferEncoding(buffer)) | ||
}) | ||
}) | ||
resolve(detectBufferEncoding(buffer)); | ||
}); | ||
}); | ||
} | ||
async function parse(blob, options = {}) { | ||
const encoding = await detectBlobEncoding(blob) | ||
const parseResult = await parseCsv(blob, {...options, encoding}) | ||
return {...parseResult, encoding} | ||
const encoding = await detectBlobEncoding(blob); | ||
const parseResult = await parseCsv(blob, { ...options, encoding }); | ||
return { ...parseResult, encoding }; | ||
} | ||
module.exports = {parse} | ||
module.exports = { parse }; |
@@ -1,4 +0,4 @@ | ||
const iconv = require('iconv-lite') | ||
const {detectBufferEncoding} = require('./detect-encoding') | ||
const {parseCsv} = require('./csv') | ||
const iconv = require("iconv-lite"); | ||
const { detectBufferEncoding } = require("./detect-encoding"); | ||
const { parseCsv } = require("./csv"); | ||
@@ -9,19 +9,17 @@ // Copied from strip-bom package which contains ES6 syntax | ||
// conversion translates it to FEFF (UTF-16 BOM) | ||
return str.codePointAt(0) === 0xFE_FF ? str.slice(1) : str | ||
return str.codePointAt(0) === 0xfe_ff ? str.slice(1) : str; | ||
} | ||
function decodeBuffer(buffer) { | ||
const encoding = detectBufferEncoding(buffer) | ||
const decodedString = stripBom( | ||
iconv.decode(buffer, encoding) | ||
) | ||
return {encoding, decodedString} | ||
const encoding = detectBufferEncoding(buffer); | ||
const decodedString = stripBom(iconv.decode(buffer, encoding)); | ||
return { encoding, decodedString }; | ||
} | ||
async function parse(buffer, options = {}) { | ||
const {encoding, decodedString} = decodeBuffer(buffer) | ||
const parseResult = await parseCsv(decodedString, options) | ||
return {...parseResult, encoding} | ||
const { encoding, decodedString } = decodeBuffer(buffer); | ||
const parseResult = await parseCsv(decodedString, options); | ||
return { ...parseResult, encoding }; | ||
} | ||
module.exports = {decodeBuffer, parse} | ||
module.exports = { decodeBuffer, parse }; |
@@ -1,8 +0,8 @@ | ||
const Papa = require('papaparse') | ||
const Papa = require("papaparse"); | ||
const PAPA_OPTIONS = { | ||
delimitersToGuess: [',', '\t', ';'], | ||
delimitersToGuess: [",", "\t", ";"], | ||
skipEmptyLines: true, | ||
header: true | ||
} | ||
header: true, | ||
}; | ||
@@ -14,8 +14,8 @@ function parseCsv(file, options = {}) { | ||
...options, | ||
complete: res => resolve(res), | ||
error: err => reject(err) | ||
}) | ||
}) | ||
complete: (res) => resolve(res), | ||
error: (err) => reject(err), | ||
}); | ||
}); | ||
} | ||
module.exports = {parseCsv} | ||
module.exports = { parseCsv }; |
@@ -1,18 +0,18 @@ | ||
const chardet = require('chardet') | ||
const fileType = require('file-type') | ||
const chardet = require("chardet"); | ||
const fileType = require("file-type"); | ||
const CHARDET_TO_NORMALIZED_ENCODINGS = { | ||
'iso-8859-1': 'windows-1252', | ||
'iso-8859-15': 'windows-1252', | ||
'windows-1252': 'windows-1252', | ||
'utf-8': 'utf-8' | ||
} | ||
"iso-8859-1": "windows-1252", | ||
"iso-8859-15": "windows-1252", | ||
"windows-1252": "windows-1252", | ||
"utf-8": "utf-8", | ||
}; | ||
function normalizeEncodingName(encoding) { | ||
const lcEncoding = encoding.toLowerCase() | ||
const lcEncoding = encoding.toLowerCase(); | ||
if (!(lcEncoding in CHARDET_TO_NORMALIZED_ENCODINGS)) { | ||
throw new Error('Encoding currently not supported: ' + encoding) | ||
throw new Error("Encoding currently not supported: " + encoding); | ||
} | ||
return CHARDET_TO_NORMALIZED_ENCODINGS[lcEncoding] | ||
return CHARDET_TO_NORMALIZED_ENCODINGS[lcEncoding]; | ||
} | ||
@@ -22,15 +22,15 @@ | ||
if (fileType(buffer)) { | ||
throw new Error('Non-text file cannot be processed') | ||
throw new Error("Non-text file cannot be processed"); | ||
} | ||
const analyseResults = chardet.analyse(buffer) | ||
const analyseResults = chardet.analyse(buffer); | ||
if (analyseResults.length === 0) { | ||
throw new Error('Unable to detect encoding') | ||
throw new Error("Unable to detect encoding"); | ||
} | ||
const utf8Result = analyseResults.find(r => r.name === 'UTF-8') | ||
const utf8Result = analyseResults.find((r) => r.name === "UTF-8"); | ||
if (utf8Result && utf8Result.confidence >= 80) { | ||
return 'utf-8' | ||
return "utf-8"; | ||
} | ||
@@ -40,8 +40,8 @@ | ||
if (utf8Result && utf8Result.confidence === 10) { | ||
return 'utf-8' | ||
return "utf-8"; | ||
} | ||
return normalizeEncodingName(analyseResults[0].name) | ||
return normalizeEncodingName(analyseResults[0].name); | ||
} | ||
module.exports = {normalizeEncodingName, detectBufferEncoding} | ||
module.exports = { normalizeEncodingName, detectBufferEncoding }; |
@@ -1,1 +0,1 @@ | ||
module.exports = require('./buffer') | ||
module.exports = require("./buffer"); |
@@ -1,8 +0,8 @@ | ||
const schema = require('../schema') | ||
const schema = require("../schema"); | ||
const {getNormalizedEnumValue} = schema | ||
const { getNormalizedEnumValue } = schema; | ||
async function readValue(fieldName, rawValue) { | ||
if (!(fieldName in schema.fields)) { | ||
throw new Error(`Unknown field name: ${fieldName}`) | ||
throw new Error(`Unknown field name: ${fieldName}`); | ||
} | ||
@@ -13,15 +13,15 @@ | ||
additionalValues: undefined, | ||
errors: [] | ||
} | ||
errors: [], | ||
}; | ||
const def = schema.fields[fieldName] | ||
const def = schema.fields[fieldName]; | ||
const trimmedValue = def.trim ? rawValue.trim() : rawValue | ||
const trimmedValue = def.trim ? rawValue.trim() : rawValue; | ||
if (def.trim && trimmedValue !== rawValue) { | ||
result.errors.push('espaces_debut_fin') | ||
result.errors.push("espaces_debut_fin"); | ||
} | ||
if (def.required && !trimmedValue) { | ||
result.errors.push('valeur_manquante') | ||
result.errors.push("valeur_manquante"); | ||
} else if (!trimmedValue) { | ||
@@ -32,77 +32,93 @@ // Ne rien faire | ||
setAdditionnalValues(values) { | ||
result.additionalValues = values | ||
result.additionalValues = values; | ||
}, | ||
addError(code) { | ||
result.errors.push(code) | ||
} | ||
}) | ||
result.errors.push(code); | ||
}, | ||
}); | ||
} else if (def.enum) { | ||
const normalizedValue = getNormalizedEnumValue(trimmedValue) | ||
const normalizedValue = getNormalizedEnumValue(trimmedValue); | ||
if (def.enumFuzzyMap.has(normalizedValue)) { | ||
const schemaValue = def.enumFuzzyMap.get(normalizedValue) | ||
const schemaValue = def.enumFuzzyMap.get(normalizedValue); | ||
if (schemaValue !== trimmedValue.normalize()) { | ||
result.errors.push('enum_fuzzy') | ||
result.errors.push("enum_fuzzy"); | ||
} | ||
result.parsedValue = schemaValue | ||
result.parsedValue = schemaValue; | ||
} else { | ||
result.errors.push('valeur_invalide') | ||
result.errors.push("valeur_invalide"); | ||
} | ||
} else { | ||
result.parsedValue = trimmedValue | ||
result.parsedValue = trimmedValue; | ||
} | ||
return result | ||
return result; | ||
} | ||
async function validateRow(row, {line, indexedFields}) { | ||
const rawValues = {} | ||
const parsedValues = {} | ||
const additionalValues = {} | ||
const localizedValues = {} | ||
const errors = [] | ||
async function validateRow(row, { line, indexedFields }) { | ||
const rawValues = {}; | ||
const parsedValues = {}; | ||
const additionalValues = {}; | ||
const localizedValues = {}; | ||
const errors = []; | ||
await Promise.all(Object.keys(row).map(async fieldName => { | ||
const rawValue = row[fieldName] | ||
const field = indexedFields[fieldName] | ||
const normalizedFieldName = field.localizedSchemaName || field.schemaName || fieldName | ||
await Promise.all( | ||
Object.keys(row).map(async (fieldName) => { | ||
const rawValue = row[fieldName]; | ||
const field = indexedFields[fieldName]; | ||
const normalizedFieldName = | ||
field.localizedSchemaName || field.schemaName || fieldName; | ||
rawValues[normalizedFieldName] = rawValue | ||
rawValues[normalizedFieldName] = rawValue; | ||
if (!field.schemaName) { | ||
return | ||
} | ||
if (!field.schemaName) { | ||
return; | ||
} | ||
const result = await readValue(field.schemaName, rawValue) | ||
const result = await readValue(field.schemaName, rawValue); | ||
for (const error of result.errors) { | ||
errors.push({code: `${normalizedFieldName}.${error}`, schemaName: fieldName}) | ||
} | ||
for (const error of result.errors) { | ||
errors.push({ | ||
code: `${normalizedFieldName}.${error}`, | ||
schemaName: fieldName, | ||
}); | ||
} | ||
if (result.additionalValues) { | ||
additionalValues[normalizedFieldName] = result.additionalValues | ||
} | ||
if (result.additionalValues) { | ||
additionalValues[normalizedFieldName] = result.additionalValues; | ||
} | ||
if (result.parsedValue !== undefined) { | ||
parsedValues[normalizedFieldName] = result.parsedValue | ||
if (result.parsedValue !== undefined) { | ||
parsedValues[normalizedFieldName] = result.parsedValue; | ||
if (field.locale) { | ||
if (!localizedValues[field.schemaName]) { | ||
localizedValues[field.schemaName] = {} | ||
if (field.locale) { | ||
if (!localizedValues[field.schemaName]) { | ||
localizedValues[field.schemaName] = {}; | ||
} | ||
localizedValues[field.schemaName][field.locale] = result.parsedValue; | ||
} | ||
localizedValues[field.schemaName][field.locale] = result.parsedValue | ||
} | ||
} | ||
})) | ||
}) | ||
); | ||
schema.row({rawValues, parsedValues, additionalValues, localizedValues}, { | ||
addError(code) { | ||
errors.push({code: `row.${code}`}) | ||
schema.row( | ||
{ rawValues, parsedValues, additionalValues, localizedValues }, | ||
{ | ||
addError(code) { | ||
errors.push({ code: `row.${code}` }); | ||
}, | ||
} | ||
}) | ||
); | ||
return {rawValues, parsedValues, additionalValues, localizedValues, errors, line} | ||
return { | ||
rawValues, | ||
parsedValues, | ||
additionalValues, | ||
localizedValues, | ||
errors, | ||
line, | ||
}; | ||
} | ||
module.exports = {validateRow, readValue} | ||
module.exports = { validateRow, readValue }; |
{ | ||
"name": "@ban-team/validateur-bal", | ||
"version": "2.18.3", | ||
"version": "2.18.4", | ||
"description": "Validateur de référence pour le format BAL", | ||
"repository": "https://github.com/BaseAdresseNationale/validateur-bal", | ||
"author": "Équipe Adresse <adresse@data.gouv.fr>", | ||
"contributors": [ | ||
"Jérôme Desboeufs <jerome.desboeufs@data.gouv.fr>", | ||
"Théophile Merlière <theophile.merliere@data.gouv.fr>", | ||
"Guillaume Fay <guillaume.fay@beta.gouv.fr>", | ||
"Fabien Tafforeau <fabien.tafforeau@beta.gouv.fr>" | ||
], | ||
"license": "MIT", | ||
@@ -24,3 +30,4 @@ "private": false, | ||
"scripts": { | ||
"lint": "xo", | ||
"lint": "npx eslint --fix lib scripts", | ||
"format": "yarn run prettier --write \"lib/**/*.js\" \"scripts/**/*.js\"", | ||
"build-minicog": "node scripts/build-minicog", | ||
@@ -54,6 +61,8 @@ "build": "pkg --targets node16-linux-x64,node16-macos-x64,node16-win-x64 --output bal .", | ||
"codecov": "^3.8.3", | ||
"eslint": "^8.57.0", | ||
"eslint-config-prettier": "^9.1.0", | ||
"fs-extra": "^10.1.0", | ||
"nyc": "^15.1.0", | ||
"pkg": "^5.8.0", | ||
"xo": "^0.52.3" | ||
"prettier": "^3.2.5" | ||
}, | ||
@@ -63,19 +72,2 @@ "engines": { | ||
}, | ||
"xo": { | ||
"space": 2, | ||
"semicolon": false, | ||
"rules": { | ||
"comma-dangle": [ | ||
"error", | ||
"never" | ||
], | ||
"unicorn/import-style": "off", | ||
"unicorn/prevent-abbreviations": "off", | ||
"unicorn/no-reduce": "off", | ||
"unicorn/prefer-module": "off", | ||
"unicorn/text-encoding-identifier-case": "off", | ||
"import/extensions": "off", | ||
"node/prefer-global/process": "off" | ||
} | ||
}, | ||
"pkg": { | ||
@@ -82,0 +74,0 @@ "scripts": "lib/**/*.js" |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 2 instances in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 2 instances in 1 package
1778948
74
10304
12