1
0
mirror of https://github.com/chinchang/web-maker.git synced 2025-07-16 03:26:19 +02:00
Files
php-web-maker/src/fileUtils.js
Kushagra Gour 17850a15a4 eslint fixes
2018-11-15 19:41:03 +05:30

170 lines
4.9 KiB
JavaScript

/**
* Returns the extension from the file name.
* @param {dtring} fileName File name
*/
export function getExtensionFromFileName(fileName) {
const type = fileName.match(/\.(\w+)$/);
return type ? type[1] : '';
}
/**
* Returns a linear file list from a nested file strcuture.
* It excludes the folders from the returned list.
* @param {array} files Nested file structure
*/
export function linearizeFiles(files) {
function reduceToLinearFiles(_files) {
return _files.reduce((list, currentFile) => {
if (currentFile.isFolder) {
return [...list, ...reduceToLinearFiles(currentFile.children)];
}
return [...list, currentFile];
}, []);
}
return reduceToLinearFiles(files);
}
/**
* Recursively iterates and assigns the `path` property to the files in passed files
* array.
* @param {array} files files structure for an item
* @param {string} parentPath Parent path to prefix with all processed files
*/
export function assignFilePaths(files, parentPath = '') {
files.forEach(file => {
file.path = parentPath ? `${parentPath}/${file.name}` : file.name;
if (file.isFolder) {
assignFilePaths(
file.children,
parentPath ? `${parentPath}/${file.name}` : file.name
);
}
});
return files;
}
/**
* Returns the file object and it's index that is direct child of passed files array with name as passed fileName.
* If not found, returns -1
* @param {array} files files structure for an item
* @param {string} fileName File/folder name
*/
export function getChildFileFromName(files, fileName) {
const index = files.findIndex(file => file.name === fileName);
return { index, file: files[index] };
}
/**
* Returns the file object and it's index in its parent for the passed path.
* If not found, returns {index:-1}
* @param {array} files files structure for an item
* @param {string} path Path of file to search
*/
export function getFileFromPath(files, path) {
let currentFolder = files;
const pathPieces = path.split('/');
while (pathPieces.length > 1) {
const folderName = pathPieces.shift();
currentFolder = getChildFileFromName(currentFolder, folderName).file
.children;
}
// now we should be left with just one value in the pathPieces array - the actual file name
return getChildFileFromName(currentFolder, pathPieces[0]);
}
/**
* Returns the file object and it's index in its parent for the passed path.
* If not found, returns {index:-1}
* @param {array} files files structure for an item
* @param {string} path Path of file to search
*/
export function removeFileAtPath(files, path) {
let currentFolder = files;
const pathPieces = path.split('/');
while (pathPieces.length > 1) {
const folderName = pathPieces.shift();
currentFolder = getChildFileFromName(currentFolder, folderName).file
.children;
}
// now we should be left with just one value in the pathPieces array - the actual file name
const { index } = getChildFileFromName(currentFolder, pathPieces[0]);
currentFolder.splice(index, 1);
}
/**
* Checks if a file with same name exists in the passed folder.
* @param {object} folder Folder to search in
* @param {string} fileName File name to search for
*/
export function doesFileExistInFolder(folder, fileName) {
const details = getChildFileFromName(folder.children, fileName);
return !!details.file;
}
/**
* Returns parent path of passed path
* @param {string} path Path of file to find parent of
*/
export function getParentPath(path) {
const pathPieces = path.split('/');
if (pathPieces.length > 1) {
return pathPieces.slice(0, -1).join('/');
}
return '';
}
/**
* Fetches the files from a github repo and returns a suitable file structure.
* @param {Promise} Promise of completition. Resolves to the files structure.
*/
export function importGithubRepo(repoUrl) {
let repoSlug, match;
if ((match = repoUrl.match(/github\.com\/([^/]*\/[^/]*)/))) {
repoSlug = match[1];
} else {
repoSlug = 'chinchang/github';
}
const queryString = '';
function fetchFile(filepath) {
return fetch(
`https://api.github.com/repos/${repoSlug}/contents/${filepath}${queryString}`
).then(response => response.json());
}
function fetchDir(path, currentDir) {
return fetch(
`https://api.github.com/repos/${repoSlug}/contents/${path}${queryString}`
)
.then(response => response.json())
.then(response => {
if (!response) {
return Promise.resolve([]);
}
return Promise.all(
response.map(file => {
if (file.type === 'file') {
return fetchFile(`${file.path}`).then(actualFile => {
currentDir.push({
name: file.name,
content: atob(actualFile.content)
});
});
} else if (file.type === 'dir') {
const newEntry = {
name: file.name,
children: [],
isFolder: true
};
currentDir.push(newEntry);
return fetchDir(`${file.path}`, newEntry.children);
}
return Promise.resolve();
})
);
});
}
const files = [];
return fetchDir('', files).then(() => {
return files;
});
}