1 | ;
|
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 | */
|
13 | const 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 | */
|
42 | const 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.
|
61 | module.exports = metalint;
|