Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use ember-cli project nodeModulesPath when available #31

Merged
merged 4 commits into from
May 12, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions lib/dependency-checker.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@ function EmberCLIDependencyChecker(project, reporter) {
this.reporter = reporter;
}

// Legacy Ember-CLI (before 0.2.4) does not have a `nodeModulesPath` property
function readNodeModulesPath(project) {
if (project.nodeModulesPath) {
return project.nodeModulesPath;
} else {
return path.join(project.root, 'node_modules');
}
}

EmberCLIDependencyChecker.prototype.checkDependencies = function() {
if (alreadyChecked || process.env.SKIP_DEPENDENCY_CHECKER) {
return;
Expand Down Expand Up @@ -51,19 +60,19 @@ EmberCLIDependencyChecker.prototype.readShrinkwrapDeps = function() {
} catch(e) {
// JSON parse error
}
return ShrinkWrapChecker.checkDependencies(this.project.root, shrinkWrapJSON);
return ShrinkWrapChecker.checkDependencies(this.project.root, readNodeModulesPath(this.project), shrinkWrapJSON);
} else {
return [];
}
};

EmberCLIDependencyChecker.prototype.lookupNodeModuleVersion = function(name) {
var nodePackage = path.join(this.project.root, 'node_modules', name, 'package.json');
var nodePackage = path.join(readNodeModulesPath(this.project), name, 'package.json');
return this.lookupPackageVersion(nodePackage);
};

EmberCLIDependencyChecker.prototype.lookupBowerPackageVersion = function(name) {
var packageDirectory = path.join(this.project.root, this.project.bowerDirectory, name);
var packageDirectory = path.resolve(this.project.root, this.project.bowerDirectory, name);
var version = null;
if (fileExists(packageDirectory) && readDir(packageDirectory).length > 0) {
var dotBowerFile = path.join(packageDirectory, '.bower.json');
Expand Down
8 changes: 6 additions & 2 deletions lib/shrinkwrap-checker.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ ShrinkwrapChecker.prototype.check = function() {
this.name, this.versionSpecified, versionInstalled, this.parents);
};

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

var nodesToCheck = [{
root: root,
nodeModulesPath: nodeModulesPath,
parents: [],
childDependencies: shrinkWrapJSON.dependencies,
name: shrinkWrapJSON.name,
Expand All @@ -46,8 +47,11 @@ ShrinkwrapChecker.checkDependencies = function(root, shrinkWrapJSON) {
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: path.join(currentNode.root, 'node_modules', childDepName),
root: root,
nodeModulesPath: nodeModulesPath,
parents: parents,
name: childDepName,
childDependencies: childDep.dependencies,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "project-npm-check",
"dependencies": {
}
}

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

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "test",
"version": "1.0.0"
}

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

52 changes: 52 additions & 0 deletions tests/helpers/project-builder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
'use strict';

var defaultProject, projectBuilder;

function simpleMerge(target, object) {
var merged = Object.create(target);
for (var key in object) {
merged[key] = object[key];
}
return merged;
}

/*
* Usage:
*
* var project = projectBuilder.build({
* dependencies: projectBuilder.buildDependencies([
* { some: object }
* ],
* root: 'some/alternative/root'
* });
*
*
*/
projectBuilder = {

build: function projectBuilder$build(configuredProject) {
var project = simpleMerge(defaultProject, configuredProject || {});
return project;
},

buildDependencies: function projectBuilder$buildDependencies(dependencies) {
return function(){
return dependencies || {};
};
},

buildBowerDependencies: function projectBuilder$buildBowerDependencies(dependencies) {
return function(){
return dependencies || {};
};
}
};

defaultProject = {
root: 'tests/fixtures/project-npm-check',
bowerDirectory: 'bower_components',
dependencies: projectBuilder.buildDependencies(),
bowerDependencies: projectBuilder.buildBowerDependencies()
};

module.exports = projectBuilder;
17 changes: 6 additions & 11 deletions tests/unit/dependency-checker-bower-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,19 @@
var assertError = require('../helpers/assert-error');
var assertNoError = require('../helpers/assert-no-error');
var DependencyChecker = require('../../lib/dependency-checker');
var projectBuilder = require('../helpers/project-builder');

describe('EmberCLIDependencyChecker', function() {
beforeEach(function(){
DependencyChecker.setAlreadyChecked(false);
});

var createProject = function(bowerDependencies) {
return {
function createProject(bowerDependencies) {
return projectBuilder.build({
root: 'tests/fixtures/project-bower-check',
bowerDirectory: 'bower_components',
dependencies: function() {
return {};
},
bowerDependencies: function() {
return bowerDependencies || {};
}
};
};
bowerDependencies: projectBuilder.buildBowerDependencies(bowerDependencies)
});
}

var assertBowerError = function(project) {
return assertError(project, 'bower');
Expand Down
31 changes: 19 additions & 12 deletions tests/unit/dependency-checker-npm-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,19 @@
var assertError = require('../helpers/assert-error');
var assertNoError = require('../helpers/assert-no-error');
var DependencyChecker = require('../../lib/dependency-checker');
var projectBuilder = require('../helpers/project-builder');

describe('EmberCLIDependencyChecker', function() {
beforeEach(function(){
DependencyChecker.setAlreadyChecked(false);
});

var createProject = function(dependencies) {
return {
root: 'tests/fixtures/project-npm-check',
bowerDirectory: 'bower_components',
dependencies: function() {
return dependencies || {};
},
bowerDependencies: function() {
return {};
}
};
};
function createProject(dependencies, options) {
options = options || {};
options.root = options.root || 'tests/fixtures/project-npm-check';
options.dependencies = projectBuilder.buildDependencies(dependencies);
return projectBuilder.build(options);
}

var assertNpmError = function(project) {
return assertError(project, 'npm');
Expand Down Expand Up @@ -93,4 +88,16 @@ describe('EmberCLIDependencyChecker', function() {
assertNoNpmError(project);
});
});

describe('sibling node_modules/ directory', function() {
it('checks depdencies', function() {
var project = createProject({
'ember-cli': '*'
}, {
root: 'tests/fixtures/project-npm-sibling-node-modules-check/app',
nodeModulesPath: 'tests/fixtures/project-npm-sibling-node-modules-check/node_modules',
});
assertNoNpmError(project);
});
});
});
39 changes: 25 additions & 14 deletions tests/unit/dependency-checker-shrinkwrap-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,19 @@ var DependencyError = require('../../lib/dependency-error');
var assert = require('chai').assert;
var DependencyChecker = require('../../lib/dependency-checker');
var Reporter = require('../../lib/reporter');
var projectBuilder = require('../helpers/project-builder');

describe('EmberCLIDependencyChecker : Shrinkwrap', function() {
beforeEach(function(){
DependencyChecker.setAlreadyChecked(false);
});

var createProject = function(dependencies, root) {
return {
root: root || 'tests/fixtures/project-shrinkwrap-check',
bowerDirectory: 'bower_components',
dependencies: function() {
return dependencies || {};
},
bowerDependencies: function() {
return {};
}
};
};
function createProject(dependencies, options) {
options = options || {};
options.root = options.root || 'tests/fixtures/project-shrinkwrap-check';
options.dependencies = projectBuilder.buildDependencies(dependencies);
return projectBuilder.build(options);
}

describe('with a shrinkwrap file', function() {
describe('with top-level dependencies that are not satisifed', function() {
Expand Down Expand Up @@ -72,7 +67,9 @@ describe('EmberCLIDependencyChecker : Shrinkwrap', function() {
it('when the installed package does not match the version specified', function() {
var project = createProject({
'mkdirp': '0.5.0'
}, 'tests/fixtures/project-shrinkwrap-nested-deps-check');
}, {
root: 'tests/fixtures/project-shrinkwrap-nested-deps-check'
});

assertError(project, 'npm-shrinkwrap');
});
Expand All @@ -83,8 +80,22 @@ describe('EmberCLIDependencyChecker : Shrinkwrap', function() {
it('when top-level deps and nested deps are satisfied', function() {
var project = createProject({
'mkdirp': '0.5.0'
}, 'tests/fixtures/project-shrinkwrap-nested-deps-ok');
}, {
root: 'tests/fixtures/project-shrinkwrap-nested-deps-ok'
});

assertNoError(project, 'npm-shrinkwrap');
});
});

describe('sibling node_modules/ directory', function() {
it('checks dependencies', function() {
var project = createProject({
'minimist': '1.1.1'
}, {
root: 'tests/fixtures/project-shrinkwrap-sibling-node-modules-check/app',
nodeModulesPath: 'tests/fixtures/project-shrinkwrap-sibling-node-modules-check/node_modules'
});
assertNoError(project, 'npm-shrinkwrap');
});
});
Expand Down