330 lines
20 KiB
JavaScript
330 lines
20 KiB
JavaScript
"use strict";
|
|
require("typings-global");
|
|
const plugins = require("./smartfile.plugins");
|
|
const SmartfileInterpreter = require("./smartfile.interpreter");
|
|
const memory = require("./smartfile.memory");
|
|
/*===============================================================
|
|
============================ Checks =============================
|
|
===============================================================*/
|
|
/**
|
|
*
|
|
* @param filePath
|
|
* @returns {boolean}
|
|
*/
|
|
exports.fileExistsSync = function (filePath) {
|
|
let fileExistsBool = false;
|
|
try {
|
|
plugins.fsExtra.readFileSync(filePath);
|
|
fileExistsBool = true;
|
|
}
|
|
catch (err) {
|
|
fileExistsBool = false;
|
|
}
|
|
return fileExistsBool;
|
|
};
|
|
/**
|
|
*
|
|
* @param filePath
|
|
* @returns {any}
|
|
*/
|
|
exports.fileExists = function (filePath) {
|
|
let done = plugins.q.defer();
|
|
plugins.fs.access(filePath, 4, function (err) {
|
|
err ? done.reject(err) : done.resolve();
|
|
});
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* Checks if given path points to an existing directory
|
|
*/
|
|
exports.isDirectory = function (pathArg) {
|
|
return plugins.fsExtra.statSync(pathArg).isDirectory();
|
|
};
|
|
/**
|
|
* Checks if a given path points to an existing file
|
|
*/
|
|
exports.isFile = function (pathArg) {
|
|
return plugins.fsExtra.statSync(pathArg).isFile();
|
|
};
|
|
/*===============================================================
|
|
============================ FS ACTIONS =========================
|
|
===============================================================*/
|
|
/**
|
|
* copies a file from A to B on the local disk
|
|
*/
|
|
exports.copy = function (fromArg, toArg) {
|
|
let done = plugins.q.defer();
|
|
plugins.fsExtra.copy(fromArg, toArg, {}, function () {
|
|
done.resolve();
|
|
});
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* copies a file SYNCHRONOUSLY from A to B on the local disk
|
|
*/
|
|
exports.copySync = function (fromArg, toArg) {
|
|
plugins.fsExtra.copySync(fromArg, toArg);
|
|
return true;
|
|
};
|
|
/**
|
|
* ensures that a directory is in place
|
|
*/
|
|
exports.ensureDir = (dirPathArg) => {
|
|
let done = plugins.q.defer();
|
|
plugins.fsExtra.ensureDir(dirPathArg, done.resolve);
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* ensures that a directory is in place
|
|
*/
|
|
exports.ensureDirSync = (dirPathArg) => {
|
|
plugins.fsExtra.ensureDirSync(dirPathArg);
|
|
};
|
|
/**
|
|
* ensure an empty directory
|
|
* @executes ASYNC
|
|
*/
|
|
exports.ensureEmptyDir = (dirPathArg) => {
|
|
let done = plugins.q.defer();
|
|
plugins.fsExtra.ensureDir(dirPathArg, () => {
|
|
plugins.fsExtra.emptyDir(dirPathArg, done.resolve);
|
|
});
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* ensure an empty directory
|
|
* @executes SYNC
|
|
*/
|
|
exports.ensureEmptyDirSync = (dirPathArg) => {
|
|
plugins.fsExtra.ensureDirSync(dirPathArg);
|
|
plugins.fsExtra.emptyDirSync(dirPathArg);
|
|
};
|
|
/**
|
|
* ensures that a file is on disk
|
|
* @param filePath the filePath to ensureDir
|
|
* @param the fileContent to place into a new file in case it doesn't exist yet
|
|
* @returns Promise<void>
|
|
* @exec ASYNC
|
|
*/
|
|
exports.ensureFile = (filePathArg, initFileStringArg) => {
|
|
let done = plugins.q.defer();
|
|
exports.ensureFileSync(filePathArg, initFileStringArg);
|
|
done.resolve();
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* ensures that a file is on disk
|
|
* @param filePath the filePath to ensureDir
|
|
* @param the fileContent to place into a new file in case it doesn't exist yet
|
|
* @returns Promise<void>
|
|
* @exec SYNC
|
|
*/
|
|
exports.ensureFileSync = (filePathArg, initFileStringArg) => {
|
|
if (exports.fileExistsSync(filePathArg)) {
|
|
return null;
|
|
}
|
|
else {
|
|
memory.toFsSync(initFileStringArg, filePathArg);
|
|
}
|
|
};
|
|
/**
|
|
* removes a file or folder from local disk
|
|
*/
|
|
exports.remove = function (pathArg) {
|
|
let done = plugins.q.defer();
|
|
plugins.fsExtra.remove(pathArg, function () {
|
|
done.resolve();
|
|
});
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* removes a file SYNCHRONOUSLY from local disk
|
|
*/
|
|
exports.removeSync = function (pathArg) {
|
|
plugins.fsExtra.removeSync(pathArg);
|
|
return true;
|
|
};
|
|
/**
|
|
* removes an array of filePaths from disk
|
|
*/
|
|
exports.removeMany = function (filePathArrayArg) {
|
|
let promiseArray = [];
|
|
for (let filePath of filePathArrayArg) {
|
|
promiseArray.push(exports.remove(filePath));
|
|
}
|
|
return Promise.all(promiseArray);
|
|
};
|
|
/**
|
|
* like removeFilePathArray but SYNCHRONOUSLY
|
|
*/
|
|
exports.removeManySync = function (filePathArrayArg) {
|
|
for (let filePath of filePathArrayArg) {
|
|
exports.removeSync(filePath);
|
|
}
|
|
};
|
|
/*===============================================================
|
|
============================ Write/Read =========================
|
|
===============================================================*/
|
|
/**
|
|
*
|
|
* @param filePathArg
|
|
* @param fileTypeArg
|
|
* @returns {any}
|
|
*/
|
|
exports.toObjectSync = function (filePathArg, fileTypeArg) {
|
|
let fileString = plugins.fsExtra.readFileSync(filePathArg, 'utf8');
|
|
let fileType;
|
|
fileTypeArg ? fileType = fileTypeArg : fileType = SmartfileInterpreter.filetype(filePathArg);
|
|
return SmartfileInterpreter.objectFile(fileString, fileType);
|
|
};
|
|
/**
|
|
* reads a file content to a String
|
|
* @param filePath
|
|
* @returns {string|Buffer|any}
|
|
*/
|
|
exports.toStringSync = function (filePath) {
|
|
let fileString;
|
|
fileString = plugins.fsExtra.readFileSync(filePath, 'utf8');
|
|
return fileString;
|
|
};
|
|
/**
|
|
*
|
|
* @param filePathArg
|
|
* @param options
|
|
* @returns {number}
|
|
*/
|
|
exports.toVinylSync = function (filePathArg, options = {}) {
|
|
return plugins.vinylFile.readSync(filePathArg, options);
|
|
};
|
|
/**
|
|
* lets you reload files hot.
|
|
* @param path
|
|
* @returns {any}
|
|
*/
|
|
exports.requireReload = function (path) {
|
|
return plugins.requireReload(path);
|
|
};
|
|
/**
|
|
* lists Folders in a directory on local disk
|
|
* @returns Promise
|
|
*/
|
|
exports.listFolders = function (pathArg, regexFilter) {
|
|
let done = plugins.q.defer();
|
|
let folderArray = plugins.fsExtra.readdirSync(pathArg).filter(function (file) {
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isDirectory();
|
|
});
|
|
if (regexFilter) {
|
|
folderArray = folderArray.filter((fileItem) => {
|
|
return regexFilter.test(fileItem);
|
|
});
|
|
}
|
|
done.resolve(folderArray);
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* lists Folders SYNCHRONOUSLY in a directory on local disk
|
|
* @returns an array with the folder names as strings
|
|
*/
|
|
exports.listFoldersSync = function (pathArg, regexFilter) {
|
|
let folderArray = plugins.fsExtra.readdirSync(pathArg).filter(function (file) {
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isDirectory();
|
|
});
|
|
if (regexFilter) {
|
|
folderArray = folderArray.filter((fileItem) => {
|
|
return regexFilter.test(fileItem);
|
|
});
|
|
}
|
|
return folderArray;
|
|
};
|
|
/**
|
|
* lists Files in a directory on local disk
|
|
* @returns Promise
|
|
*/
|
|
exports.listFiles = function (pathArg, regexFilter) {
|
|
let done = plugins.q.defer();
|
|
let fileArray = plugins.fsExtra.readdirSync(pathArg).filter(function (file) {
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
|
|
});
|
|
if (regexFilter) {
|
|
fileArray = fileArray.filter((fileItem) => {
|
|
return regexFilter.test(fileItem);
|
|
});
|
|
}
|
|
done.resolve(fileArray);
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* lists Files SYNCHRONOUSLY in a directory on local disk
|
|
* @returns an array with the folder names as strings
|
|
*/
|
|
exports.listFilesSync = function (pathArg, regexFilter) {
|
|
let fileArray = plugins.fsExtra.readdirSync(pathArg).filter(function (file) {
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
|
|
});
|
|
if (regexFilter) {
|
|
fileArray = fileArray.filter((fileItem) => {
|
|
return regexFilter.test(fileItem);
|
|
});
|
|
}
|
|
return fileArray;
|
|
};
|
|
/**
|
|
* lists all items (folders AND files) in a directory on local disk
|
|
* @returns Promise<string[]>
|
|
*/
|
|
exports.listAllItems = function (pathArg, regexFilter) {
|
|
let done = plugins.q.defer();
|
|
let allItmesArray = plugins.fsExtra.readdirSync(pathArg);
|
|
if (regexFilter) {
|
|
allItmesArray = allItmesArray.filter((fileItem) => {
|
|
return regexFilter.test(fileItem);
|
|
});
|
|
}
|
|
;
|
|
done.resolve(allItmesArray);
|
|
return done.promise;
|
|
};
|
|
/**
|
|
* lists all items (folders AND files) in a directory on local disk
|
|
* @returns an array with the folder names as strings
|
|
* @executes SYNC
|
|
*/
|
|
exports.listAllItemsSync = function (pathArg, regexFilter) {
|
|
let allItmesArray = plugins.fsExtra.readdirSync(pathArg).filter(function (file) {
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
|
|
});
|
|
if (regexFilter) {
|
|
allItmesArray = allItmesArray.filter((fileItem) => {
|
|
return regexFilter.test(fileItem);
|
|
});
|
|
}
|
|
return allItmesArray;
|
|
};
|
|
/**
|
|
* lists a file tree using a miniMatch filter
|
|
* note: if the miniMatch Filter is an absolute path, the cwdArg will be omitted
|
|
* @returns Promise<string[]> string array with the absolute paths of all matching files
|
|
*/
|
|
exports.listFileTree = (dirPathArg, miniMatchFilter) => {
|
|
let done = plugins.q.defer();
|
|
// handle absolute miniMatchFilter
|
|
let dirPath;
|
|
if (plugins.path.isAbsolute(miniMatchFilter)) {
|
|
dirPath = '/';
|
|
}
|
|
else {
|
|
dirPath = dirPathArg;
|
|
}
|
|
let options = {
|
|
cwd: dirPath
|
|
};
|
|
plugins.glob(miniMatchFilter, options, (err, files) => {
|
|
if (err) {
|
|
console.log(err);
|
|
done.reject(err);
|
|
}
|
|
done.resolve(files);
|
|
});
|
|
return done.promise;
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmaWxlLmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRmaWxlLmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQkFBdUI7QUFFdkIsK0NBQStDO0FBQy9DLGdFQUFnRTtBQUNoRSw2Q0FBNEM7QUFDNUM7O2lFQUVpRTtBQUVqRTs7OztHQUlHO0FBQ1EsUUFBQSxjQUFjLEdBQUcsVUFBUyxRQUFRO0lBQ3pDLElBQUksY0FBYyxHQUFZLEtBQUssQ0FBQTtJQUNuQyxJQUFJLENBQUM7UUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0QyxjQUFjLEdBQUcsSUFBSSxDQUFBO0lBQ3pCLENBQUM7SUFBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ1gsY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUMxQixDQUFDO0lBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FBQTtBQUN6QixDQUFDLENBQUE7QUFFRDs7OztHQUlHO0FBQ1EsUUFBQSxVQUFVLEdBQUcsVUFBUyxRQUFRO0lBQ3JDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDNUIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxVQUFVLEdBQUc7UUFDeEMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQzNDLENBQUMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7QUFDdkIsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDUSxRQUFBLFdBQVcsR0FBRyxVQUFTLE9BQU87SUFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxD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
|