'use strict';
var path = require('path');
var join = path.join;
var util = require('./util');
var Package = require('./package');
var debug = require('debug')('father:spm');
var SpmPackage = Package.extend({
readPackage: function() {
var pkgFile = normalize(join(this.dest, 'package.json'));
debug('readPackage(%s) info %s', pkgFile.id, JSON.stringify(pkgFile));
Object.keys(pkgFile.dependencies)
.forEach(function(name) {
pkgFile.dependencies[name] = resolveDeps(name, pkgFile, this);
}.bind(this));
return pkgFile;
}
});
module.exports = SpmPackage;
function normalize(pkg) {
var dest = path.dirname(pkg);
delete require.cache[pkg];
pkg = require(pkg);
pkg.spm = pkg.spm || {};
// detect main type
if (!pkg.spm.main) {
pkg.spm.main = 'index.js';
}
if (typeof pkg.spm.main !== 'string') {
throw new Error('pkg.spm.main should be string.');
}
// detect output type
if (!pkg.spm.output) {
pkg.spm.output = [];
}
if (!Array.isArray(pkg.spm.output)) {
throw new Error('pkg.spm.output should be array.');
}
var ret = {
id: pkg.name + '@' + pkg.version,
name: pkg.name,
version: pkg.version,
dependencies: pkg.spm.dependencies || {},
main: pkg.spm.main,
dest: dest,
output: pkg.spm.output,
origin: pkg
};
return ret;
}
function resolveDeps(name, pkgFile, pkg) {
var base = util.getBase(pkg);
var dest = join(base, 'sea-modules', name);
var version = util.getVersion(pkgFile.dependencies[name], dest);
if (!version) {
throw new Error('no matched version of ' + name);
}
return {
id: name + '@' + version,
name: name,
version: version,
dest: join(dest, version)
};
}
|