file-routing-expressjs
Version:
A dependency-free, flexible, system-based file routing for Express.
1 lines • 6.47 kB
Source Map (JSON)
{"version":3,"sources":["../../src/helpers/extractors.ts"],"sourcesContent":["import { DirRouteContext, ErrorHandler, ExpressMethod, FileRouteContext, RouteConfig, RouterFileError, RouterFileMiddleware } from \"../types\";\nimport { ENDPOINT_FILE_NAME_REGEX } from \"../constants/regex\";\nimport { filenameToJSorTS } from \"./builders\";\nimport { fileExistsAndIsJSorTS, functionIsExceptionHandler, functionIsRequestHandler } from \"./validators\";\nimport { RequestHandler } from \"express\";\n\nexport function extractEndpointName(name: string) {\n const regex = ENDPOINT_FILE_NAME_REGEX;\n const match = name.match(regex);\n const isParam = !!match && match.length >= 2;\n\n name = isParam ? `:${match[1] || name}` : name;\n\n return { name, isParam };\n}\n\nexport function extractDirConfig(dir: string): RouteConfig {\n const file = filenameToJSorTS(dir, \"_config\");\n\n if (!file) {\n return {};\n }\n\n const module = require(file);\n return module.config || module.default || {};\n}\n\nfunction extractDirMiddlewares(dir: string): RequestHandler[] {\n const file = filenameToJSorTS(dir, \"_middleware\");\n if (!file) {\n return [];\n }\n\n const module = require(file);\n let middlewares: RequestHandler[] = module.middlewares || module.default;\n\n if (!Array.isArray(middlewares)) {\n middlewares = middlewares ? [middlewares] : [];\n }\n\n return middlewares.filter(functionIsRequestHandler);\n}\n\n\nfunction extractDirErrorMiddleware(dir: string): ErrorHandler | undefined {\n const file = filenameToJSorTS(dir, \"_error\");\n\n if (!file) {\n return undefined;\n }\n\n const module = require(file);\n const errorHandler: any = module.error || module.default || undefined;\n return functionIsExceptionHandler(errorHandler) ? errorHandler : undefined;\n}\n\nfunction extractFileConfig(module: any): RouteConfig {\n return module.config || {};\n}\n\nfunction extractFileMiddlewares(module: any): RouterFileMiddleware{\n let middlewares: RouterFileMiddleware = module.middlewares;\n \n if (!Array.isArray(middlewares)) {\n if(typeof middlewares === \"object\") {\n const entries = Object.entries(middlewares);\n\n for(let [method, middleware] of entries) {\n const expressMethod = method as ExpressMethod;\n\n if(!Array.isArray(middleware)) {\n middleware = middleware ? [middleware] : []\n }\n\n middlewares[expressMethod] = middleware.filter(functionIsRequestHandler);\n }\n\n return middlewares;\n }\n\n middlewares = middlewares ? [middlewares] : [];\n }\n\n return middlewares.filter(functionIsRequestHandler);\n}\n\nfunction extractFileErrorMiddleware(module: any): RouterFileError {\n const errorHandler: RouterFileError = module.error || undefined;\n\n if(functionIsExceptionHandler(errorHandler)) return errorHandler;\n\n if(typeof errorHandler === \"object\") {\n const entries = Object.entries(errorHandler);\n\n for(let [method, nestedErrorHandler] of entries) {\n const expressMethod = method as ExpressMethod;\n\n errorHandler[expressMethod] = functionIsExceptionHandler(nestedErrorHandler) ? nestedErrorHandler : undefined;\n }\n\n return errorHandler;\n }\n\n return undefined;\n}\n\nexport function extractDirContext(target: string): DirRouteContext {\n const config = extractDirConfig(target);\n const middlewares = extractDirMiddlewares(target);\n const errorHandler = extractDirErrorMiddleware(target);\n\n return {\n config,\n middlewares,\n errorHandler\n };\n}\n\nexport function extractFileContext(target: string): FileRouteContext {\n if(!fileExistsAndIsJSorTS(target)) {\n return {\n config: {},\n middlewares: [],\n errorHandler: undefined\n };\n }\n\n const module = require(target);\n const config = extractFileConfig(module);\n const middlewares = extractFileMiddlewares(module);\n const errorHandler = extractFileErrorMiddleware(module);\n\n return {\n config,\n middlewares,\n errorHandler\n };\n}"],"mappings":"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","names":[]}