UNPKG

@d3vtool/kazejs

Version:

A flexible Node.js web framework built with TypeScript, focusing on dependency injection, routing, middleware, and schema validation. Supports dynamic routes, global middleware, static files, and customizable error handling for scalable apps.

194 lines (193 loc) 9.51 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _FileRouter_instances, _FileRouter_mapRouter, _FileRouter_lazyDynamicLoadFileMap, _FileRouter_routerDirPath, _FileRouter_getMiddlewareAt, _FileRouter_importOrRequire; Object.defineProperty(exports, "__esModule", { value: true }); exports.FileRouter = void 0; const kaze_router_1 = require("./kaze-router"); const kaze_map_router_1 = require("./kaze-map-router"); const node_path_1 = __importDefault(require("node:path")); const promises_1 = __importDefault(require("node:fs/promises")); class FileRouter extends kaze_router_1.Router { constructor() { super(); _FileRouter_instances.add(this); _FileRouter_mapRouter.set(this, new kaze_map_router_1.MapRouter()); _FileRouter_lazyDynamicLoadFileMap.set(this, new Map()); _FileRouter_routerDirPath.set(this, node_path_1.default.join(process.cwd(), "routes")); this.indexDirectoryRoutes(__classPrivateFieldGet(this, _FileRouter_routerDirPath, "f"), { path: __classPrivateFieldGet(this, _FileRouter_routerDirPath, "f"), type: "normal" }); } async indexDirectoryRoutes(rootDir, pathInfo) { try { const dirs = await promises_1.default.readdir(rootDir); for (const dir of dirs) { const fullpath = node_path_1.default.join(rootDir, dir); const info = await promises_1.default.stat(fullpath); if (info.isDirectory()) { if (dir.startsWith("[")) { if (dir.includes("@")) { throw new Error(`Invalid route name: ${dir}`); } await this.indexDirectoryRoutes(fullpath, { path: fullpath, type: "dynamic-param" }); } else { await this.indexDirectoryRoutes(fullpath, { path: fullpath, type: "normal" }); } } else if (info.isFile() && (node_path_1.default.basename(fullpath) === "route.ts" || node_path_1.default.basename(fullpath) === "route.js")) { let routeCode = {}; routeCode = await __classPrivateFieldGet(this, _FileRouter_instances, "m", _FileRouter_importOrRequire).call(this, fullpath); let route = fullpath.replace(__classPrivateFieldGet(this, _FileRouter_routerDirPath, "f"), "") .replaceAll("\\", "/") .replace(/route\.(?:ts|js)$/, ""); route = route.length > 1 ? route.replace(/\/$/, "") : route; route = route.replaceAll(/\/\(.*?\)/g, ''); const middlewareFns = []; if (pathInfo.type === "dynamic-param") { route = route.replaceAll(/\[([^\]]+)\]/g, ':$1'); } else if (route.includes("/@")) { const regex = /\/@[\w]+/g; const dyns = route.matchAll(regex).map(dyn => dyn[0]); route = route.replaceAll(regex, '/*'); for (const dyn of dyns) { const pathFix = node_path_1.default.join(dyn, ""); const dynPath = node_path_1.default.join(fullpath.split(pathFix)[0], dyn, "middleware"); let middlewares = await __classPrivateFieldGet(this, _FileRouter_instances, "m", _FileRouter_getMiddlewareAt).call(this, dynPath + ".js"); if (middlewares.length === 0) { middlewares = await __classPrivateFieldGet(this, _FileRouter_instances, "m", _FileRouter_getMiddlewareAt).call(this, dynPath + ".ts"); } middlewareFns.push(...middlewares); } } const middlewarePath = fullpath.replace(/route\.(ts|js)$/, 'middleware.$1'); if (!route.includes("/*")) { const middlewares = await __classPrivateFieldGet(this, _FileRouter_instances, "m", _FileRouter_getMiddlewareAt).call(this, middlewarePath); middlewareFns.push(...middlewares); } for (const methodName in routeCode) { if (methodName === "default") continue; __classPrivateFieldGet(this, _FileRouter_mapRouter, "f")[methodName.toLowerCase()](route, ...middlewareFns, routeCode[methodName]); } } } } catch { throw new Error(`Dir Read Error: Directory ${__classPrivateFieldGet(this, _FileRouter_routerDirPath, "f")}.`); } } get(route, ...handlers) { } post(route, ...handlers) { } put(route, ...handlers) { } delete(route, ...handlers) { } patch(route, ...handlers) { } head(route, ...handlers) { } options(route, ...handlers) { } trace(route, ...handlers) { } connect(route, ...handlers) { } link(route, ...handlers) { } unlink(route, ...handlers) { } all(route, ...handlers) { } middlewares(...handlers) { } ; fetchMiddlewares() { return __classPrivateFieldGet(this, _FileRouter_mapRouter, "f").fetchMiddlewares(); } async fetchHandlers(route, reqMethod) { route = (route.length > 1 && route.endsWith("/")) ? route.slice(0, -1) : route; const fullpath = __classPrivateFieldGet(this, _FileRouter_lazyDynamicLoadFileMap, "f").get(route); if (!fullpath) { return __classPrivateFieldGet(this, _FileRouter_mapRouter, "f").fetchHandlers(route, reqMethod); } const middlewarePath = __classPrivateFieldGet(this, _FileRouter_lazyDynamicLoadFileMap, "f").get(`m-${route}`); let middlewareCode = []; if (middlewarePath) { const middleware = await __classPrivateFieldGet(this, _FileRouter_instances, "m", _FileRouter_importOrRequire).call(this, middlewarePath); middlewareCode = middleware ? Object.values(middleware) : []; } const routeCode = await __classPrivateFieldGet(this, _FileRouter_instances, "m", _FileRouter_importOrRequire).call(this, fullpath); return [...middlewareCode, routeCode[reqMethod.toUpperCase()]]; } } exports.FileRouter = FileRouter; _FileRouter_mapRouter = new WeakMap(), _FileRouter_lazyDynamicLoadFileMap = new WeakMap(), _FileRouter_routerDirPath = new WeakMap(), _FileRouter_instances = new WeakSet(), _FileRouter_getMiddlewareAt = async function _FileRouter_getMiddlewareAt(middlewarePath) { try { await promises_1.default.access(middlewarePath, promises_1.default.constants.R_OK); const middlewareFns = await __classPrivateFieldGet(this, _FileRouter_instances, "m", _FileRouter_importOrRequire).call(this, middlewarePath); return Object.values(middlewareFns); } catch { } ; return []; }, _FileRouter_importOrRequire = // continue working on lazy load file async function _FileRouter_importOrRequire(path) { try { return await Promise.resolve(`${path}`).then(s => __importStar(require(s))); } catch { return require(path); } };