@nasriya/hypercloud
Version:
Nasriya HyperCloud is a lightweight Node.js HTTP2 framework.
95 lines (94 loc) • 3.73 kB
JavaScript
import fs from 'fs';
import path from 'path';
import helpers from "../../../utils/helpers.js";
import Page from "../assets/Page.js";
class PagesManager {
create: (page) => {
this.
},
register: async (directory) => {
try {
const dirents = await fs.promises.readdir(directory, { encoding: 'utf-8', withFileTypes: true });
const folders = dirents.filter(i => i.isDirectory());
const files = dirents.filter(i => {
const name = i.name.toLowerCase();
return i.isFile() && (name.endsWith('.page.js') || name.endsWith('.page.ts'));
});
for (const file of files) {
const content = await helpers.loadFileModule(path.join(file.parentPath, file.name));
if (!(content instanceof Page)) {
continue;
}
const pageName = content.name;
if (pageName in this.
throw new Error(`${pageName} is already defined. Only unique Page names are allowed`);
}
this.
}
for (const folder of folders) {
if (folder.name !== 'locals') {
await this.
}
}
}
catch (error) {
if (error instanceof Error) {
error.message = `Unable to register page: ${error.message}`;
}
throw error;
}
}
};
/**
* Register your defined pages so you can use them in your code
* @param paths A `PathLike` or an array of `PathLike` directories containing your pages.
*/
register(paths) {
if (!Array.isArray(paths)) {
paths = [paths];
}
const errRes = { message: 'Invalid pages\' paths detected. Read the error list', errors: [] };
// Validating input
for (const viewsPath of paths) {
const validity = helpers.checkPathAccessibility(viewsPath);
if (validity.valid) {
this.
continue;
}
const error = { path: viewsPath, type: 'invalid_path', error: '' };
if (validity.errors.notString) {
error.error = 'Not a string';
}
if (validity.errors.doesntExist) {
error.error = 'Path doesn\'t exist';
}
if (validity.errors.notAccessible) {
error.error = 'access denied: no read permissions';
}
errRes.errors.push(error);
}
if (errRes.errors.length > 0) {
throw errRes;
}
}
/**Run all the stored registers */
async scan() {
if (this.
helpers.printConsole('Scanning for pages...');
const scanResult = await Promise.allSettled(this.
const rejected = scanResult.filter(i => i.status === 'rejected');
if (rejected.length > 0) {
throw rejected.map(i => i.reason);
}
this.
}
}
/**Get all the pages in an array */
get all() { return Object.values(this.
/**Access the storage object */
get storage() { return this.
}
export default new PagesManager();