diff options
Diffstat (limited to 'lib/utils/path.js')
-rw-r--r-- | lib/utils/path.js | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/lib/utils/path.js b/lib/utils/path.js index 5285896..c233c92 100644 --- a/lib/utils/path.js +++ b/lib/utils/path.js @@ -1,5 +1,12 @@ -var _ = require("lodash"); -var path = require("path"); +var _ = require('lodash'); +var path = require('path'); + +var error = require('./error'); + +// Normalize a filename +function normalizePath(filename) { + return path.normalize(filename); +} // Return true if file path is inside a folder function isInRoot(root, filename) { @@ -10,31 +17,42 @@ function isInRoot(root, filename) { // Resolve paths in a specific folder // Throw error if file is outside this folder function resolveInRoot(root) { - var input, result, err; + var input, result; input = _.chain(arguments) .toArray() .slice(1) .reduce(function(current, p) { // Handle path relative to book root ("/README.md") - if (p[0] == "/" || p[0] == "\\") return p.slice(1); + if (p[0] == '/' || p[0] == '\\') return p.slice(1); return current? path.join(current, p) : path.normalize(p); - }, "") + }, '') .value(); result = path.resolve(root, input); if (!isInRoot(root, result)) { - err = new Error("EACCESS: \"" + result + "\" not in \"" + root + "\""); - err.code = "EACCESS"; - throw err; + throw new error.FileOutOfScopeError({ + filename: result, + root: root + }); } return result; } +// Chnage extension +function setExtension(filename, ext) { + return path.join( + path.dirname(filename), + path.basename(filename, path.extname(filename)) + ext + ); +} + module.exports = { isInRoot: isInRoot, - resolveInRoot: resolveInRoot + resolveInRoot: resolveInRoot, + normalize: normalizePath, + setExtension: setExtension }; |