diff --git a/lib/resolve/resolverFactory.js b/lib/resolve/resolverFactory.js index 986618ca..ebf89093 100644 --- a/lib/resolve/resolverFactory.js +++ b/lib/resolve/resolverFactory.js @@ -1,8 +1,21 @@ -var Q = require('q'); -var GitFsResolver = require('./resolvers/GitFsResolver'); +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); +var request = require('request'); +var GitFsResolver = require('./resolvers/GitFsResolver'); var GitRemoteResolver = require('./resolvers/GitRemoteResolver'); -var FsResolver = require('./resolvers/FsResolver'); -var UrlResolver = require('./resolvers/UrlResolver'); +var FsResolver = require('./resolvers/FsResolver'); +var UrlResolver = require('./resolvers/UrlResolver'); + +/* + +## TODO: + +- fabrication cache: based on the source, store the resolver type +- use `registry.search` configuration in the registry search +- use `shorthandResolver` and assume remote git when "\w+\/\w+" is the source + +*/ function createResolver(endpoint, options) { var split = endpoint.split('#'), @@ -17,8 +30,53 @@ function createResolver(endpoint, options) { options = options || {}; options.target = options.target || target; - // TODO: analyze source and create appropriate package - return Q.fcall(new GitRemoteResolver(source, options)); + // Test source type. + // Valid types are: local folder, URL, local git, remote git and published + // package + + // if it's a remote git + if (/^git(\+(ssh|https?))?:\/\//i.exec(source)) { + return Q.resolve(new GitRemoteResolver(source, options)); + } + + // if it's an URL + if (/^https?:\/\//i.exec(source)) { + return Q.resolve(new UrlResolver(source, options)); + } + + // if it's a local git + return Q.nfcall(fs.stat, path.resolve(source + '/.git')) + .then(function (stats) { + if (stats.isDirectory()) { + return new GitFsResolver(source, options); + } else { + throw new Error('.git is not a folder'); + } + }) + .fail(function () { + // if it's a local file/folder + return Q.nfcall(fs.stat, source) + .then(function () { + return new FsResolver(source, options); + }) + .fail(function () { + return Q.nfcall(request, 'https://bower.herokuapp.com/packages/' + source) + .spread(function (res, body) { + if (res.statusCode === 404) { + throw new Error('Not a package alias'); + } + + return createResolver(JSON.parse(body).url, options); + }) + .fail(function (err) { + throw new Error('Unknown source type'); + //return new PublishedResolver(source, options); + }) + ; + }) + ; + } + ); } module.exports = createResolver; \ No newline at end of file diff --git a/package.json b/package.json index d5ed1a97..cc0c2528 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "pathspec": "~0.9.2", "glob": "~3.1.21", "rimraf": "~2.1.4", - "chmodr": "~0.1.0" + "chmodr": "~0.1.0", + "request": "~2.20.0" }, "devDependencies": { "mocha": "~1.8.2",