dependabot-npm_and_yarn 0.125.2 → 0.125.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/README.md +29 -0
  3. data/helpers/lib/npm/conflicting-dependency-parser.js +43 -13
  4. data/helpers/lib/yarn/conflicting-dependency-parser.js +148 -11
  5. data/helpers/package.json +5 -5
  6. data/helpers/test/npm/conflicting-dependency-parser.test.js +67 -0
  7. data/helpers/test/npm/fixtures/conflicting-dependency-parser/deeply-nested/package-lock.json +565 -0
  8. data/helpers/test/npm/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
  9. data/helpers/test/npm/fixtures/conflicting-dependency-parser/nested/package-lock.json +188 -0
  10. data/helpers/test/npm/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
  11. data/helpers/test/npm/fixtures/conflicting-dependency-parser/simple/package-lock.json +27 -0
  12. data/helpers/test/npm/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
  13. data/helpers/test/npm/helpers.js +14 -0
  14. data/helpers/test/npm/updater.test.js +1 -15
  15. data/helpers/test/yarn/conflicting-dependency-parser.test.js +84 -0
  16. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
  17. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/yarn.lock +496 -0
  18. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/package.json +14 -0
  19. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/yarn.lock +21 -0
  20. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
  21. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/yarn.lock +172 -0
  22. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
  23. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/yarn.lock +21 -0
  24. data/helpers/test/yarn/helpers.js +11 -0
  25. data/helpers/yarn.lock +124 -83
  26. data/lib/dependabot/npm_and_yarn/file_parser/lockfile_parser.rb +3 -3
  27. data/lib/dependabot/npm_and_yarn/file_updater/npm_lockfile_updater.rb +1 -1
  28. data/lib/dependabot/npm_and_yarn/update_checker.rb +1 -1
  29. data/lib/dependabot/npm_and_yarn/update_checker/conflicting_dependency_resolver.rb +9 -3
  30. data/lib/dependabot/npm_and_yarn/update_checker/latest_version_finder.rb +3 -1
  31. metadata +27 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae99e6c36cdc88f0f62dec813df98ff581a0468d356457eef51008b847f034c6
4
- data.tar.gz: 4a3eb575fab37826d0f2dfa1cb443a63c347602d30448b4e30688d99ae880353
3
+ metadata.gz: e88189590eb01dfeb8fad3851dc497eceafc3b46e81fcf39579f2f547b33a053
4
+ data.tar.gz: c609ca903390320ef312ad88737d403f1adfb558ccc48a1de2494cf65a8c6e8a
5
5
  SHA512:
6
- metadata.gz: '08c996cc22935cfa3945f517e3c10954d26290d94276c380f1cbca824e3dd92a2a147f4d37612ed3251f8729f39ee1d997511b3954cb579f1dcc17ad71d42264'
7
- data.tar.gz: 9c636874c74ed0818fa1d79b0eb2e545a293435d89cdc97b1ec045e9e1566af851eb6e004c6e1b4004f365054c4db633a626e343c6d3996592d252562f837144
6
+ metadata.gz: ba52aa70e4ce22621245958937751ceeb7b981864a5d0120713bfd5c626ef440aa379bf21074fe9e472306f7627c5bc499d91a83eb61e536709d40b5b15a8883
7
+ data.tar.gz: 39d1ec4278a78e1e2e0fde846fb3b7ab7c67b96aa9fdcee322f874aef0eb2e689c0b941b8e47580db403a1ebb1e7ef2b4d5d6c6af209884e053546ec39683626
@@ -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.
@@ -18,22 +18,19 @@ async function findConflictingDependencies(directory, depName, targetVersion) {
18
18
  });
19
19
 
20
20
  return await arb.loadVirtual().then((tree) => {
21
- var parents = [];
22
-
21
+ const parents = [];
23
22
  for (const node of tree.inventory.query("name", depName)) {
24
23
  for (const edge of node.edgesIn) {
25
24
  if (!semver.satisfies(targetVersion, edge.spec)) {
26
- var parentVersion;
27
- for (const fromEdge of edge.from.edgesIn.values()) {
28
- if (fromEdge.name == edge.from.name) {
29
- parentVersion = edge.from.version;
30
- }
31
- }
32
-
33
- parents.push({
34
- name: edge.from.name,
35
- version: parentVersion,
36
- requirement: 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
+ });
37
34
  });
38
35
  }
39
36
  }
@@ -43,4 +40,37 @@ async function findConflictingDependencies(directory, depName, targetVersion) {
43
40
  });
44
41
  }
45
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
+
46
76
  module.exports = { findConflictingDependencies };
@@ -9,31 +9,168 @@
9
9
  * - An array of objects with conflicting dependencies
10
10
  */
11
11
 
12
+ const fs = require("fs");
13
+ const path = require("path");
12
14
  const semver = require("semver");
13
15
  const { parse } = require("./lockfile-parser");
14
16
  const { LOCKFILE_ENTRY_REGEX } = require("./helpers");
15
17
 
16
18
  async function findConflictingDependencies(directory, depName, targetVersion) {
17
- var parents = [];
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
+ );
18
51
 
19
- const json = await parse(directory);
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
+ }
20
92
 
21
- Object.entries(json).forEach(([entry, pkg]) => {
22
- if (entry.match(LOCKFILE_ENTRY_REGEX) && pkg.dependencies) {
23
- Object.entries(pkg.dependencies).forEach(([subDepName, spec]) => {
24
- if (subDepName === depName && !semver.satisfies(targetVersion, spec)) {
25
- const [_, parentDepName] = entry.match(LOCKFILE_ENTRY_REGEX);
26
- parents.push({
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, {
27
142
  name: parentDepName,
28
143
  version: pkg.version,
29
144
  requirement: spec,
145
+ transitiveSpec,
146
+ topLevelSpec,
30
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
+ );
31
168
  }
32
- });
169
+ }
33
170
  }
34
- });
171
+ }
35
172
 
36
- return parents;
173
+ return conflictingParents;
37
174
  }
38
175
 
39
176
  module.exports = { findConflictingDependencies };
@@ -10,16 +10,16 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@dependabot/yarn-lib": "^1.21.1",
13
- "@npmcli/arborist": "^1.0.9",
13
+ "@npmcli/arborist": "^1.0.13",
14
14
  "detect-indent": "^6.0.0",
15
- "npm": "6.14.8",
15
+ "npm": "6.14.9",
16
16
  "semver": "^7.3.2"
17
17
  },
18
18
  "devDependencies": {
19
- "eslint": "^7.12.1",
19
+ "eslint": "^7.14.0",
20
20
  "eslint-plugin-prettier": "^3.1.4",
21
- "jest": "^26.6.2",
22
- "prettier": "^2.1.2",
21
+ "jest": "^26.6.3",
22
+ "prettier": "^2.2.1",
23
23
  "rimraf": "^3.0.2"
24
24
  }
25
25
  }
@@ -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
+ }