Skip to content

Commit

Permalink
support post-dependencies, npm update, endpoint API 1.2
Browse files Browse the repository at this point in the history
  • Loading branch information
guybedford committed Jan 1, 2015
1 parent a168862 commit c5125f1
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 37 deletions.
8 changes: 0 additions & 8 deletions lib/config/loader.js
Expand Up @@ -25,8 +25,6 @@ var PackageName = require('./package-name');
var alphabetize = require('../common').alphabetize;
var ui = require('../ui');

var nodelibs;

/*
* Loader Configuration Class
*
Expand Down Expand Up @@ -139,14 +137,9 @@ Config.prototype.read = function() {
}

// ensure that everything in baseMap has a depMap, even if empty
// also add back nodelibs into depMaps here
if (!nodelibs)
nodelibs = new PackageName(endpoint.load('npm').nodelibs);
for (var d in self.baseMap) {
var name = self.baseMap[d].exactName;
var depMap = self.depMap[name] = self.depMap[name] || {};
if (name.substr(0, 4) == 'npm:')
self.depMap[name].nodelibs = nodelibs;
}

self.versions = self.versions || {};
Expand Down Expand Up @@ -298,7 +291,6 @@ Config.prototype.write = function() {
for (var p in cfg.map) {
var subMap = cfg.map[p];
if (typeof subMap == 'object') {
delete subMap.nodelibs;
if (!hasProperties(subMap))
delete cfg.map[p];
else
Expand Down
20 changes: 12 additions & 8 deletions lib/install.js
Expand Up @@ -331,15 +331,19 @@ function install(name, target, options, seen) {
}

// trigger dependency downloads
// this can be triggered twice
// - once by initial preload, and once post-build if additional dependencies are discovered
function downloadDeps(depMap) {
dependencyDownloads = Promise.all(Object.keys(depMap).map(function(dep) {
return install(dep, depMap[dep], {
latest: options.latest,
lock: options.lock,
parent: resolution.exactName,
inject: options.inject
}, seen);
}));
dependencyDownloads = (dependencyDownloads || Promise.resolve()).then(function() {
return Promise.all(Object.keys(depMap).map(function(dep) {
return install(dep, depMap[dep], {
latest: options.latest,
lock: options.lock,
parent: resolution.exactName,
inject: options.inject
}, seen);
}));
});
}
}

Expand Down
76 changes: 55 additions & 21 deletions lib/package.js
Expand Up @@ -328,14 +328,17 @@ exports.inject = function(pkg, depLoad) {

// note if it is a symlink, we leave it unaltered
var downloading = {};
exports.download = function(pkg, override, unlink, preload) {
exports.download = function(pkg, override, unlink, installDeps) {
override = override || {};
if (downloading[pkg.exactName]) {
if (preload)
downloading[pkg.exactName].preload.then(function(depMap) {
preload(depMap)
return depMap
});
downloading[pkg.exactName].preload.then(function(depMap) {
installDeps(depMap);
return depMap
});
downloading[pkg.exactName].postload.then(function(depMap) {
installDeps(depMap);
return depMap;
});
return downloading[pkg.exactName].promise;
}

Expand All @@ -345,10 +348,19 @@ exports.download = function(pkg, override, unlink, preload) {
getPackageConfigReject = reject;
});

var postloadResolve;

downloading[pkg.exactName] = {
preload: getPackageConfigPromise.then(function(pjson) {
var depMap = processDeps(pjson.dependencies, pjson.registry);
preload(depMap)
installDeps(depMap)
return depMap;
}),
postload: new Promise(function(resolve, reject) {
postloadResolve = resolve;
})
.then(function(depMap) {
installDeps(depMap);
return depMap;
})
};
Expand Down Expand Up @@ -484,7 +496,7 @@ exports.download = function(pkg, override, unlink, preload) {
.then(function(_pjson) {
if (_pjson)
pjson = _pjson;
return _pkg.processPackage(pkg, cacheDir, pjson);
return _pkg.processPackage(pkg, cacheDir, pjson, postloadResolve);
})
// we've now finished creating the cache directory
.then(function() {
Expand Down Expand Up @@ -555,10 +567,11 @@ exports.derivePackageConfig = derivePackageConfig;
NB this function should be deprecated
*/
exports.processPackage = function(pkg, dir, pjson) {
exports.processPackage = function(pkg, dir, pjson, postload) {
var endpoint = ep.load(pjson.registry != 'jspm' && pjson.registry || pkg.endpoint);
var deps;
var buildErrors = [];
var curDeps;

return Promise.resolve()

Expand All @@ -567,18 +580,30 @@ exports.processPackage = function(pkg, dir, pjson) {
if (endpoint.build)
return Promise.resolve()
.then(function() {
curDeps = Object.keys(pjson.dependencies);
return endpoint.build(pjson, dir);
})
.catch(function(e) {
throw 'Error building package `' + pkg.name + '`\n' + e;
});
})
})

// apply build operations from the package.json
.then(function(_buildErrors) {
if (_buildErrors)
buildErrors = buildErrors.concat(_buildErrors);

// if we gained a new dependency, download it
if (pjson.dependencies && Object.keys(pjson.dependencies).length > curDeps.length) {
var newDepMap = processDeps(pjson.dependencies, pjson.registry);
// remove dependencies already downloaded
Object.keys(newDepMap).forEach(function(dep) {
if (curDeps.indexOf(dep) != -1)
delete newDepMap[dep];
});
postload(newDepMap);
}

// don't build in dependencies
deps = pjson.dependencies;
delete pjson.dependencies;
Expand All @@ -605,15 +630,21 @@ exports.processPackage = function(pkg, dir, pjson) {
exports.createMain = function(pkg, pjson, downloadDir) {
var lastNamePart, main;
var mainPath;
var importantMain;
var pluginMain;

return Promise.resolve()

// create the main entry point
.then(function() {
lastNamePart = pkg.name.split('/').pop().split(':').pop();
main = typeof pjson.main == 'string' && pjson.main;
importantMain = main[main.length - 1] === '!' && main;

// we don't need to ensure it exists for plugin mains
// as they can have custom locate functions
if (main && main.indexOf('!') != -1) {
pluginMain = true;
return true;
}

if (main) {
if (main.substr(0, 2) == './')
Expand All @@ -626,9 +657,7 @@ exports.createMain = function(pkg, pjson, downloadDir) {

// try the package.json main
return new Promise(function(resolve, reject) {
mainPath = path.resolve(downloadDir, importantMain ?
main.substr(0, main.length - 1) :
main.substr(main.length - 3, 3) != '.js' ? main + '.js' : main);
mainPath = path.resolve(downloadDir, main.substr(main.length - 3, 3) != '.js' ? main + '.js' : main);
fs.exists(mainPath, resolve);
});
})
Expand All @@ -645,18 +674,23 @@ exports.createMain = function(pkg, pjson, downloadDir) {
.then(function(exists) {
// don't create a main if it doesn't exist
if (!exists) {
ui.log('warn', 'No main entry point detected for `' + pkg.exactName + '`. Try adding an override.');
if (pjson.main !== false)
ui.log('warn', 'No main entry point detected for `' + pkg.exactName + '`.\nTry adding an override, or set the package.json %"main": false% if this is the intention.\n');
return;
}

// detect the format of the main
// create the main pointer
var mainFile = path.resolve(downloadDir, '../' + lastNamePart + '@' + pkg.version + '.js');

// plugin mains are redirected by CommonJS
if (pluginMain)
return asp(fs.writeFile)(mainFile, getRedirectContents('cjs', pkg.exactName + '/' + main));

// otherwise detect the format of the main
return asp(fs.readFile)(mainPath)
.then(function(source) {
var detected = build.detectFormat(source.toString());

// create the main pointer
var mainFile = path.resolve(downloadDir, '../' + lastNamePart + '@' + pkg.version + '.js');
main = importantMain || main;

return asp(fs.writeFile)(mainFile, getRedirectContents(detected.format, pkg.exactName + '/' + main));
});
});
Expand Down

0 comments on commit c5125f1

Please sign in to comment.