2018-07-03 06:55:09 +00:00
|
|
|
import plugins = require('./smartfile.plugins');
|
|
|
|
import SmartfileInterpreter = require('./smartfile.interpreter');
|
2017-03-04 20:10:46 +00:00
|
|
|
|
2018-07-03 06:55:09 +00:00
|
|
|
import { Smartfile } from './smartfile.classes.smartfile';
|
2017-03-04 20:10:46 +00:00
|
|
|
|
2018-07-03 06:55:09 +00:00
|
|
|
import * as memory from './smartfile.memory';
|
2016-06-24 01:36:51 +00:00
|
|
|
/*===============================================================
|
|
|
|
============================ Checks =============================
|
|
|
|
===============================================================*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param filePath
|
|
|
|
* @returns {boolean}
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let fileExistsSync = function(filePath): boolean {
|
|
|
|
let fileExistsBool: boolean = false;
|
2017-03-04 20:10:46 +00:00
|
|
|
try {
|
2018-07-03 06:55:09 +00:00
|
|
|
plugins.fsExtra.readFileSync(filePath);
|
|
|
|
fileExistsBool = true;
|
2017-03-04 20:10:46 +00:00
|
|
|
} catch (err) {
|
2018-07-03 06:55:09 +00:00
|
|
|
fileExistsBool = false;
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
return fileExistsBool;
|
|
|
|
};
|
2016-06-24 01:36:51 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param filePath
|
|
|
|
* @returns {any}
|
|
|
|
*/
|
2019-02-17 20:07:22 +00:00
|
|
|
export let fileExists = (filePath): Promise<boolean> => {
|
|
|
|
const done = plugins.smartpromise.defer<boolean>();
|
2019-01-27 02:11:10 +00:00
|
|
|
plugins.fs.access(filePath, 4, err => {
|
2019-02-17 20:07:22 +00:00
|
|
|
err ? done.resolve(false) : done.resolve(true);
|
2018-07-03 06:55:09 +00:00
|
|
|
});
|
|
|
|
return done.promise;
|
|
|
|
};
|
2016-06-24 01:36:51 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if given path points to an existing directory
|
|
|
|
*/
|
2019-02-17 20:07:22 +00:00
|
|
|
export let isDirectory = (pathArg): boolean => {
|
2017-05-07 18:50:59 +00:00
|
|
|
try {
|
2018-07-03 06:55:09 +00:00
|
|
|
return plugins.fsExtra.statSync(pathArg).isDirectory();
|
2017-05-07 18:50:59 +00:00
|
|
|
} catch (err) {
|
2018-07-03 06:55:09 +00:00
|
|
|
return false;
|
2017-05-07 18:50:59 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|
2016-06-24 01:36:51 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if a given path points to an existing file
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let isFile = function(pathArg): boolean {
|
|
|
|
return plugins.fsExtra.statSync(pathArg).isFile();
|
|
|
|
};
|
2016-06-24 01:36:51 +00:00
|
|
|
|
2016-06-23 15:42:08 +00:00
|
|
|
/*===============================================================
|
|
|
|
============================ FS ACTIONS =========================
|
|
|
|
===============================================================*/
|
|
|
|
|
2016-09-24 19:42:45 +00:00
|
|
|
/**
|
|
|
|
* copies a file from A to B on the local disk
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let copy = function(fromArg: string, toArg: string) {
|
|
|
|
let done = plugins.smartpromise.defer();
|
|
|
|
plugins.fsExtra.copy(fromArg, toArg, {}, function() {
|
|
|
|
done.resolve();
|
|
|
|
});
|
|
|
|
return done.promise;
|
|
|
|
};
|
2016-09-24 19:42:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* copies a file SYNCHRONOUSLY from A to B on the local disk
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let copySync = function(fromArg: string, toArg: string): boolean {
|
|
|
|
plugins.fsExtra.copySync(fromArg, toArg);
|
|
|
|
return true;
|
|
|
|
};
|
2016-09-24 19:42:45 +00:00
|
|
|
|
2016-06-28 04:57:51 +00:00
|
|
|
/**
|
|
|
|
* ensures that a directory is in place
|
|
|
|
*/
|
2016-09-20 15:56:49 +00:00
|
|
|
export let ensureDir = (dirPathArg: string) => {
|
2018-07-03 06:55:09 +00:00
|
|
|
let done = plugins.smartpromise.defer();
|
|
|
|
plugins.fsExtra.ensureDir(dirPathArg, done.resolve);
|
|
|
|
return done.promise;
|
|
|
|
};
|
2016-06-28 04:57:51 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* ensures that a directory is in place
|
|
|
|
*/
|
2016-09-20 15:56:49 +00:00
|
|
|
export let ensureDirSync = (dirPathArg: string) => {
|
2018-07-03 06:55:09 +00:00
|
|
|
plugins.fsExtra.ensureDirSync(dirPathArg);
|
|
|
|
};
|
2016-06-28 04:57:51 +00:00
|
|
|
|
2017-01-01 01:45:53 +00:00
|
|
|
/**
|
|
|
|
* ensure an empty directory
|
|
|
|
* @executes ASYNC
|
|
|
|
*/
|
|
|
|
export let ensureEmptyDir = (dirPathArg: string) => {
|
2018-07-03 06:55:09 +00:00
|
|
|
let done = plugins.smartpromise.defer();
|
2017-03-04 20:10:46 +00:00
|
|
|
plugins.fsExtra.ensureDir(dirPathArg, () => {
|
2018-07-03 06:55:09 +00:00
|
|
|
plugins.fsExtra.emptyDir(dirPathArg, done.resolve);
|
|
|
|
});
|
|
|
|
return done.promise;
|
|
|
|
};
|
2017-01-01 01:45:53 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* ensure an empty directory
|
|
|
|
* @executes SYNC
|
|
|
|
*/
|
|
|
|
export let ensureEmptyDirSync = (dirPathArg: string) => {
|
2018-07-03 06:55:09 +00:00
|
|
|
plugins.fsExtra.ensureDirSync(dirPathArg);
|
|
|
|
plugins.fsExtra.emptyDirSync(dirPathArg);
|
|
|
|
};
|
2017-01-01 01:45:53 +00:00
|
|
|
|
2016-06-23 16:39:02 +00:00
|
|
|
/**
|
2016-09-24 19:42:45 +00:00
|
|
|
* 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
|
2016-06-23 16:39:02 +00:00
|
|
|
*/
|
2017-01-20 23:47:48 +00:00
|
|
|
export let ensureFile = (filePathArg, initFileStringArg): Promise<void> => {
|
2018-07-03 06:55:09 +00:00
|
|
|
let done = plugins.smartpromise.defer<void>();
|
|
|
|
ensureFileSync(filePathArg, initFileStringArg);
|
|
|
|
done.resolve();
|
|
|
|
return done.promise;
|
|
|
|
};
|
2016-06-23 15:42:08 +00:00
|
|
|
|
2016-06-23 16:39:02 +00:00
|
|
|
/**
|
2016-09-24 19:42:45 +00:00
|
|
|
* 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
|
2016-06-23 16:39:02 +00:00
|
|
|
*/
|
2016-09-24 19:42:45 +00:00
|
|
|
export let ensureFileSync = (filePathArg: string, initFileStringArg: string): void => {
|
2017-03-04 20:10:46 +00:00
|
|
|
if (fileExistsSync(filePathArg)) {
|
2018-07-03 06:55:09 +00:00
|
|
|
return null;
|
2017-03-04 20:10:46 +00:00
|
|
|
} else {
|
2018-07-03 06:55:09 +00:00
|
|
|
memory.toFsSync(initFileStringArg, filePathArg);
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|
2016-09-20 15:56:49 +00:00
|
|
|
|
2016-09-24 19:42:45 +00:00
|
|
|
/**
|
|
|
|
* removes a file or folder from local disk
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let remove = function(pathArg: string): Promise<void> {
|
|
|
|
let done = plugins.smartpromise.defer<void>();
|
|
|
|
plugins.fsExtra.remove(pathArg, function() {
|
|
|
|
done.resolve();
|
|
|
|
});
|
|
|
|
return done.promise;
|
|
|
|
};
|
2016-06-23 15:42:08 +00:00
|
|
|
|
2016-06-23 16:39:02 +00:00
|
|
|
/**
|
|
|
|
* removes a file SYNCHRONOUSLY from local disk
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let removeSync = function(pathArg: string): boolean {
|
|
|
|
plugins.fsExtra.removeSync(pathArg);
|
|
|
|
return true;
|
|
|
|
};
|
2016-06-23 15:42:08 +00:00
|
|
|
|
2016-09-29 12:17:46 +00:00
|
|
|
/**
|
|
|
|
* removes an array of filePaths from disk
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let removeMany = function(filePathArrayArg: string[]) {
|
|
|
|
let promiseArray: Promise<void>[] = [];
|
2017-03-04 20:10:46 +00:00
|
|
|
for (let filePath of filePathArrayArg) {
|
2018-07-03 06:55:09 +00:00
|
|
|
promiseArray.push(remove(filePath));
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
return Promise.all(promiseArray);
|
|
|
|
};
|
2016-09-29 12:17:46 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* like removeFilePathArray but SYNCHRONOUSLY
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let removeManySync = function(filePathArrayArg: string[]): void {
|
2017-03-04 20:10:46 +00:00
|
|
|
for (let filePath of filePathArrayArg) {
|
2018-07-03 06:55:09 +00:00
|
|
|
removeSync(filePath);
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|
2016-09-29 12:17:46 +00:00
|
|
|
|
2016-06-23 15:42:08 +00:00
|
|
|
/*===============================================================
|
|
|
|
============================ Write/Read =========================
|
|
|
|
===============================================================*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param filePathArg
|
|
|
|
* @param fileTypeArg
|
|
|
|
* @returns {any}
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let toObjectSync = function(filePathArg, fileTypeArg?) {
|
2019-01-27 02:11:10 +00:00
|
|
|
const fileString = plugins.fsExtra.readFileSync(filePathArg, 'utf8');
|
2018-07-03 06:55:09 +00:00
|
|
|
let fileType;
|
|
|
|
fileTypeArg ? (fileType = fileTypeArg) : (fileType = SmartfileInterpreter.filetype(filePathArg));
|
|
|
|
return SmartfileInterpreter.objectFile(fileString, fileType);
|
|
|
|
};
|
2016-06-23 15:42:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* reads a file content to a String
|
|
|
|
* @param filePath
|
|
|
|
* @returns {string|Buffer|any}
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let toStringSync = function(filePath: string): string {
|
2019-01-27 02:11:10 +00:00
|
|
|
const fileString: string = plugins.fsExtra.readFileSync(filePath, 'utf8');
|
2018-07-03 06:55:09 +00:00
|
|
|
return fileString;
|
|
|
|
};
|
2017-03-04 20:10:46 +00:00
|
|
|
|
2019-06-26 19:17:58 +00:00
|
|
|
export const fileTreeToObject = async (dirPathArg: string, miniMatchFilter: string) => {
|
2017-04-30 13:37:34 +00:00
|
|
|
// handle absolute miniMatchFilter
|
2018-07-03 06:55:09 +00:00
|
|
|
let dirPath: string;
|
2017-04-30 13:37:34 +00:00
|
|
|
if (plugins.path.isAbsolute(miniMatchFilter)) {
|
2018-07-03 06:55:09 +00:00
|
|
|
dirPath = '/';
|
2017-04-30 13:37:34 +00:00
|
|
|
} else {
|
2018-07-03 06:55:09 +00:00
|
|
|
dirPath = dirPathArg;
|
2017-04-30 13:37:34 +00:00
|
|
|
}
|
|
|
|
|
2019-06-26 19:17:58 +00:00
|
|
|
const fileTree = await listFileTree(dirPath, miniMatchFilter);
|
|
|
|
const smartfileArray: Smartfile[] = [];
|
2017-03-04 20:10:46 +00:00
|
|
|
for (let filePath of fileTree) {
|
2017-08-02 11:10:30 +00:00
|
|
|
let readPath = ((): string => {
|
|
|
|
if (!plugins.path.isAbsolute(filePath)) {
|
2018-07-03 06:55:09 +00:00
|
|
|
return plugins.path.join(dirPath, filePath);
|
2017-08-02 11:10:30 +00:00
|
|
|
} else {
|
2018-07-03 06:55:09 +00:00
|
|
|
return filePath;
|
2017-08-02 11:10:30 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
})();
|
|
|
|
let fileContentString = toStringSync(readPath);
|
2017-05-01 17:49:34 +00:00
|
|
|
|
2017-05-07 21:16:25 +00:00
|
|
|
// push a read file as Smartfile
|
2018-07-03 06:55:09 +00:00
|
|
|
smartfileArray.push(
|
|
|
|
new Smartfile({
|
2019-06-26 19:17:58 +00:00
|
|
|
contentBuffer: Buffer.from(fileContentString),
|
2018-07-03 06:55:09 +00:00
|
|
|
base: dirPath,
|
|
|
|
path: filePath
|
|
|
|
})
|
|
|
|
);
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
return smartfileArray;
|
|
|
|
};
|
2016-06-23 15:42:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param filePathArg
|
|
|
|
* @param options
|
|
|
|
* @returns {number}
|
|
|
|
*/
|
2018-07-03 06:55:09 +00:00
|
|
|
export let toVinylSync = function(filePathArg, options = {}) {
|
|
|
|
return plugins.vinylFile.readSync(filePathArg, options);
|
|
|
|
};
|
2016-06-23 15:42:08 +00:00
|
|
|
|
2016-06-23 16:39:02 +00:00
|
|
|
/**
|
|
|
|
* lists Folders in a directory on local disk
|
2018-11-22 22:23:26 +00:00
|
|
|
* @returns Promise with an array that contains the folder names
|
2016-06-23 16:39:02 +00:00
|
|
|
*/
|
2019-01-27 02:11:10 +00:00
|
|
|
export let listFolders = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => {
|
|
|
|
return listFoldersSync(pathArg, regexFilter);
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|
2016-06-23 15:42:08 +00:00
|
|
|
|
2016-06-23 16:39:02 +00:00
|
|
|
/**
|
|
|
|
* lists Folders SYNCHRONOUSLY in a directory on local disk
|
2016-06-28 04:57:51 +00:00
|
|
|
* @returns an array with the folder names as strings
|
2016-06-23 16:39:02 +00:00
|
|
|
*/
|
2018-11-22 22:38:05 +00:00
|
|
|
export let listFoldersSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
2019-04-08 14:39:41 +00:00
|
|
|
let folderArray = plugins.fsExtra.readdirSync(pathArg).filter(file => {
|
2018-07-03 06:55:09 +00:00
|
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isDirectory();
|
|
|
|
});
|
2017-03-04 20:10:46 +00:00
|
|
|
if (regexFilter) {
|
2018-07-03 06:55:09 +00:00
|
|
|
folderArray = folderArray.filter(fileItem => {
|
|
|
|
return regexFilter.test(fileItem);
|
|
|
|
});
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
return folderArray;
|
|
|
|
};
|
2016-06-28 06:40:22 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* lists Files in a directory on local disk
|
|
|
|
* @returns Promise
|
|
|
|
*/
|
2019-01-27 02:11:10 +00:00
|
|
|
export let listFiles = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => {
|
|
|
|
return listFilesSync(pathArg, regexFilter);
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|
2016-06-28 06:40:22 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* lists Files SYNCHRONOUSLY in a directory on local disk
|
|
|
|
* @returns an array with the folder names as strings
|
|
|
|
*/
|
2019-01-27 02:11:10 +00:00
|
|
|
export let listFilesSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
|
|
|
let fileArray = plugins.fsExtra.readdirSync(pathArg).filter(file => {
|
2018-07-03 06:55:09 +00:00
|
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
|
|
|
|
});
|
2017-03-04 20:10:46 +00:00
|
|
|
if (regexFilter) {
|
2018-07-03 06:55:09 +00:00
|
|
|
fileArray = fileArray.filter(fileItem => {
|
|
|
|
return regexFilter.test(fileItem);
|
|
|
|
});
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
return fileArray;
|
|
|
|
};
|
2016-06-28 06:40:22 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* lists all items (folders AND files) in a directory on local disk
|
2016-09-17 21:11:44 +00:00
|
|
|
* @returns Promise<string[]>
|
2016-06-28 06:40:22 +00:00
|
|
|
*/
|
2019-01-27 02:11:10 +00:00
|
|
|
export let listAllItems = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => {
|
|
|
|
return listAllItemsSync(pathArg, regexFilter);
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|
2016-06-28 06:40:22 +00:00
|
|
|
|
|
|
|
/**
|
2016-09-17 21:11:44 +00:00
|
|
|
* lists all items (folders AND files) in a directory on local disk
|
2016-06-28 06:40:22 +00:00
|
|
|
* @returns an array with the folder names as strings
|
2016-09-17 21:11:44 +00:00
|
|
|
* @executes SYNC
|
2016-06-28 06:40:22 +00:00
|
|
|
*/
|
2019-01-27 02:11:10 +00:00
|
|
|
export let listAllItemsSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
2018-07-03 06:55:09 +00:00
|
|
|
let allItmesArray = plugins.fsExtra.readdirSync(pathArg).filter(function(file) {
|
|
|
|
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
|
|
|
|
});
|
2017-03-04 20:10:46 +00:00
|
|
|
if (regexFilter) {
|
2018-07-03 06:55:09 +00:00
|
|
|
allItmesArray = allItmesArray.filter(fileItem => {
|
|
|
|
return regexFilter.test(fileItem);
|
|
|
|
});
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
return allItmesArray;
|
|
|
|
};
|
2016-06-28 06:40:22 +00:00
|
|
|
|
2016-09-17 21:11:44 +00:00
|
|
|
/**
|
|
|
|
* lists a file tree using a miniMatch filter
|
2016-09-30 14:16:11 +00:00
|
|
|
* note: if the miniMatch Filter is an absolute path, the cwdArg will be omitted
|
2016-09-17 21:11:44 +00:00
|
|
|
* @returns Promise<string[]> string array with the absolute paths of all matching files
|
|
|
|
*/
|
2019-06-26 19:17:58 +00:00
|
|
|
export const listFileTree = async (dirPathArg: string, miniMatchFilter: string, absolutePathsBool: boolean = false): Promise<string[]> => {
|
2019-01-27 02:11:10 +00:00
|
|
|
const done = plugins.smartpromise.defer<string[]>();
|
2017-03-04 20:10:46 +00:00
|
|
|
|
|
|
|
// handle absolute miniMatchFilter
|
2018-07-03 06:55:09 +00:00
|
|
|
let dirPath: string;
|
2017-03-04 20:10:46 +00:00
|
|
|
if (plugins.path.isAbsolute(miniMatchFilter)) {
|
2018-07-03 06:55:09 +00:00
|
|
|
dirPath = '/';
|
2017-03-04 20:10:46 +00:00
|
|
|
} else {
|
2018-07-03 06:55:09 +00:00
|
|
|
dirPath = dirPathArg;
|
2017-03-04 20:10:46 +00:00
|
|
|
}
|
|
|
|
|
2019-01-27 02:11:10 +00:00
|
|
|
const options = {
|
2017-05-26 23:07:32 +00:00
|
|
|
cwd: dirPath,
|
2017-05-27 00:54:22 +00:00
|
|
|
nodir: true,
|
|
|
|
dot: true
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|
2017-03-04 20:10:46 +00:00
|
|
|
plugins.glob(miniMatchFilter, options, (err, files: string[]) => {
|
|
|
|
if (err) {
|
2018-07-03 06:55:09 +00:00
|
|
|
console.log(err);
|
|
|
|
done.reject(err);
|
2016-09-30 14:16:11 +00:00
|
|
|
}
|
2018-07-03 06:55:09 +00:00
|
|
|
done.resolve(files);
|
|
|
|
});
|
2019-06-26 19:17:58 +00:00
|
|
|
|
|
|
|
let fileList = await done.promise;
|
|
|
|
if (absolutePathsBool) {
|
|
|
|
fileList = fileList.map(filePath => {
|
|
|
|
return plugins.path.resolve(plugins.path.join(dirPath, filePath));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return fileList;
|
2018-07-03 06:55:09 +00:00
|
|
|
};
|