mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
7.1 KiB
199 lines
7.1 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.filenameToSteps = exports.resolve = exports.unixify = exports.isWin = void 0;
|
|
exports.isFd = isFd;
|
|
exports.validateFd = validateFd;
|
|
exports.dataToBuffer = dataToBuffer;
|
|
exports.nullCheck = nullCheck;
|
|
exports.pathToFilename = pathToFilename;
|
|
exports.createError = createError;
|
|
exports.createStatError = createStatError;
|
|
const path_1 = require("@jsonjoy.com/fs-node-builtins/lib/path");
|
|
const buffer_1 = require("@jsonjoy.com/fs-node-builtins/lib/internal/buffer");
|
|
const errors = require("@jsonjoy.com/fs-node-builtins/lib/internal/errors");
|
|
const process_1 = require("./process");
|
|
const encoding_1 = require("./encoding");
|
|
const fs_node_utils_1 = require("@jsonjoy.com/fs-node-utils");
|
|
exports.isWin = process_1.default.platform === 'win32';
|
|
const resolveCrossPlatform = path_1.resolve;
|
|
const pathSep = path_1.posix ? path_1.posix.sep : path_1.sep;
|
|
const isSeparator = (str, i) => {
|
|
let char = str[i];
|
|
return i > 0 && (char === '/' || (exports.isWin && char === '\\'));
|
|
};
|
|
const removeTrailingSeparator = (str) => {
|
|
let i = str.length - 1;
|
|
if (i < 2)
|
|
return str;
|
|
while (isSeparator(str, i))
|
|
i--;
|
|
return str.substr(0, i + 1);
|
|
};
|
|
const normalizePath = (str, stripTrailing) => {
|
|
if (typeof str !== 'string')
|
|
throw new TypeError('expected a string');
|
|
str = str.replace(/[\\\/]+/g, '/');
|
|
if (stripTrailing !== false)
|
|
str = removeTrailingSeparator(str);
|
|
return str;
|
|
};
|
|
const unixify = (filepath, stripTrailing = true) => {
|
|
if (exports.isWin) {
|
|
filepath = normalizePath(filepath, stripTrailing);
|
|
return filepath.replace(/^([a-zA-Z]+:|\.\/)/, '');
|
|
}
|
|
return filepath;
|
|
};
|
|
exports.unixify = unixify;
|
|
let resolve = (filename, base = process_1.default.cwd()) => resolveCrossPlatform(base, filename);
|
|
exports.resolve = resolve;
|
|
if (exports.isWin) {
|
|
const _resolve = resolve;
|
|
exports.resolve = resolve = (filename, base) => (0, exports.unixify)(_resolve(filename, base));
|
|
}
|
|
const filenameToSteps = (filename, base) => {
|
|
const fullPath = resolve(filename, base);
|
|
const fullPathSansSlash = fullPath.substring(1);
|
|
if (!fullPathSansSlash)
|
|
return [];
|
|
return fullPathSansSlash.split(pathSep);
|
|
};
|
|
exports.filenameToSteps = filenameToSteps;
|
|
function isFd(path) {
|
|
return path >>> 0 === path;
|
|
}
|
|
function validateFd(fd) {
|
|
if (!isFd(fd))
|
|
throw TypeError(fs_node_utils_1.ERRSTR.FD);
|
|
}
|
|
function dataToBuffer(data, encoding = encoding_1.ENCODING_UTF8) {
|
|
if (buffer_1.Buffer.isBuffer(data))
|
|
return data;
|
|
else if (data instanceof Uint8Array)
|
|
return (0, buffer_1.bufferFrom)(data);
|
|
else if (encoding === 'buffer')
|
|
return (0, buffer_1.bufferFrom)(String(data), 'utf8');
|
|
else
|
|
return (0, buffer_1.bufferFrom)(String(data), encoding);
|
|
}
|
|
function nullCheck(path, callback) {
|
|
if (('' + path).indexOf('\u0000') !== -1) {
|
|
const er = new Error('Path must be a string without null bytes');
|
|
er.code = 'ENOENT';
|
|
if (typeof callback !== 'function')
|
|
throw er;
|
|
Promise.resolve().then(() => callback(er));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function getPathFromURLPosix(url) {
|
|
if (url.hostname !== '') {
|
|
throw new errors.TypeError('ERR_INVALID_FILE_URL_HOST', process_1.default.platform);
|
|
}
|
|
const pathname = url.pathname;
|
|
for (let n = 0; n < pathname.length; n++) {
|
|
if (pathname[n] === '%') {
|
|
const third = pathname.codePointAt(n + 2) | 0x20;
|
|
if (pathname[n + 1] === '2' && third === 102) {
|
|
throw new errors.TypeError('ERR_INVALID_FILE_URL_PATH', 'must not include encoded / characters');
|
|
}
|
|
}
|
|
}
|
|
return decodeURIComponent(pathname);
|
|
}
|
|
function pathToFilename(path) {
|
|
if (path instanceof Uint8Array) {
|
|
path = (0, buffer_1.bufferFrom)(path);
|
|
}
|
|
if (typeof path !== 'string' && !buffer_1.Buffer.isBuffer(path)) {
|
|
try {
|
|
if (!(path instanceof require('url').URL))
|
|
throw new TypeError(fs_node_utils_1.ERRSTR.PATH_STR);
|
|
}
|
|
catch (err) {
|
|
throw new TypeError(fs_node_utils_1.ERRSTR.PATH_STR);
|
|
}
|
|
path = getPathFromURLPosix(path);
|
|
}
|
|
const pathString = String(path);
|
|
nullCheck(pathString);
|
|
return pathString;
|
|
}
|
|
const ENOENT = 'ENOENT';
|
|
const EBADF = 'EBADF';
|
|
const EINVAL = 'EINVAL';
|
|
const EPERM = 'EPERM';
|
|
const EPROTO = 'EPROTO';
|
|
const EEXIST = 'EEXIST';
|
|
const ENOTDIR = 'ENOTDIR';
|
|
const EMFILE = 'EMFILE';
|
|
const EACCES = 'EACCES';
|
|
const EISDIR = 'EISDIR';
|
|
const ENOTEMPTY = 'ENOTEMPTY';
|
|
const ENOSYS = 'ENOSYS';
|
|
const ERR_FS_EISDIR = 'ERR_FS_EISDIR';
|
|
const ERR_OUT_OF_RANGE = 'ERR_OUT_OF_RANGE';
|
|
function formatError(errorCode, func = '', path = '', path2 = '') {
|
|
let pathFormatted = '';
|
|
if (path)
|
|
pathFormatted = ` '${path}'`;
|
|
if (path2)
|
|
pathFormatted += ` -> '${path2}'`;
|
|
switch (errorCode) {
|
|
case ENOENT:
|
|
return `ENOENT: no such file or directory, ${func}${pathFormatted}`;
|
|
case EBADF:
|
|
return `EBADF: bad file descriptor, ${func}${pathFormatted}`;
|
|
case EINVAL:
|
|
return `EINVAL: invalid argument, ${func}${pathFormatted}`;
|
|
case EPERM:
|
|
return `EPERM: operation not permitted, ${func}${pathFormatted}`;
|
|
case EPROTO:
|
|
return `EPROTO: protocol error, ${func}${pathFormatted}`;
|
|
case EEXIST:
|
|
return `EEXIST: file already exists, ${func}${pathFormatted}`;
|
|
case ENOTDIR:
|
|
return `ENOTDIR: not a directory, ${func}${pathFormatted}`;
|
|
case EISDIR:
|
|
return `EISDIR: illegal operation on a directory, ${func}${pathFormatted}`;
|
|
case EACCES:
|
|
return `EACCES: permission denied, ${func}${pathFormatted}`;
|
|
case ENOTEMPTY:
|
|
return `ENOTEMPTY: directory not empty, ${func}${pathFormatted}`;
|
|
case EMFILE:
|
|
return `EMFILE: too many open files, ${func}${pathFormatted}`;
|
|
case ENOSYS:
|
|
return `ENOSYS: function not implemented, ${func}${pathFormatted}`;
|
|
case ERR_FS_EISDIR:
|
|
return `[ERR_FS_EISDIR]: Path is a directory: ${func} returned EISDIR (is a directory) ${path}`;
|
|
case ERR_OUT_OF_RANGE:
|
|
return `[ERR_OUT_OF_RANGE]: value out of range, ${func}${pathFormatted}`;
|
|
default:
|
|
return `${errorCode}: error occurred, ${func}${pathFormatted}`;
|
|
}
|
|
}
|
|
function createError(errorCode, func = '', path = '', path2 = '', Constructor = Error) {
|
|
const error = new Constructor(formatError(errorCode, func, path, path2));
|
|
error.code = errorCode;
|
|
if (path) {
|
|
error.path = path;
|
|
}
|
|
return error;
|
|
}
|
|
function createStatError(errorCode, func = '', path = '', path2 = '') {
|
|
return {
|
|
code: errorCode,
|
|
message: formatError(errorCode, func, path, path2),
|
|
path,
|
|
toError() {
|
|
const error = new Error(this.message);
|
|
error.code = this.code;
|
|
if (this.path) {
|
|
error.path = this.path;
|
|
}
|
|
return error;
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=util.js.map
|