73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
|
/**
|
||
|
* @fileoverview Common helpers for operations on filenames and paths
|
||
|
* @author Ian VanSchooten
|
||
|
*/
|
||
|
"use strict";
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Requirements
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
const path = require("path");
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Private
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
/**
|
||
|
* Replace Windows with posix style paths
|
||
|
*
|
||
|
* @param {string} filepath Path to convert
|
||
|
* @returns {string} Converted filepath
|
||
|
*/
|
||
|
function convertPathToPosix(filepath) {
|
||
|
const normalizedFilepath = path.normalize(filepath);
|
||
|
const posixFilepath = normalizedFilepath.replace(/\\/gu, "/");
|
||
|
|
||
|
return posixFilepath;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts an absolute filepath to a relative path from a given base path
|
||
|
*
|
||
|
* For example, if the filepath is `/my/awesome/project/foo.bar`,
|
||
|
* and the base directory is `/my/awesome/project/`,
|
||
|
* then this function should return `foo.bar`.
|
||
|
*
|
||
|
* path.relative() does something similar, but it requires a baseDir (`from` argument).
|
||
|
* This function makes it optional and just removes a leading slash if the baseDir is not given.
|
||
|
*
|
||
|
* It does not take into account symlinks (for now).
|
||
|
*
|
||
|
* @param {string} filepath Path to convert to relative path. If already relative,
|
||
|
* it will be assumed to be relative to process.cwd(),
|
||
|
* converted to absolute, and then processed.
|
||
|
* @param {string} [baseDir] Absolute base directory to resolve the filepath from.
|
||
|
* If not provided, all this function will do is remove
|
||
|
* a leading slash.
|
||
|
* @returns {string} Relative filepath
|
||
|
*/
|
||
|
function getRelativePath(filepath, baseDir) {
|
||
|
const absolutePath = path.isAbsolute(filepath)
|
||
|
? filepath
|
||
|
: path.resolve(filepath);
|
||
|
|
||
|
if (baseDir) {
|
||
|
if (!path.isAbsolute(baseDir)) {
|
||
|
throw new Error(`baseDir should be an absolute path: ${baseDir}`);
|
||
|
}
|
||
|
return path.relative(baseDir, absolutePath);
|
||
|
}
|
||
|
return absolutePath.replace(/^\//u, "");
|
||
|
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Public Interface
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
module.exports = {
|
||
|
convertPathToPosix,
|
||
|
getRelativePath
|
||
|
};
|