graphquire
Version:
module graph builder and installer.
53 lines (47 loc) • 2.17 kB
JavaScript
/* vim:set ts=2 sw=2 sts=2 expandtab */
/*jshint asi: true undef: true es5: true node: true devel: true
forin: true latedef: false globalstrict: true */
/*global define: true */
"use strict";
function isAbsolute(uri) { return uri && uri.charAt(0) !== '.' }
function resolve(uri, base) {
var path, paths, last
if (isAbsolute(uri)) return uri
paths = uri.split('/')
base = base ? base.split('/') : [ '.' ]
if (base.length > 1) base.pop()
while ((path = paths.shift())) {
if (path === '..') {
if (base.length && base[base.length - 1] !== '..') {
if (base.pop() === '.') base.push(path)
} else base.push(path)
} else if (path !== '.') {
base.push(path)
}
}
if (base[base.length - 1].substr(-1) === '.') base.push('')
return base.join('/')
}
exports['test resolve'] = function(assert) {
assert.equal(resolve('./'), './', './ @ => ./')
assert.equal(resolve('.'), './', '. @ => ./')
assert.equal(resolve('./a'), './a', './a @ => ./a')
assert.equal(resolve('./a/b'), './a/b', './a/b @ => ./a/b')
assert.equal(resolve('./a', './b'), './a', './a @ ./b => ./a')
assert.equal(resolve('./a', '../b'), '../a', './a @ ../b => ../a')
assert.equal(resolve('./a', '../b/c'), '../b/a', './a @ ../b/c => ../b/a')
assert.equal(resolve('../b'), '../b', '../b @ => ../b')
assert.equal(resolve('../../a', './b'), '../../a', '../../a @ ./b => ../../a')
assert.equal(resolve('../../a', './b/c'), '../a', '../../a @ ./b/c => ../a')
assert.equal(resolve('../..', './a/b/c'), './', '../.. @ ./a/b/c => ./')
assert.equal(resolve('./', '../b'), '../', './ @ ../b => ../b')
assert.equal(resolve('./a', '../b'), '../a', './a @ ../b => ../a')
assert.equal(resolve('..', '..'), '../../', '.. @ .. => ../../')
assert.equal(resolve('../', '..'), '../../', '../ @ .. => ../../')
assert.equal(resolve('..', '../'), '../../', '.. @ ../ => ../../')
assert.equal(resolve('../', '../'), '../../', '../ @ ../ => ../../')
assert.equal(resolve('..', '../a/b'), '../', '.. @ ../a/b => ../')
assert.equal(resolve('.', '..'), '../', '. @ .. => ../')
}
if (module == require.main)
require("test").run(exports)