@vulppi/intrest
Version:
Backend kit make by Vulppi
8 lines (7 loc) • 39.3 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/workers/router.ts", "../../src/controllers/tunnel.ts", "../../src/controllers/constants.ts", "../../src/controllers/path.ts", "../../src/controllers/response.ts", "../../src/controllers/compare.ts"],
"sourcesContent": ["import { parentPort } from 'worker_threads'\r\nimport { tunnel } from '../controllers/tunnel'\r\n\r\nparentPort!.on(\r\n 'message',\r\n async ({ config, basePath, data, requestId }: WorkerProps) => {\r\n await tunnel(\r\n {\r\n data,\r\n config,\r\n basePath,\r\n },\r\n (state, data) => {\r\n parentPort?.postMessage({\r\n requestId,\r\n state,\r\n data,\r\n })\r\n },\r\n )\r\n },\r\n)\r\n", "import { createReadStream } from 'fs'\r\nimport { StatusCodes } from 'http-status-codes'\r\nimport _ from 'lodash'\r\nimport { lookup } from 'mime-types'\r\nimport { join } from 'path'\r\nimport { unescape } from 'querystring'\r\nimport { pathToFileURL } from 'url'\r\nimport { defaultPaths, globPatterns } from './constants'\r\nimport {\r\n encapsulateModule,\r\n getFolderPath,\r\n globFind,\r\n globFindAll,\r\n normalizePath,\r\n} from './path'\r\nimport { sendResponseParser } from './response'\r\n\r\nexport async function tunnel(\r\n { data, config, basePath }: Omit<WorkerProps, 'requestId'>,\r\n endCallback: (state: ResponseState, data: ResponseData) => void,\r\n) {\r\n const context = {\r\n ...data,\r\n params: {},\r\n query: new URLSearchParams(data.query || ''),\r\n } as IntREST.IntRequest\r\n\r\n // Send response if static file found\r\n const staticFolder = await getFolderPath(basePath, globPatterns.staticFolder)\r\n if (staticFolder) {\r\n const staticFile = await globFind(staticFolder, context.path)\r\n if (staticFile) {\r\n const mimeType = lookup(staticFile)\r\n if (mimeType) {\r\n return await sendResponse(\r\n {\r\n status: StatusCodes.OK,\r\n body: createReadStream(staticFile),\r\n headers: {\r\n 'Content-Type': mimeType,\r\n },\r\n },\r\n context.headers,\r\n endCallback,\r\n )\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const identities = await getIdentities(context.path)\r\n\r\n // Send response not found if no route found\r\n if (!identities.length) {\r\n return await sendResponse(\r\n {\r\n status: StatusCodes.NOT_FOUND,\r\n body: {\r\n message: config.messages?.NOT_FOUND || 'Not found',\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n },\r\n context.headers,\r\n endCallback,\r\n )\r\n }\r\n\r\n const method = context.method\r\n const basePathCompiled = normalizePath(\r\n join(defaultPaths.compiledFolder, defaultPaths.compiledRoutes),\r\n )\r\n const routes = await Promise.all(\r\n identities.map(async (i) => {\r\n const routeModule = await import(\r\n encapsulateModule(\r\n pathToFileURL(\r\n normalizePath(join(basePathCompiled, i.pathname, 'route.mjs')),\r\n ).toString(),\r\n )\r\n )\r\n return {\r\n handler: (routeModule[method] ||\r\n routeModule['ALL'] ||\r\n routeModule.default) as IntREST.RequestHandler | undefined,\r\n identity: i,\r\n }\r\n }),\r\n )\r\n const route = routes.find((r) => typeof r.handler === 'function')\r\n\r\n // Send response not allowed if method not found in route\r\n if (!route?.handler) {\r\n return await sendResponse(\r\n {\r\n status: StatusCodes.METHOD_NOT_ALLOWED,\r\n body: {\r\n message:\r\n config.messages?.METHOD_NOT_ALLOWED || 'Method not allowed',\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n },\r\n context.headers,\r\n endCallback,\r\n )\r\n }\r\n\r\n const paramExtract = route.identity.paramExtract\r\n const pathname = route.identity.pathname\r\n const paramKeys = route.identity.paramKeys\r\n const paramValues = Array.from(data.path.match(paramExtract) || []).slice(1)\r\n context.params = _.zipObject(paramKeys, paramValues.map(unescape))\r\n\r\n const middlewares = await getMiddlewares(pathname)\r\n\r\n const response = await callRecursiveMiddlewares({\r\n middlewares,\r\n context,\r\n config,\r\n requestHandler: route.handler,\r\n })\r\n\r\n if (!response) throw new Error('Response not found')\r\n\r\n return await sendResponse(response, context.headers, endCallback)\r\n } catch (error) {\r\n console.error(error)\r\n if (error instanceof Error) {\r\n return await sendResponse(\r\n {\r\n status: StatusCodes.INTERNAL_SERVER_ERROR,\r\n body: {\r\n message: error.message,\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n },\r\n context.headers,\r\n endCallback,\r\n )\r\n } else if (typeof error === 'object' && error != null) {\r\n return await sendResponse(error, context.headers, endCallback)\r\n }\r\n\r\n throw error\r\n }\r\n}\r\n\r\nasync function sendResponse(\r\n resData: IntREST.IntResponse,\r\n reqHeaders: IntREST.IntRequest['headers'],\r\n endCallback: (state: ResponseState, data: ResponseData) => void,\r\n) {\r\n return await sendResponseParser(resData, reqHeaders, 'void', (ev) => {\r\n const { state, data } = ev\r\n endCallback(state, data)\r\n })\r\n}\r\n\r\nasync function getIdentities(route: string) {\r\n const basePath = normalizePath(\r\n join(\r\n process.cwd(),\r\n defaultPaths.compiledFolder,\r\n defaultPaths.compiledRoutes,\r\n ),\r\n )\r\n const identitiesPaths = await globFindAll(\r\n basePath,\r\n globPatterns.identityPoints,\r\n )\r\n const identitiesModules = await Promise.all(\r\n identitiesPaths.map((p) =>\r\n import(encapsulateModule(pathToFileURL(p).toString())).then(\r\n (m) => m as AutoGeneratedVars,\r\n ),\r\n ),\r\n )\r\n return identitiesModules\r\n .filter((m) => m.paramExtract.test(route))\r\n .sort((a, b) => (a.pathname > b.pathname ? 1 : -1))\r\n .sort(sortCompiledRoutes)\r\n}\r\n\r\nasync function getMiddlewares(pathname: string) {\r\n const basePath = normalizePath(\r\n join(\r\n process.cwd(),\r\n defaultPaths.compiledFolder,\r\n defaultPaths.compiledRoutes,\r\n ),\r\n )\r\n const pathnames = pathname\r\n .split('/')\r\n .map((_, i, l) => (i > 0 ? l.slice(0, i + 1).join('/') : '/'))\r\n .map((p) => normalizePath(join(basePath, p, 'middleware.mjs')))\r\n const middlewarePaths = await globFindAll(\r\n basePath,\r\n globPatterns.middlewarePoints,\r\n )\r\n const validMiddlewarePaths = middlewarePaths.filter((p) =>\r\n pathnames.some((pn) => p === pn),\r\n )\r\n\r\n const middlewareModules = await Promise.all(\r\n validMiddlewarePaths.map(async (p) => ({\r\n handler: await import(\r\n encapsulateModule(pathToFileURL(p).toString())\r\n ).then((m) => (m.middleware || m.default) as IntREST.MiddlewareHandler),\r\n pathname: p.replace(basePath, ''),\r\n })),\r\n )\r\n return middlewareModules.filter((m) => typeof m.handler === 'function')\r\n}\r\n\r\nfunction sortCompiledRoutes(a: AutoGeneratedVars, b: AutoGeneratedVars) {\r\n const aSlipt = a.pathname.split('/')\r\n const bSlipt = b.pathname.split('/')\r\n for (let i = 0; i < aSlipt.length; i++) {\r\n if (aSlipt[i][0] === '[' && bSlipt[i]?.[0] === '[') continue\r\n if (aSlipt[i][0] === '[') return 1\r\n if (bSlipt[i]?.[0] === '[') return -1\r\n }\r\n if (b.route.toLowerCase() > a.route.toLowerCase()) return -1\r\n if (b.route.toLowerCase() < a.route.toLowerCase()) return 1\r\n return 0\r\n}\r\n\r\ninterface MiddlewareModule {\r\n handler: IntREST.MiddlewareHandler\r\n pathname: string\r\n}\r\n\r\ninterface CallRecursiveMiddlewaresArgs {\r\n middlewares: MiddlewareModule[]\r\n context: IntREST.IntRequest\r\n config: IntREST.Config\r\n requestHandler: IntREST.RequestHandler\r\n}\r\n\r\nasync function callRecursiveMiddlewares({\r\n middlewares,\r\n context,\r\n config,\r\n requestHandler,\r\n}: CallRecursiveMiddlewaresArgs): Promise<IntREST.IntResponse> {\r\n if (!middlewares.length)\r\n return (\r\n (await requestHandler(context)) || {\r\n status: StatusCodes.NOT_FOUND,\r\n }\r\n )\r\n\r\n const middleware = middlewares[0]\r\n\r\n const timeoutId = setTimeout(() => {\r\n throw new Error(`Middleware handler timeout: ${middleware.pathname}`)\r\n }, config.limits?.middleware?.timeout || 5000)\r\n\r\n const response = await middleware.handler(\r\n context,\r\n async (c?: CustomRequestData) => {\r\n clearTimeout(timeoutId)\r\n context.custom = _.merge(context.custom, c)\r\n return callRecursiveMiddlewares({\r\n middlewares: middlewares.slice(1),\r\n context,\r\n config,\r\n requestHandler,\r\n })\r\n },\r\n )\r\n clearTimeout(timeoutId)\r\n return response\r\n}\r\n", "export const isDev = () => process.env.NODE_ENV === 'development'\r\n\r\nexport const globPatterns = {\r\n env: ['.env', '.env{.local,.development,.production}'],\r\n entryFolder: ['routes', 'src/routes'],\r\n assetsFolder: ['assets', 'src/assets'],\r\n staticFolder: ['static', 'src/static', 'public', 'src/public'],\r\n configFile: 'intrest.config.{mjs,cjs,js}',\r\n envFile: '.env{.local,.development,.production}',\r\n bootstrapEntry: 'bootstrap.ts',\r\n bootstrapCompiled: 'bootstrap.mjs',\r\n entryPoints: '**/{route,middleware,validation}.ts',\r\n identityPoints: '**/__identity.mjs',\r\n middlewarePoints: '**/middleware.mjs',\r\n routeFile: 'route.{mjs,cjs,js,ts}',\r\n middlewareFile: 'middleware.{mjs,cjs,js,ts}',\r\n} as const\r\n\r\nexport const regexpPatterns = {\r\n env: /^\\.env(?:\\.[a-z-_]*)?$/,\r\n config: /^intrest\\.config\\.[mc]?js$/,\r\n bootstrap: /^bootstrap\\.ts$/,\r\n entry: /(?:^|\\/)(?:route|middleware|validation)\\.ts$/,\r\n observable: /(?:route)\\.ts$/,\r\n reservedChars: /(?:[.*+?^=!:${}()|\\[\\]\\/\\\\])/g,\r\n startSlashesOrNot: /^[\\\\\\/]*/,\r\n endSlashesOrNot: /[\\\\\\/]*$/,\r\n multiSlashes: /[\\\\\\/]+/g,\r\n isBusboyContentType: /^(?:x-www-form-urlencoded|multipart\\/form-data.*)$/i,\r\n isJSONContentType: /^application\\/json$/i,\r\n isXMLContentType: /^application\\/xml$/i,\r\n isAcceptableContentType:\r\n /^(?:x-www-form-urlencoded|multipart\\/form-data.*|application\\/(?:json|xml))$/i,\r\n} as const\r\n\r\nexport const defaultPaths = {\r\n compiledFolder: '.intrest',\r\n compiledRoutes: 'routes',\r\n workerMultiWorker: 'multi.mjs',\r\n workerSingleWorker: 'single.mjs',\r\n workerRouter: 'router.mjs',\r\n routeIdentity: '__identity.mjs',\r\n} as const\r\n\r\nexport const defaultOutputPaths = {\r\n vercel: '.vercel/output',\r\n}\r\n", "import { glob } from 'glob'\r\nimport { join, normalize } from 'path'\r\nimport { pathToFileURL } from 'url'\r\nimport { globPatterns, isDev } from './constants'\r\n\r\n/**\r\n * Normalize the path and replace all backslash with slash\r\n *\r\n * @param pathname\r\n * @returns\r\n */\r\nexport function normalizePath(pathname: string) {\r\n return normalize(pathname).replace(/[\\/\\\\]+/g, '/')\r\n}\r\n\r\n/**\r\n * Get the module from the given path\r\n * If the path is not given or the module is not found, return empty object\r\n */\r\nexport async function getModule(configPath?: string) {\r\n if (!configPath) return {} as Record<string, any>\r\n const configURL = pathToFileURL(configPath)\r\n configURL.searchParams.set('update', Date.now().toString())\r\n try {\r\n return (\r\n (await import(configURL.toString()).then(\r\n (m) => m as Record<string, any>,\r\n )) || {}\r\n )\r\n } catch (err) {\r\n return {} as Record<string, any>\r\n }\r\n}\r\n\r\n/**\r\n * Find the first file that match the glob pattern\r\n */\r\nexport async function globFind(\r\n ...pattern: string[]\r\n): Promise<string | undefined> {\r\n const res = await glob(normalizePath(join(...pattern)), {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res[0] && normalizePath(res[0])\r\n}\r\n\r\n/**\r\n * Find the first file that match the glob pattern list\r\n */\r\nexport async function globFindList(\r\n ...pattern: string[][]\r\n): Promise<string | undefined> {\r\n const list = pattern.map((p) => normalizePath(join(...p)))\r\n const res = await glob(list, {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res[0] && normalizePath(res[0])\r\n}\r\n\r\n/**\r\n * Find all files that match the glob pattern\r\n */\r\nexport async function globFindAll(...pattern: string[]): Promise<string[]> {\r\n const res = await glob(normalizePath(join(...pattern)), {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res.map(normalizePath)\r\n}\r\n\r\n/**\r\n * Find all files that match the glob pattern list\r\n */\r\nexport async function globFindAllList(\r\n ...pattern: string[][]\r\n): Promise<string[]> {\r\n const list = pattern.map((p) => normalizePath(join(...p)))\r\n const res = await glob(list.reverse(), {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res.map(normalizePath)\r\n}\r\n\r\n/**\r\n * Escape the path with the given escape string\r\n */\r\nexport function escapePath(pathname: string, ...escape: string[]) {\r\n return normalizePath(pathname)\r\n .replace(normalizePath(join(...escape)), '')\r\n .replace(/^\\//, '')\r\n}\r\n\r\n/**\r\n * Clear the extension of the path\r\n */\r\nexport function clearExtension(path: string) {\r\n return normalizePath(path).replace(/\\.[a-z0-9]+$/i, '')\r\n}\r\n\r\n/**\r\n * Find the list of env files that match the glob pattern\r\n * inside the given base path\r\n */\r\nexport async function findEnvPaths(basePath: string) {\r\n return globFindAllList(...globPatterns.env.map((p) => [basePath, p]))\r\n}\r\n\r\n/**\r\n * Get the first env file that match the glob pattern\r\n * inside the given base path\r\n */\r\nexport async function getEnvPath(basePath: string) {\r\n return (await findEnvPaths(basePath))[0] as string | undefined\r\n}\r\n\r\n/**\r\n * Find the app folder that match the glob pattern\r\n * inside the given base path\r\n */\r\nexport async function getFolderPath(\r\n basePath: string,\r\n possibleFolders: readonly string[],\r\n) {\r\n return (\r\n (await globFindAllList(...possibleFolders.map((p) => [basePath, p])))[0] ||\r\n possibleFolders[1]\r\n )\r\n}\r\n\r\n/**\r\n * Add the update query to the module path for development\r\n * to prevent the module from being cached\r\n */\r\nexport function encapsulateModule(v: string) {\r\n if (!isDev()) return v\r\n return `${v}?update=${Date.now()}`\r\n}\r\n", "import { existsSync } from 'fs'\r\nimport { StatusCodes } from 'http-status-codes'\r\nimport _ from 'lodash'\r\nimport { dirname } from 'path'\r\nimport { join } from 'path'\r\nimport rangeParser from 'range-parser'\r\nimport { Readable } from 'stream'\r\nimport { isBuffer } from './compare'\r\nimport { defaultPaths } from './constants'\r\nimport { escapePath, globFindAll, normalizePath } from './path'\r\n\r\nfunction isRange(\r\n range?: rangeParser.Result | rangeParser.Ranges,\r\n): range is rangeParser.Ranges {\r\n return !!(\r\n range &&\r\n Array.isArray(range) &&\r\n range.length &&\r\n range.type === 'bytes'\r\n )\r\n}\r\n\r\n/**\r\n * Send the response data to the client through the worker port\r\n * auto detect the type of response and send the data\r\n */\r\nexport async function sendResponseParser(\r\n res: IntREST.IntResponse,\r\n reqHeaders: IntREST.IntRequest['headers'],\r\n requestId: string,\r\n sendMessage: (msg: TransferResponse) => void,\r\n) {\r\n // Get content length and type from the response headers\r\n const lengthHeaderKey = Object.keys(res.headers || {}).find((k) =>\r\n /^content-length$/i.test(k),\r\n )\r\n const typeHeaderKey = Object.keys(res.headers || {}).find((k) =>\r\n /^content-type$/i.test(k),\r\n )\r\n const contentLength = _.get(\r\n res.headers || {},\r\n lengthHeaderKey || 'Content-Length',\r\n Infinity,\r\n )\r\n const contentType = _.get(res.headers || {}, typeHeaderKey || 'Content-Type')\r\n\r\n // Get the range from the request headers\r\n const range = reqHeaders.range\r\n ? rangeParser(+contentLength, reqHeaders.range, { combine: true })\r\n : undefined\r\n\r\n // If has range in request header, add content range and status code and remove content-length\r\n if (isRange(range)) {\r\n res.status =\r\n !res.status || res.status === StatusCodes.OK\r\n ? StatusCodes.PARTIAL_CONTENT\r\n : res.status\r\n res.headers = {\r\n ...res.headers,\r\n 'Content-Range':\r\n `bytes ${range[0].start}-${range[0].end}` +\r\n (contentLength && isFinite(+contentLength) ? `/${contentLength}` : ''),\r\n }\r\n delete res.headers[lengthHeaderKey || 'Content-Length']\r\n }\r\n\r\n // Check if the response has headers to send to the client\r\n for (const entry of Object.entries(res.headers || {})) {\r\n sendMessage({\r\n requestId,\r\n state: 'set',\r\n data: entry,\r\n })\r\n }\r\n // Check if the response has cookies to send to the client\r\n for (const [key, cookieData] of Object.entries(res.cookies || {})) {\r\n if (Array.isArray(cookieData)) {\r\n for (const cookie of cookieData) {\r\n sendMessage({\r\n requestId,\r\n state: 'cookie',\r\n data: {\r\n name: key,\r\n value: cookie.value,\r\n options: cookie.options,\r\n },\r\n })\r\n }\r\n } else {\r\n sendMessage({\r\n requestId,\r\n state: 'cookie',\r\n data: {\r\n name: key,\r\n value: cookieData.value,\r\n options: cookieData.options,\r\n },\r\n })\r\n }\r\n }\r\n // Check if the response has cookies to clear in the client\r\n for (const [key, cookieData] of Object.entries(res.clearCookies || {})) {\r\n if (Array.isArray(cookieData)) {\r\n for (const cookie of cookieData) {\r\n sendMessage({\r\n requestId,\r\n state: 'clear-cookie',\r\n data: {\r\n name: key,\r\n options: cookie,\r\n },\r\n })\r\n }\r\n } else {\r\n sendMessage({\r\n requestId,\r\n state: 'clear-cookie',\r\n data: {\r\n name: key,\r\n options: cookieData,\r\n },\r\n })\r\n }\r\n }\r\n\r\n // Send the status code to the client\r\n sendMessage({\r\n requestId,\r\n state: 'status',\r\n data: res.status || StatusCodes.OK,\r\n })\r\n\r\n // Check if the response has a body to send to the client\r\n if (res.body) {\r\n // If the response body is a buffer or string\r\n // send the data to the client like a buffer\r\n if (typeof res.body === 'string' || isBuffer(res.body)) {\r\n // If the response has no content type\r\n // set the content type to text/plain\r\n if (!contentType) {\r\n sendMessage({\r\n requestId,\r\n state: 'set',\r\n data: ['Content-Type', 'text/plain'],\r\n })\r\n }\r\n const data = Buffer.from(res.body)\r\n // If the response has a range header\r\n // send only the range of the buffer\r\n if (isRange(range)) {\r\n sendMessage({\r\n requestId,\r\n state: 'write',\r\n data: data.subarray(range[0].start, range[0].end + 1),\r\n })\r\n } else {\r\n sendMessage({\r\n requestId,\r\n state: 'write',\r\n data,\r\n })\r\n }\r\n // If the response body is a readable stream\r\n } else if (res.body instanceof Readable) {\r\n // If the response not has a content type\r\n // set the content type to application/octet-stream\r\n if (!contentType) {\r\n sendMessage({\r\n requestId,\r\n state: 'set',\r\n data: ['Content-Type', 'application/octet-stream'],\r\n })\r\n }\r\n const reader = res.body\r\n if (isRange(range)) {\r\n const start = range[0].start\r\n const end = range[0].end\r\n let readed = 0\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n reader.on('data', (c) => {\r\n const chunk = Buffer.from(c)\r\n if (chunk.length + readed < start) {\r\n readed += chunk.length\r\n return\r\n }\r\n if (readed > end) {\r\n reader.destroy()\r\n return resolve()\r\n }\r\n const offset = Math.max(start - readed, 0)\r\n const length = Math.min(end + 1 - readed, chunk.length)\r\n readed += length\r\n const data = chunk.subarray(offset, offset + length)\r\n sendMessage({\r\n requestId,\r\n state: 'write',\r\n data,\r\n })\r\n })\r\n reader.on('end', () => {\r\n resolve()\r\n })\r\n reader.on('error', (err) => {\r\n reject(err)\r\n })\r\n })\r\n } else {\r\n await new Promise<void>((resolve, reject) => {\r\n reader.on('data', (chunk) => {\r\n sendMessage({\r\n requestId,\r\n state: 'write',\r\n data: chunk,\r\n })\r\n })\r\n reader.on('end', () => {\r\n resolve()\r\n })\r\n reader.on('error', (err) => {\r\n reject(err)\r\n })\r\n })\r\n }\r\n } else {\r\n // If the response body is a object\r\n if (!contentType) {\r\n sendMessage({\r\n requestId,\r\n state: 'set',\r\n data: ['Content-Type', 'application/json'],\r\n })\r\n }\r\n const body = JSON.stringify(res.body)\r\n const data = Buffer.from(body)\r\n if (isRange(range)) {\r\n sendMessage({\r\n requestId,\r\n state: 'write',\r\n data: data.subarray(range[0].start, range[0].end + 1),\r\n })\r\n } else {\r\n sendMessage({\r\n requestId,\r\n state: 'write',\r\n data,\r\n })\r\n }\r\n }\r\n }\r\n\r\n // Send the end of the response to the client\r\n sendMessage({\r\n requestId,\r\n state: 'end',\r\n data: undefined,\r\n })\r\n}\r\n\r\n/**\r\n * Find the middleware pathnames in the compiled directory\r\n */\r\nexport async function findMiddlewarePathnames(\r\n basePath: string,\r\n routeFilePath: string,\r\n) {\r\n // Get the directory of the route file path\r\n // and escape it from root project path\r\n const dir = dirname(\r\n escapePath(\r\n routeFilePath,\r\n normalizePath(\r\n join(\r\n basePath,\r\n defaultPaths.compiledFolder,\r\n defaultPaths.compiledRoutes,\r\n ),\r\n ),\r\n ),\r\n )\r\n // Get all directories from the route file path recursively\r\n const directories = recursiveDirectoryList(dir)\r\n // Create a list of possible middleware paths\r\n const searchList = directories.map((r) =>\r\n normalizePath(\r\n join(\r\n ...[\r\n basePath,\r\n defaultPaths.compiledFolder,\r\n defaultPaths.compiledRoutes,\r\n r,\r\n 'middleware.mjs',\r\n ].filter(Boolean),\r\n ),\r\n ),\r\n )\r\n // Filter the list to get only the existing paths\r\n return searchList.filter((r) => existsSync(r))\r\n}\r\n\r\n/**\r\n * Find all route pathnames in the compiled directory\r\n */\r\nexport async function getAllRoutePathnames(basePath: string) {\r\n return await globFindAll(\r\n basePath,\r\n defaultPaths.compiledFolder,\r\n defaultPaths.compiledRoutes,\r\n '**',\r\n 'route.mjs',\r\n )\r\n}\r\n\r\n/**\r\n * Parse route pathname to route path\r\n */\r\nexport function parseRoutePathname(pathname: string) {\r\n return (\r\n pathname\r\n // Remove groups\r\n .replace(/[\\/\\\\]?\\([A-z\u00C0-\u00FA0-9-_$]+\\)/gi, '')\r\n // Remove filename and extension\r\n .replace(/route\\.(mj|cj|j|t)s$/, '')\r\n // Remove the '\\' of end of the path\r\n .replace(/\\/*$/, '')\r\n // Ensure that starts with `/`\r\n .replace(/^\\/*/, '/')\r\n )\r\n}\r\n\r\nexport function parseRoutePathnameToRegexp(pathname: string, basePath: string) {\r\n const escapedRoute = escapePath(pathname, basePath)\r\n const cleanedRoute = parseRoutePathname(escapedRoute)\r\n\r\n if (/\\[\\.\\.\\.[A-z\u00C0-\u00FA0-9-_$]+\\].+$/.test(cleanedRoute)) {\r\n throw new Error(`Invalid route path: ${escapedRoute}`)\r\n }\r\n\r\n // Compile the route path to a regexp\r\n return {\r\n pathname,\r\n route: cleanedRoute,\r\n vars: Array.from(\r\n cleanedRoute.matchAll(/\\[(?:\\.{3,3})?([A-z\u00C0-\u00FA0-9-_$]+)\\]/g),\r\n ).map((m) => m[1]),\r\n paramRegexp: new RegExp(\r\n cleanedRoute\r\n .replace(/\\[([A-z\u00C0-\u00FA0-9-_$]+)\\]/g, '([A-z\u00C0-\u00FA0-9-_:$.@%]+)')\r\n .replace(/\\[\\.{3,3}([A-z\u00C0-\u00FA0-9-_$]+)\\]/g, '?([A-z\u00C0-\u00FA0-9-_:$%.@/]*)')\r\n .replace(/[\\/\\\\]/, '\\\\/')\r\n .replace(/^\\^*/, '^')\r\n .replace(/\\$*$/, '\\\\/?$'),\r\n ),\r\n }\r\n}\r\n\r\n/**\r\n * Find the route pathnames in the compiled directory\r\n */\r\nexport async function findRoutePathnames(basePath: string, route?: string) {\r\n const routesPathnames = await getAllRoutePathnames(basePath)\r\n const maps = routesPathnames.map((r) =>\r\n parseRoutePathnameToRegexp(\r\n r,\r\n normalizePath(\r\n join(\r\n basePath,\r\n defaultPaths.compiledFolder,\r\n defaultPaths.compiledRoutes,\r\n ),\r\n ),\r\n ),\r\n )\r\n\r\n // Filter the list to get only the match routes if route is defined\r\n if (route) {\r\n return maps\r\n .filter((m) => m.paramRegexp.test(route))\r\n .sort(sortCompiledRoutes)\r\n }\r\n return maps.sort(sortCompiledRoutes)\r\n}\r\n\r\ninterface CompiledRoute {\r\n pathname: string\r\n route: string\r\n vars: string[]\r\n paramRegexp: RegExp\r\n}\r\n\r\n/**\r\n * Sort the compiled routes by priority\r\n */\r\nexport function sortCompiledRoutes(a: CompiledRoute, b: CompiledRoute) {\r\n const aSlipt = a.pathname.split('/')\r\n const bSlipt = b.pathname.split('/')\r\n for (let i = 0; i < aSlipt.length; i++) {\r\n if (aSlipt[i][0] === '[' && bSlipt[i][0] === '[') continue\r\n if (aSlipt[i][0] === '[') return 1\r\n if (bSlipt[i]?.[0] === '[') return -1\r\n }\r\n if (b.route.toLowerCase() > a.route.toLowerCase()) return -1\r\n if (b.route.toLowerCase() < a.route.toLowerCase()) return 1\r\n return b.pathname.length - a.pathname.length\r\n}\r\n\r\n/**\r\n * Get all directories from a path recursively\r\n */\r\nexport function recursiveDirectoryList(path: string) {\r\n const dirs = normalizePath(path)\r\n .split('/')\r\n .map((_, i, arr) => arr.slice(0, i + 1).join('/'))\r\n if (!dirs.includes('')) dirs.unshift('')\r\n return dirs\r\n}\r\n", "import {\n isAnyArrayBuffer,\n isUint16Array,\n isUint32Array,\n isUint8Array,\n} from 'util/types'\n\nexport function isBuffer(data: any): data is Buffer {\n if (isAnyArrayBuffer(data)) return true\n if (isUint8Array(data)) return true\n if (isUint16Array(data)) return true\n if (isUint32Array(data)) return true\n\n return false\n}\n"],
"mappings": "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",
"names": ["parentPort", "createReadStream", "StatusCodes", "_", "lookup", "join", "unescape", "pathToFileURL", "isDev", "globPatterns", "defaultPaths", "glob", "join", "normalize", "normalizePath", "pathname", "normalize", "globFind", "pattern", "res", "glob", "normalizePath", "join", "globFindAll", "pattern", "glob", "normalizePath", "join", "globFindAllList", "list", "p", "getFolderPath", "basePath", "possibleFolders", "globFindAllList", "p", "encapsulateModule", "v", "isDev", "StatusCodes", "_", "rangeParser", "Readable", "isAnyArrayBuffer", "isUint16Array", "isUint32Array", "isUint8Array", "isBuffer", "data", "isRange", "range", "sendResponseParser", "res", "reqHeaders", "requestId", "sendMessage", "lengthHeaderKey", "k", "typeHeaderKey", "contentLength", "_", "contentType", "rangeParser", "StatusCodes", "entry", "key", "cookieData", "cookie", "isBuffer", "data", "Readable", "reader", "start", "end", "readed", "resolve", "reject", "c", "chunk", "offset", "length", "err", "body", "tunnel", "data", "config", "basePath", "endCallback", "context", "staticFolder", "getFolderPath", "globPatterns", "staticFile", "globFind", "mimeType", "lookup", "sendResponse", "StatusCodes", "createReadStream", "identities", "getIdentities", "method", "basePathCompiled", "normalizePath", "join", "defaultPaths", "route", "i", "routeModule", "encapsulateModule", "pathToFileURL", "r", "paramExtract", "pathname", "paramKeys", "paramValues", "_", "unescape", "middlewares", "getMiddlewares", "response", "callRecursiveMiddlewares", "error", "resData", "reqHeaders", "sendResponseParser", "ev", "state", "identitiesPaths", "globFindAll", "p", "m", "a", "b", "sortCompiledRoutes", "pathnames", "l", "validMiddlewarePaths", "pn", "aSlipt", "bSlipt", "requestHandler", "middleware", "timeoutId", "parentPort", "config", "basePath", "data", "requestId", "tunnel", "state"]
}