UNPKG

@nasriya/hypercloud

Version:

Nasriya HyperCloud is a lightweight Node.js HTTP2 framework.

100 lines (99 loc) 4.11 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const helpers_1 = __importDefault(require("../../../utils/helpers")); const Page_1 = __importDefault(require("../assets/Page")); class PagesManager { #_storage = {}; #_registers = []; #_helpers = { create: (page) => { this.#_storage[page.name] = page; }, register: async (directory) => { try { const dirents = await fs_1.default.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_1.default.loadFileModule(path_1.default.join(file.parentPath, file.name)); if (!(content instanceof Page_1.default)) { continue; } const pageName = content.name; if (pageName in this.#_storage) { throw new Error(`${pageName} is already defined. Only unique Page names are allowed`); } this.#_helpers.create(content); } for (const folder of folders) { if (folder.name !== 'locals') { await this.#_helpers.register(path_1.default.join(directory, folder.name)); } } } 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_1.default.checkPathAccessibility(viewsPath); if (validity.valid) { this.#_registers.push(this.#_helpers.register(viewsPath)); 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.#_registers.length > 0) { helpers_1.default.printConsole('Scanning for pages...'); const scanResult = await Promise.allSettled(this.#_registers); const rejected = scanResult.filter(i => i.status === 'rejected'); if (rejected.length > 0) { throw rejected.map(i => i.reason); } this.#_registers.length = 0; } } /**Get all the pages in an array */ get all() { return Object.values(this.#_storage); } /**Access the storage object */ get storage() { return this.#_storage; } } exports.default = new PagesManager();