Skip to content

Commit

Permalink
Merge pull request #4 from sorrycc/master
Browse files Browse the repository at this point in the history
resolve devDependencies for root package
  • Loading branch information
popomore committed Jun 20, 2014
2 parents 8bb56dc + ac1e472 commit dfda566
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 20 deletions.
42 changes: 29 additions & 13 deletions lib/package.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ var properties = [
'main',
'origin',
'dependencies',
'devDependencies',
'files',
'output'
];
Expand All @@ -47,6 +48,7 @@ var Package = Class.create({
this.dest = dir;
this._packages = {};
this._dependencies = [];
this._devDependencies = [];
this._exportProperty(properties);
},

Expand Down Expand Up @@ -81,9 +83,9 @@ var Package = Class.create({
var prop = {
get: function() {
if (!that._parsed && !that._parsing) that._parse();
if (key === 'dependencies') {
if (key === 'dependencies' || key === 'devDependencies') {
var deps = {};
that._dependencies.forEach(function(id) {
that['_' + key].forEach(function(id) {
var pkg = that.get(id);
deps[pkg.name] = pkg;
});
Expand Down Expand Up @@ -118,17 +120,31 @@ var Package = Class.create({
},

_parsePkgDeps: function() {
var Self = this.constructor, deps = this._pkg.dependencies;
Object.keys(deps)
.forEach(function(name) {
var sub = deps[name];
if (!this.get(sub.id)) {
var opt = extend({}, this.options, {father: this});
this.set(new Self(sub.dest, opt)._parse());
}
this._dependencies.push(sub.id);
}.bind(this));
debug('_parsePkgDeps of pkg(%s) [%s]', this.id, Object.keys(deps));
var Self = this.constructor;
var that = this;

resolveDeps(this._pkg.dependencies);
resolveDeps(this._pkg.devDependencies || {}, true);

function resolveDeps(deps, isDev) {
Object.keys(deps)
.forEach(function(name) {
var sub = deps[name];
if (!that.get(sub.id)) {
var opt = extend({}, that.options, {father: that});
that.set(new Self(sub.dest, opt)._parse());
}
if (isDev) {
that._devDependencies.push(sub.id);
} else {
that._dependencies.push(sub.id);
}
});
}

debug('_parsePkgDeps of pkg(%s) [%s] [%s]', this.id,
Object.keys(this._pkg.dependencies),
Object.keys(this._pkg.devDependencies || {}));
},

_parseFiles: function() {
Expand Down
20 changes: 14 additions & 6 deletions lib/spm-package.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,27 @@ var debug = require('debug')('father:spm');
var SpmPackage = Package.extend({

readPackage: function() {
var pkgFile = normalize(join(this.dest, 'package.json'));
var pkgFile = normalize(join(this.dest, 'package.json'), this.father);
debug('readPackage(%s) info %s', pkgFile.id, JSON.stringify(pkgFile));

Object.keys(pkgFile.dependencies)
.forEach(function(name) {
pkgFile.dependencies[name] = resolveDeps(name, pkgFile, this);
pkgFile.dependencies[name] = resolveDeps(name, pkgFile.dependencies, this);
}.bind(this));

Object.keys(pkgFile.devDependencies)
.forEach(function(name) {
pkgFile.devDependencies[name] = resolveDeps(name, pkgFile.devDependencies, this);
}.bind(this));

return pkgFile;
}

});

module.exports = SpmPackage;

function normalize(pkg) {
function normalize(pkg, father) {
var dest = path.dirname(pkg);
delete require.cache[pkg];
pkg = require(pkg);
Expand All @@ -36,7 +42,7 @@ function normalize(pkg) {
if (typeof pkg.spm.main !== 'string') {
throw new Error('pkg.spm.main should be string.');
}

// handle ./index.js
pkg.spm.main = pkg.spm.main.replace(/^\.\//, '');

Expand All @@ -58,18 +64,20 @@ function normalize(pkg) {
name: pkg.name,
version: pkg.version,
dependencies: pkg.spm.dependencies || {},
devDependencies: father ? {} : (pkg.spm.devDependencies || {}),
main: pkg.spm.main,
dest: dest,
output: pkg.spm.output,
origin: pkg
};

return ret;
}

function resolveDeps(name, pkgFile, pkg) {
function resolveDeps(name, deps, pkg) {
var base = util.getBase(pkg);
var dest = join(base, 'sea-modules', name);
var version = util.getVersion(pkgFile.dependencies[name], dest);
var version = util.getVersion(deps[name], dest);
if (!version) {
throw new Error('no matched version of ' + name);
}
Expand Down
3 changes: 3 additions & 0 deletions test/fixtures/spm/normal/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
"b": "1.1.0",
"c": "1.1.1",
"d": "~0.1.0"
},
"devDependencies": {
"e": "1.1.0"
}
}
}
10 changes: 10 additions & 0 deletions test/fixtures/spm/normal/sea-modules/e/1.1.0/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "e",
"version": "1.1.0",
"spm": {
"main": "src/e.js",
"devDependencies": {
"f": "0.1.0"
}
}
}
1 change: 1 addition & 0 deletions test/fixtures/spm/normal/sea-modules/e/1.1.0/src/e.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
alert
11 changes: 10 additions & 1 deletion test/spm.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ describe('Father.SpmPackage', function() {
pkg.output.should.eql(['c.js']);
should.exists(pkg.files['c.js']);
var pkgDeps = pkg.dependencies;
var pkgDevDeps = pkg.devDependencies;
pkg.main.should.eql('a.js');
pkg.name.should.eql('a');
pkg.version.should.eql('1.0.0');
Expand All @@ -21,6 +22,7 @@ describe('Father.SpmPackage', function() {
pkgDeps['b'].should.eql(pkg.get('b@1.1.0'));
pkgDeps['c'].should.eql(pkg.get('c@1.1.1'));
pkgDeps['d'].should.eql(pkg.get('d@0.1.1'));
pkgDevDeps['e'].should.eql(pkg.get('e@1.1.0'));

var b = pkg.get('b@1.1.0');
var bDeps = b.dependencies;
Expand Down Expand Up @@ -48,6 +50,12 @@ describe('Father.SpmPackage', function() {
d2.name.should.eql('d');
d2.version.should.eql('0.1.1');
d2.files['index.js'].dependencies.should.eql([]);

var e = pkg.get('e@1.1.0');
e.main.should.eql('src/e.js');
e.name.should.eql('e');
e.version.should.eql('1.1.0');
e.files['src/e.js'].dependencies.should.eql([]);
});

it('version cache', function() {
Expand Down Expand Up @@ -152,7 +160,8 @@ describe('Father.SpmPackage', function() {
'd@0.1.0',
'c@1.1.1',
'b@1.1.0',
'd@0.1.1'
'd@0.1.1',
'e@1.1.0'
]);
});

Expand Down

0 comments on commit dfda566

Please sign in to comment.