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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/README.md +29 -0
  3. data/helpers/lib/npm/conflicting-dependency-parser.js +76 -0
  4. data/helpers/lib/npm/index.js +3 -0
  5. data/helpers/lib/yarn/conflicting-dependency-parser.js +176 -0
  6. data/helpers/lib/yarn/fix-duplicates.js +5 -3
  7. data/helpers/lib/yarn/helpers.js +8 -1
  8. data/helpers/lib/yarn/index.js +3 -0
  9. data/helpers/package.json +3 -2
  10. data/helpers/test/npm/conflicting-dependency-parser.test.js +67 -0
  11. data/helpers/test/npm/fixtures/conflicting-dependency-parser/deeply-nested/package-lock.json +565 -0
  12. data/helpers/test/npm/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
  13. data/helpers/test/npm/fixtures/conflicting-dependency-parser/nested/package-lock.json +188 -0
  14. data/helpers/test/npm/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
  15. data/helpers/test/npm/fixtures/conflicting-dependency-parser/simple/package-lock.json +27 -0
  16. data/helpers/test/npm/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
  17. data/helpers/test/npm/helpers.js +14 -0
  18. data/helpers/test/npm/updater.test.js +1 -15
  19. data/helpers/test/yarn/conflicting-dependency-parser.test.js +84 -0
  20. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
  21. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/yarn.lock +496 -0
  22. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/package.json +14 -0
  23. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/yarn.lock +21 -0
  24. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
  25. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/yarn.lock +172 -0
  26. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
  27. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/yarn.lock +21 -0
  28. data/helpers/test/yarn/helpers.js +11 -0
  29. data/helpers/yarn.lock +625 -30
  30. data/lib/dependabot/npm_and_yarn/file_fetcher.rb +2 -6
  31. data/lib/dependabot/npm_and_yarn/file_updater/npm_lockfile_updater.rb +1 -3
  32. data/lib/dependabot/npm_and_yarn/file_updater/npmrc_builder.rb +2 -6
  33. data/lib/dependabot/npm_and_yarn/file_updater/yarn_lockfile_updater.rb +5 -15
  34. data/lib/dependabot/npm_and_yarn/metadata_finder.rb +3 -9
  35. data/lib/dependabot/npm_and_yarn/requirement.rb +2 -6
  36. data/lib/dependabot/npm_and_yarn/update_checker.rb +15 -12
  37. data/lib/dependabot/npm_and_yarn/update_checker/conflicting_dependency_resolver.rb +69 -0
  38. data/lib/dependabot/npm_and_yarn/update_checker/dependency_files_builder.rb +94 -0
  39. data/lib/dependabot/npm_and_yarn/update_checker/latest_version_finder.rb +2 -6
  40. data/lib/dependabot/npm_and_yarn/update_checker/registry_finder.rb +1 -3
  41. data/lib/dependabot/npm_and_yarn/update_checker/subdependency_version_resolver.rb +24 -86
  42. data/lib/dependabot/npm_and_yarn/update_checker/version_resolver.rb +16 -85
  43. data/lib/dependabot/npm_and_yarn/version.rb +1 -3
  44. metadata +27 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f93a700a12bf8acc719d2716900e4fc5c17b5227ba84a6c6761b4736426d8a0
4
- data.tar.gz: 27df298a59ebf2d6c975b8e6370d21f70bc580fa74bd4134f31a060b152e61d7
3
+ metadata.gz: 74b4f8a2fdcbfb3b33dc587ee7fff5488bb2328e5d5cb59327520ce52a19e6f0
4
+ data.tar.gz: f8e09730aec68b7ff4745d58c6873539de25686cac0c10dc41ecff434e1a2435
5
5
  SHA512:
6
- metadata.gz: 416f6346d2784cce5a0e3d3d8422831b4654db8a7c23678d54599f16cd430ddfc50ad863c7eae1d3715d6bbb2e743d416f218b6b30cda14fb3ba285aca14c98d
7
- data.tar.gz: 73dc809d8ef956b018c6973a91b922e8b487aca2d3a2cdde11894d51f94b7a3fc07889035e11c7543ecbafc775ad870652be0e61f01abd0a00449cd93b978915
6
+ metadata.gz: 8338c4eae0027af367594c67c79befb5603a2c9534adffb0f6bc501e264c40e453643aa423d1cf18d8e7e87c3d9b99b384cbbc494d0548e5f05bc3dd904feb04
7
+ data.tar.gz: 542f15a0de016dd10b58c128e47f997b76a32cbc411945f6db40e3f5544760c2c683b83104ef5fbe194b5c3008e729bcafc9b6a3b0e47a329adab1bb1d59c49e
@@ -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 };
@@ -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(re)) {
31
- const [_, packageName, requestedVersion] = name.match(re);
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 })
@@ -44,4 +44,11 @@ class LightweightInstall extends Install {
44
44
  }
45
45
  }
46
46
 
47
- module.exports = { isString, LightweightAdd, LightweightInstall };
47
+ const LOCKFILE_ENTRY_REGEX = /^(.*)@([^@]*?)$/;
48
+
49
+ module.exports = {
50
+ isString,
51
+ LightweightAdd,
52
+ LightweightInstall,
53
+ LOCKFILE_ENTRY_REGEX,
54
+ };
@@ -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
  };
@@ -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.8",
15
+ "npm": "6.14.9",
15
16
  "semver": "^7.3.2"
16
17
  },
17
18
  "devDependencies": {
18
- "eslint": "^7.12.1",
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
+ }