1 | /**
|
2 | * @module
|
3 | * @see {@link https://www.npmjs.com/package/purgecss|PurgeCSS}
|
4 | */
|
5 |
|
6 | ;
|
7 |
|
8 | const PurgeCSS = require("purgecss").default;
|
9 | const glob = require("../glob");
|
10 | const SEVERITY = require("../severity");
|
11 |
|
12 | /**
|
13 | * Initialise un checker pour PurgeCSS.
|
14 | *
|
15 | * @returns {object} Le patron et les options par défaut.
|
16 | */
|
17 | const configure = function () {
|
18 | return {
|
19 | "patterns": "*.css",
|
20 | "linters": { "purgecss": { "content": ["*.html", "*.js"] } }
|
21 | };
|
22 | };
|
23 |
|
24 | /**
|
25 | * Vérifie un fichier avec l'utilitaire <strong>PurgeCSS</strong>.
|
26 | *
|
27 | * @param {string} file Le fichier qui sera vérifié.
|
28 | * @param {number} level Le niveau de sévérité minimum des notifications
|
29 | * retournées.
|
30 | * @param {object} options Les options qui seront passées au linter.
|
31 | * @param {string} root L'adresse du répertoire où se trouve le dossier
|
32 | * <code>.metalint/</code>.
|
33 | * @returns {Promise.<Array.<object>>} Une promesse retournant la liste des
|
34 | * notifications.
|
35 | */
|
36 | const wrapper = async function (file, level, options, root) {
|
37 | if (SEVERITY.FATAL > level) {
|
38 | return [];
|
39 | }
|
40 |
|
41 | const results = await new PurgeCSS().purge(Object.assign({}, options, {
|
42 | // Utiliser le format des patrons de Metalint.
|
43 | "content": glob.walk([], options.content, root),
|
44 | "css": [file],
|
45 | "rejected": true
|
46 | }));
|
47 | if (0 === results.length) {
|
48 | return [{
|
49 | "file": file,
|
50 | "linter": "purgecss",
|
51 | "severity": SEVERITY.FATAL,
|
52 | "message": "No content provided."
|
53 | }];
|
54 | }
|
55 |
|
56 | return results[0].rejected.map((rejected) => ({
|
57 | "file": file,
|
58 | "linter": "purgecss",
|
59 | "severity": SEVERITY.ERROR,
|
60 | "message": `'${rejected}' is never used.`
|
61 | })).filter((n) => level >= n.severity);
|
62 | };
|
63 |
|
64 | module.exports = { configure, wrapper };
|