UNPKG

2.15 kBJavaScriptView Raw
1"use strict";
2
3/**
4 * Compare deux notifications. En commançant par le numéro de ligne, puis celui
5 * de la colonne.
6 *
7 * @param {Object} notice1 La première notification.
8 * @param {Object} notice2 La seconde notification.
9 * @return {number} Un nombre négatif si la 1<sup>re</sup> notification est
10 * inférieure à la 2<sup>de</sup> ; <code>0</code> si elles
11 * sont égales ; sinon un nombre positif.
12 */
13const compare = function (notice1, notice2) {
14 for (let i = 0; i < notice1.locations.length &&
15 i < notice2.locations.length; ++i) {
16 const locations1 = notice1.locations[i];
17 const locations2 = notice2.locations[i];
18
19 let diff = locations1.line - locations2.line;
20 if (0 !== diff) {
21 return diff;
22 }
23
24 diff = ("column" in locations1 ? locations1.column : -1) -
25 ("column" in locations2 ? locations2.column : -1);
26 if (0 !== diff) {
27 return diff;
28 }
29 }
30 return notice1.locations.length - notice2.locations.length;
31};
32
33/**
34 * Vérifie, avec des linters, un fichier.
35 *
36 * @param {string} file Le fichier qui sera vérifié.
37 * @param {Array.<Object>} checkers Les checkers (contenant les linters et le
38 * niveau de sévérité) utilisés pour vérifier
39 * le code source.
40 * @return {Promise.<Array.<Object>>} La liste des notifications.
41 */
42const metalint = function (file, checkers) {
43 const results = [];
44
45 for (const checker of checkers) {
46 for (const name in checker.linters) {
47 // Charger l’enrobage du linter et l’utiliser pour vérifier le
48 // fichier.
49 const { wrapper } = require("./wrapper/" + name);
50 results.push(wrapper(file, checker.level, checker.linters[name]));
51 }
52 }
53
54 // Regrouper et trier les notifications.
55 return Promise.all(results).then(function (notices) {
56 return [].concat(...notices).sort(compare);
57 });
58};
59
60// Exposer la fonction pour vérifier un code source.
61module.exports = metalint;