check-peer-dependencies 4.1.0 → 4.3.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.
@@ -22,10 +22,8 @@
22
22
  <select />
23
23
  </component>
24
24
  <component name="ChangeListManager">
25
- <list default="true" id="ebeb713d-6dc4-42d1-a42e-54aad95d9c0a" name="Default Changelist" comment="chore: update all dependencies">
25
+ <list default="true" id="ebeb713d-6dc4-42d1-a42e-54aad95d9c0a" name="Default Changelist" comment="feat: detect yarn2 lockfile (and then use 'yarn up')&#10;&#10;Note: yarn2 pnp will likely never be supported">
26
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" />
28
- <change beforePath="$PROJECT_DIR$/src/packageUtils.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/packageUtils.ts" afterDir="false" />
29
27
  </list>
30
28
  <option name="SHOW_DIALOG" value="false" />
31
29
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -33,9 +31,22 @@
33
31
  <option name="LAST_RESOLUTION" value="IGNORE" />
34
32
  </component>
35
33
  <component name="Git.Settings">
34
+ <option name="RECENT_BRANCH_BY_REPOSITORY">
35
+ <map>
36
+ <entry key="$PROJECT_DIR$" value="yarn2-sorta-notreally" />
37
+ </map>
38
+ </option>
36
39
  <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
37
40
  <option name="UPDATE_TYPE" value="REBASE" />
38
41
  </component>
42
+ <component name="GitSEFilterConfiguration">
43
+ <file-type-list>
44
+ <filtered-out-file-type name="LOCAL_BRANCH" />
45
+ <filtered-out-file-type name="REMOTE_BRANCH" />
46
+ <filtered-out-file-type name="TAG" />
47
+ <filtered-out-file-type name="COMMIT_BY_MESSAGE" />
48
+ </file-type-list>
49
+ </component>
39
50
  <component name="GitToolBoxStore">
40
51
  <option name="projectConfigVersion" value="2" />
41
52
  <option name="recentBranches">
@@ -58,6 +69,12 @@
58
69
  </RecentBranches>
59
70
  </option>
60
71
  </component>
72
+ <component name="MarkdownSettingsMigration">
73
+ <option name="stateVersion" value="1" />
74
+ </component>
75
+ <component name="ProjectColorInfo"><![CDATA[{
76
+ "associatedIndex": 6
77
+ }]]></component>
61
78
  <component name="ProjectId" id="1SkfJRmHXPtjMGY19cBVwFevkIM" />
62
79
  <component name="ProjectLevelVcsManager">
63
80
  <OptionsSetting value="false" id="Update" />
@@ -68,22 +85,17 @@
68
85
  <option name="hideEmptyMiddlePackages" value="true" />
69
86
  <option name="showLibraryContents" value="true" />
70
87
  </component>
71
- <component name="PropertiesComponent">
72
- <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
73
- <property name="last_opened_file_path" value="$PROJECT_DIR$" />
74
- <property name="node.js.detected.package.eslint" value="true" />
75
- <property name="node.js.detected.package.tslint" value="true" />
76
- <property name="node.js.path.for.package.eslint" value="project" />
77
- <property name="node.js.path.for.package.tslint" value="project" />
78
- <property name="node.js.selected.package.eslint" value="(autodetect)" />
79
- <property name="node.js.selected.package.tslint" value="(autodetect)" />
80
- <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
81
- <property name="nodejs_npm_path_reset_for_default_project" value="true" />
82
- <property name="nodejs_package_manager_path" value="yarn" />
83
- <property name="settings.editor.selected.configurable" value="preferences.pluginManager" />
84
- <property name="ts.external.directory.path" value="$PROJECT_DIR$/node_modules/typescript/lib" />
85
- <property name="vue.rearranger.settings.migration" value="true" />
86
- </component>
88
+ <component name="PropertiesComponent"><![CDATA[{
89
+ "keyToString": {
90
+ "git-widget-placeholder": "optional",
91
+ "node.js.detected.package.eslint": "true",
92
+ "node.js.detected.package.tslint": "true",
93
+ "node.js.selected.package.eslint": "(autodetect)",
94
+ "node.js.selected.package.tslint": "(autodetect)",
95
+ "nodejs_package_manager_path": "yarn",
96
+ "ts.external.directory.path": "/Users/chris/projects/check-peer-dependencies/node_modules/typescript/lib"
97
+ }
98
+ }]]></component>
87
99
  <component name="RecentsManager">
88
100
  <key name="es6.move.members.recent.items">
89
101
  <recent name="$PROJECT_DIR$/src/packageUtils.ts" />
@@ -306,13 +318,8 @@
306
318
  </entry>
307
319
  </map>
308
320
  </option>
309
- <option name="oldMeFiltersMigrated" value="true" />
310
321
  </component>
311
322
  <component name="VcsManagerConfiguration">
312
- <MESSAGE value="chore: add shelljs dependency" />
313
- <MESSAGE value="chore: add yargs and shelljs dependency" />
314
- <MESSAGE value="chore: add yargs and shelljs and semver dependencies" />
315
- <MESSAGE value="refactor: extract cli.ts" />
316
323
  <MESSAGE value="fix(packageManager): remove console.log, switch to boolean parameters" />
317
324
  <MESSAGE value="fix(checkPeerDependencies): check for yalc'd packages using installedVersion, not dependerVersion" />
318
325
  <MESSAGE value="chore: Add README.md and CHANGELOG.md" />
@@ -334,6 +341,10 @@
334
341
  <MESSAGE value="feat(peerDependencyMeta): support peerDependencyMeta in package.json to ignore optional peer dependencies" />
335
342
  <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
343
  <MESSAGE value="chore: update all dependencies" />
337
- <option name="LAST_COMMIT_MESSAGE" value="chore: update all dependencies" />
344
+ <MESSAGE value="feat: load checkPeerDependencies config from package.json (and merge with CLI options)" />
345
+ <MESSAGE value="feat: Add support for ignoring peer dependencies (via cli option or config stored in package.json)" />
346
+ <MESSAGE value="fix: Install peer deps as devDependencies if the peer dep came from a dev dependency&#10;fix: Properly install dev dependencies when using npm as the package manager" />
347
+ <MESSAGE value="feat: detect yarn2 lockfile (and then use 'yarn up')&#10;&#10;Note: yarn2 pnp will likely never be supported" />
348
+ <option name="LAST_COMMIT_MESSAGE" value="feat: detect yarn2 lockfile (and then use 'yarn up')&#10;&#10;Note: yarn2 pnp will likely never be supported" />
338
349
  </component>
339
350
  </project>
package/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ # 4.3.0 (2023-10-17)
2
+ [Compare `check-peer-dependencies` versions 4.2.0 and 4.3.0](https://github.com/christopherthielen/check-peer-dependencies/compare/4.2.0...4.3.0)
3
+
4
+ ### Bug Fixes
5
+
6
+ * non-satisfied optional dependency should fail ([7d43b0d](https://github.com/christopherthielen/check-peer-dependencies/commit/7d43b0d))
7
+
8
+
9
+
10
+
11
+ # 4.2.0 (2023-03-13)
12
+ [Compare `check-peer-dependencies` versions 4.1.0 and 4.2.0](https://github.com/christopherthielen/check-peer-dependencies/compare/4.1.0...4.2.0)
13
+
14
+ ### Bug Fixes
15
+
16
+ * Install peer deps as devDependencies if the peer dep came from a dev dependency ([6ef3021](https://github.com/christopherthielen/check-peer-dependencies/commit/6ef3021)), closes [#21](https://github.com/christopherthielen/check-peer-dependencies/issues/21)
17
+ * Method for determining the installed version fails [#27](https://github.com/christopherthielen/check-peer-dependencies/issues/27) ([8058585](https://github.com/christopherthielen/check-peer-dependencies/commit/8058585))
18
+
19
+
20
+
21
+
1
22
  # 4.1.0 (2021-11-28)
2
23
  [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
24
 
package/README.md CHANGED
@@ -27,6 +27,8 @@ Options:
27
27
  [boolean] [default: false]
28
28
  --verbose Prints every peer dependency, even those that
29
29
  are met [boolean] [default: false]
30
+ --ignore package name to ignore (may specify multiple)
31
+ [array] [default: []]
30
32
  --runOnlyOnRootDependencies Run tool only on package root dependencies
31
33
  [boolean] [default: false]
32
34
  --findSolutions Search for solutions and print package
@@ -33,7 +33,8 @@ function getAllNestedPeerDependencies(options) {
33
33
  return gatheredDependencies.map(applySemverInformation).map(applyIgnoreInformation);
34
34
  }
35
35
  var recursiveCount = 0;
36
- var isProblem = function (dep) { return !dep.semverSatisfies && !dep.isIgnored && !dep.isYalc && !dep.isPeerOptionalDependency; };
36
+ var isProblem = function (dep) { return !dep.semverSatisfies && !dep.isIgnored && !dep.isYalc &&
37
+ (!dep.isPeerOptionalDependency || !!dep.installedVersion); };
37
38
  var reportPeerDependencyStatus = function (dep, byDepender, showSatisfiedDep, verbose) {
38
39
  var message = byDepender ?
39
40
  dep.depender.name + "@" + dep.depender.version + " requires " + dep.name + " " + dep.version :
@@ -46,18 +47,18 @@ var reportPeerDependencyStatus = function (dep, byDepender, showSatisfiedDep, ve
46
47
  else if (dep.isYalc) {
47
48
  console.log(" \u2611\uFE0F " + message + " (" + dep.installedVersion + " is installed via yalc)");
48
49
  }
49
- else if (dep.installedVersion && dep.isPeerOptionalDependency) {
50
- if (verbose) {
51
- console.log(" \u2611\uFE0F " + message + ") OPTIONAL (" + dep.installedVersion + " is installed)");
52
- }
53
- }
54
50
  else if (dep.isIgnored) {
55
51
  if (verbose) {
56
52
  console.log(" \u2611\uFE0F " + message + " IGNORED (" + dep.name + " is not installed)");
57
53
  }
58
54
  }
59
55
  else if (dep.installedVersion) {
60
- console.log(" \u274C " + message + ") (" + dep.installedVersion + " is installed)");
56
+ if (dep.isPeerOptionalDependency) {
57
+ console.log(" \u274C " + message + ") OPTIONAL (" + dep.installedVersion + " is installed)");
58
+ }
59
+ else {
60
+ console.log(" \u274C " + message + ") (" + dep.installedVersion + " is installed)");
61
+ }
61
62
  }
62
63
  else if (dep.isPeerOptionalDependency) {
63
64
  if (verbose) {
package/dist/cli.js CHANGED
File without changes
@@ -29,12 +29,12 @@ function getCommandLines(packageManager, resolutions) {
29
29
  commands.push("yarn upgrade " + upgrades.join(' '));
30
30
  }
31
31
  }
32
- else if (packageManager === 'npm' && (installs.length || upgrades.length)) {
32
+ else if (packageManager === 'npm' && (installs.length || upgrades.length || devInstalls.length)) {
33
33
  if (installs.length || upgrades.length) {
34
34
  commands.push("npm install " + installs.concat(upgrades).join(' '));
35
35
  }
36
36
  if (devInstalls.length) {
37
- commands.push("npm install -D " + installs.concat(upgrades).join(' '));
37
+ commands.push("npm install -D " + devInstalls);
38
38
  }
39
39
  }
40
40
  return commands;
@@ -10,14 +10,14 @@ function gatherPeerDependencies(packagePath, options) {
10
10
  var visitor = function (path, json, deps) {
11
11
  peerDeps = peerDeps.concat(deps.peerDependencies);
12
12
  };
13
- walkPackageDependencyTree(packagePath, visitor, [], options);
13
+ walkPackageDependencyTree(packagePath, false, visitor, [], options);
14
14
  // Eliminate duplicates
15
15
  return peerDeps.reduce(function (acc, dep) {
16
16
  return acc.some(function (dep2) { return isSameDep(dep, dep2); }) ? acc : acc.concat(dep);
17
17
  }, []);
18
18
  }
19
19
  exports.gatherPeerDependencies = gatherPeerDependencies;
20
- function walkPackageDependencyTree(packagePath, visitor, visitedPaths, options) {
20
+ function walkPackageDependencyTree(packagePath, isAncestorDevDependency, visitor, visitedPaths, options) {
21
21
  var isRootPackage = visitedPaths.length === 0;
22
22
  if (visitedPaths.includes(packagePath)) {
23
23
  return;
@@ -28,13 +28,13 @@ function walkPackageDependencyTree(packagePath, visitor, visitedPaths, options)
28
28
  throw new Error("package.json missing at " + packageJsonPath + ".");
29
29
  }
30
30
  var packageJson = readJson_1.readJson(packageJsonPath);
31
- var packageDependencies = getPackageMeta(packagePath, packageJson);
31
+ var packageDependencies = getPackageMeta(packagePath, packageJson, isAncestorDevDependency);
32
32
  if (options.debug) {
33
33
  console.log(packageJsonPath);
34
34
  packageDependencies.peerDependencies.forEach(function (dep) { return console.log(dep); });
35
35
  }
36
36
  visitor(packagePath, packageJson, packageDependencies);
37
- function walkDependency(dependency) {
37
+ function walkDependency(dependency, isAncestorDevDependency) {
38
38
  if (resolve.isCore(dependency.name)) {
39
39
  return;
40
40
  }
@@ -51,15 +51,15 @@ function walkPackageDependencyTree(packagePath, visitor, visitedPaths, options)
51
51
  throw new Error("WARN: Unable to resolve package " + dependency.name + " from " + packagePath);
52
52
  }
53
53
  }
54
- walkPackageDependencyTree(dependencyPath, visitor, visitedPaths, options);
54
+ walkPackageDependencyTree(dependencyPath, isAncestorDevDependency, visitor, visitedPaths, options);
55
55
  }
56
56
  if (isRootPackage)
57
- packageDependencies.devDependencies.forEach(walkDependency);
57
+ packageDependencies.devDependencies.forEach(function (dep) { return walkDependency(dep, true); });
58
58
  if (isRootPackage || !options.runOnlyOnRootDependencies)
59
- packageDependencies.dependencies.forEach(walkDependency);
59
+ packageDependencies.dependencies.forEach(function (dep) { return walkDependency(dep, false); });
60
60
  }
61
61
  exports.walkPackageDependencyTree = walkPackageDependencyTree;
62
- function buildDependencyArray(type, pkgJson, depender) {
62
+ function buildDependencyArray(type, pkgJson, depender, isAncestorDevDependency) {
63
63
  var dependenciesObject = pkgJson[type] || {};
64
64
  var peerDependenciesMeta = pkgJson.peerDependenciesMeta || {};
65
65
  // backwards compat
@@ -68,7 +68,7 @@ function buildDependencyArray(type, pkgJson, depender) {
68
68
  return packageNames.map(function (name) {
69
69
  var _a, _b;
70
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);
71
+ var isPeerDevDependency = isAncestorDevDependency || !!((_b = peerDependenciesMeta[name]) === null || _b === void 0 ? void 0 : _b.dev) || !!peerDevDependencies.includes(name);
72
72
  return {
73
73
  name: name,
74
74
  type: type,
@@ -79,13 +79,13 @@ function buildDependencyArray(type, pkgJson, depender) {
79
79
  };
80
80
  });
81
81
  }
82
- function getPackageMeta(packagePath, packageJson) {
82
+ function getPackageMeta(packagePath, packageJson, isAncestorDevDependency) {
83
83
  var name = packageJson.name, version = packageJson.version;
84
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);
85
+ packageMeta.dependencies = buildDependencyArray("dependencies", packageJson, packageMeta, isAncestorDevDependency);
86
+ packageMeta.devDependencies = buildDependencyArray("devDependencies", packageJson, packageMeta, isAncestorDevDependency);
87
+ packageMeta.optionalDependencies = buildDependencyArray("optionalDependencies", packageJson, packageMeta, isAncestorDevDependency);
88
+ packageMeta.peerDependencies = buildDependencyArray("peerDependencies", packageJson, packageMeta, isAncestorDevDependency);
89
89
  return packageMeta;
90
90
  }
91
91
  exports.getPackageMeta = getPackageMeta;
@@ -94,7 +94,9 @@ function resolvePackageDir(basedir, packageName) {
94
94
  // In resolve() v2.x this callback has a different signature
95
95
  // function packageFilter(pkg, pkgfile, pkgdir) {
96
96
  function packageFilter(pkg, pkgdir) {
97
- packagePath = pkgdir;
97
+ if (!packagePath || pkg.version) {
98
+ packagePath = pkgdir;
99
+ }
98
100
  return pkg;
99
101
  }
100
102
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "check-peer-dependencies",
3
- "version": "4.1.0",
3
+ "version": "4.3.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": {
@@ -1,77 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __assign = (this && this.__assign) || function () {
4
- __assign = Object.assign || function(t) {
5
- for (var s, i = 1, n = arguments.length; i < n; i++) {
6
- s = arguments[i];
7
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
8
- t[p] = s[p];
9
- }
10
- return t;
11
- };
12
- return __assign.apply(this, arguments);
13
- };
14
- exports.__esModule = true;
15
- var path = require("path");
16
- var semver = require("semver");
17
- var shelljs_1 = require("shelljs");
18
- var packageManager_1 = require("./packageManager");
19
- var packageUtils_1 = require("./packageUtils");
20
- var readJson_1 = require("./readJson");
21
- var solution_1 = require("./solution");
22
- function checkPeerDependencies(packageManager, installMissingPeerDependencies) {
23
- var allNestedPeerDependencies = packageUtils_1.gatherPeerDependencies(".").map(function (dep) {
24
- var installedVersion = getInstalledVersion(dep);
25
- var semverSatisfies = installedVersion ? semver.satisfies(installedVersion, dep.version) : false;
26
- return __assign(__assign({}, dep), { installedVersion: installedVersion, semverSatisfies: semverSatisfies });
27
- }).sort(function (a, b) { return ("" + a.name + a.depender).localeCompare("" + b.name + b.depender); });
28
- allNestedPeerDependencies.forEach(function (dep) {
29
- if (dep.semverSatisfies) {
30
- console.log("\u2705 " + dep.depender + " requires " + dep.name + " " + dep.version + " and " + dep.installedVersion + " is installed");
31
- }
32
- else if (dep.installedVersion) {
33
- console.log("\u274C " + dep.depender + " requires " + dep.name + " " + dep.version + ", but " + dep.name + " is not installed");
34
- }
35
- else {
36
- console.log("\u274C " + dep.depender + " requires " + dep.name + " " + dep.version + ", but " + dep.installedVersion + " is installed");
37
- }
38
- });
39
- var problems = allNestedPeerDependencies.filter(function (dep) { return !dep.semverSatisfies && !/file:\.yalc/.exec(dep.dependerVersion); });
40
- if (!problems.length) {
41
- console.log('No problems found!');
42
- return;
43
- }
44
- console.log('Searching for solutions:');
45
- var resolutions = solution_1.findPossibleResolutions(problems, allNestedPeerDependencies);
46
- var installs = resolutions.filter(function (r) { return r.resolutionType === 'install'; }).map(function (r) { return r.resolution; });
47
- var upgrades = resolutions.filter(function (r) { return r.resolutionType === 'upgrade'; }).map(function (r) { return r.resolution; });
48
- var nosolution = resolutions.filter(function (r) { return !r.resolution; });
49
- nosolution.forEach(function (solution) {
50
- var name = solution.problem.name;
51
- var errorPrefix = "Unable to find a version of " + name + " that satisfies the following peerDependencies:";
52
- var peerDepRanges = allNestedPeerDependencies.filter(function (dep) { return dep.name === name; })
53
- .reduce(function (acc, dep) { return acc.includes(dep.version) ? acc : acc.concat(dep.version); }, []);
54
- console.error("\u274C\u274C\u274C " + errorPrefix + " " + peerDepRanges.join(" and ") + " \u274C\u274C\u274C");
55
- });
56
- var commandLines = packageManager_1.getCommandLines(packageManager, installs, upgrades);
57
- if (nosolution.length) {
58
- console.error();
59
- }
60
- if (installMissingPeerDependencies) {
61
- console.log('Installing peerDependencies...');
62
- commandLines.forEach(function (command) { return shelljs_1.exec(command); });
63
- }
64
- else {
65
- commandLines.forEach(function (command) { return console.log(command); });
66
- console.log();
67
- }
68
- }
69
- exports.checkPeerDependencies = checkPeerDependencies;
70
- function getInstalledVersion(dep) {
71
- var peerDependencyDir = packageUtils_1.resolvePackageDir(".", dep.name);
72
- if (!peerDependencyDir) {
73
- return undefined;
74
- }
75
- var packageJson = readJson_1.readJson(path.resolve(peerDependencyDir, 'package.json'));
76
- return packageJson.version;
77
- }
@@ -1,20 +0,0 @@
1
- "use strict";
2
- exports.__esModule = true;
3
- var resolve = require("resolve");
4
- function resolvePackageDir(basedir, packageName) {
5
- var packagePath;
6
- function packageFilter(pkg, pkgfile) {
7
- packagePath = pkgfile;
8
- return pkg;
9
- }
10
- try {
11
- resolve.sync(packageName, { basedir: basedir, packageFilter: packageFilter });
12
- }
13
- catch (ignored) {
14
- // resolve.sync throws if no main: is present
15
- // Some packages (such as @types/*) do not have a main
16
- // As long as we have a packagePath, it's fine
17
- }
18
- return packagePath;
19
- }
20
- exports.resolvePackageDir = resolvePackageDir;