Skip to content

Commit

Permalink
Use correct node_module resolution
Browse files Browse the repository at this point in the history
This fixes quaertym#78 and removes a deprecation warning in ember-cli master (`DEPRECATION: An addon is trying to access project.nodeModulesPath. This is not a reliable way to discover npm modules....`).
  • Loading branch information
ef4 committed Nov 14, 2017
1 parent 94711af commit ee038c7
Show file tree
Hide file tree
Showing 13 changed files with 59 additions and 46 deletions.
27 changes: 18 additions & 9 deletions lib/dependency-checker.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
'use strict';

var path = require('path');
var resolve = require('resolve');
var fs = require('fs');
var readFile = fs.readFileSync;
var readDir = fs.readdirSync;
var fileExists = fs.existsSync;
var Package = require('./package');
var readNodeModulesPath = require('./utils/read-node-modules-path');
var buildNodePackagePath = require('./utils/build-node-package-path');
var buildBowerPackagePath = require('./utils/build-bower-package-path');

var alreadyChecked = false;
Expand Down Expand Up @@ -77,15 +76,20 @@ EmberCLIDependencyChecker.prototype.readShrinkwrapDeps = function() {
} catch(e) {
// JSON parse error
}
return ShrinkWrapChecker.checkDependencies(this.project.root, readNodeModulesPath(this.project), shrinkWrapJSON);
return ShrinkWrapChecker.checkDependencies(this.project.root, shrinkWrapJSON);
} else {
return [];
}
};

EmberCLIDependencyChecker.prototype.lookupNodeModuleVersion = function(name) {
var nodePackage = path.join(readNodeModulesPath(this.project), name, 'package.json');
return this.lookupPackageVersion(nodePackage);
EmberCLIDependencyChecker.prototype.lookupNodeModule = function(name) {
try {
var nodePackage = resolve.sync(path.join(name, 'package.json'), { basedir: this.project.root });
var version = this.lookupPackageVersion(nodePackage);
return { version: version, path: path.dirname(nodePackage) };
} catch(err) {
return { version: null, path: null };
}
};

EmberCLIDependencyChecker.prototype.lookupBowerPackageVersion = function(name) {
Expand Down Expand Up @@ -128,9 +132,14 @@ EmberCLIDependencyChecker.prototype.readNPMDependencies = function() {
EmberCLIDependencyChecker.prototype.readDependencies = function(dependencies, type) {
return Object.keys(dependencies).map(function(name) {
var versionSpecified = dependencies[name];
var versionInstalled = (type === 'npm') ? this.lookupNodeModuleVersion(name) : this.lookupBowerPackageVersion(name);
var path = (type === 'npm') ? buildNodePackagePath(this.project, name) : buildBowerPackagePath(this.project, name);
return new Package(name, versionSpecified, versionInstalled, path);
if (type === 'npm') {
var result = this.lookupNodeModule(name);
return new Package(name, versionSpecified, result.version, result.path);
} else {
var versionInstalled = this.lookupBowerPackageVersion(name);
var path = buildBowerPackagePath(this.project, name);
return new Package(name, versionSpecified, versionInstalled, path);
}
}, this);
};

Expand Down
30 changes: 21 additions & 9 deletions lib/shrinkwrap-checker.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,45 @@
var readPackageJSON = require('./utils/read-package-json');
var ShrinkwrapPackage = require('./shrinkwrap-package');
var path = require('path');
var resolve = require('resolve');

var ShrinkwrapChecker = function(root, name, versionSpecified, parents){
var ShrinkwrapChecker = function(root, name, versionSpecified, parents, requiredFrom){
this.root = root;
this.name = name;
this.versionSpecified = versionSpecified;
this.parents = parents;
this.requiredFrom = requiredFrom;
};

ShrinkwrapChecker.prototype.check = function() {
var packageJSON = readPackageJSON(this.root) || {};
if (!this.root) {
try {
this.root = path.dirname(resolve.sync(path.join(this.name, 'package.json'), { basedir: this.requiredFrom }));
} catch(err) {
// not found
}
}
var packageJSON;
if (!this.root) {
packageJSON = {};
} else {
packageJSON = readPackageJSON(this.root) || {};
}

var versionInstalled = packageJSON.version;
var resolvedInstalled = packageJSON['_resolved'];

return new ShrinkwrapPackage(
this.name, this.versionSpecified, versionInstalled, resolvedInstalled, this.parents);
};

ShrinkwrapChecker.checkDependencies = function(root, nodeModulesPath, shrinkWrapJSON) {

ShrinkwrapChecker.checkDependencies = function(root, shrinkWrapJSON) {
var resolvedDependencies = [];
var currentNode;

var nodesToCheck = [{
root: root,
nodeModulesPath: nodeModulesPath,
parents: [],
childDependencies: shrinkWrapJSON.dependencies,
name: shrinkWrapJSON.name,
Expand All @@ -37,7 +52,7 @@ ShrinkwrapChecker.checkDependencies = function(root, nodeModulesPath, shrinkWrap

while ((currentNode = nodesToCheck.pop())) {
checker = new ShrinkwrapChecker(
currentNode.root, currentNode.name, currentNode.version, currentNode.parents);
currentNode.root, currentNode.name, currentNode.version, currentNode.parents, currentNode.requiredFrom);

resolved = checker.check();
resolvedDependencies.push(resolved);
Expand All @@ -48,11 +63,8 @@ ShrinkwrapChecker.checkDependencies = function(root, nodeModulesPath, shrinkWrap
Object.keys(currentNode.childDependencies).forEach(function(childDepName){
var childDep = currentNode.childDependencies[childDepName];

var root = path.join(currentNode.nodeModulesPath, childDepName);
var nodeModulesPath = path.join(root, 'node_modules');
nodesToCheck.push({
root: root,
nodeModulesPath: nodeModulesPath,
requiredFrom: checker.root,
parents: parents,
name: childDepName,
childDependencies: childDep.dependencies,
Expand Down
6 changes: 0 additions & 6 deletions lib/utils/build-node-package-path.js

This file was deleted.

10 changes: 0 additions & 10 deletions lib/utils/read-node-modules-path.js

This file was deleted.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
"dependencies": {
"chalk": "^1.1.3",
"is-git-url": "^1.0.0",
"resolve": "^1.5.0",
"semver": "^5.3.0"
},
"ember-addon": {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Empty file.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Empty file.
Empty file.
5 changes: 5 additions & 0 deletions tests/unit/dependency-checker-package-manager-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ describe('EmberCLIDependencyChecker', function() {
var project = createProject({ 'ember-cli': '*' });
assertNoPackageManagerError(project);
});

it('when the version specified is found outside the project root', function() {
var project = createProject({ 'example-package': '1.2.3' }, { root: 'tests/fixtures/outside-root-' + packageManagerName + '-project/project' });
assertNoPackageManagerError(project);
});
});

describe('sibling node_modules/ directory', function() {
Expand Down
8 changes: 0 additions & 8 deletions tests/unit/utils-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,4 @@ describe('Utils', function() {
});
});

describe('buildNodePackagePath', function() {
it('should return node modules path appended by package name', function() {
var buildPath = require('../../lib/utils/build-node-package-path');
var project = { nodeModulesPath: 'node_modules' };
assert.equal(buildPath(project, 'awesome-addon'), 'node_modules' + path.sep + 'awesome-addon');
});
});

});
10 changes: 6 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4584,6 +4584,12 @@ resolve@^1.1.2, resolve@^1.1.6, resolve@^1.3.0, resolve@^1.3.2, resolve@^1.3.3:
dependencies:
path-parse "^1.0.5"

resolve@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
dependencies:
path-parse "^1.0.5"

restore-cursor@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
Expand Down Expand Up @@ -4661,10 +4667,6 @@ sanitize-filename@^1.6.1:
dependencies:
truncate-utf8-bytes "^1.0.0"

semver@^4.1.0:
version "4.3.6"
resolved "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"

semver@^5.1.0, semver@^5.1.1, semver@^5.3.0:
version "5.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
Expand Down

0 comments on commit ee038c7

Please sign in to comment.