check-peer-dependencies 2.0.6 → 4.1.0

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.
@@ -1,5 +1,8 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
3
6
  <component name="BranchesTreeState">
4
7
  <expand>
5
8
  <path>
@@ -19,8 +22,9 @@
19
22
  <select />
20
23
  </component>
21
24
  <component name="ChangeListManager">
22
- <list default="true" id="ebeb713d-6dc4-42d1-a42e-54aad95d9c0a" name="Default Changelist" comment="feat(walkPackageDependencyTree): Check devDependencies too">
23
- <change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
25
+ <list default="true" id="ebeb713d-6dc4-42d1-a42e-54aad95d9c0a" name="Default Changelist" comment="chore: update all dependencies">
26
+ <change beforePath="$PROJECT_DIR$/src/checkPeerDependencies.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/checkPeerDependencies.ts" afterDir="false" />
27
+ <change beforePath="$PROJECT_DIR$/src/cli.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/cli.ts" afterDir="false" />
24
28
  <change beforePath="$PROJECT_DIR$/src/packageUtils.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/packageUtils.ts" afterDir="false" />
25
29
  </list>
26
30
  <option name="SHOW_DIALOG" value="false" />
@@ -32,6 +36,28 @@
32
36
  <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
33
37
  <option name="UPDATE_TYPE" value="REBASE" />
34
38
  </component>
39
+ <component name="GitToolBoxStore">
40
+ <option name="projectConfigVersion" value="2" />
41
+ <option name="recentBranches">
42
+ <RecentBranches>
43
+ <option name="branchesForRepo">
44
+ <list>
45
+ <RecentBranchesForRepo>
46
+ <option name="branches">
47
+ <list>
48
+ <RecentBranch>
49
+ <option name="branchName" value="master" />
50
+ <option name="lastUsedInstant" value="1609100767" />
51
+ </RecentBranch>
52
+ </list>
53
+ </option>
54
+ <option name="repositoryRootUrl" value="file://$PROJECT_DIR$" />
55
+ </RecentBranchesForRepo>
56
+ </list>
57
+ </option>
58
+ </RecentBranches>
59
+ </option>
60
+ </component>
35
61
  <component name="ProjectId" id="1SkfJRmHXPtjMGY19cBVwFevkIM" />
36
62
  <component name="ProjectLevelVcsManager">
37
63
  <OptionsSetting value="false" id="Update" />
@@ -54,7 +80,7 @@
54
80
  <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
55
81
  <property name="nodejs_npm_path_reset_for_default_project" value="true" />
56
82
  <property name="nodejs_package_manager_path" value="yarn" />
57
- <property name="settings.editor.selected.configurable" value="configurable.group.appearance" />
83
+ <property name="settings.editor.selected.configurable" value="preferences.pluginManager" />
58
84
  <property name="ts.external.directory.path" value="$PROJECT_DIR$/node_modules/typescript/lib" />
59
85
  <property name="vue.rearranger.settings.migration" value="true" />
60
86
  </component>
@@ -222,7 +248,49 @@
222
248
  <option name="project" value="LOCAL" />
223
249
  <updated>1590443867678</updated>
224
250
  </task>
225
- <option name="localTasksCounter" value="22" />
251
+ <task id="LOCAL-00022" summary="feat(findSolutions): Add a toggle to find solutions and print installation commands.&#10;&#10;BREAKING CHANGE: no longer prints installation commands by default, instead prints a message about using --install">
252
+ <created>1608670757697</created>
253
+ <option name="number" value="00022" />
254
+ <option name="presentableId" value="LOCAL-00022" />
255
+ <option name="project" value="LOCAL" />
256
+ <updated>1608670757697</updated>
257
+ </task>
258
+ <task id="LOCAL-00023" summary="feat(report): For a given unmet peer dependency, show every related peer dependency, even if currently met">
259
+ <created>1608674747012</created>
260
+ <option name="number" value="00023" />
261
+ <option name="presentableId" value="LOCAL-00023" />
262
+ <option name="project" value="LOCAL" />
263
+ <updated>1608674747012</updated>
264
+ </task>
265
+ <task id="LOCAL-00024" summary="feat(orderBy): Change default orderBy to 'dependee'&#10;&#10;BREAKING CHANGE: default order changed from 'depender' to 'dependee'">
266
+ <created>1608674774129</created>
267
+ <option name="number" value="00024" />
268
+ <option name="presentableId" value="LOCAL-00024" />
269
+ <option name="project" value="LOCAL" />
270
+ <updated>1608674774129</updated>
271
+ </task>
272
+ <task id="LOCAL-00025" summary="feat(peerDependencyMeta): support peerDependencyMeta in package.json to ignore optional peer dependencies">
273
+ <created>1608689514910</created>
274
+ <option name="number" value="00025" />
275
+ <option name="presentableId" value="LOCAL-00025" />
276
+ <option name="project" value="LOCAL" />
277
+ <updated>1608689514910</updated>
278
+ </task>
279
+ <task id="LOCAL-00026" summary="feat(prerelease): include prerelease when matching ranges, i.e. the range &quot;&gt;=6.0.0&quot; matches &quot;7.0.0-beta.1&quot;&#10;&#10;BREAKING CHANGE: Matches prerelease versions">
280
+ <created>1609100365568</created>
281
+ <option name="number" value="00026" />
282
+ <option name="presentableId" value="LOCAL-00026" />
283
+ <option name="project" value="LOCAL" />
284
+ <updated>1609100365568</updated>
285
+ </task>
286
+ <task id="LOCAL-00027" summary="chore: update all dependencies">
287
+ <created>1609100430351</created>
288
+ <option name="number" value="00027" />
289
+ <option name="presentableId" value="LOCAL-00027" />
290
+ <option name="project" value="LOCAL" />
291
+ <updated>1609100430351</updated>
292
+ </task>
293
+ <option name="localTasksCounter" value="28" />
226
294
  <servers />
227
295
  </component>
228
296
  <component name="TypeScriptGeneratedFilesManager">
@@ -241,7 +309,6 @@
241
309
  <option name="oldMeFiltersMigrated" value="true" />
242
310
  </component>
243
311
  <component name="VcsManagerConfiguration">
244
- <MESSAGE value="feat: switch to typescript" />
245
312
  <MESSAGE value="chore: add shelljs dependency" />
246
313
  <MESSAGE value="chore: add yargs and shelljs dependency" />
247
314
  <MESSAGE value="chore: add yargs and shelljs and semver dependencies" />
@@ -261,16 +328,12 @@
261
328
  <MESSAGE value="fix(peerDevDependencies): Use an array of package names in 'peerDevDependencies' in conjunction with the standard 'peerDependencies' object to install peer deps as devDependencies. &#10;This now acts more as an extension of thstandard node packaging rather than adding completely custom behavior.&#10;&#10;Also removed check-peer-dependencies-optional-dependency because its postinstall script only gets runs when check-peer-dependencies-optional-dependency package is re-installed. So it was basically a failed experiment." />
262
329
  <MESSAGE value="fix(peerDevDependencies): Make peerDevDependency includes check a bit safer" />
263
330
  <MESSAGE value="feat(walkPackageDependencyTree): Check devDependencies too" />
264
- <option name="LAST_COMMIT_MESSAGE" value="feat(walkPackageDependencyTree): Check devDependencies too" />
265
- </component>
266
- <component name="WindowStateProjectService">
267
- <state x="684" y="492" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2" timestamp="1594746756731">
268
- <screen x="0" y="23" width="1792" height="1097" />
269
- </state>
270
- <state x="684" y="492" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2/0.23.1792.1097@0.23.1792.1097" timestamp="1594746756731" />
271
- <state x="561" y="268" width="670" height="676" key="search.everywhere.popup" timestamp="1600641960318">
272
- <screen x="0" y="23" width="1792" height="1097" />
273
- </state>
274
- <state x="561" y="268" width="670" height="676" key="search.everywhere.popup/0.23.1792.1097@0.23.1792.1097" timestamp="1600641960318" />
331
+ <MESSAGE value="feat(findSolutions): Add a toggle to find solutions and print installation commands.&#10;&#10;BREAKING CHANGE: no longer prints installation commands by default, instead prints a message about using --install" />
332
+ <MESSAGE value="feat(report): For a given unmet peer dependency, show every related peer dependency, even if currently met" />
333
+ <MESSAGE value="feat(orderBy): Change default orderBy to 'dependee'&#10;&#10;BREAKING CHANGE: default order changed from 'depender' to 'dependee'" />
334
+ <MESSAGE value="feat(peerDependencyMeta): support peerDependencyMeta in package.json to ignore optional peer dependencies" />
335
+ <MESSAGE value="feat(prerelease): include prerelease when matching ranges, i.e. the range &quot;&gt;=6.0.0&quot; matches &quot;7.0.0-beta.1&quot;&#10;&#10;BREAKING CHANGE: Matches prerelease versions" />
336
+ <MESSAGE value="chore: update all dependencies" />
337
+ <option name="LAST_COMMIT_MESSAGE" value="chore: update all dependencies" />
275
338
  </component>
276
339
  </project>
package/CHANGELOG.md CHANGED
@@ -1,3 +1,57 @@
1
+ # 4.1.0 (2021-11-28)
2
+ [Compare `check-peer-dependencies` versions 4.0.0 and 4.1.0](https://github.com/christopherthielen/check-peer-dependencies/compare/4.0.0...4.1.0)
3
+
4
+ ### Features
5
+
6
+ * Add support for ignoring peer dependencies (via cli option or config stored in package.json) ([5994c9c](https://github.com/christopherthielen/check-peer-dependencies/commit/5994c9c))
7
+ * load checkPeerDependencies config from package.json (and merge with CLI options) ([e2f0fee](https://github.com/christopherthielen/check-peer-dependencies/commit/e2f0fee))
8
+
9
+
10
+
11
+
12
+ # 4.0.0 (2020-12-27)
13
+ [Compare `check-peer-dependencies` versions 3.1.0 and 4.0.0](https://github.com/christopherthielen/check-peer-dependencies/compare/3.1.0...4.0.0)
14
+
15
+ ### Features
16
+
17
+ * **prerelease:** include prerelease when matching ranges, i.e. the range ">=6.0.0" matches "7.0.0-beta.1" ([0493379](https://github.com/christopherthielen/check-peer-dependencies/commit/0493379))
18
+
19
+
20
+ ### BREAKING CHANGES
21
+
22
+ * **prerelease:** Matches prerelease versions
23
+
24
+
25
+
26
+
27
+ # 3.1.0 (2020-12-23)
28
+ [Compare `check-peer-dependencies` versions 3.0.0 and 3.1.0](https://github.com/christopherthielen/check-peer-dependencies/compare/3.0.0...3.1.0)
29
+
30
+ ### Features
31
+
32
+ * **peerDependencyMeta:** support peerDependencyMeta in package.json to ignore optional peer dependencies ([4e3b757](https://github.com/christopherthielen/check-peer-dependencies/commit/4e3b757))
33
+ * See: https://github.com/yarnpkg/rfcs/blob/master/accepted/0000-optional-peer-dependencies.md
34
+
35
+
36
+
37
+ # 3.0.0 (2020-12-22)
38
+ [Compare `check-peer-dependencies` versions 2.0.6 and 3.0.0](https://github.com/christopherthielen/check-peer-dependencies/compare/2.0.6...3.0.0)
39
+
40
+ ### Features
41
+
42
+ * **findSolutions:** Add a toggle to find solutions and print installation commands. ([c34735a](https://github.com/christopherthielen/check-peer-dependencies/commit/c34735a))
43
+ * **orderBy:** Change default orderBy to 'dependee' ([e77e069](https://github.com/christopherthielen/check-peer-dependencies/commit/e77e069))
44
+ * **report:** For a given unmet peer dependency, show every related peer dependency, even if currently met ([516a259](https://github.com/christopherthielen/check-peer-dependencies/commit/516a259))
45
+
46
+
47
+ ### BREAKING CHANGES
48
+
49
+ * **orderBy:** default order changed from 'depender' to 'dependee'
50
+ * **findSolutions:** no longer prints installation commands by default, instead prints a message about using --install
51
+
52
+
53
+
54
+
1
55
  ## 2.0.6 (2020-09-20)
2
56
  [Compare `check-peer-dependencies` versions 2.0.5 and 2.0.6](https://github.com/christopherthielen/check-peer-dependencies/compare/2.0.5...2.0.6)
3
57
 
package/README.md CHANGED
@@ -17,11 +17,23 @@ npx check-peer-dependencies [--yarn|--npm] [--install] [--help]
17
17
 
18
18
  Options:
19
19
  ```
20
- --help, -h Print usage information [boolean]
21
- --version Show version number [boolean]
22
- --yarn Use yarn package manager [boolean]
23
- --npm Use npm package manager [boolean]
24
- --install Install missing or incorrect peerDependencies [boolean]
20
+ -h, --help Print usage information [boolean]
21
+ --version Show version number [boolean]
22
+ --yarn Force yarn package manager [boolean]
23
+ --npm Force npm package manager [boolean]
24
+ --orderBy Order the output by depender or dependee
25
+ [choices: "depender", "dependee"] [default: "dependee"]
26
+ --debug Print debugging information
27
+ [boolean] [default: false]
28
+ --verbose Prints every peer dependency, even those that
29
+ are met [boolean] [default: false]
30
+ --runOnlyOnRootDependencies Run tool only on package root dependencies
31
+ [boolean] [default: false]
32
+ --findSolutions Search for solutions and print package
33
+ installation commands
34
+ [boolean] [default: false]
35
+ --install Install missing or incorrect peerDependencies
36
+ [boolean] [default: false]
25
37
  ```
26
38
 
27
39
  ---
@@ -12,6 +12,7 @@ var __assign = (this && this.__assign) || function () {
12
12
  return __assign.apply(this, arguments);
13
13
  };
14
14
  exports.__esModule = true;
15
+ exports.checkPeerDependencies = void 0;
15
16
  var semver = require("semver");
16
17
  var shelljs_1 = require("shelljs");
17
18
  var packageManager_1 = require("./packageManager");
@@ -21,62 +22,55 @@ function getAllNestedPeerDependencies(options) {
21
22
  var gatheredDependencies = packageUtils_1.gatherPeerDependencies(".", options);
22
23
  function applySemverInformation(dep) {
23
24
  var installedVersion = packageUtils_1.getInstalledVersion(dep);
24
- var semverSatisfies = installedVersion ? semver.satisfies(installedVersion, dep.version) : false;
25
+ var semverSatisfies = installedVersion ? semver.satisfies(installedVersion, dep.version, { includePrerelease: true }) : false;
25
26
  var isYalc = !!/-[a-f0-9]+-yalc$/.exec(installedVersion);
26
27
  return __assign(__assign({}, dep), { installedVersion: installedVersion, semverSatisfies: semverSatisfies, isYalc: isYalc });
27
28
  }
28
- return gatheredDependencies.map(applySemverInformation);
29
+ function applyIgnoreInformation(dep) {
30
+ var isIgnored = options.ignore.includes(dep.name);
31
+ return __assign(__assign({}, dep), { isIgnored: isIgnored });
32
+ }
33
+ return gatheredDependencies.map(applySemverInformation).map(applyIgnoreInformation);
29
34
  }
30
35
  var recursiveCount = 0;
31
- var reportPeerDependencyStatusByDepender = function (dep, options) {
36
+ var isProblem = function (dep) { return !dep.semverSatisfies && !dep.isIgnored && !dep.isYalc && !dep.isPeerOptionalDependency; };
37
+ var reportPeerDependencyStatus = function (dep, byDepender, showSatisfiedDep, verbose) {
38
+ var message = byDepender ?
39
+ dep.depender.name + "@" + dep.depender.version + " requires " + dep.name + " " + dep.version :
40
+ dep.name + " " + dep.version + " is required by " + dep.depender.name + "@" + dep.depender.version;
32
41
  if (dep.semverSatisfies) {
33
- if (options.verbose) {
34
- console.log(" \u2705 " + dep.depender + "@" + dep.dependerVersion + " requires " + dep.name + " " + dep.version + " (" + dep.installedVersion + " is installed)");
42
+ if (showSatisfiedDep) {
43
+ console.log(" \u2705 " + message + " (" + dep.installedVersion + " is installed)");
35
44
  }
36
45
  }
37
46
  else if (dep.isYalc) {
38
- console.log(" \u2611\uFE0F " + dep.depender + "@" + dep.dependerVersion + " requires " + dep.name + " " + dep.version + " (" + dep.installedVersion + " is installed via yalc)");
39
- }
40
- else if (dep.installedVersion) {
41
- console.log(" \u274C " + dep.depender + "@" + dep.dependerVersion + " requires " + dep.name + " " + dep.version + " (" + dep.installedVersion + " is installed)");
47
+ console.log(" \u2611\uFE0F " + message + " (" + dep.installedVersion + " is installed via yalc)");
42
48
  }
43
- else {
44
- console.log(" \u274C " + dep.depender + "@" + dep.dependerVersion + " requires " + dep.name + " " + dep.version + " (" + dep.name + " is not installed)");
45
- }
46
- };
47
- var reportPeerDependencyStatusByDependee = function (dep, options) {
48
- if (dep.semverSatisfies) {
49
- if (options.verbose) {
50
- console.log(" \u2705 " + dep.name + " " + dep.version + " is required by " + dep.depender + "@" + dep.dependerVersion + " (" + dep.installedVersion + " is installed)");
49
+ else if (dep.installedVersion && dep.isPeerOptionalDependency) {
50
+ if (verbose) {
51
+ console.log(" \u2611\uFE0F " + message + ") OPTIONAL (" + dep.installedVersion + " is installed)");
51
52
  }
52
53
  }
53
- else if (dep.isYalc) {
54
- console.log(" \u2611\uFE0F " + dep.name + " " + dep.version + " is required by " + dep.depender + "@" + dep.dependerVersion + " (" + dep.installedVersion + " is installed via yalc)");
54
+ else if (dep.isIgnored) {
55
+ if (verbose) {
56
+ console.log(" \u2611\uFE0F " + message + " IGNORED (" + dep.name + " is not installed)");
57
+ }
55
58
  }
56
59
  else if (dep.installedVersion) {
57
- console.log(" \u274C " + dep.name + " " + dep.version + " is required by " + dep.depender + "@" + dep.dependerVersion + " (" + dep.installedVersion + " is installed)");
60
+ console.log(" \u274C " + message + ") (" + dep.installedVersion + " is installed)");
61
+ }
62
+ else if (dep.isPeerOptionalDependency) {
63
+ if (verbose) {
64
+ console.log(" \u2611\uFE0F " + message + " OPTIONAL (" + dep.name + " is not installed)");
65
+ }
58
66
  }
59
67
  else {
60
- console.log(" \u274C " + dep.name + " " + dep.version + " is required by " + dep.depender + "@" + dep.dependerVersion + " (" + dep.name + " is not installed)");
68
+ console.log(" \u274C " + message + " (" + dep.name + " is not installed)");
61
69
  }
62
70
  };
63
- function checkPeerDependencies(packageManager, options) {
64
- var allNestedPeerDependencies = getAllNestedPeerDependencies(options);
65
- if (options.orderBy === 'depender') {
66
- allNestedPeerDependencies.sort(function (a, b) { return ("" + a.depender + a.name).localeCompare("" + b.depender + b.name); });
67
- allNestedPeerDependencies.forEach(function (dep) { return reportPeerDependencyStatusByDepender(dep, options); });
68
- }
69
- else if (options.orderBy === 'dependee') {
70
- allNestedPeerDependencies.sort(function (a, b) { return ("" + a.name + a.depender).localeCompare("" + b.name + b.depender); });
71
- allNestedPeerDependencies.forEach(function (dep) { return reportPeerDependencyStatusByDependee(dep, options); });
72
- }
73
- var problems = allNestedPeerDependencies.filter(function (dep) { return !dep.semverSatisfies && !dep.isYalc; });
74
- if (!problems.length) {
75
- console.log(' ✅ All peer dependencies are met');
76
- return;
77
- }
71
+ function findSolutions(problems, allNestedPeerDependencies) {
78
72
  console.log();
79
- console.log('Searching for solutions...');
73
+ console.log("Searching for solutions for " + problems.length + " missing dependencies...");
80
74
  console.log();
81
75
  var resolutions = solution_1.findPossibleResolutions(problems, allNestedPeerDependencies);
82
76
  var resolutionsWithSolutions = resolutions.filter(function (r) { return r.resolution; });
@@ -91,37 +85,82 @@ function checkPeerDependencies(packageManager, options) {
91
85
  if (nosolution.length > 0) {
92
86
  console.error();
93
87
  }
94
- var commandLines = packageManager_1.getCommandLines(packageManager, resolutionsWithSolutions);
95
- if (options.install && commandLines.length > 0) {
96
- console.log('Installing peerDependencies...');
88
+ return { resolutionsWithSolutions: resolutionsWithSolutions, nosolution: nosolution };
89
+ }
90
+ function installPeerDependencies(commandLines, options, nosolution, packageManager) {
91
+ console.log('Installing peerDependencies...');
92
+ console.log();
93
+ commandLines.forEach(function (command) {
94
+ console.log("$ " + command);
95
+ shelljs_1.exec(command);
97
96
  console.log();
98
- commandLines.forEach(function (command) {
99
- console.log("$ " + command);
100
- shelljs_1.exec(command);
101
- console.log();
102
- });
103
- var newUnsatisfiedDeps = getAllNestedPeerDependencies(options)
104
- .filter(function (dep) { return !dep.semverSatisfies; })
105
- .filter(function (dep) { return !nosolution.some(function (x) { return packageUtils_1.isSameDep(x.problem, dep); }); });
106
- if (nosolution.length === 0 && newUnsatisfiedDeps.length === 0) {
107
- console.log('All peer dependencies are met');
97
+ });
98
+ var newProblems = getAllNestedPeerDependencies(options)
99
+ .filter(function (dep) { return isProblem(dep); })
100
+ .filter(function (dep) { return !nosolution.some(function (x) { return packageUtils_1.isSameDep(x.problem, dep); }); });
101
+ if (nosolution.length === 0 && newProblems.length === 0) {
102
+ console.log('All peer dependencies are met');
103
+ }
104
+ if (newProblems.length > 0) {
105
+ console.log("Found " + newProblems.length + " new unmet peerDependencies...");
106
+ if (++recursiveCount < 5) {
107
+ return checkPeerDependencies(packageManager, options);
108
108
  }
109
- if (newUnsatisfiedDeps.length > 0) {
110
- console.log("Found " + newUnsatisfiedDeps.length + " new unmet peerDependencies...");
111
- if (++recursiveCount < 5) {
112
- return checkPeerDependencies(packageManager, options);
113
- }
114
- else {
115
- console.error('Recursion limit reached (5)');
116
- process.exit(5);
117
- }
109
+ else {
110
+ console.error('Recursion limit reached (5)');
111
+ process.exit(5);
118
112
  }
113
+ }
114
+ return;
115
+ }
116
+ function report(options, allNestedPeerDependencies) {
117
+ if (options.orderBy === 'depender') {
118
+ allNestedPeerDependencies.sort(function (a, b) { return ("" + a.depender + a.name).localeCompare("" + b.depender + b.name); });
119
+ }
120
+ else if (options.orderBy == 'dependee') {
121
+ allNestedPeerDependencies.sort(function (a, b) { return ("" + a.name + a.depender).localeCompare("" + b.name + b.depender); });
122
+ }
123
+ allNestedPeerDependencies.forEach(function (dep) {
124
+ var relatedPeerDeps = allNestedPeerDependencies.filter(function (other) { return other.name === dep.name && other !== dep; });
125
+ var showIfSatisfied = options.verbose || relatedPeerDeps.some(function (dep) { return isProblem(dep); });
126
+ reportPeerDependencyStatus(dep, options.orderBy === 'depender', showIfSatisfied, options.verbose);
127
+ });
128
+ }
129
+ function checkPeerDependencies(packageManager, options) {
130
+ var allNestedPeerDependencies = getAllNestedPeerDependencies(options);
131
+ report(options, allNestedPeerDependencies);
132
+ var problems = allNestedPeerDependencies.filter(function (dep) { return isProblem(dep); });
133
+ if (!problems.length) {
134
+ console.log(' ✅ All peer dependencies are met');
119
135
  return;
120
136
  }
121
- else if (commandLines.length > 0) {
122
- console.log("Install peerDependencies using " + (commandLines.length > 1 ? 'these commands:' : 'this command') + ":");
137
+ if (options.install) {
138
+ var _a = findSolutions(problems, allNestedPeerDependencies), nosolution = _a.nosolution, resolutionsWithSolutions = _a.resolutionsWithSolutions;
139
+ var commandLines = packageManager_1.getCommandLines(packageManager, resolutionsWithSolutions);
140
+ if (commandLines.length) {
141
+ return installPeerDependencies(commandLines, options, nosolution, packageManager);
142
+ }
143
+ }
144
+ else if (options.findSolutions) {
145
+ var resolutionsWithSolutions = findSolutions(problems, allNestedPeerDependencies).resolutionsWithSolutions;
146
+ var commandLines = packageManager_1.getCommandLines(packageManager, resolutionsWithSolutions);
147
+ if (commandLines.length) {
148
+ console.log();
149
+ console.log("Install peerDependencies using " + (commandLines.length > 1 ? 'these commands:' : 'this command') + ":");
150
+ console.log();
151
+ commandLines.forEach(function (command) { return console.log(command); });
152
+ console.log();
153
+ }
154
+ }
155
+ else {
156
+ console.log();
157
+ console.log("Search for solutions using this command:");
158
+ console.log();
159
+ console.log("npx check-peer-dependencies --findSolutions");
160
+ console.log();
161
+ console.log("Install peerDependencies using this command:");
123
162
  console.log();
124
- commandLines.forEach(function (command) { return console.log(command); });
163
+ console.log("npx check-peer-dependencies --install");
125
164
  console.log();
126
165
  }
127
166
  process.exit(1);
package/dist/cli.js CHANGED
@@ -5,6 +5,8 @@ var yarrrrgs = require("yargs");
5
5
  var checkPeerDependencies_1 = require("./checkPeerDependencies");
6
6
  var packageManager_1 = require("./packageManager");
7
7
  var options = yarrrrgs
8
+ .pkgConf('checkPeerDependencies')
9
+ .usage('Options may also be stored in package.json under the "checkPeerDependencies" key')
8
10
  .option('help', {
9
11
  alias: 'h',
10
12
  boolean: true,
@@ -20,7 +22,7 @@ var options = yarrrrgs
20
22
  })
21
23
  .option('orderBy', {
22
24
  choices: ['depender', 'dependee'],
23
- "default": 'depender',
25
+ "default": 'dependee',
24
26
  description: 'Order the output by depender or dependee'
25
27
  })
26
28
  .option('debug', {
@@ -32,11 +34,22 @@ var options = yarrrrgs
32
34
  boolean: true,
33
35
  "default": false,
34
36
  description: 'Prints every peer dependency, even those that are met'
37
+ })
38
+ .option('ignore', {
39
+ string: true,
40
+ array: true,
41
+ "default": [],
42
+ description: 'package name to ignore (may specify multiple)'
35
43
  })
36
44
  .option('runOnlyOnRootDependencies', {
37
45
  boolean: true,
38
46
  "default": false,
39
47
  description: 'Run tool only on package root dependencies'
48
+ })
49
+ .option('findSolutions', {
50
+ boolean: true,
51
+ "default": false,
52
+ description: 'Search for solutions and print package installation commands'
40
53
  })
41
54
  .option('install', {
42
55
  boolean: true,
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  exports.__esModule = true;
3
+ exports.getCommandLines = exports.getPackageManager = void 0;
3
4
  var fs = require("fs");
4
5
  function getPackageManager(forceYarn, forceNpm) {
5
6
  if (forceYarn)
@@ -1,16 +1,6 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
2
  exports.__esModule = true;
3
+ exports.isSameDep = exports.getInstalledVersion = exports.resolvePackageDir = exports.getPackageMeta = exports.walkPackageDependencyTree = exports.gatherPeerDependencies = void 0;
14
4
  var fs = require("fs");
15
5
  var path = require("path");
16
6
  var resolve = require("resolve");
@@ -38,7 +28,7 @@ function walkPackageDependencyTree(packagePath, visitor, visitedPaths, options)
38
28
  throw new Error("package.json missing at " + packageJsonPath + ".");
39
29
  }
40
30
  var packageJson = readJson_1.readJson(packageJsonPath);
41
- var packageDependencies = getPackageDependencies(packagePath, packageJson);
31
+ var packageDependencies = getPackageMeta(packagePath, packageJson);
42
32
  if (options.debug) {
43
33
  console.log(packageJsonPath);
44
34
  packageDependencies.peerDependencies.forEach(function (dep) { return console.log(dep); });
@@ -69,30 +59,36 @@ function walkPackageDependencyTree(packagePath, visitor, visitedPaths, options)
69
59
  packageDependencies.dependencies.forEach(walkDependency);
70
60
  }
71
61
  exports.walkPackageDependencyTree = walkPackageDependencyTree;
72
- function buildDependencyArray(packagePath, packageJson, dependenciesObject) {
73
- return Object.keys(dependenciesObject).map(function (name) { return ({
74
- name: name,
75
- version: dependenciesObject[name],
76
- depender: packageJson.name,
77
- dependerVersion: packageJson.version,
78
- dependerPath: packagePath
79
- }); });
62
+ function buildDependencyArray(type, pkgJson, depender) {
63
+ var dependenciesObject = pkgJson[type] || {};
64
+ var peerDependenciesMeta = pkgJson.peerDependenciesMeta || {};
65
+ // backwards compat
66
+ var peerDevDependencies = pkgJson.peerDevDependencies || [];
67
+ var packageNames = Object.keys(dependenciesObject);
68
+ return packageNames.map(function (name) {
69
+ var _a, _b;
70
+ var isPeerOptionalDependency = !!((_a = peerDependenciesMeta[name]) === null || _a === void 0 ? void 0 : _a.optional);
71
+ var isPeerDevDependency = !!((_b = peerDependenciesMeta[name]) === null || _b === void 0 ? void 0 : _b.dev) || !!peerDevDependencies.includes(name);
72
+ return {
73
+ name: name,
74
+ type: type,
75
+ version: dependenciesObject[name],
76
+ isPeerDevDependency: isPeerDevDependency,
77
+ isPeerOptionalDependency: isPeerOptionalDependency,
78
+ depender: depender
79
+ };
80
+ });
80
81
  }
81
- function getPackageDependencies(packagePath, packageJson) {
82
- var name = packageJson.name, _a = packageJson.dependencies, dependencies = _a === void 0 ? {} : _a, _b = packageJson.devDependencies, devDependencies = _b === void 0 ? {} : _b, _c = packageJson.optionalDependencies, optionalDependencies = _c === void 0 ? {} : _c, _d = packageJson.peerDependencies, peerDependencies = _d === void 0 ? {} : _d, _e = packageJson.peerDevDependencies, peerDevDependencies = _e === void 0 ? [] : _e;
83
- var applyPeerDevDependencies = function (dep) {
84
- return (__assign(__assign({}, dep), { isPeerDevDependency: peerDevDependencies.includes && peerDevDependencies.includes(dep.name) }));
85
- };
86
- return {
87
- packageName: name,
88
- dependencies: buildDependencyArray(packagePath, packageJson, dependencies),
89
- devDependencies: buildDependencyArray(packagePath, packageJson, devDependencies),
90
- optionalDependencies: buildDependencyArray(packagePath, packageJson, optionalDependencies),
91
- peerDependencies: buildDependencyArray(packagePath, packageJson, peerDependencies).map(applyPeerDevDependencies),
92
- peerDevDependencies: peerDevDependencies
93
- };
82
+ function getPackageMeta(packagePath, packageJson) {
83
+ var name = packageJson.name, version = packageJson.version;
84
+ var packageMeta = { name: name, version: version, packagePath: packagePath };
85
+ packageMeta.dependencies = buildDependencyArray("dependencies", packageJson, packageMeta);
86
+ packageMeta.devDependencies = buildDependencyArray("devDependencies", packageJson, packageMeta);
87
+ packageMeta.optionalDependencies = buildDependencyArray("optionalDependencies", packageJson, packageMeta);
88
+ packageMeta.peerDependencies = buildDependencyArray("peerDependencies", packageJson, packageMeta);
89
+ return packageMeta;
94
90
  }
95
- exports.getPackageDependencies = getPackageDependencies;
91
+ exports.getPackageMeta = getPackageMeta;
96
92
  function resolvePackageDir(basedir, packageName) {
97
93
  var packagePath;
98
94
  // In resolve() v2.x this callback has a different signature
@@ -124,17 +120,10 @@ function getInstalledVersion(dep) {
124
120
  }
125
121
  exports.getInstalledVersion = getInstalledVersion;
126
122
  function isSameDep(a, b) {
127
- var keys = [
128
- "name",
129
- "version",
130
- "depender",
131
- "dependerPath",
132
- "dependerVersion",
133
- "installedVersion",
134
- "semverSatisfies",
135
- "isYalc",
136
- "isPeerDevDependency",
137
- ];
138
- return keys.every(function (key) { return a[key] === b[key]; });
123
+ var keys = ["name", "version", "installedVersion", "semverSatisfies", "isYalc", "isPeerDevDependency",];
124
+ return keys.every(function (key) { return a[key] === b[key]; }) &&
125
+ a.depender.name === b.depender.name &&
126
+ a.depender.version === b.depender.version &&
127
+ a.depender.packagePath === b.depender.packagePath;
139
128
  }
140
129
  exports.isSameDep = isSameDep;
package/dist/readJson.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  exports.__esModule = true;
3
+ exports.readJson = void 0;
3
4
  var fs_1 = require("fs");
4
5
  function readJson(filename) {
5
6
  return JSON.parse(fs_1.readFileSync(filename).toString('utf-8'));
package/dist/solution.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  exports.__esModule = true;
3
+ exports.findPossibleResolutions = void 0;
3
4
  var semver = require("semver");
4
5
  var shelljs_1 = require("shelljs");
5
6
  function semverReverseSort(a, b) {
@@ -26,12 +27,15 @@ function findPossibleResolutions(problems, allPeerDependencies) {
26
27
  exports.findPossibleResolutions = findPossibleResolutions;
27
28
  function findPossibleResolution(packageName, allPeerDeps) {
28
29
  var requiredPeerVersions = allPeerDeps.filter(function (dep) { return dep.name === packageName; });
30
+ // todo: skip this step if only one required peer version and it's an exact version
29
31
  var command = "npm view " + packageName + " versions";
30
32
  var rawVersionsInfo;
31
33
  try {
32
34
  rawVersionsInfo = shelljs_1.exec(command, { silent: true }).stdout;
33
35
  var availableVersions = JSON.parse(rawVersionsInfo.replace(/'/g, '"')).sort(semverReverseSort);
34
- return availableVersions.find(function (ver) { return requiredPeerVersions.every(function (peerVer) { return semver.satisfies(ver, peerVer.version); }); });
36
+ return availableVersions.find(function (ver) { return requiredPeerVersions.every(function (peerVer) {
37
+ return semver.satisfies(ver, peerVer.version, { includePrerelease: true });
38
+ }); });
35
39
  }
36
40
  catch (err) {
37
41
  console.error("Error while running command: '" + command + "'");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "check-peer-dependencies",
3
- "version": "2.0.6",
3
+ "version": "4.1.0",
4
4
  "description": "Checks peer dependencies of the current package. Offers solutions for any that are unmet.",
5
5
  "main": "dist/check_peer_dependencies.js",
6
6
  "scripts": {
@@ -29,17 +29,17 @@
29
29
  },
30
30
  "homepage": "https://github.com/christopherthielen/check-peer-dependencies#readme",
31
31
  "dependencies": {
32
- "resolve": "^1.14.1",
33
- "semver": "^7.1.1",
34
- "shelljs": "^0.8.3",
35
- "yargs": "^15.0.2"
32
+ "resolve": "^1.19.0",
33
+ "semver": "^7.3.4",
34
+ "shelljs": "^0.8.4",
35
+ "yargs": "^16.2.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/node": "^13.1.1",
39
- "@types/semver": "^6.2.0",
40
- "@types/shelljs": "^0.8.6",
41
- "@types/yargs": "^13.0.4",
42
- "@uirouter/publish-scripts": "^2.3.42",
43
- "typescript": "^3.7.4"
38
+ "@types/node": "^14.14.16",
39
+ "@types/semver": "^7.3.4",
40
+ "@types/shelljs": "^0.8.8",
41
+ "@types/yargs": "^15.0.12",
42
+ "@uirouter/publish-scripts": "^2.5.4",
43
+ "typescript": "^4.1.3"
44
44
  }
45
45
  }