dependabot-npm_and_yarn 0.125.0 → 0.125.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/helpers/README.md +29 -0
- data/helpers/lib/npm/conflicting-dependency-parser.js +76 -0
- data/helpers/lib/npm/index.js +3 -0
- data/helpers/lib/yarn/conflicting-dependency-parser.js +176 -0
- data/helpers/lib/yarn/fix-duplicates.js +5 -3
- data/helpers/lib/yarn/helpers.js +8 -1
- data/helpers/lib/yarn/index.js +3 -0
- data/helpers/package.json +3 -2
- data/helpers/test/npm/conflicting-dependency-parser.test.js +67 -0
- data/helpers/test/npm/fixtures/conflicting-dependency-parser/deeply-nested/package-lock.json +565 -0
- data/helpers/test/npm/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
- data/helpers/test/npm/fixtures/conflicting-dependency-parser/nested/package-lock.json +188 -0
- data/helpers/test/npm/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
- data/helpers/test/npm/fixtures/conflicting-dependency-parser/simple/package-lock.json +27 -0
- data/helpers/test/npm/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
- data/helpers/test/npm/helpers.js +14 -0
- data/helpers/test/npm/updater.test.js +1 -15
- data/helpers/test/yarn/conflicting-dependency-parser.test.js +84 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/yarn.lock +496 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/package.json +14 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/yarn.lock +21 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/yarn.lock +172 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
- data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/yarn.lock +21 -0
- data/helpers/test/yarn/helpers.js +11 -0
- data/helpers/yarn.lock +625 -30
- data/lib/dependabot/npm_and_yarn/file_fetcher.rb +2 -6
- data/lib/dependabot/npm_and_yarn/file_updater/npm_lockfile_updater.rb +1 -3
- data/lib/dependabot/npm_and_yarn/file_updater/npmrc_builder.rb +2 -6
- data/lib/dependabot/npm_and_yarn/file_updater/yarn_lockfile_updater.rb +5 -15
- data/lib/dependabot/npm_and_yarn/metadata_finder.rb +3 -9
- data/lib/dependabot/npm_and_yarn/requirement.rb +2 -6
- data/lib/dependabot/npm_and_yarn/update_checker.rb +15 -12
- data/lib/dependabot/npm_and_yarn/update_checker/conflicting_dependency_resolver.rb +69 -0
- data/lib/dependabot/npm_and_yarn/update_checker/dependency_files_builder.rb +94 -0
- data/lib/dependabot/npm_and_yarn/update_checker/latest_version_finder.rb +2 -6
- data/lib/dependabot/npm_and_yarn/update_checker/registry_finder.rb +1 -3
- data/lib/dependabot/npm_and_yarn/update_checker/subdependency_version_resolver.rb +24 -86
- data/lib/dependabot/npm_and_yarn/update_checker/version_resolver.rb +16 -85
- data/lib/dependabot/npm_and_yarn/version.rb +1 -3
- metadata +27 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74b4f8a2fdcbfb3b33dc587ee7fff5488bb2328e5d5cb59327520ce52a19e6f0
|
4
|
+
data.tar.gz: f8e09730aec68b7ff4745d58c6873539de25686cac0c10dc41ecff434e1a2435
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8338c4eae0027af367594c67c79befb5603a2c9534adffb0f6bc501e264c40e453643aa423d1cf18d8e7e87c3d9b99b384cbbc494d0548e5f05bc3dd904feb04
|
7
|
+
data.tar.gz: 542f15a0de016dd10b58c128e47f997b76a32cbc411945f6db40e3f5544760c2c683b83104ef5fbe194b5c3008e729bcafc9b6a3b0e47a329adab1bb1d59c49e
|
data/helpers/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Native JavaScript helpers
|
2
|
+
-------------------------
|
3
|
+
|
4
|
+
This directory contains helper functions for npm and yarn, natively written in
|
5
|
+
Javascript so that we can utilize the package managers internal APIs and other
|
6
|
+
native tooling for these ecosystems.
|
7
|
+
|
8
|
+
These helpers are called from the Ruby code via `run.js`, they are passed
|
9
|
+
arguments via stdin and return JSON data to stdout.
|
10
|
+
|
11
|
+
## Testing
|
12
|
+
|
13
|
+
When working on these helpers, it's convenient to write some high level tests in
|
14
|
+
JavaScript to make it easier to debug the code.
|
15
|
+
|
16
|
+
You can now run the tests from this directory by running:
|
17
|
+
|
18
|
+
```
|
19
|
+
yarn test path/to/test.js
|
20
|
+
```
|
21
|
+
|
22
|
+
### Debugging
|
23
|
+
|
24
|
+
In order to run an interactive debugger:
|
25
|
+
|
26
|
+
- `node --inspect-brk node_modules/.bin/jest --runInBand path/to/test/test.js`
|
27
|
+
- In Chrome, nativate to chrome://inspect
|
28
|
+
- Click `Open dedicated DevTools for Node`
|
29
|
+
- You'll now be able to interactively debug using the chrome dev tools.
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/* Conflicting dependency parser for npm
|
2
|
+
*
|
3
|
+
* Inputs:
|
4
|
+
* - directory containing a package.json and a yarn.lock
|
5
|
+
* - dependency name
|
6
|
+
* - target dependency version
|
7
|
+
*
|
8
|
+
* Outputs:
|
9
|
+
* - An array of objects with conflicting dependencies
|
10
|
+
*/
|
11
|
+
|
12
|
+
const Arborist = require("@npmcli/arborist");
|
13
|
+
const semver = require("semver");
|
14
|
+
|
15
|
+
async function findConflictingDependencies(directory, depName, targetVersion) {
|
16
|
+
const arb = new Arborist({
|
17
|
+
path: directory,
|
18
|
+
});
|
19
|
+
|
20
|
+
return await arb.loadVirtual().then((tree) => {
|
21
|
+
const parents = [];
|
22
|
+
for (const node of tree.inventory.query("name", depName)) {
|
23
|
+
for (const edge of node.edgesIn) {
|
24
|
+
if (!semver.satisfies(targetVersion, edge.spec)) {
|
25
|
+
findTopLevelEdges(edge).forEach((topLevel) => {
|
26
|
+
explanation = buildExplanation(node, edge, topLevel);
|
27
|
+
|
28
|
+
parents.push({
|
29
|
+
explanation: explanation,
|
30
|
+
name: edge.from.name,
|
31
|
+
version: edge.from.version,
|
32
|
+
requirement: edge.spec,
|
33
|
+
});
|
34
|
+
});
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
return parents;
|
40
|
+
});
|
41
|
+
}
|
42
|
+
|
43
|
+
function buildExplanation(node, directEdge, topLevelEdge) {
|
44
|
+
if (directEdge.from === topLevelEdge.to) {
|
45
|
+
// The nodes parent is top-level
|
46
|
+
return `${directEdge.from.name}@${directEdge.from.version} requires ${directEdge.to.name}@${directEdge.spec}`;
|
47
|
+
} else if (topLevelEdge.to.edgesOut.has(directEdge.from.name)) {
|
48
|
+
// The nodes parent is a direct dependency of the top-level dependency
|
49
|
+
return (
|
50
|
+
`${topLevelEdge.to.name}@${topLevelEdge.to.version} requires ${directEdge.to.name}@${directEdge.spec} ` +
|
51
|
+
`via ${directEdge.from.name}@${directEdge.from.version}`
|
52
|
+
);
|
53
|
+
} else {
|
54
|
+
// The nodes parent is a transitive dependency of the top-level dependency
|
55
|
+
return (
|
56
|
+
`${topLevelEdge.to.name}@${topLevelEdge.to.version} requires ${directEdge.to.name}@${directEdge.spec} ` +
|
57
|
+
`via a transitive dependency on ${directEdge.from.name}@${directEdge.from.version}`
|
58
|
+
);
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
function findTopLevelEdges(edge, parents = []) {
|
63
|
+
edge.from.edgesIn.forEach((parent) => {
|
64
|
+
if (parent.from.edgesIn.size === 0) {
|
65
|
+
if (!parents.includes(parent)) {
|
66
|
+
parents.push(parent);
|
67
|
+
}
|
68
|
+
} else {
|
69
|
+
findTopLevelEdges(parent, parents);
|
70
|
+
}
|
71
|
+
});
|
72
|
+
|
73
|
+
return parents;
|
74
|
+
}
|
75
|
+
|
76
|
+
module.exports = { findConflictingDependencies };
|
data/helpers/lib/npm/index.js
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
const updater = require("./updater");
|
2
2
|
const peerDependencyChecker = require("./peer-dependency-checker");
|
3
3
|
const subdependencyUpdater = require("./subdependency-updater");
|
4
|
+
const conflictingDependencyParser = require("./conflicting-dependency-parser");
|
4
5
|
|
5
6
|
module.exports = {
|
6
7
|
update: updater.updateDependencyFiles,
|
7
8
|
updateSubdependency: subdependencyUpdater.updateDependencyFile,
|
8
9
|
checkPeerDependencies: peerDependencyChecker.checkPeerDependencies,
|
10
|
+
findConflictingDependencies:
|
11
|
+
conflictingDependencyParser.findConflictingDependencies,
|
9
12
|
};
|
@@ -0,0 +1,176 @@
|
|
1
|
+
/* Conflicting dependency parser for yarn
|
2
|
+
*
|
3
|
+
* Inputs:
|
4
|
+
* - directory containing a package.json and a yarn.lock
|
5
|
+
* - dependency name
|
6
|
+
* - target dependency version
|
7
|
+
*
|
8
|
+
* Outputs:
|
9
|
+
* - An array of objects with conflicting dependencies
|
10
|
+
*/
|
11
|
+
|
12
|
+
const fs = require("fs");
|
13
|
+
const path = require("path");
|
14
|
+
const semver = require("semver");
|
15
|
+
const { parse } = require("./lockfile-parser");
|
16
|
+
const { LOCKFILE_ENTRY_REGEX } = require("./helpers");
|
17
|
+
|
18
|
+
async function findConflictingDependencies(directory, depName, targetVersion) {
|
19
|
+
const lockfileJson = await parse(directory);
|
20
|
+
const packageJson = fs
|
21
|
+
.readFileSync(path.join(directory, "package.json"))
|
22
|
+
.toString();
|
23
|
+
const dependencyTypes = [
|
24
|
+
"dependencies",
|
25
|
+
"devDependencies",
|
26
|
+
"optionalDependencies",
|
27
|
+
];
|
28
|
+
const topLevelDependencies = dependencyTypes.flatMap((type) => {
|
29
|
+
return Object.entries(JSON.parse(packageJson)[type] || {});
|
30
|
+
});
|
31
|
+
|
32
|
+
const conflictingParents = topLevelDependencies.flatMap(
|
33
|
+
([topLevelDepName, topLevelRequirement]) => {
|
34
|
+
const topLevelSpec = {
|
35
|
+
name: topLevelDepName,
|
36
|
+
requirement: topLevelRequirement,
|
37
|
+
};
|
38
|
+
|
39
|
+
return Array.from(
|
40
|
+
findConflictingParentDependencies(
|
41
|
+
topLevelDepName,
|
42
|
+
topLevelRequirement,
|
43
|
+
depName,
|
44
|
+
targetVersion,
|
45
|
+
topLevelSpec,
|
46
|
+
lockfileJson
|
47
|
+
).values()
|
48
|
+
);
|
49
|
+
}
|
50
|
+
);
|
51
|
+
|
52
|
+
return conflictingParents.map((parentSpec) => {
|
53
|
+
const explanation = buildExplanation(parentSpec, depName);
|
54
|
+
return {
|
55
|
+
explanation: explanation,
|
56
|
+
name: parentSpec.name,
|
57
|
+
version: parentSpec.version,
|
58
|
+
requirement: parentSpec.requirement,
|
59
|
+
};
|
60
|
+
});
|
61
|
+
}
|
62
|
+
|
63
|
+
function buildExplanation(parentSpec, targetDepName) {
|
64
|
+
if (
|
65
|
+
parentSpec.name === parentSpec.topLevelSpec.name &&
|
66
|
+
parentSpec.version === parentSpec.topLevelSpec.version
|
67
|
+
) {
|
68
|
+
// The nodes parent is top-level
|
69
|
+
return (
|
70
|
+
`${parentSpec.name}@${parentSpec.version} requires ${targetDepName}` +
|
71
|
+
`@${parentSpec.requirement}`
|
72
|
+
);
|
73
|
+
} else if (
|
74
|
+
parentSpec.transitiveSpec.name === parentSpec.topLevelSpec.name &&
|
75
|
+
parentSpec.transitiveSpec.version === parentSpec.topLevelSpec.version
|
76
|
+
) {
|
77
|
+
// The nodes parent is a direct dependency of the top-level dependency
|
78
|
+
return (
|
79
|
+
`${parentSpec.topLevelSpec.name}@${parentSpec.topLevelSpec.version} requires ` +
|
80
|
+
`${targetDepName}@${parentSpec.requirement} ` +
|
81
|
+
`via ${parentSpec.name}@${parentSpec.version}`
|
82
|
+
);
|
83
|
+
} else {
|
84
|
+
// The nodes parent is a transitive dependency of the top-level dependency
|
85
|
+
return (
|
86
|
+
`${parentSpec.topLevelSpec.name}@${parentSpec.topLevelSpec.version} requires ` +
|
87
|
+
`${targetDepName}@${parentSpec.requirement} ` +
|
88
|
+
`via a transitive dependency on ${parentSpec.name}@${parentSpec.version}`
|
89
|
+
);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
function findConflictingParentDependencies(
|
94
|
+
dependency,
|
95
|
+
requirement,
|
96
|
+
targetDep,
|
97
|
+
targetversion,
|
98
|
+
topLevelSpec,
|
99
|
+
lockfileJson,
|
100
|
+
transitiveSpec = {},
|
101
|
+
checkedEntries = new Set(),
|
102
|
+
conflictingParents = new Map()
|
103
|
+
) {
|
104
|
+
// Prevent infinte loops for circular dependencies by only checking each
|
105
|
+
// lockfile entry once
|
106
|
+
const checkedEntry = [dependency, requirement].join("@");
|
107
|
+
if (checkedEntries.has(checkedEntry)) {
|
108
|
+
return conflictingParents;
|
109
|
+
}
|
110
|
+
|
111
|
+
checkedEntries.add(checkedEntry);
|
112
|
+
|
113
|
+
for (const [entry, pkg] of Object.entries(lockfileJson)) {
|
114
|
+
const [_, parentDepName, parentDepRequirement] = entry.match(
|
115
|
+
LOCKFILE_ENTRY_REGEX
|
116
|
+
);
|
117
|
+
// Decorate the top-level dependency spec with an installed version as we
|
118
|
+
// only have the requirement from the package.json manifest
|
119
|
+
if (
|
120
|
+
topLevelSpec.name == parentDepName &&
|
121
|
+
topLevelSpec.requirement == parentDepRequirement
|
122
|
+
) {
|
123
|
+
topLevelSpec.version = pkg.version;
|
124
|
+
}
|
125
|
+
|
126
|
+
if (
|
127
|
+
pkg.dependencies &&
|
128
|
+
dependency == parentDepName &&
|
129
|
+
requirement == parentDepRequirement
|
130
|
+
) {
|
131
|
+
// Recursive check for sub-dependencies finding dependencies that don't
|
132
|
+
// allow the target version of the vulnerable dependency to be installed
|
133
|
+
for (const [subDepName, spec] of Object.entries(pkg.dependencies)) {
|
134
|
+
if (
|
135
|
+
subDepName === targetDep &&
|
136
|
+
!semver.satisfies(targetversion, spec)
|
137
|
+
) {
|
138
|
+
// Only add the conflicting parent once per version preventing
|
139
|
+
// duplicate dependencies from circular graphs
|
140
|
+
const key = [parentDepName, pkg.version].join("@");
|
141
|
+
conflictingParents.set(key, {
|
142
|
+
name: parentDepName,
|
143
|
+
version: pkg.version,
|
144
|
+
requirement: spec,
|
145
|
+
transitiveSpec,
|
146
|
+
topLevelSpec,
|
147
|
+
});
|
148
|
+
} else {
|
149
|
+
// Keep track of the parent dependency as a way to check if the
|
150
|
+
// conflicting dependency ends up being a direct dependency of a
|
151
|
+
// top-level dependency
|
152
|
+
transitiveSpec = {
|
153
|
+
name: parentDepName,
|
154
|
+
version: pkg.version,
|
155
|
+
requirement: parentDepRequirement,
|
156
|
+
};
|
157
|
+
findConflictingParentDependencies(
|
158
|
+
subDepName,
|
159
|
+
spec,
|
160
|
+
targetDep,
|
161
|
+
targetversion,
|
162
|
+
topLevelSpec,
|
163
|
+
lockfileJson,
|
164
|
+
transitiveSpec,
|
165
|
+
checkedEntries,
|
166
|
+
conflictingParents
|
167
|
+
);
|
168
|
+
}
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
return conflictingParents;
|
174
|
+
}
|
175
|
+
|
176
|
+
module.exports = { findConflictingDependencies };
|
@@ -2,6 +2,7 @@ const parse = require("@dependabot/yarn-lib/lib/lockfile/parse").default;
|
|
2
2
|
const stringify = require("@dependabot/yarn-lib/lib/lockfile/stringify")
|
3
3
|
.default;
|
4
4
|
const semver = require("semver");
|
5
|
+
const { LOCKFILE_ENTRY_REGEX } = require("./helpers");
|
5
6
|
|
6
7
|
function flattenIndirectDependencies(packages) {
|
7
8
|
return (packages || []).reduce((acc, { pkg }) => {
|
@@ -24,11 +25,12 @@ module.exports = (data, updatedDependencyName) => {
|
|
24
25
|
const noHeader = !Boolean(data.match(/^# THIS IS AN AU/m));
|
25
26
|
|
26
27
|
const packages = {};
|
27
|
-
const re = /^(.*)@([^@]*?)$/;
|
28
28
|
|
29
29
|
Object.entries(json).forEach(([name, pkg]) => {
|
30
|
-
if (name.match(
|
31
|
-
const [_, packageName, requestedVersion] = name.match(
|
30
|
+
if (name.match(LOCKFILE_ENTRY_REGEX)) {
|
31
|
+
const [_, packageName, requestedVersion] = name.match(
|
32
|
+
LOCKFILE_ENTRY_REGEX
|
33
|
+
);
|
32
34
|
packages[packageName] = packages[packageName] || [];
|
33
35
|
packages[packageName].push(
|
34
36
|
Object.assign({}, { name, pkg, packageName, requestedVersion })
|
data/helpers/lib/yarn/helpers.js
CHANGED
@@ -44,4 +44,11 @@ class LightweightInstall extends Install {
|
|
44
44
|
}
|
45
45
|
}
|
46
46
|
|
47
|
-
|
47
|
+
const LOCKFILE_ENTRY_REGEX = /^(.*)@([^@]*?)$/;
|
48
|
+
|
49
|
+
module.exports = {
|
50
|
+
isString,
|
51
|
+
LightweightAdd,
|
52
|
+
LightweightInstall,
|
53
|
+
LOCKFILE_ENTRY_REGEX,
|
54
|
+
};
|
data/helpers/lib/yarn/index.js
CHANGED
@@ -2,10 +2,13 @@ const lockfileParser = require("./lockfile-parser");
|
|
2
2
|
const updater = require("./updater");
|
3
3
|
const subdependencyUpdater = require("./subdependency-updater");
|
4
4
|
const peerDependencyChecker = require("./peer-dependency-checker");
|
5
|
+
const conflictingDependencyParser = require("./conflicting-dependency-parser");
|
5
6
|
|
6
7
|
module.exports = {
|
7
8
|
parseLockfile: lockfileParser.parse,
|
8
9
|
update: updater.updateDependencyFiles,
|
9
10
|
updateSubdependency: subdependencyUpdater.updateDependencyFile,
|
10
11
|
checkPeerDependencies: peerDependencyChecker.checkPeerDependencies,
|
12
|
+
findConflictingDependencies:
|
13
|
+
conflictingDependencyParser.findConflictingDependencies,
|
11
14
|
};
|
data/helpers/package.json
CHANGED
@@ -10,12 +10,13 @@
|
|
10
10
|
},
|
11
11
|
"dependencies": {
|
12
12
|
"@dependabot/yarn-lib": "^1.21.1",
|
13
|
+
"@npmcli/arborist": "^1.0.12",
|
13
14
|
"detect-indent": "^6.0.0",
|
14
|
-
"npm": "6.14.
|
15
|
+
"npm": "6.14.9",
|
15
16
|
"semver": "^7.3.2"
|
16
17
|
},
|
17
18
|
"devDependencies": {
|
18
|
-
"eslint": "^7.
|
19
|
+
"eslint": "^7.14.0",
|
19
20
|
"eslint-plugin-prettier": "^3.1.4",
|
20
21
|
"jest": "^26.6.2",
|
21
22
|
"prettier": "^2.1.2",
|
@@ -0,0 +1,67 @@
|
|
1
|
+
const path = require("path");
|
2
|
+
const os = require("os");
|
3
|
+
const fs = require("fs");
|
4
|
+
const rimraf = require("rimraf");
|
5
|
+
const {
|
6
|
+
findConflictingDependencies,
|
7
|
+
} = require("../../lib/npm/conflicting-dependency-parser");
|
8
|
+
const helpers = require("./helpers");
|
9
|
+
|
10
|
+
describe("findConflictingDependencies", () => {
|
11
|
+
let tempDir;
|
12
|
+
beforeEach(() => {
|
13
|
+
tempDir = fs.mkdtempSync(os.tmpdir() + path.sep);
|
14
|
+
});
|
15
|
+
afterEach(() => rimraf.sync(tempDir));
|
16
|
+
|
17
|
+
it("finds conflicting dependencies", async () => {
|
18
|
+
helpers.copyDependencies("conflicting-dependency-parser/simple", tempDir);
|
19
|
+
|
20
|
+
const result = await findConflictingDependencies(tempDir, "abind", "2.0.0");
|
21
|
+
expect(result).toEqual([
|
22
|
+
{
|
23
|
+
explanation: "objnest@4.1.2 requires abind@^1.0.0",
|
24
|
+
name: "objnest",
|
25
|
+
version: "4.1.2",
|
26
|
+
requirement: "^1.0.0",
|
27
|
+
},
|
28
|
+
]);
|
29
|
+
});
|
30
|
+
|
31
|
+
it("finds the top-level conflicting dependency", async () => {
|
32
|
+
helpers.copyDependencies("conflicting-dependency-parser/nested", tempDir);
|
33
|
+
|
34
|
+
const result = await findConflictingDependencies(tempDir, "abind", "2.0.0");
|
35
|
+
expect(result).toEqual([
|
36
|
+
{
|
37
|
+
explanation: "askconfig@4.0.4 requires abind@^1.0.4 via objnest@5.0.10",
|
38
|
+
name: "objnest",
|
39
|
+
version: "5.0.10",
|
40
|
+
requirement: "^1.0.4",
|
41
|
+
},
|
42
|
+
]);
|
43
|
+
});
|
44
|
+
|
45
|
+
it("explains a deeply nested dependency", async () => {
|
46
|
+
helpers.copyDependencies(
|
47
|
+
"conflicting-dependency-parser/deeply-nested",
|
48
|
+
tempDir
|
49
|
+
);
|
50
|
+
|
51
|
+
const result = await findConflictingDependencies(tempDir, "abind", "2.0.0");
|
52
|
+
expect(result).toEqual([
|
53
|
+
{
|
54
|
+
explanation: "apass@1.1.0 requires abind@^1.0.0 via cipherjson@2.1.0",
|
55
|
+
name: "cipherjson",
|
56
|
+
version: "2.1.0",
|
57
|
+
requirement: "^1.0.0",
|
58
|
+
},
|
59
|
+
{
|
60
|
+
explanation: `apass@1.1.0 requires abind@^1.0.0 via a transitive dependency on objnest@3.0.9`,
|
61
|
+
name: "objnest",
|
62
|
+
version: "3.0.9",
|
63
|
+
requirement: "^1.0.0",
|
64
|
+
},
|
65
|
+
]);
|
66
|
+
});
|
67
|
+
});
|
@@ -0,0 +1,565 @@
|
|
1
|
+
{
|
2
|
+
"name": "test",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"lockfileVersion": 1,
|
5
|
+
"requires": true,
|
6
|
+
"dependencies": {
|
7
|
+
"abind": {
|
8
|
+
"version": "1.0.5",
|
9
|
+
"resolved": "https://registry.npmjs.org/abind/-/abind-1.0.5.tgz",
|
10
|
+
"integrity": "sha512-dbaEZphdPje0ihqSdWg36Sb8S20TuqQomiz2593oIx+enQ9Q4vDZRjIzhnkWltGRKVKqC28kTribkgRLBexWVQ=="
|
11
|
+
},
|
12
|
+
"aglob": {
|
13
|
+
"version": "2.0.1",
|
14
|
+
"resolved": "https://registry.npmjs.org/aglob/-/aglob-2.0.1.tgz",
|
15
|
+
"integrity": "sha1-kl7PJC11AkLAcVrNMy+V90kGZhQ=",
|
16
|
+
"requires": {
|
17
|
+
"co": "^4.6.0",
|
18
|
+
"glob": "^7.1.1"
|
19
|
+
}
|
20
|
+
},
|
21
|
+
"ansi-regex": {
|
22
|
+
"version": "2.1.1",
|
23
|
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
24
|
+
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
|
25
|
+
},
|
26
|
+
"apass": {
|
27
|
+
"version": "1.1.0",
|
28
|
+
"resolved": "https://registry.npmjs.org/apass/-/apass-1.1.0.tgz",
|
29
|
+
"integrity": "sha1-WNdSImWxQTtctC/2v/CfIaKDVpc=",
|
30
|
+
"requires": {
|
31
|
+
"asfs": "^1.1.1",
|
32
|
+
"askconfig": "^3.0.5",
|
33
|
+
"cipherjson": "^2.1.0",
|
34
|
+
"co": "^4.6.0",
|
35
|
+
"colorprint": "^4.1.0",
|
36
|
+
"commander": "^2.9.0",
|
37
|
+
"execcli": "^4.0.10",
|
38
|
+
"fmtjson": "^3.0.7"
|
39
|
+
}
|
40
|
+
},
|
41
|
+
"argx": {
|
42
|
+
"version": "3.0.2",
|
43
|
+
"resolved": "https://registry.npmjs.org/argx/-/argx-3.0.2.tgz",
|
44
|
+
"integrity": "sha1-G6qI0WCrb1Rrbs4OB1lswrs0JKk=",
|
45
|
+
"requires": {
|
46
|
+
"iftype": "^3.0.0"
|
47
|
+
}
|
48
|
+
},
|
49
|
+
"arrayreduce": {
|
50
|
+
"version": "2.1.0",
|
51
|
+
"resolved": "https://registry.npmjs.org/arrayreduce/-/arrayreduce-2.1.0.tgz",
|
52
|
+
"integrity": "sha1-6lg24whra1S3pWK0eez4BpyU0Qo="
|
53
|
+
},
|
54
|
+
"asfs": {
|
55
|
+
"version": "1.2.3",
|
56
|
+
"resolved": "https://registry.npmjs.org/asfs/-/asfs-1.2.3.tgz",
|
57
|
+
"integrity": "sha1-VnE2PoPEOQjvFaJciBkcYbUICDM=",
|
58
|
+
"requires": {
|
59
|
+
"aglob": "^2.0.1",
|
60
|
+
"co": "^4.6.0",
|
61
|
+
"filecopy": "^3.0.0",
|
62
|
+
"mkdirp": "^0.5.1"
|
63
|
+
}
|
64
|
+
},
|
65
|
+
"askconfig": {
|
66
|
+
"version": "3.0.5",
|
67
|
+
"resolved": "https://registry.npmjs.org/askconfig/-/askconfig-3.0.5.tgz",
|
68
|
+
"integrity": "sha1-PwcA078U8w44yAH57QDC2Wgqne0=",
|
69
|
+
"requires": {
|
70
|
+
"argx": "^3.0.0",
|
71
|
+
"cli-color": "^1.1.0",
|
72
|
+
"co": "^4.6.0",
|
73
|
+
"objnest": "^3.0.6"
|
74
|
+
}
|
75
|
+
},
|
76
|
+
"asleep": {
|
77
|
+
"version": "1.0.3",
|
78
|
+
"resolved": "https://registry.npmjs.org/asleep/-/asleep-1.0.3.tgz",
|
79
|
+
"integrity": "sha1-oQTiSsIpVjxCXk6n51tXihnuIY4="
|
80
|
+
},
|
81
|
+
"async": {
|
82
|
+
"version": "2.6.3",
|
83
|
+
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
|
84
|
+
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
|
85
|
+
"requires": {
|
86
|
+
"lodash": "^4.17.14"
|
87
|
+
}
|
88
|
+
},
|
89
|
+
"babel-runtime": {
|
90
|
+
"version": "6.26.0",
|
91
|
+
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
|
92
|
+
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
|
93
|
+
"requires": {
|
94
|
+
"core-js": "^2.4.0",
|
95
|
+
"regenerator-runtime": "^0.11.0"
|
96
|
+
}
|
97
|
+
},
|
98
|
+
"balanced-match": {
|
99
|
+
"version": "1.0.0",
|
100
|
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
101
|
+
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
102
|
+
},
|
103
|
+
"brace-expansion": {
|
104
|
+
"version": "1.1.11",
|
105
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
106
|
+
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
107
|
+
"requires": {
|
108
|
+
"balanced-match": "^1.0.0",
|
109
|
+
"concat-map": "0.0.1"
|
110
|
+
}
|
111
|
+
},
|
112
|
+
"cipherjson": {
|
113
|
+
"version": "2.1.0",
|
114
|
+
"resolved": "https://registry.npmjs.org/cipherjson/-/cipherjson-2.1.0.tgz",
|
115
|
+
"integrity": "sha1-NxWib+PkEKL2W9jQw3jnzdei0eI=",
|
116
|
+
"requires": {
|
117
|
+
"abind": "^1.0.0",
|
118
|
+
"argx": "^3.0.2",
|
119
|
+
"async": "^2.1.4",
|
120
|
+
"objnest": "^3.0.9",
|
121
|
+
"writeout": "^2.1.0"
|
122
|
+
}
|
123
|
+
},
|
124
|
+
"cli-color": {
|
125
|
+
"version": "1.4.0",
|
126
|
+
"resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz",
|
127
|
+
"integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==",
|
128
|
+
"requires": {
|
129
|
+
"ansi-regex": "^2.1.1",
|
130
|
+
"d": "1",
|
131
|
+
"es5-ext": "^0.10.46",
|
132
|
+
"es6-iterator": "^2.0.3",
|
133
|
+
"memoizee": "^0.4.14",
|
134
|
+
"timers-ext": "^0.1.5"
|
135
|
+
}
|
136
|
+
},
|
137
|
+
"co": {
|
138
|
+
"version": "4.6.0",
|
139
|
+
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
|
140
|
+
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
|
141
|
+
},
|
142
|
+
"colorprint": {
|
143
|
+
"version": "4.1.0",
|
144
|
+
"resolved": "https://registry.npmjs.org/colorprint/-/colorprint-4.1.0.tgz",
|
145
|
+
"integrity": "sha1-BSroTEv9Ed7l7xvwfC9iVYT8CYk=",
|
146
|
+
"requires": {
|
147
|
+
"cli-color": "^1.1.0",
|
148
|
+
"commander": "^2.9.0"
|
149
|
+
}
|
150
|
+
},
|
151
|
+
"commander": {
|
152
|
+
"version": "2.20.3",
|
153
|
+
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
154
|
+
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
|
155
|
+
},
|
156
|
+
"concat-map": {
|
157
|
+
"version": "0.0.1",
|
158
|
+
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
159
|
+
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
160
|
+
},
|
161
|
+
"core-js": {
|
162
|
+
"version": "2.6.11",
|
163
|
+
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
|
164
|
+
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
|
165
|
+
},
|
166
|
+
"d": {
|
167
|
+
"version": "1.0.1",
|
168
|
+
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
|
169
|
+
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
|
170
|
+
"requires": {
|
171
|
+
"es5-ext": "^0.10.50",
|
172
|
+
"type": "^1.0.1"
|
173
|
+
}
|
174
|
+
},
|
175
|
+
"es5-ext": {
|
176
|
+
"version": "0.10.53",
|
177
|
+
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
|
178
|
+
"integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
|
179
|
+
"requires": {
|
180
|
+
"es6-iterator": "~2.0.3",
|
181
|
+
"es6-symbol": "~3.1.3",
|
182
|
+
"next-tick": "~1.0.0"
|
183
|
+
}
|
184
|
+
},
|
185
|
+
"es6-iterator": {
|
186
|
+
"version": "2.0.3",
|
187
|
+
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
|
188
|
+
"integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
|
189
|
+
"requires": {
|
190
|
+
"d": "1",
|
191
|
+
"es5-ext": "^0.10.35",
|
192
|
+
"es6-symbol": "^3.1.1"
|
193
|
+
}
|
194
|
+
},
|
195
|
+
"es6-symbol": {
|
196
|
+
"version": "3.1.3",
|
197
|
+
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
|
198
|
+
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
|
199
|
+
"requires": {
|
200
|
+
"d": "^1.0.1",
|
201
|
+
"ext": "^1.1.2"
|
202
|
+
}
|
203
|
+
},
|
204
|
+
"es6-weak-map": {
|
205
|
+
"version": "2.0.3",
|
206
|
+
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
|
207
|
+
"integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
|
208
|
+
"requires": {
|
209
|
+
"d": "1",
|
210
|
+
"es5-ext": "^0.10.46",
|
211
|
+
"es6-iterator": "^2.0.3",
|
212
|
+
"es6-symbol": "^3.1.1"
|
213
|
+
}
|
214
|
+
},
|
215
|
+
"event-emitter": {
|
216
|
+
"version": "0.3.5",
|
217
|
+
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
|
218
|
+
"integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
|
219
|
+
"requires": {
|
220
|
+
"d": "1",
|
221
|
+
"es5-ext": "~0.10.14"
|
222
|
+
}
|
223
|
+
},
|
224
|
+
"execcli": {
|
225
|
+
"version": "4.0.11",
|
226
|
+
"resolved": "https://registry.npmjs.org/execcli/-/execcli-4.0.11.tgz",
|
227
|
+
"integrity": "sha1-PbmCCoP6EkK5v7UNEVUdBQWSfUM=",
|
228
|
+
"requires": {
|
229
|
+
"argx": "^3.0.0",
|
230
|
+
"arrayreduce": "^2.1.0",
|
231
|
+
"babel-runtime": "^6.23.0",
|
232
|
+
"findout": "^2.0.1",
|
233
|
+
"hasbin": "^1.2.3",
|
234
|
+
"stringcase": "^3.2.1"
|
235
|
+
}
|
236
|
+
},
|
237
|
+
"ext": {
|
238
|
+
"version": "1.4.0",
|
239
|
+
"resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
|
240
|
+
"integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
|
241
|
+
"requires": {
|
242
|
+
"type": "^2.0.0"
|
243
|
+
},
|
244
|
+
"dependencies": {
|
245
|
+
"type": {
|
246
|
+
"version": "2.1.0",
|
247
|
+
"resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz",
|
248
|
+
"integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA=="
|
249
|
+
}
|
250
|
+
}
|
251
|
+
},
|
252
|
+
"extend": {
|
253
|
+
"version": "3.0.2",
|
254
|
+
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
255
|
+
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
|
256
|
+
},
|
257
|
+
"filecopy": {
|
258
|
+
"version": "3.0.1",
|
259
|
+
"resolved": "https://registry.npmjs.org/filecopy/-/filecopy-3.0.1.tgz",
|
260
|
+
"integrity": "sha1-hqX4pylo7K6qW7suPoEKh3zUmWY=",
|
261
|
+
"requires": {
|
262
|
+
"aglob": "^2.0.1",
|
263
|
+
"argx": "^3.0.0",
|
264
|
+
"co": "^4.6.0",
|
265
|
+
"mkdirp": "^0.5.1"
|
266
|
+
}
|
267
|
+
},
|
268
|
+
"filedel": {
|
269
|
+
"version": "4.1.2",
|
270
|
+
"resolved": "https://registry.npmjs.org/filedel/-/filedel-4.1.2.tgz",
|
271
|
+
"integrity": "sha512-GmCi+mLI3DgGFde0W3vsZshRtSBK5BxTkrVLioGLoARBY5Ef42anaXP1PmQTI6AI/TVoM8Mkw5mBisGy5MPlTA==",
|
272
|
+
"requires": {
|
273
|
+
"aglob": "^3.0.2",
|
274
|
+
"argx": "^4.0.4",
|
275
|
+
"asfs": "^2.3.0",
|
276
|
+
"rimraf": "^3.0.2"
|
277
|
+
},
|
278
|
+
"dependencies": {
|
279
|
+
"aglob": {
|
280
|
+
"version": "3.0.2",
|
281
|
+
"resolved": "https://registry.npmjs.org/aglob/-/aglob-3.0.2.tgz",
|
282
|
+
"integrity": "sha512-0khk6p36zn0NbYAMtNov7o4VQpWOZChVt+cQHIEb0KSqxNn5hvGU2+pPI5+6vydUhe8W3ZxREMcpkAmMEi8p9Q==",
|
283
|
+
"requires": {
|
284
|
+
"glob": "^7.1.3"
|
285
|
+
}
|
286
|
+
},
|
287
|
+
"argx": {
|
288
|
+
"version": "4.0.4",
|
289
|
+
"resolved": "https://registry.npmjs.org/argx/-/argx-4.0.4.tgz",
|
290
|
+
"integrity": "sha512-XLWeRTNBJRzQkbMweLIxdtnvpE7iYUBraPwrIJX57FjL4D1RHLMJRM1AyEP6KZHgvjW7TSnxF8MpGic7YdTGOA==",
|
291
|
+
"requires": {
|
292
|
+
"iftype": "^4.0.9"
|
293
|
+
}
|
294
|
+
},
|
295
|
+
"asfs": {
|
296
|
+
"version": "2.3.0",
|
297
|
+
"resolved": "https://registry.npmjs.org/asfs/-/asfs-2.3.0.tgz",
|
298
|
+
"integrity": "sha512-mPfLlrZuoDFjR0Cd9ructfhJ4Cq0OH3CNVaO2RjMk+I9Utfb28sxFdnAVPByziTzTh2jgd7wX7Wy+8LIBjz2nw==",
|
299
|
+
"requires": {
|
300
|
+
"aglob": "^3.0.1",
|
301
|
+
"filecopy": "^4.1.0",
|
302
|
+
"mkdirp": "^1.0.3"
|
303
|
+
}
|
304
|
+
},
|
305
|
+
"filecopy": {
|
306
|
+
"version": "4.1.0",
|
307
|
+
"resolved": "https://registry.npmjs.org/filecopy/-/filecopy-4.1.0.tgz",
|
308
|
+
"integrity": "sha512-1K2VHl+WVzODCwcZzmSrNCUIYTM37F4/yny0bI05bN3PdQHZjfszsW2L2yia7/Xb1B854f6XrA3ZTv0KjBmogA==",
|
309
|
+
"requires": {
|
310
|
+
"aglob": "^3.0.2",
|
311
|
+
"argx": "^4.0.4",
|
312
|
+
"mkdirp": "^1.0.3"
|
313
|
+
}
|
314
|
+
},
|
315
|
+
"iftype": {
|
316
|
+
"version": "4.0.9",
|
317
|
+
"resolved": "https://registry.npmjs.org/iftype/-/iftype-4.0.9.tgz",
|
318
|
+
"integrity": "sha512-01Klo+04dkDzY193D1GVfOdQzmpqaYFJTAlZKRztkT/BOaU7sSnvxGimSln+7DMqLUP4tpDTNFgxqVPLYZVypA=="
|
319
|
+
},
|
320
|
+
"mkdirp": {
|
321
|
+
"version": "1.0.4",
|
322
|
+
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
323
|
+
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
|
324
|
+
}
|
325
|
+
}
|
326
|
+
},
|
327
|
+
"findout": {
|
328
|
+
"version": "2.1.2",
|
329
|
+
"resolved": "https://registry.npmjs.org/findout/-/findout-2.1.2.tgz",
|
330
|
+
"integrity": "sha1-eEFc9z7Z4nwC4pqbxETn0ir2AQU=",
|
331
|
+
"requires": {
|
332
|
+
"babel-runtime": "^6.11.6",
|
333
|
+
"co": "^4.6.0"
|
334
|
+
}
|
335
|
+
},
|
336
|
+
"fmtjson": {
|
337
|
+
"version": "3.0.7",
|
338
|
+
"resolved": "https://registry.npmjs.org/fmtjson/-/fmtjson-3.0.7.tgz",
|
339
|
+
"integrity": "sha1-eGM+7hRk33CotIRWfN7rS+j/08w=",
|
340
|
+
"requires": {
|
341
|
+
"aglob": "^1.0.2",
|
342
|
+
"argx": "^3.0.1",
|
343
|
+
"asfs": "^1.0.5",
|
344
|
+
"co": "^4.6.0",
|
345
|
+
"writeout": "^2.0.7"
|
346
|
+
},
|
347
|
+
"dependencies": {
|
348
|
+
"aglob": {
|
349
|
+
"version": "1.1.1",
|
350
|
+
"resolved": "https://registry.npmjs.org/aglob/-/aglob-1.1.1.tgz",
|
351
|
+
"integrity": "sha1-+VJpKq29nVKHdekUtpXgdjH58Io=",
|
352
|
+
"requires": {
|
353
|
+
"babel-runtime": "^6.11.6",
|
354
|
+
"co": "^4.6.0",
|
355
|
+
"glob": "^7.0.5"
|
356
|
+
}
|
357
|
+
}
|
358
|
+
}
|
359
|
+
},
|
360
|
+
"fs.realpath": {
|
361
|
+
"version": "1.0.0",
|
362
|
+
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
363
|
+
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
|
364
|
+
},
|
365
|
+
"glob": {
|
366
|
+
"version": "7.1.6",
|
367
|
+
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
|
368
|
+
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
|
369
|
+
"requires": {
|
370
|
+
"fs.realpath": "^1.0.0",
|
371
|
+
"inflight": "^1.0.4",
|
372
|
+
"inherits": "2",
|
373
|
+
"minimatch": "^3.0.4",
|
374
|
+
"once": "^1.3.0",
|
375
|
+
"path-is-absolute": "^1.0.0"
|
376
|
+
}
|
377
|
+
},
|
378
|
+
"hasbin": {
|
379
|
+
"version": "1.2.3",
|
380
|
+
"resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz",
|
381
|
+
"integrity": "sha1-eMWSaJPIAhXCtWiuH9P8q3omlrA=",
|
382
|
+
"requires": {
|
383
|
+
"async": "~1.5"
|
384
|
+
},
|
385
|
+
"dependencies": {
|
386
|
+
"async": {
|
387
|
+
"version": "1.5.2",
|
388
|
+
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
389
|
+
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
390
|
+
}
|
391
|
+
}
|
392
|
+
},
|
393
|
+
"iftype": {
|
394
|
+
"version": "3.0.2",
|
395
|
+
"resolved": "https://registry.npmjs.org/iftype/-/iftype-3.0.2.tgz",
|
396
|
+
"integrity": "sha1-V3EmHmT7NaaA0yDTZox1Kfklq3Q=",
|
397
|
+
"requires": {
|
398
|
+
"babel-runtime": "^6.11.6"
|
399
|
+
}
|
400
|
+
},
|
401
|
+
"inflight": {
|
402
|
+
"version": "1.0.6",
|
403
|
+
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
404
|
+
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
405
|
+
"requires": {
|
406
|
+
"once": "^1.3.0",
|
407
|
+
"wrappy": "1"
|
408
|
+
}
|
409
|
+
},
|
410
|
+
"inherits": {
|
411
|
+
"version": "2.0.4",
|
412
|
+
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
413
|
+
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
414
|
+
},
|
415
|
+
"is-promise": {
|
416
|
+
"version": "2.2.2",
|
417
|
+
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
|
418
|
+
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
|
419
|
+
},
|
420
|
+
"lodash": {
|
421
|
+
"version": "4.17.20",
|
422
|
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
423
|
+
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
|
424
|
+
},
|
425
|
+
"lru-queue": {
|
426
|
+
"version": "0.1.0",
|
427
|
+
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
|
428
|
+
"integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
|
429
|
+
"requires": {
|
430
|
+
"es5-ext": "~0.10.2"
|
431
|
+
}
|
432
|
+
},
|
433
|
+
"memoizee": {
|
434
|
+
"version": "0.4.14",
|
435
|
+
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
|
436
|
+
"integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
|
437
|
+
"requires": {
|
438
|
+
"d": "1",
|
439
|
+
"es5-ext": "^0.10.45",
|
440
|
+
"es6-weak-map": "^2.0.2",
|
441
|
+
"event-emitter": "^0.3.5",
|
442
|
+
"is-promise": "^2.1",
|
443
|
+
"lru-queue": "0.1",
|
444
|
+
"next-tick": "1",
|
445
|
+
"timers-ext": "^0.1.5"
|
446
|
+
}
|
447
|
+
},
|
448
|
+
"minimatch": {
|
449
|
+
"version": "3.0.4",
|
450
|
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
451
|
+
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
452
|
+
"requires": {
|
453
|
+
"brace-expansion": "^1.1.7"
|
454
|
+
}
|
455
|
+
},
|
456
|
+
"minimist": {
|
457
|
+
"version": "1.2.5",
|
458
|
+
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
459
|
+
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
460
|
+
},
|
461
|
+
"mkdirp": {
|
462
|
+
"version": "0.5.5",
|
463
|
+
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
|
464
|
+
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
|
465
|
+
"requires": {
|
466
|
+
"minimist": "^1.2.5"
|
467
|
+
}
|
468
|
+
},
|
469
|
+
"next-tick": {
|
470
|
+
"version": "1.0.0",
|
471
|
+
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
|
472
|
+
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
|
473
|
+
},
|
474
|
+
"objnest": {
|
475
|
+
"version": "3.0.9",
|
476
|
+
"resolved": "https://registry.npmjs.org/objnest/-/objnest-3.0.9.tgz",
|
477
|
+
"integrity": "sha1-yBHtOVXPRgO6Ncx+A0j+oZUbk5U=",
|
478
|
+
"requires": {
|
479
|
+
"abind": "^1.0.0",
|
480
|
+
"extend": "^3.0.0"
|
481
|
+
}
|
482
|
+
},
|
483
|
+
"once": {
|
484
|
+
"version": "1.4.0",
|
485
|
+
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
486
|
+
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
487
|
+
"requires": {
|
488
|
+
"wrappy": "1"
|
489
|
+
}
|
490
|
+
},
|
491
|
+
"path-is-absolute": {
|
492
|
+
"version": "1.0.1",
|
493
|
+
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
494
|
+
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
|
495
|
+
},
|
496
|
+
"regenerator-runtime": {
|
497
|
+
"version": "0.11.1",
|
498
|
+
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
|
499
|
+
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
|
500
|
+
},
|
501
|
+
"rimraf": {
|
502
|
+
"version": "3.0.2",
|
503
|
+
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
|
504
|
+
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
|
505
|
+
"requires": {
|
506
|
+
"glob": "^7.1.3"
|
507
|
+
}
|
508
|
+
},
|
509
|
+
"stringcase": {
|
510
|
+
"version": "3.2.1",
|
511
|
+
"resolved": "https://registry.npmjs.org/stringcase/-/stringcase-3.2.1.tgz",
|
512
|
+
"integrity": "sha1-iTRRYwSXZM92q89c4Ctkv7ZHLlY="
|
513
|
+
},
|
514
|
+
"timers-ext": {
|
515
|
+
"version": "0.1.7",
|
516
|
+
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
|
517
|
+
"integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
|
518
|
+
"requires": {
|
519
|
+
"es5-ext": "~0.10.46",
|
520
|
+
"next-tick": "1"
|
521
|
+
}
|
522
|
+
},
|
523
|
+
"type": {
|
524
|
+
"version": "1.2.0",
|
525
|
+
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
|
526
|
+
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
|
527
|
+
},
|
528
|
+
"wrappy": {
|
529
|
+
"version": "1.0.2",
|
530
|
+
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
531
|
+
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
532
|
+
},
|
533
|
+
"writeout": {
|
534
|
+
"version": "2.3.4",
|
535
|
+
"resolved": "https://registry.npmjs.org/writeout/-/writeout-2.3.4.tgz",
|
536
|
+
"integrity": "sha512-8EO+2MdDKvyhVGGA7hXtCOWIyfpzi1PAkmYTFUhq3/duskEDYzcDvZTiYgVV/CectCRSelGdIW++ym58uNOuYw==",
|
537
|
+
"requires": {
|
538
|
+
"argx": "^4.0.4",
|
539
|
+
"asleep": "^1.0.3",
|
540
|
+
"filedel": "^4.1.2",
|
541
|
+
"mkdirp": "^1.0.4"
|
542
|
+
},
|
543
|
+
"dependencies": {
|
544
|
+
"argx": {
|
545
|
+
"version": "4.0.4",
|
546
|
+
"resolved": "https://registry.npmjs.org/argx/-/argx-4.0.4.tgz",
|
547
|
+
"integrity": "sha512-XLWeRTNBJRzQkbMweLIxdtnvpE7iYUBraPwrIJX57FjL4D1RHLMJRM1AyEP6KZHgvjW7TSnxF8MpGic7YdTGOA==",
|
548
|
+
"requires": {
|
549
|
+
"iftype": "^4.0.9"
|
550
|
+
}
|
551
|
+
},
|
552
|
+
"iftype": {
|
553
|
+
"version": "4.0.9",
|
554
|
+
"resolved": "https://registry.npmjs.org/iftype/-/iftype-4.0.9.tgz",
|
555
|
+
"integrity": "sha512-01Klo+04dkDzY193D1GVfOdQzmpqaYFJTAlZKRztkT/BOaU7sSnvxGimSln+7DMqLUP4tpDTNFgxqVPLYZVypA=="
|
556
|
+
},
|
557
|
+
"mkdirp": {
|
558
|
+
"version": "1.0.4",
|
559
|
+
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
560
|
+
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
|
561
|
+
}
|
562
|
+
}
|
563
|
+
}
|
564
|
+
}
|
565
|
+
}
|