15815213711
2024-08-26 67b8b6731811983447e053d4396b3708c14dfe3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
 * @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
};