UNPKG

3.86 kBJavaScriptView Raw
1/**
2 * @module
3 * @see {@link https://www.npmjs.com/package/david|David DM}
4 */
5
6"use strict";
7
8const fs = require("fs").promises;
9const david = require("david");
10const SEVERITY = require("../severity");
11
12/**
13 * Initialise un checker pour David DM.
14 *
15 * @returns {object} Le patron et les options par défaut.
16 */
17const configure = function () {
18 return {
19 "patterns": "/package.json",
20 "linters": { "david": {} }
21 };
22};
23
24/**
25 * Liste les dépendances obsolètes par type.
26 *
27 * @param {string} file Le fichier <em>package.json</em> qui sera vérifié.
28 * @param {object} source L'objet JSON d'un fichier <em>package.json</em>.
29 * @param {string} type Le type des dépendances (<code>null</code>,
30 * <code>"dev"</code>, <code>"optional"</code> ou
31 * <code>"peer"</code>).
32 * @param {boolean} stable <code>true</code> pour remonter seulement les
33 * nouvelles versions stables ; sinon
34 * <code>false</code>.
35 * @returns {Promise.<Array.<object>>} Une promesse retournant la liste des
36 * notifications.
37 */
38const list = async function (file, source, type, stable) {
39 const opts = {};
40 if (null !== type) {
41 opts[type] = true;
42 }
43
44 const deps = await new Promise((resolve) => {
45 david.getDependencies(source, opts, (_, d) => resolve(d));
46 });
47 return Object.keys(deps).map((depName) => {
48 const dep = deps[depName];
49 if ("warn" in dep) {
50 return {
51 "file": file,
52 "linter": "david",
53 "severity": SEVERITY.FATAL,
54 "message": dep.warn.message
55 };
56 }
57 let severity = null;
58 let message;
59 if (david.isUpdated(dep, { "stable": true })) {
60 severity = SEVERITY.ERROR;
61 message =
62 "New stable version " + dep.stable + " is released to " +
63 (null === type ? "d" : type + "D") + "ependencies '" + depName +
64 "'.";
65 } else if (!stable && david.isUpdated(dep)) {
66 severity = SEVERITY.INFO;
67 message =
68 "New version " + dep.latest + " is released to " +
69 (null === type ? "d" : type + "D") + "ependencies '" + depName +
70 "'.";
71 }
72
73 return {
74 "file": file,
75 "linter": "david",
76 "severity": severity,
77 "message": message
78 };
79 }).filter((n) => null !== n.severity);
80};
81
82/**
83 * Analyse toutes les dépendances d'un <em>package.json</em> (d'un module
84 * <em>npm</em>) avec <strong>David DM</strong>.
85 *
86 * @param {string} file Le fichier qui sera vérifié.
87 * @param {number} level Le niveau de sévérité minimum des notifications
88 * retournées.
89 * @param {object} options Les options qui seront passées à l'outil.
90 * @returns {Promise.<Array.<object>>} Une promesse retournant la liste des
91 * notifications.
92 */
93const wrapper = async function (file, level, options) {
94 if (SEVERITY.FATAL > level) {
95 return [];
96 }
97
98 const source = JSON.parse(await fs.readFile(file, "utf-8"));
99 const results = [];
100 results.push(list(file, source, null, options.stable));
101 if ("dev" in options && options.dev) {
102 results.push(list(file, source, "dev", options.stable));
103 }
104 if ("optional" in options && options.optional) {
105 results.push(list(file, source, "optional", options.stable));
106 }
107 if ("peer" in options && options.peer) {
108 results.push(list(file, source, "peer", options.stable));
109 }
110 const notices = await Promise.all(results);
111 return [].concat(...notices);
112};
113
114module.exports = { configure, wrapper };