1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | "use strict";
|
7 |
|
8 | const fs = require("fs").promises;
|
9 | const david = require("david");
|
10 | const SEVERITY = require("../severity");
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | const configure = function () {
|
18 | return {
|
19 | "patterns": "/package.json",
|
20 | "linters": { "david": {} }
|
21 | };
|
22 | };
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | const 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 |
|
84 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 | const 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 |
|
114 | module.exports = { configure, wrapper };
|