Code coverage report for father/lib/spm-package.js

Statements: 100% (49 / 49)      Branches: 100% (16 / 16)      Functions: 100% (8 / 8)      Lines: 100% (49 / 49)      Ignored: none     

All files » father/lib/ » spm-package.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109    1 1 1 1 1 1   1     41 39   39   33   38         1   1 41 41 41 41     41 24   41 1       40 31   40 1     39                   39     1   1 33 33 33   33 22   11 11     33 33 1     32                       1 11   13     1       1 33 16   33    
'use strict';
 
var fs = require('fs');
var path = require('path');
var join = path.join;
var semver = require('semver');
var Package = require('./package');
var debug = require('debug')('father:spm');
 
var SpmPackage = Package.extend({
 
  readPackage: function() {
    var pkg = normalize(join(this.dest, 'package.json'));
    debug('readPackage(%s) info %s', pkg.id, JSON.stringify(pkg));
 
    Object.keys(pkg.dependencies)
      .forEach(function(name) {
        pkg.dependencies[name] = resolveDeps(name, pkg, this);
      }.bind(this));
    return pkg;
  }
 
});
 
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;
}
 
var versionCache = {};
 
function resolveDeps(name, pkg, self) {
  var versions, version = pkg.dependencies[name];
  var ancestor = getAncestor(self);
  var dest = join(ancestor.dest, 'sea-modules', name);
 
  if (versionCache[dest]) {
    versions = versionCache[dest];
  } else {
    versions = getVersions(dest);
    versionCache[dest] = versions;
  }
 
  version = semver.maxSatisfying(versions, version);
  if (!version) {
    throw new Error('no matched version of ' + name);
  }
 
  return {
    id: name + '@' + version,
    name: name,
    version: version,
    dest: join(dest, version)
  };
}
 
/*
  Get versions from specified directory
*/
 
function getVersions(dest) {
  return fs.readdirSync(dest)
    .filter(function(item) {
      return semver.valid(item);
    })
    .sort(function(a, b) {
      return semver.gt(a, b);
    });
}
 
function getAncestor(self) {
  while(self.father) {
    self = self.father;
  }
  return self;
}