UNPKG

hexo-fs

Version:

File system module for Hexo.

495 lines 20.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.unlinkSync = exports.unlink = exports.ftruncateSync = exports.ftruncate = exports.truncateSync = exports.truncate = exports.lstatSync = exports.lstat = exports.fstatSync = exports.fstat = exports.statSync = exports.stat = exports.renameSync = exports.rename = exports.realpathSync = exports.realpath = exports.readlinkSync = exports.readlink = exports.readdirSync = exports.readdir = exports.readSync = exports.read = exports.symlinkSync = exports.symlink = exports.openSync = exports.open = exports.mkdirSync = exports.mkdir = exports.linkSync = exports.link = exports.fsyncSync = exports.fsync = exports.createWriteStream = exports.createReadStream = exports.closeSync = exports.close = exports.lchownSync = exports.lchown = exports.fchownSync = exports.fchown = exports.chownSync = exports.chown = exports.lchmodSync = exports.lchmod = exports.fchmodSync = exports.fchmod = exports.chmodSync = exports.chmod = exports.accessSync = exports.access = void 0; exports.WriteStream = exports.ReadStream = exports.Stats = exports.writeSync = exports.write = exports.unwatchFile = exports.watchFile = exports.futimesSync = exports.futimes = exports.utimesSync = exports.utimes = void 0; exports.exists = exists; exports.existsSync = existsSync; exports.mkdirs = mkdirs; exports.mkdirsSync = mkdirsSync; exports.writeFile = writeFile; exports.writeFileSync = writeFileSync; exports.appendFile = appendFile; exports.appendFileSync = appendFileSync; exports.copyFile = copyFile; exports.copyDir = copyDir; exports.listDir = listDir; exports.listDirSync = listDirSync; exports.escapeEOL = escapeEOL; exports.escapeBOM = escapeBOM; exports.escapeFileContent = escapeFileContent; exports.readFile = readFile; exports.readFileSync = readFileSync; exports.emptyDir = emptyDir; exports.emptyDirSync = emptyDirSync; exports.rmdir = rmdir; exports.rmdirSync = rmdirSync; exports.watch = watch; exports.ensurePath = ensurePath; exports.ensurePathSync = ensurePathSync; exports.ensureWriteStream = ensureWriteStream; exports.ensureWriteStreamSync = ensureWriteStreamSync; const chokidar_1 = __importDefault(require("chokidar")); const bluebird_1 = __importDefault(require("bluebird")); const path_1 = require("path"); const hexo_util_1 = require("hexo-util"); const util_1 = require("util"); const graceful_fs_1 = __importDefault(require("graceful-fs")); const promisifyAccess = (0, util_1.promisify)(graceful_fs_1.default.access); const promisifyMkdir = (0, util_1.promisify)(graceful_fs_1.default.mkdir); const promisifyReaddir = (0, util_1.promisify)(graceful_fs_1.default.readdir); const promisifyReadFile = (0, util_1.promisify)(graceful_fs_1.default.readFile); const promisifyWriteFile = (0, util_1.promisify)(graceful_fs_1.default.writeFile); const promisifyCopyFile = (0, util_1.promisify)(graceful_fs_1.default.copyFile); const promisifyAppendFile = (0, util_1.promisify)(graceful_fs_1.default.appendFile); const promisifyUnlink = (0, util_1.promisify)(graceful_fs_1.default.unlink); const promisifyRmdir = (0, util_1.promisify)(graceful_fs_1.default.rmdir); const rEOL = /\r\n/g; function exists(path) { if (!path) throw new TypeError('path is required!'); const promise = promisifyAccess(path).then(() => true, error => { if (error.code !== 'ENOENT') throw error; return false; }); return bluebird_1.default.resolve(promise); } function existsSync(path) { if (!path) throw new TypeError('path is required!'); try { graceful_fs_1.default.accessSync(path); } catch (err) { if (err.code !== 'ENOENT') throw err; return false; } return true; } function mkdirs(path) { if (!path) throw new TypeError('path is required!'); return bluebird_1.default.resolve(promisifyMkdir(path, { recursive: true })); } function mkdirsSync(path) { if (!path) throw new TypeError('path is required!'); graceful_fs_1.default.mkdirSync(path, { recursive: true }); } function checkParent(path) { return bluebird_1.default.resolve(promisifyMkdir((0, path_1.dirname)(path), { recursive: true })); } function writeFile(path, data, options) { if (!path) throw new TypeError('path is required!'); if (!data) data = ''; return checkParent(path) .then(() => promisifyWriteFile(path, data, options)); } function writeFileSync(path, data, options) { if (!path) throw new TypeError('path is required!'); graceful_fs_1.default.mkdirSync((0, path_1.dirname)(path), { recursive: true }); graceful_fs_1.default.writeFileSync(path, data, options); } function appendFile(path, data, options) { if (!path) throw new TypeError('path is required!'); return checkParent(path) .then(() => promisifyAppendFile(path, data, options)); } function appendFileSync(path, data, options) { if (!path) throw new TypeError('path is required!'); graceful_fs_1.default.mkdirSync((0, path_1.dirname)(path), { recursive: true }); graceful_fs_1.default.appendFileSync(path, data, options); } function copyFile(src, dest, flags) { if (!src) throw new TypeError('src is required!'); if (!dest) throw new TypeError('dest is required!'); return checkParent(dest) .then(() => promisifyCopyFile(src, dest, flags)); } const trueFn = () => true; function ignoreHiddenFiles(ignore) { if (!ignore) return trueFn; return ({ name }) => !name.startsWith('.'); } function ignoreFilesRegex(regex) { if (!regex) return trueFn; return ({ name }) => !regex.test(name); } function ignoreExcludeFiles(arr, parent) { if (!arr || !arr.length) return trueFn; const set = new Set(arr); return ({ name }) => !set.has((0, path_1.join)(parent, name)); } function _readAndFilterDir(path_2) { return __awaiter(this, arguments, void 0, function* (path, options = {}) { const { ignoreHidden = true, ignorePattern } = options; return (yield promisifyReaddir(path, Object.assign(Object.assign({}, options), { withFileTypes: true }))) .filter(ignoreHiddenFiles(ignoreHidden)) .filter(ignoreFilesRegex(ignorePattern)); }); } function _readAndFilterDirSync(path, options) { const { ignoreHidden = true, ignorePattern } = options; return graceful_fs_1.default.readdirSync(path, Object.assign(Object.assign({}, options), { withFileTypes: true })) .filter(ignoreHiddenFiles(ignoreHidden)) .filter(ignoreFilesRegex(ignorePattern)); } function _copyDirWalker(src, dest, results, parent, options) { return __awaiter(this, void 0, void 0, function* () { return bluebird_1.default.map(_readAndFilterDir(src, options), item => { const childSrc = (0, path_1.join)(src, item.name); const childDest = (0, path_1.join)(dest, item.name); const currentPath = (0, path_1.join)(parent, item.name); if (item.isDirectory()) { return _copyDirWalker(childSrc, childDest, results, currentPath, options); } results.push(currentPath); return copyFile(childSrc, childDest, 0); }); }); } function copyDir(src, dest, options = {}) { if (!src) throw new TypeError('src is required!'); if (!dest) throw new TypeError('dest is required!'); const results = []; return checkParent(dest) .then(() => _copyDirWalker(src, dest, results, '', options)) .return(results); } function _listDirWalker(path, results, parent, options) { return __awaiter(this, void 0, void 0, function* () { const promises = []; for (const item of yield _readAndFilterDir(path, options)) { const currentPath = (0, path_1.join)(parent, item.name); if (item.isDirectory()) { promises.push(_listDirWalker((0, path_1.join)(path, item.name), results, currentPath, options)); } else { results.push(currentPath); } } yield bluebird_1.default.all(promises); }); } function listDir(path, options = {}) { if (!path) throw new TypeError('path is required!'); const results = []; return bluebird_1.default.resolve(_listDirWalker(path, results, '', options)) .return(results); } function _listDirSyncWalker(path, results, parent, options) { for (const item of _readAndFilterDirSync(path, options)) { const currentPath = (0, path_1.join)(parent, item.name); if (item.isDirectory()) { _listDirSyncWalker((0, path_1.join)(path, item.name), results, currentPath, options); } else { results.push(currentPath); } } } function listDirSync(path, options = {}) { if (!path) throw new TypeError('path is required!'); const results = []; _listDirSyncWalker(path, results, '', options); return results; } function escapeEOL(str) { return str.replace(rEOL, '\n'); } function escapeBOM(str) { return str.charCodeAt(0) === 0xFEFF ? str.substring(1) : str; } function escapeFileContent(content) { return escapeBOM(escapeEOL(content)); } function _readFile(path_2) { return __awaiter(this, arguments, void 0, function* (path, options = {}) { if (!Object.prototype.hasOwnProperty.call(options, 'encoding')) options.encoding = 'utf8'; const content = yield promisifyReadFile(path, options); if (options.escape == null || options.escape) { return escapeFileContent(content); } return content; }); } function readFile(path, options) { if (!path) throw new TypeError('path is required!'); return bluebird_1.default.resolve(_readFile(path, options)); } function readFileSync(path, options = {}) { if (!path) throw new TypeError('path is required!'); if (!Object.prototype.hasOwnProperty.call(options, 'encoding')) options.encoding = 'utf8'; const content = graceful_fs_1.default.readFileSync(path, options); if (options.escape == null || options.escape) { return escapeFileContent(content); } return content; } function _emptyDir(path, parent, options) { return __awaiter(this, void 0, void 0, function* () { const entries = (yield _readAndFilterDir(path, options)).filter(ignoreExcludeFiles(options.exclude, parent)); const results = []; yield bluebird_1.default.map(entries, (item) => { const fullPath = (0, path_1.join)(path, item.name); const currentPath = (0, path_1.join)(parent, item.name); if (item.isDirectory()) { return _emptyDir(fullPath, currentPath, options).then((files) => __awaiter(this, void 0, void 0, function* () { results.push(...files); if (!(yield promisifyReaddir(fullPath)).length) { return promisifyRmdir(fullPath); } })); } results.push(currentPath); return promisifyUnlink(fullPath); }); return results; }); } function emptyDir(path, options = {}) { if (!path) throw new TypeError('path is required!'); return bluebird_1.default.resolve(_emptyDir(path, '', options)); } function _emptyDirSync(path, options, parent) { const entries = _readAndFilterDirSync(path, options) .filter(ignoreExcludeFiles(options.exclude, parent)); const results = []; for (const item of entries) { const childPath = (0, path_1.join)(path, item.name); const currentPath = (0, path_1.join)(parent, item.name); if (item.isDirectory()) { const removed = _emptyDirSync(childPath, options, currentPath); if (!graceful_fs_1.default.readdirSync(childPath).length) { rmdirSync(childPath); } results.push(...removed); } else { graceful_fs_1.default.unlinkSync(childPath); results.push(currentPath); } } return results; } function emptyDirSync(path, options = {}) { if (!path) throw new TypeError('path is required!'); return _emptyDirSync(path, options, ''); } function _rmdir(path) { return __awaiter(this, void 0, void 0, function* () { const files = promisifyReaddir(path, { withFileTypes: true }); yield bluebird_1.default.map(files, (item) => { const childPath = (0, path_1.join)(path, item.name); return item.isDirectory() ? _rmdir(childPath) : promisifyUnlink(childPath); }); return promisifyRmdir(path); }); } function rmdir(path) { if (!path) throw new TypeError('path is required!'); return bluebird_1.default.resolve(_rmdir(path)); } function _rmdirSync(path) { const files = graceful_fs_1.default.readdirSync(path, { withFileTypes: true }); for (let i = 0, len = files.length; i < len; i++) { const item = files[i]; const childPath = (0, path_1.join)(path, item.name); if (item.isDirectory()) { _rmdirSync(childPath); } else { graceful_fs_1.default.unlinkSync(childPath); } } graceful_fs_1.default.rmdirSync(path); } function rmdirSync(path) { if (!path) throw new TypeError('path is required!'); _rmdirSync(path); } function watch(path, options) { if (!path) throw new TypeError('path is required!'); const watcher = chokidar_1.default.watch(path, options); return new bluebird_1.default((resolve, reject) => { watcher.on('ready', resolve); watcher.on('error', reject); }).thenReturn(watcher); } function _findUnusedPath(path, files) { const ext = (0, path_1.extname)(path); const base = (0, path_1.basename)(path, ext); const regex = new RegExp(`^${(0, hexo_util_1.escapeRegExp)(base)}(?:-(\\d+))?${(0, hexo_util_1.escapeRegExp)(ext)}$`); let num = -1; for (let i = 0, len = files.length; i < len; i++) { const item = files[i]; const match = item.match(regex); if (match == null) continue; const matchNum = match[1] ? parseInt(match[1], 10) : 0; if (matchNum > num) { num = matchNum; } } return (0, path_1.join)((0, path_1.dirname)(path), `${base}-${num + 1}${ext}`); } function _ensurePath(path) { return __awaiter(this, void 0, void 0, function* () { if (!(yield exists(path))) return path; const files = yield promisifyReaddir((0, path_1.dirname)(path)); return _findUnusedPath(path, files); }); } function ensurePath(path) { if (!path) throw new TypeError('path is required!'); return bluebird_1.default.resolve(_ensurePath(path)); } function ensurePathSync(path) { if (!path) throw new TypeError('path is required!'); if (!graceful_fs_1.default.existsSync(path)) return path; const files = graceful_fs_1.default.readdirSync((0, path_1.dirname)(path)); return _findUnusedPath(path, files); } function ensureWriteStream(path, options) { if (!path) throw new TypeError('path is required!'); return checkParent(path) .then(() => graceful_fs_1.default.createWriteStream(path, options)); } function ensureWriteStreamSync(path, options) { if (!path) throw new TypeError('path is required!'); graceful_fs_1.default.mkdirSync((0, path_1.dirname)(path), { recursive: true }); return graceful_fs_1.default.createWriteStream(path, options); } // access ['F_OK', 'R_OK', 'W_OK', 'X_OK'].forEach(key => { Object.defineProperty(exports, key, { enumerable: true, value: graceful_fs_1.default.constants[key], writable: false }); }); exports.access = bluebird_1.default.promisify(graceful_fs_1.default.access); exports.accessSync = graceful_fs_1.default.accessSync; // chmod exports.chmod = bluebird_1.default.promisify(graceful_fs_1.default.chmod); exports.chmodSync = graceful_fs_1.default.chmodSync; exports.fchmod = bluebird_1.default.promisify(graceful_fs_1.default.fchmod); exports.fchmodSync = graceful_fs_1.default.fchmodSync; exports.lchmod = bluebird_1.default.promisify(graceful_fs_1.default.lchmod); exports.lchmodSync = graceful_fs_1.default.lchmodSync; // chown exports.chown = bluebird_1.default.promisify(graceful_fs_1.default.chown); exports.chownSync = graceful_fs_1.default.chownSync; exports.fchown = bluebird_1.default.promisify(graceful_fs_1.default.fchown); exports.fchownSync = graceful_fs_1.default.fchownSync; exports.lchown = bluebird_1.default.promisify(graceful_fs_1.default.lchown); exports.lchownSync = graceful_fs_1.default.lchownSync; // close exports.close = bluebird_1.default.promisify(graceful_fs_1.default.close); exports.closeSync = graceful_fs_1.default.closeSync; // createStream exports.createReadStream = graceful_fs_1.default.createReadStream; exports.createWriteStream = graceful_fs_1.default.createWriteStream; // fsync exports.fsync = bluebird_1.default.promisify(graceful_fs_1.default.fsync); exports.fsyncSync = graceful_fs_1.default.fsyncSync; // link exports.link = bluebird_1.default.promisify(graceful_fs_1.default.link); exports.linkSync = graceful_fs_1.default.linkSync; // mkdir exports.mkdir = bluebird_1.default.promisify(graceful_fs_1.default.mkdir); exports.mkdirSync = graceful_fs_1.default.mkdirSync; // open exports.open = bluebird_1.default.promisify(graceful_fs_1.default.open); exports.openSync = graceful_fs_1.default.openSync; // symlink exports.symlink = bluebird_1.default.promisify(graceful_fs_1.default.symlink); exports.symlinkSync = graceful_fs_1.default.symlinkSync; // read exports.read = bluebird_1.default.promisify(graceful_fs_1.default.read); exports.readSync = graceful_fs_1.default.readSync; // readdir exports.readdir = bluebird_1.default.promisify(graceful_fs_1.default.readdir); exports.readdirSync = graceful_fs_1.default.readdirSync; // readlink exports.readlink = bluebird_1.default.promisify(graceful_fs_1.default.readlink); exports.readlinkSync = graceful_fs_1.default.readlinkSync; // realpath exports.realpath = bluebird_1.default.promisify(graceful_fs_1.default.realpath); exports.realpathSync = graceful_fs_1.default.realpathSync; // rename exports.rename = bluebird_1.default.promisify(graceful_fs_1.default.rename); exports.renameSync = graceful_fs_1.default.renameSync; // stat exports.stat = bluebird_1.default.promisify(graceful_fs_1.default.stat); exports.statSync = graceful_fs_1.default.statSync; exports.fstat = bluebird_1.default.promisify(graceful_fs_1.default.fstat); exports.fstatSync = graceful_fs_1.default.fstatSync; exports.lstat = bluebird_1.default.promisify(graceful_fs_1.default.lstat); exports.lstatSync = graceful_fs_1.default.lstatSync; // truncate exports.truncate = bluebird_1.default.promisify(graceful_fs_1.default.truncate); exports.truncateSync = graceful_fs_1.default.truncateSync; exports.ftruncate = bluebird_1.default.promisify(graceful_fs_1.default.ftruncate); exports.ftruncateSync = graceful_fs_1.default.ftruncateSync; // unlink exports.unlink = bluebird_1.default.promisify(graceful_fs_1.default.unlink); exports.unlinkSync = graceful_fs_1.default.unlinkSync; // utimes exports.utimes = bluebird_1.default.promisify(graceful_fs_1.default.utimes); exports.utimesSync = graceful_fs_1.default.utimesSync; exports.futimes = bluebird_1.default.promisify(graceful_fs_1.default.futimes); exports.futimesSync = graceful_fs_1.default.futimesSync; // watch exports.watchFile = graceful_fs_1.default.watchFile; exports.unwatchFile = graceful_fs_1.default.unwatchFile; // write exports.write = bluebird_1.default.promisify(graceful_fs_1.default.write); exports.writeSync = graceful_fs_1.default.writeSync; // Static classes exports.Stats = graceful_fs_1.default.Stats; exports.ReadStream = graceful_fs_1.default.ReadStream; exports.WriteStream = graceful_fs_1.default.WriteStream; //# sourceMappingURL=fs.js.map