375 lines
23 KiB
JavaScript
375 lines
23 KiB
JavaScript
"use strict";
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
require("typings-global");
|
|
const plugins = require("./smartfile.plugins");
|
|
const SmartfileInterpreter = require("./smartfile.interpreter");
|
|
const smartfile_classes_smartfile_1 = require("./smartfile.classes.smartfile");
|
|
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) {
|
|
try {
|
|
return plugins.fsExtra.statSync(pathArg).isDirectory();
|
|
}
|
|
catch (err) {
|
|
return false;
|
|
}
|
|
};
|
|
/**
|
|
* 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 = plugins.fsExtra.readFileSync(filePath, 'utf8');
|
|
return fileString;
|
|
};
|
|
exports.fileTreeToObject = (dirPathArg, miniMatchFilter) => __awaiter(this, void 0, void 0, function* () {
|
|
// handle absolute miniMatchFilter
|
|
let dirPath;
|
|
if (plugins.path.isAbsolute(miniMatchFilter)) {
|
|
dirPath = '/';
|
|
}
|
|
else {
|
|
dirPath = dirPathArg;
|
|
}
|
|
let fileTree = yield exports.listFileTree(dirPath, miniMatchFilter);
|
|
let smartfileArray = [];
|
|
for (let filePath of fileTree) {
|
|
let readPath = (() => {
|
|
if (!plugins.path.isAbsolute(filePath)) {
|
|
return plugins.path.join(dirPath, filePath);
|
|
}
|
|
else {
|
|
return filePath;
|
|
}
|
|
})();
|
|
let fileContentString = exports.toStringSync(readPath);
|
|
// push a read file as Smartfile
|
|
smartfileArray.push(new smartfile_classes_smartfile_1.Smartfile({
|
|
contentBuffer: new Buffer(fileContentString),
|
|
base: dirPath,
|
|
path: filePath
|
|
}));
|
|
}
|
|
return smartfileArray;
|
|
});
|
|
/**
|
|
*
|
|
* @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,
|
|
nodir: true,
|
|
dot: true
|
|
};
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmaWxlLmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRmaWxlLmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSwwQkFBdUI7QUFFdkIsK0NBQStDO0FBQy9DLGdFQUFnRTtBQUVoRSwrRUFBeUQ7QUFFekQsNkNBQTRDO0FBQzVDOztpRUFFaUU7QUFFakU7Ozs7R0FJRztBQUNRLFFBQUEsY0FBYyxHQUFHLFVBQVUsUUFBUTtJQUM1QyxJQUFJLGNBQWMsR0FBWSxLQUFLLENBQUE7SUFDbkMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEMsY0FBYyxHQUFHLElBQUksQ0FBQTtJQUN2QixDQUFDO0lBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNiLGNBQWMsR0FBRyxLQUFLLENBQUE7SUFDeEIsQ0FBQztJQUNELE1BQU0sQ0FBQyxjQUFjLENBQUE7QUFDdkIsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsVUFBVSxHQUFHLFVBQVUsUUFBUTtJQUN4QyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsVUFBVSxHQUFHO1FBQzFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN6QyxDQUFDLENBQUMsQ0FBQTtJQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3JCLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ1EsUUFBQSxXQUFXLEdBQUcsVUFBVSxPQUFPO0lBQ3hDLElBQUksQ0FBQztRQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFD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
|