🚀. Socket Launch Week Day 2:Introducing Manifest Alerts.Learn more
Sign In

@threew/app

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@threew/app - npm Package Compare versions

Comparing version
1.0.4
to
1.0.5
+135
-92
dist/cjs/index.cjs

@@ -678,2 +678,26 @@ "use strict";

".json": "application/json",
".map": "application/json",
".xml": "application/xml",
".txt": "text/plain",
".md": "text/markdown",
".pdf": "application/pdf",
".doc": "application/msword",
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
".xls": "application/vnd.ms-excel",
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
".ppt": "application/vnd.ms-powerpoint",
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
".zip": "application/zip",
".rar": "application/x-rar-compressed",
".7z": "application/x-7z-compressed",
".tar": "application/x-tar",
".gz": "application/gzip",
".mp3": "audio/mpeg",
".wav": "audio/wav",
".ogg": "audio/ogg",
".m4a": "audio/mp4",
".mp4": "video/mp4",
".webm": "video/webm",
".avi": "video/x-msvideo",
".mov": "video/quicktime",
".png": "image/png",

@@ -685,14 +709,26 @@ ".jpg": "image/jpeg",

".ico": "image/x-icon",
".txt": "text/plain",
".xml": "application/xml",
".pdf": "application/pdf",
".zip": "application/zip",
".mp3": "audio/mpeg",
".mp4": "video/mp4",
".webp": "image/webp",
".bmp": "image/bmp",
".tiff": "image/tiff",
".woff": "font/woff",
".woff2": "font/woff2",
".ttf": "font/ttf",
".eot": "application/vnd.ms-fontobject"
".otf": "font/otf",
".eot": "application/vnd.ms-fontobject",
".wasm": "application/wasm",
".manifest": "text/cache-manifest",
".webmanifest": "application/manifest+json"
};
function setCacheHeaders(res, maxAge, immutable) {
let value;
if (maxAge === 0) {
value = "no-cache, must-revalidate";
} else {
value = `public, max-age=${maxAge}`;
if (immutable) {
value += ", immutable";
}
}
res.setHeader("Cache-Control", value);
}
function staticFiles(root, options = {}) {

@@ -714,4 +750,15 @@ const {

const { req, res } = ctx;
const url = req.url || "/";
let filePath = path.join(rootPath, url);
let url = req.url || "/";
url = url.split("?")[0] || "/";
if (dotfiles !== "allow") {
const basename2 = path.basename(url);
if (basename2.startsWith(".")) {
if (!fallthrough) {
res.status(404).json({ error: "Not Found" });
return;
}
return next();
}
}
let filePath = path.resolve(rootPath, `.${url}`);
if (!filePath.startsWith(rootPath)) {

@@ -724,33 +771,70 @@ if (!fallthrough) {

}
try {
const stat = await import_node_fs.promises.stat(filePath);
if (stat.isDirectory()) {
if (index !== false) {
filePath = path.join(filePath, index);
try {
const indexStat = await import_node_fs.promises.stat(filePath);
await serveFile(filePath, indexStat, ctx, options);
const serveFile = async (targetPath, stat) => {
const ext = path.extname(targetPath).toLowerCase();
const contentType = MIME_TYPES[ext] ?? "application/octet-stream";
res.setHeader("Content-Type", contentType);
res.setHeader("Content-Length", String(stat.size));
if (lastModified) {
res.setHeader(
"Last-Modified",
stat.mtime.toUTCString()
);
}
if (etag) {
const etagValue = generateEtag(stat);
res.setHeader("ETag", etagValue);
const ifNoneMatch = req.headers["if-none-match"];
if (typeof ifNoneMatch === "string" && ifNoneMatch === etagValue) {
res.status(304);
res.raw.end();
return;
}
}
if (cacheControl) {
setCacheHeaders(res, maxAge, immutable);
}
if (lastModified) {
const ifModifiedSince = req.headers["if-modified-since"];
if (typeof ifModifiedSince === "string") {
const modifiedDate = new Date(ifModifiedSince);
if (!Number.isNaN(modifiedDate.getTime()) && stat.mtime <= modifiedDate) {
res.status(304);
res.raw.end();
return;
} catch {
}
}
if (!fallthrough) {
res.status(404).json({ error: "Not Found" });
return;
}
if (setHeaders) {
setHeaders(res, targetPath, stat);
}
const stream = fs.createReadStream(targetPath);
stream.pipe(res.raw);
stream.on("error", () => {
if (!res.raw.headersSent) {
res.status(500);
res.raw.end();
}
return next();
});
res.raw.on("finish", () => {
stream.destroy();
});
};
try {
let stat = await import_node_fs.promises.stat(filePath);
if (stat.isDirectory()) {
const indexPath = path.join(filePath, index);
stat = await import_node_fs.promises.stat(indexPath);
filePath = indexPath;
}
await serveFile(filePath, stat, ctx, options);
await serveFile(filePath, stat);
return;
} catch (err) {
if (err.code === "ENOENT") {
if (extensions.length > 0) {
for (const ext of extensions) {
const extPath = filePath + ext;
try {
const extStat = await import_node_fs.promises.stat(extPath);
await serveFile(extPath, extStat, ctx, options);
return;
} catch {
continue;
}
if (err?.code === "ENOENT") {
for (const extension of extensions) {
const extPath = `${filePath}${extension}`;
try {
const stat = await import_node_fs.promises.stat(extPath);
await serveFile(extPath, stat);
return;
} catch {
}

@@ -772,56 +856,2 @@ }

}
async function serveFile(filePath, stat, ctx, options) {
const { req, res } = ctx;
const {
etag = true,
maxAge = 0,
cacheControl = true,
lastModified = true,
immutable = false,
setHeaders
} = options;
const ext = path.extname(filePath).toLowerCase();
const contentType = MIME_TYPES[ext] || "application/octet-stream";
res.setHeader("Content-Type", contentType);
res.setHeader("Content-Length", stat.size);
if (lastModified) {
res.setHeader("Last-Modified", stat.mtime.toUTCString());
}
if (etag) {
const etagValue = generateEtag(stat);
res.setHeader("ETag", etagValue);
const ifNoneMatch = req.headers["if-none-match"];
if (ifNoneMatch === etagValue) {
res.status(304);
res.raw.end();
return;
}
}
if (cacheControl) {
const cacheControlValue = immutable ? `public, max-age=${maxAge}, immutable` : `public, max-age=${maxAge}`;
res.setHeader("Cache-Control", cacheControlValue);
}
if (lastModified) {
const ifModifiedSince = req.headers["if-modified-since"];
if (ifModifiedSince) {
const ifModifiedSinceDate = new Date(ifModifiedSince);
if (stat.mtime <= ifModifiedSinceDate) {
res.status(304);
res.raw.end();
return;
}
}
}
if (setHeaders) {
setHeaders(res, filePath, stat);
}
const stream = fs.createReadStream(filePath);
stream.pipe(res.raw);
stream.on("error", () => {
if (!res.raw.headersSent) {
res.status(500);
res.raw.end();
}
});
}
function generateEtag(stat) {

@@ -833,9 +863,22 @@ const mtime = stat.mtime.getTime().toString(16);

function sendFile(filePath) {
return async (ctx, next) => {
return async (ctx) => {
try {
const resolvedPath = path.resolve(filePath);
const stat = await import_node_fs.promises.stat(resolvedPath);
await serveFile(resolvedPath, stat, ctx, {});
} catch (err) {
ctx.res.status(404).json({ error: "File not found" });
const ext = path.extname(resolvedPath).toLowerCase();
const contentType = MIME_TYPES[ext] ?? "application/octet-stream";
ctx.res.setHeader("Content-Type", contentType);
ctx.res.setHeader("Content-Length", String(stat.size));
const stream = fs.createReadStream(resolvedPath);
stream.pipe(ctx.res.raw);
stream.on("error", () => {
if (!ctx.res.raw.headersSent) {
ctx.res.status(500);
ctx.res.raw.end();
}
});
} catch {
ctx.res.status(404).json({
error: "File not found"
});
}

@@ -842,0 +885,0 @@ };

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/core/Server.ts","../src/utils/parseQuery.ts","../src/core/Request.ts","../src/http/status.ts","../src/core/Response.ts","../src/core/Context.ts","../src/core/RouteMatcher.ts","../src/core/MiddlewareRunner.ts","../src/core/BodyParser.ts","../src/http/methods.ts","../src/utils/normalize.ts","../src/core/Router.ts","../src/app/App.ts","../src/app/createApp.ts","../src/middleware/Logger.ts","../src/middleware/RateLimit.ts","../src/middleware/Static.ts","../src/utils/isObject.ts","../src/utils/merge.ts","../src/utils/parseParams.ts"],"sourcesContent":["export * from './app';\nexport * from './core';\nexport * from './middleware';\nexport * from './http';\nexport * from './utils';\nexport * from './types';\n","import { createServer, IncomingMessage, ServerResponse, Server as NodeServer } from 'node:http';\nimport { Request } from './Request';\nimport { Response } from './Response';\nimport { Context } from './Context';\nimport { Router } from './Router';\nimport { RouteMatcher } from './RouteMatcher';\nimport { MiddlewareRunner } from './MiddlewareRunner';\nimport { BodyParser } from './BodyParser';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n}\n\nexport class Server {\n private nodeServer: NodeServer;\n\n constructor(private router: Router) {\n this.nodeServer = createServer(this.handleRequest.bind(this));\n }\n\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const request = new Request(req);\n const response = new Response(res);\n const context = new Context(request, response);\n\n try {\n await BodyParser.parse(request);\n\n const routes = this.router.getRoutes();\n let matchedRoute = null;\n\n for (const route of routes) {\n if (route.method === request.method) {\n const match = RouteMatcher.match(route.path, request.path);\n if (match.matches) {\n request.params = match.params;\n matchedRoute = route;\n break;\n }\n }\n }\n\n if (matchedRoute) {\n await MiddlewareRunner.run(context, matchedRoute.middlewares, matchedRoute.handler);\n } else {\n response.notFound('Route Not Found');\n }\n } catch (error) {\n console.error(error);\n response.internalError('Internal Server Error');\n }\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const port = typeof optionsOrPort === 'number' ? optionsOrPort : optionsOrPort.port || 3000;\n const host = typeof optionsOrPort === 'object' ? optionsOrPort.host || '0.0.0.0' : '0.0.0.0';\n\n return this.nodeServer.listen(port, host, callback);\n }\n\n public close(callback?: (err?: Error) => void): this {\n this.nodeServer.close(callback);\n return this;\n }\n}\n","export function parseQuery(url: string): Record<string, string | string[]> {\n const query: Record<string, string | string[]> = {};\n const queryString = url.split('?')[1];\n \n if (!queryString) return query;\n\n const pairs = queryString.split('&');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (!key) continue;\n \n const decodedKey = decodeURIComponent(key);\n const decodedValue = value ? decodeURIComponent(value) : '';\n\n const existing = query[decodedKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n query[decodedKey] = [existing, decodedValue];\n }\n } else {\n query[decodedKey] = decodedValue;\n }\n }\n\n return query;\n}\n","import { IncomingMessage } from 'node:http';\nimport { parseQuery } from '../utils/parseQuery';\n\nexport class Request {\n public params: Record<string, string> = {};\n public query: Record<string, string | string[]> = {};\n public body: any = null;\n public headers: IncomingMessage['headers'];\n public ip: string | undefined;\n public method: string;\n public path: string;\n public url: string;\n public originalUrl: string;\n\n constructor(private rawRequest: IncomingMessage) {\n this.headers = rawRequest.headers;\n this.method = rawRequest.method || 'GET';\n this.url = rawRequest.url || '/';\n this.originalUrl = rawRequest.url || '/';\n this.path = this.url.split('?')[0] || '/';\n this.query = parseQuery(this.url);\n this.ip = rawRequest.socket.remoteAddress;\n }\n\n get raw(): IncomingMessage {\n return this.rawRequest;\n }\n}\n","export enum HttpStatus {\n CONTINUE = 100,\n SWITCHING_PROTOCOLS = 101,\n PROCESSING = 102,\n EARLY_HINTS = 103,\n OK = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NON_AUTHORITATIVE_INFORMATION = 203,\n NO_CONTENT = 204,\n RESET_CONTENT = 205,\n PARTIAL_CONTENT = 206,\n MULTI_STATUS = 207,\n ALREADY_REPORTED = 208,\n IM_USED = 226,\n MULTIPLE_CHOICES = 300,\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n SEE_OTHER = 303,\n NOT_MODIFIED = 304,\n USE_PROXY = 305,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n PROXY_AUTHENTICATION_REQUIRED = 407,\n REQUEST_TIMEOUT = 408,\n CONFLICT = 409,\n GONE = 410,\n LENGTH_REQUIRED = 411,\n PRECONDITION_FAILED = 412,\n PAYLOAD_TOO_LARGE = 413,\n URI_TOO_LONG = 414,\n UNSUPPORTED_MEDIA_TYPE = 415,\n RANGE_NOT_SATISFIABLE = 416,\n EXPECTATION_FAILED = 417,\n IM_A_TEAPOT = 418,\n MISDIRECTED_REQUEST = 421,\n UNPROCESSABLE_ENTITY = 422,\n LOCKED = 423,\n FAILED_DEPENDENCY = 424,\n TOO_EARLY = 425,\n UPGRADE_REQUIRED = 426,\n PRECONDITION_REQUIRED = 428,\n TOO_MANY_REQUESTS = 429,\n REQUEST_HEADER_FIELDS_TOO_LARGE = 431,\n UNAVAILABLE_FOR_LEGAL_REASONS = 451,\n INTERNAL_SERVER_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n HTTP_VERSION_NOT_SUPPORTED = 505,\n VARIANT_ALSO_NEGOTIATES = 506,\n INSUFFICIENT_STORAGE = 507,\n LOOP_DETECTED = 508,\n BANDWIDTH_LIMIT_EXCEEDED = 509,\n NOT_EXTENDED = 510,\n NETWORK_AUTHENTICATION_REQUIRED = 511,\n}\n","import { ServerResponse } from 'node:http';\nimport { HttpStatus } from '../http/status';\n\nexport class Response {\n constructor(private rawResponse: ServerResponse) {}\n\n public status(code: number): this {\n this.rawResponse.statusCode = code;\n return this;\n }\n\n public setHeader(name: string, value: string | string[]): this {\n this.rawResponse.setHeader(name, value);\n return this;\n }\n\n public send(data: any): void {\n if (typeof data === 'string') {\n this.rawResponse.setHeader('Content-Type', 'text/plain');\n this.rawResponse.end(data);\n } else if (Buffer.isBuffer(data)) {\n this.rawResponse.end(data);\n } else {\n this.json(data);\n }\n }\n\n public json(data: any): void {\n const body = JSON.stringify(data);\n this.rawResponse.setHeader('Content-Type', 'application/json');\n this.rawResponse.end(body);\n }\n\n public success(data: any): void {\n this.status(HttpStatus.OK).json({\n success: true,\n data,\n });\n }\n\n public created(data: any): void {\n this.status(HttpStatus.CREATED).json({\n success: true,\n data,\n });\n }\n\n public error(message: string, code: number = HttpStatus.INTERNAL_SERVER_ERROR): void {\n this.status(code).json({\n success: false,\n message,\n });\n }\n\n public badRequest(message: string = 'Bad Request'): void {\n this.error(message, HttpStatus.BAD_REQUEST);\n }\n\n public unauthorized(message: string = 'Unauthorized'): void {\n this.error(message, HttpStatus.UNAUTHORIZED);\n }\n\n public forbidden(message: string = 'Forbidden'): void {\n this.error(message, HttpStatus.FORBIDDEN);\n }\n\n public notFound(message: string = 'Not Found'): void {\n this.error(message, HttpStatus.NOT_FOUND);\n }\n\n public conflict(message: string = 'Conflict'): void {\n this.error(message, HttpStatus.CONFLICT);\n }\n\n public internalError(message: string = 'Internal Server Error'): void {\n this.error(message, HttpStatus.INTERNAL_SERVER_ERROR);\n }\n\n get raw(): ServerResponse {\n return this.rawResponse;\n }\n}\n","import { Request } from './Request';\nimport { Response } from './Response';\n\nexport class Context {\n constructor(\n public readonly req: Request,\n public readonly res: Response\n ) {}\n}\n","export interface MatchResult {\n matches: boolean;\n params: Record<string, string>;\n}\n\nexport class RouteMatcher {\n public static match(pattern: string, path: string): MatchResult {\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return { matches: false, params: {} };\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i]!;\n const pathPart = pathParts[i]!;\n\n if (patternPart.startsWith(':')) {\n const paramName = patternPart.slice(1);\n params[paramName] = pathPart;\n } else if (patternPart !== pathPart) {\n return { matches: false, params: {} };\n }\n }\n\n return { matches: true, params };\n }\n}\n","import { Context } from './Context';\n\nexport type NextFunction = (err?: any) => void | Promise<void>;\nexport type Middleware = (ctx: Context, next: NextFunction) => void | Promise<void>;\n\nexport class MiddlewareRunner {\n public static async run(\n ctx: Context,\n middlewares: Middleware[],\n handler: Middleware\n ): Promise<void> {\n const allMiddlewares = [...middlewares, handler];\n let index = 0;\n\n const next: NextFunction = async (err?: any) => {\n if (err) {\n throw err;\n }\n\n if (index < allMiddlewares.length) {\n const middleware = allMiddlewares[index++];\n if (middleware) {\n await middleware(ctx, next);\n }\n }\n };\n\n await next();\n }\n}\n","import { Request } from './Request';\n\nexport class BodyParser {\n public static async parse(req: Request): Promise<void> {\n const contentType = req.headers['content-type'] || '';\n \n return new Promise((resolve, reject) => {\n let data = '';\n req.raw.on('data', (chunk) => {\n data += chunk;\n });\n\n req.raw.on('end', () => {\n try {\n if (contentType.includes('application/json')) {\n req.body = data ? JSON.parse(data) : {};\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const params = new URLSearchParams(data);\n const body: Record<string, string> = {};\n params.forEach((value, key) => {\n body[key] = value;\n });\n req.body = body;\n } else if (contentType.includes('text/plain')) {\n req.body = data;\n } else {\n req.body = data;\n }\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n\n req.raw.on('error', (err) => {\n reject(err);\n });\n });\n }\n}\n","export enum HttpMethod {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n PATCH = 'PATCH',\n DELETE = 'DELETE',\n OPTIONS = 'OPTIONS',\n HEAD = 'HEAD',\n}\n\nexport type HttpMethodType = keyof typeof HttpMethod | Lowercase<keyof typeof HttpMethod>;\n","export function normalizePath(path: string): string {\n if (path === '/') return path;\n return path.replace(/\\/+/g, '/').replace(/\\/+$/, '') || '/';\n}\n","import { Middleware } from './MiddlewareRunner';\nimport { HttpMethod } from '../http/methods';\nimport { normalizePath } from '../utils/normalize';\n\nexport interface Route {\n method: string;\n path: string;\n handler: Middleware;\n middlewares: Middleware[];\n}\n\nexport class Router {\n private routes: Route[] = [];\n private prefix: string = '';\n private middlewares: Middleware[] = [];\n\n constructor(prefix: string = '', middlewares: Middleware[] = []) {\n this.prefix = normalizePath(prefix);\n this.middlewares = middlewares;\n }\n\n public use(...middlewares: Middleware[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n private addRoute(method: string, path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n const fullPath = normalizePath(this.prefix + normalizePath(path));\n this.routes.push({\n method,\n path: fullPath,\n handler,\n middlewares: [...this.middlewares, ...middlewares],\n });\n return this;\n }\n\n public get(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.GET, path, handler, ...middlewares);\n }\n\n public post(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.POST, path, handler, ...middlewares);\n }\n\n public put(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PUT, path, handler, ...middlewares);\n }\n\n public patch(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PATCH, path, handler, ...middlewares);\n }\n\n public delete(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.DELETE, path, handler, ...middlewares);\n }\n\n public options(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.OPTIONS, path, handler, ...middlewares);\n }\n\n public head(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.HEAD, path, handler, ...middlewares);\n }\n\n public group(prefix: string, callback: (router: Router) => void, ...middlewares: Middleware[]): this {\n const subRouter = new Router(this.prefix + normalizePath(prefix), [...this.middlewares, ...middlewares]);\n callback(subRouter);\n this.routes.push(...subRouter.getRoutes());\n return this;\n }\n\n public getRoutes(): Route[] {\n return this.routes;\n }\n}\n","import { Server, ServerOptions } from '../core/Server';\nimport { Router } from '../core/Router';\nimport { Server as NodeServer } from 'node:http';\nimport { networkInterfaces } from 'node:os';\n\nexport class App extends Router {\n private server: Server;\n\n constructor() {\n super();\n this.server = new Server(this);\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const options = typeof optionsOrPort === 'number' \n ? { port: optionsOrPort } \n : optionsOrPort;\n \n const port = options.port || 3000;\n const host = options.host || 'localhost';\n \n const server = this.server.listen(optionsOrPort, () => {\n this.printServerInfo(port, host);\n if (callback) callback();\n });\n \n return server;\n }\n\n private printServerInfo(port: number, host: string): void {\n const green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\n const cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\n const blue = (text: string) => `\\x1b[34m${text}\\x1b[0m`;\n const bold = (text: string) => `\\x1b[1m${text}\\x1b[0m`;\n const dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\n const underline = (text: string) => `\\x1b[4m${text}\\x1b[0m`;\n \n console.log();\n \n const localUrl = `http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;\n console.log(`${green('✓')} ${bold('Server started successfully!')}`);\n console.log();\n console.log(` ${bold('➜')} ${cyan('Local:')} ${underline(blue(localUrl))}`);\n \n const networks = this.getNetworkAddresses();\n if (networks.length > 0) {\n networks.forEach(network => {\n const networkUrl = `http://${network.address}:${port}`;\n console.log(` ${bold('➜')} ${cyan(`${network.name}:`)} ${underline(blue(networkUrl))}`);\n });\n }\n \n console.log();\n console.log(` ${dim('Press Ctrl+C to stop the server')}`);\n console.log();\n }\n\n private getNetworkAddresses(): Array<{ name: string; address: string }> {\n const interfaces = networkInterfaces();\n const addresses: Array<{ name: string; address: string }> = [];\n \n for (const [name, netInterface] of Object.entries(interfaces)) {\n if (!netInterface) continue;\n \n for (const net of netInterface) {\n if (!net.internal && net.family === 'IPv4') {\n addresses.push({\n name: this.getNetworkName(name),\n address: net.address\n });\n }\n }\n }\n \n return addresses;\n }\n\n private getNetworkName(interfaceName: string): string {\n const nameMap: Record<string, string> = {\n 'en0': 'WiFi',\n 'en1': 'Ethernet',\n 'eth0': 'Ethernet',\n 'wlan0': 'WiFi',\n 'enp0s3': 'Network',\n 'ens33': 'Network'\n };\n \n return nameMap[interfaceName] || interfaceName;\n }\n\n public close(callback?: (err?: Error) => void): this {\n console.log('\\x1b[33m\\n Shutting down server...\\x1b[0m');\n this.server.close((err) => {\n if (err) {\n console.error('\\x1b[31m Error during shutdown:\\x1b[0m', err);\n } else {\n console.log('\\x1b[32m Server stopped successfully\\n\\x1b[0m');\n }\n if (callback) callback(err);\n });\n return this;\n }\n}","import { App } from './App';\n\nexport function createApp(): App {\n return new App();\n}\n","import { Middleware } from '../core/MiddlewareRunner';\n\ninterface LoggerOptions {\n silent?: boolean;\n showTimestamp?: boolean;\n showQuery?: boolean;\n excludePaths?: (string | RegExp)[];\n logLevel?: 'info' | 'debug' | 'error' | 'none';\n}\n\nexport function logger(options: LoggerOptions = {}): Middleware {\n const {\n silent = false,\n showTimestamp = true,\n showQuery = false,\n excludePaths = [],\n logLevel = 'info',\n } = options;\n\n return async (ctx, next) => {\n if (silent || logLevel === 'none') return next();\n\n const start = Date.now();\n const { req, res } = ctx;\n const url = req.url || '/';\n \n // Check exclude paths\n for (const pattern of excludePaths) {\n if (pattern instanceof RegExp && pattern.test(url)) return next();\n if (typeof pattern === 'string' && (url === pattern || url.startsWith(pattern))) return next();\n }\n \n // Parse query if needed\n let queryString = '';\n if (showQuery && req.url) {\n const queryIndex = req.url.indexOf('?');\n if (queryIndex !== -1) queryString = req.url.substring(queryIndex);\n }\n \n let statusCode = 200;\n try {\n await next();\n statusCode = res.raw?.statusCode || 200;\n } catch (err) {\n statusCode = 500;\n throw err;\n }\n \n const ms = Date.now() - start;\n const method = req.method || 'GET';\n \n // Filter by log level\n if (logLevel === 'error' && statusCode < 400) return;\n if (logLevel === 'debug' && statusCode < 300) return;\n \n // Format output\n const parts: string[] = [];\n const dim = '\\x1b[2m';\n const reset = '\\x1b[0m';\n \n if (showTimestamp) {\n parts.push(`${dim}[${new Date().toLocaleTimeString()}]${reset}`);\n }\n \n // Method color\n const methodColors: Record<string, string> = {\n GET: '\\x1b[34m', POST: '\\x1b[32m', PUT: '\\x1b[33m',\n DELETE: '\\x1b[31m', PATCH: '\\x1b[35m'\n };\n const methodColor = methodColors[method] || '\\x1b[37m';\n parts.push(`${methodColor}${method.padEnd(6)}${reset}`);\n \n // URL with query\n parts.push(`${url.split('?')[0]}${dim}${queryString}${reset}`);\n \n // Status color\n let statusColor = '\\x1b[32m';\n if (statusCode >= 400) statusColor = '\\x1b[33m';\n if (statusCode >= 500) statusColor = '\\x1b[31m';\n parts.push(`${statusColor}${statusCode}${reset}`);\n \n // Duration\n const durationColor = ms > 1000 ? '\\x1b[33m' : dim;\n parts.push(`${durationColor}${ms}ms${reset}`);\n \n console.log(parts.join(' '));\n };\n}\n\n// Development logger\nexport function devLogger(): Middleware {\n return logger({ showTimestamp: true, logLevel: 'debug' });\n}\n\n// Production logger (JSON format)\nexport function prodLogger(): Middleware {\n return async (ctx, next) => {\n const start = Date.now();\n const { req, res } = ctx;\n \n await next();\n \n const ms = Date.now() - start;\n console.log(JSON.stringify({\n timestamp: new Date().toISOString(),\n method: req.method,\n url: req.url,\n status: res.raw?.statusCode || 200,\n duration: ms,\n }));\n };\n}\n\n// Only log errors\nexport function errorLogger(): Middleware {\n return logger({ logLevel: 'error', showTimestamp: true });\n}\n\n// Detailed logging\nexport function detailedLogger(): Middleware {\n return logger({ \n showTimestamp: true, \n showQuery: true, \n logLevel: 'debug',\n excludePaths: ['/health', '/ping']\n });\n}","import { Middleware } from '../core/MiddlewareRunner';\nimport { HttpStatus } from '../http/status';\n\nexport interface RateLimitOptions {\n windowMs: number;\n max: number;\n message?: string;\n}\n\nexport function rateLimit(options: RateLimitOptions): Middleware {\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (ctx, next) => {\n const ip = ctx.req.ip || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, {\n count: 1,\n resetTime: now + options.windowMs,\n });\n return next();\n }\n\n record.count++;\n if (record.count > options.max) {\n ctx.res.status(HttpStatus.TOO_MANY_REQUESTS).json({\n success: false,\n message: options.message || 'Too many requests',\n });\n return;\n }\n\n return next();\n };\n}\n","import { Middleware } from '../core/MiddlewareRunner';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promises as fsPromises } from 'node:fs';\n\ninterface StaticOptions {\n dotfiles?: 'allow' | 'deny' | 'ignore';\n etag?: boolean;\n extensions?: string[];\n index?: string | false;\n maxAge?: number;\n cacheControl?: boolean;\n lastModified?: boolean;\n immutable?: boolean;\n fallthrough?: boolean;\n setHeaders?: (res: any, path: string, stat: fs.Stats) => void;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.mjs': 'application/javascript',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.txt': 'text/plain',\n '.xml': 'application/xml',\n '.pdf': 'application/pdf',\n '.zip': 'application/zip',\n '.mp3': 'audio/mpeg',\n '.mp4': 'video/mp4',\n '.webp': 'image/webp',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.eot': 'application/vnd.ms-fontobject',\n};\n\nexport function staticFiles(root: string, options: StaticOptions = {}): Middleware {\n const {\n dotfiles = 'ignore',\n etag = true,\n extensions = [],\n index = 'index.html',\n maxAge = 0,\n cacheControl = true,\n lastModified = true,\n immutable = false,\n fallthrough = true,\n setHeaders,\n } = options;\n\n const rootPath = path.resolve(root);\n\n return async (ctx, next) => {\n const { req, res } = ctx;\n const url = req.url || '/';\n \n let filePath = path.join(rootPath, url);\n \n if (!filePath.startsWith(rootPath)) {\n if (!fallthrough) {\n res.status(403).json({ error: 'Forbidden' });\n return;\n }\n return next();\n }\n\n try {\n const stat = await fsPromises.stat(filePath);\n \n if (stat.isDirectory()) {\n if (index !== false) {\n filePath = path.join(filePath, index as string);\n try {\n const indexStat = await fsPromises.stat(filePath);\n await serveFile(filePath, indexStat, ctx, options);\n return;\n } catch {\n // Index file not found\n }\n }\n \n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n return next();\n }\n \n await serveFile(filePath, stat, ctx, options);\n \n } catch (err: any) {\n if (err.code === 'ENOENT') {\n if (extensions.length > 0) {\n for (const ext of extensions) {\n const extPath = filePath + ext;\n try {\n const extStat = await fsPromises.stat(extPath);\n await serveFile(extPath, extStat, ctx, options);\n return;\n } catch {\n continue;\n }\n }\n }\n \n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n return next();\n }\n \n if (!fallthrough) {\n res.status(500).json({ error: 'Internal Server Error' });\n return;\n }\n return next();\n }\n };\n}\n\nasync function serveFile(\n filePath: string,\n stat: fs.Stats,\n ctx: any,\n options: StaticOptions\n): Promise<void> {\n const { req, res } = ctx;\n const {\n etag = true,\n maxAge = 0,\n cacheControl = true,\n lastModified = true,\n immutable = false,\n setHeaders,\n } = options;\n\n const ext = path.extname(filePath).toLowerCase();\n const contentType = MIME_TYPES[ext] || 'application/octet-stream';\n \n res.setHeader('Content-Type', contentType);\n res.setHeader('Content-Length', stat.size);\n \n if (lastModified) {\n res.setHeader('Last-Modified', stat.mtime.toUTCString());\n }\n \n if (etag) {\n const etagValue = generateEtag(stat);\n res.setHeader('ETag', etagValue);\n \n const ifNoneMatch = req.headers['if-none-match'];\n if (ifNoneMatch === etagValue) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n \n if (cacheControl) {\n const cacheControlValue = immutable \n ? `public, max-age=${maxAge}, immutable`\n : `public, max-age=${maxAge}`;\n res.setHeader('Cache-Control', cacheControlValue);\n }\n \n if (lastModified) {\n const ifModifiedSince = req.headers['if-modified-since'];\n if (ifModifiedSince) {\n const ifModifiedSinceDate = new Date(ifModifiedSince);\n if (stat.mtime <= ifModifiedSinceDate) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n }\n \n if (setHeaders) {\n setHeaders(res, filePath, stat);\n }\n \n const stream = fs.createReadStream(filePath);\n stream.pipe(res.raw);\n \n stream.on('error', () => {\n if (!res.raw.headersSent) {\n res.status(500);\n res.raw.end();\n }\n });\n}\n\nfunction generateEtag(stat: fs.Stats): string {\n const mtime = stat.mtime.getTime().toString(16);\n const size = stat.size.toString(16);\n return `\"${size}-${mtime}\"`;\n}\n\nexport function sendFile(filePath: string): Middleware {\n return async (ctx, next) => {\n try {\n const resolvedPath = path.resolve(filePath);\n const stat = await fsPromises.stat(resolvedPath);\n await serveFile(resolvedPath, stat, ctx, {});\n } catch (err) {\n ctx.res.status(404).json({ error: 'File not found' });\n }\n };\n}","export function isObject(item: unknown): item is Record<string, unknown> {\n return (item !== null && typeof item === 'object' && !Array.isArray(item));\n}\n","import { isObject } from './isObject';\n\nexport function mergeDeep<T extends Record<string, any>>(target: T, ...sources: T[]): T {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n mergeDeep(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return mergeDeep(target, ...sources);\n}\n","export function parseParams(pattern: string, path: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n patternParts.forEach((part, i) => {\n if (part.startsWith(':')) {\n const paramName = part.slice(1);\n params[paramName] = pathParts[i] || '';\n }\n });\n\n return params;\n}\n"],"mappings":"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","names":["HttpStatus","path","resolve","HttpMethod","path","path","fsPromises","path"]}
{"version":3,"sources":["../src/index.ts","../src/core/Server.ts","../src/utils/parseQuery.ts","../src/core/Request.ts","../src/http/status.ts","../src/core/Response.ts","../src/core/Context.ts","../src/core/RouteMatcher.ts","../src/core/MiddlewareRunner.ts","../src/core/BodyParser.ts","../src/http/methods.ts","../src/utils/normalize.ts","../src/core/Router.ts","../src/app/App.ts","../src/app/createApp.ts","../src/middleware/Logger.ts","../src/middleware/RateLimit.ts","../src/middleware/Static.ts","../src/utils/isObject.ts","../src/utils/merge.ts","../src/utils/parseParams.ts"],"sourcesContent":["export * from './app';\nexport * from './core';\nexport * from './middleware';\nexport * from './http';\nexport * from './utils';\nexport * from './types';\n","import { createServer, IncomingMessage, ServerResponse, Server as NodeServer } from 'node:http';\nimport { Request } from './Request';\nimport { Response } from './Response';\nimport { Context } from './Context';\nimport { Router } from './Router';\nimport { RouteMatcher } from './RouteMatcher';\nimport { MiddlewareRunner } from './MiddlewareRunner';\nimport { BodyParser } from './BodyParser';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n}\n\nexport class Server {\n private nodeServer: NodeServer;\n\n constructor(private router: Router) {\n this.nodeServer = createServer(this.handleRequest.bind(this));\n }\n\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const request = new Request(req);\n const response = new Response(res);\n const context = new Context(request, response);\n\n try {\n await BodyParser.parse(request);\n\n const routes = this.router.getRoutes();\n let matchedRoute = null;\n\n for (const route of routes) {\n if (route.method === request.method) {\n const match = RouteMatcher.match(route.path, request.path);\n if (match.matches) {\n request.params = match.params;\n matchedRoute = route;\n break;\n }\n }\n }\n\n if (matchedRoute) {\n await MiddlewareRunner.run(context, matchedRoute.middlewares, matchedRoute.handler);\n } else {\n response.notFound('Route Not Found');\n }\n } catch (error) {\n console.error(error);\n response.internalError('Internal Server Error');\n }\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const port = typeof optionsOrPort === 'number' ? optionsOrPort : optionsOrPort.port || 3000;\n const host = typeof optionsOrPort === 'object' ? optionsOrPort.host || '0.0.0.0' : '0.0.0.0';\n\n return this.nodeServer.listen(port, host, callback);\n }\n\n public close(callback?: (err?: Error) => void): this {\n this.nodeServer.close(callback);\n return this;\n }\n}\n","export function parseQuery(url: string): Record<string, string | string[]> {\n const query: Record<string, string | string[]> = {};\n const queryString = url.split('?')[1];\n \n if (!queryString) return query;\n\n const pairs = queryString.split('&');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (!key) continue;\n \n const decodedKey = decodeURIComponent(key);\n const decodedValue = value ? decodeURIComponent(value) : '';\n\n const existing = query[decodedKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n query[decodedKey] = [existing, decodedValue];\n }\n } else {\n query[decodedKey] = decodedValue;\n }\n }\n\n return query;\n}\n","import { IncomingMessage } from 'node:http';\nimport { parseQuery } from '../utils/parseQuery';\n\nexport class Request {\n public params: Record<string, string> = {};\n public query: Record<string, string | string[]> = {};\n public body: any = null;\n public headers: IncomingMessage['headers'];\n public ip: string | undefined;\n public method: string;\n public path: string;\n public url: string;\n public originalUrl: string;\n\n constructor(private rawRequest: IncomingMessage) {\n this.headers = rawRequest.headers;\n this.method = rawRequest.method || 'GET';\n this.url = rawRequest.url || '/';\n this.originalUrl = rawRequest.url || '/';\n this.path = this.url.split('?')[0] || '/';\n this.query = parseQuery(this.url);\n this.ip = rawRequest.socket.remoteAddress;\n }\n\n get raw(): IncomingMessage {\n return this.rawRequest;\n }\n}\n","export enum HttpStatus {\n CONTINUE = 100,\n SWITCHING_PROTOCOLS = 101,\n PROCESSING = 102,\n EARLY_HINTS = 103,\n OK = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NON_AUTHORITATIVE_INFORMATION = 203,\n NO_CONTENT = 204,\n RESET_CONTENT = 205,\n PARTIAL_CONTENT = 206,\n MULTI_STATUS = 207,\n ALREADY_REPORTED = 208,\n IM_USED = 226,\n MULTIPLE_CHOICES = 300,\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n SEE_OTHER = 303,\n NOT_MODIFIED = 304,\n USE_PROXY = 305,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n PROXY_AUTHENTICATION_REQUIRED = 407,\n REQUEST_TIMEOUT = 408,\n CONFLICT = 409,\n GONE = 410,\n LENGTH_REQUIRED = 411,\n PRECONDITION_FAILED = 412,\n PAYLOAD_TOO_LARGE = 413,\n URI_TOO_LONG = 414,\n UNSUPPORTED_MEDIA_TYPE = 415,\n RANGE_NOT_SATISFIABLE = 416,\n EXPECTATION_FAILED = 417,\n IM_A_TEAPOT = 418,\n MISDIRECTED_REQUEST = 421,\n UNPROCESSABLE_ENTITY = 422,\n LOCKED = 423,\n FAILED_DEPENDENCY = 424,\n TOO_EARLY = 425,\n UPGRADE_REQUIRED = 426,\n PRECONDITION_REQUIRED = 428,\n TOO_MANY_REQUESTS = 429,\n REQUEST_HEADER_FIELDS_TOO_LARGE = 431,\n UNAVAILABLE_FOR_LEGAL_REASONS = 451,\n INTERNAL_SERVER_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n HTTP_VERSION_NOT_SUPPORTED = 505,\n VARIANT_ALSO_NEGOTIATES = 506,\n INSUFFICIENT_STORAGE = 507,\n LOOP_DETECTED = 508,\n BANDWIDTH_LIMIT_EXCEEDED = 509,\n NOT_EXTENDED = 510,\n NETWORK_AUTHENTICATION_REQUIRED = 511,\n}\n","import { ServerResponse } from 'node:http';\nimport { HttpStatus } from '../http/status';\n\nexport class Response {\n constructor(private rawResponse: ServerResponse) {}\n\n public status(code: number): this {\n this.rawResponse.statusCode = code;\n return this;\n }\n\n public setHeader(name: string, value: string | string[]): this {\n this.rawResponse.setHeader(name, value);\n return this;\n }\n\n public send(data: any): void {\n if (typeof data === 'string') {\n this.rawResponse.setHeader('Content-Type', 'text/plain');\n this.rawResponse.end(data);\n } else if (Buffer.isBuffer(data)) {\n this.rawResponse.end(data);\n } else {\n this.json(data);\n }\n }\n\n public json(data: any): void {\n const body = JSON.stringify(data);\n this.rawResponse.setHeader('Content-Type', 'application/json');\n this.rawResponse.end(body);\n }\n\n public success(data: any): void {\n this.status(HttpStatus.OK).json({\n success: true,\n data,\n });\n }\n\n public created(data: any): void {\n this.status(HttpStatus.CREATED).json({\n success: true,\n data,\n });\n }\n\n public error(message: string, code: number = HttpStatus.INTERNAL_SERVER_ERROR): void {\n this.status(code).json({\n success: false,\n message,\n });\n }\n\n public badRequest(message: string = 'Bad Request'): void {\n this.error(message, HttpStatus.BAD_REQUEST);\n }\n\n public unauthorized(message: string = 'Unauthorized'): void {\n this.error(message, HttpStatus.UNAUTHORIZED);\n }\n\n public forbidden(message: string = 'Forbidden'): void {\n this.error(message, HttpStatus.FORBIDDEN);\n }\n\n public notFound(message: string = 'Not Found'): void {\n this.error(message, HttpStatus.NOT_FOUND);\n }\n\n public conflict(message: string = 'Conflict'): void {\n this.error(message, HttpStatus.CONFLICT);\n }\n\n public internalError(message: string = 'Internal Server Error'): void {\n this.error(message, HttpStatus.INTERNAL_SERVER_ERROR);\n }\n\n get raw(): ServerResponse {\n return this.rawResponse;\n }\n}\n","import { Request } from './Request';\nimport { Response } from './Response';\n\nexport class Context {\n constructor(\n public readonly req: Request,\n public readonly res: Response\n ) {}\n}\n","export interface MatchResult {\n matches: boolean;\n params: Record<string, string>;\n}\n\nexport class RouteMatcher {\n public static match(pattern: string, path: string): MatchResult {\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return { matches: false, params: {} };\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i]!;\n const pathPart = pathParts[i]!;\n\n if (patternPart.startsWith(':')) {\n const paramName = patternPart.slice(1);\n params[paramName] = pathPart;\n } else if (patternPart !== pathPart) {\n return { matches: false, params: {} };\n }\n }\n\n return { matches: true, params };\n }\n}\n","import { Context } from './Context';\n\nexport type NextFunction = (err?: any) => void | Promise<void>;\nexport type Middleware = (ctx: Context, next: NextFunction) => void | Promise<void>;\n\nexport class MiddlewareRunner {\n public static async run(\n ctx: Context,\n middlewares: Middleware[],\n handler: Middleware\n ): Promise<void> {\n const allMiddlewares = [...middlewares, handler];\n let index = 0;\n\n const next: NextFunction = async (err?: any) => {\n if (err) {\n throw err;\n }\n\n if (index < allMiddlewares.length) {\n const middleware = allMiddlewares[index++];\n if (middleware) {\n await middleware(ctx, next);\n }\n }\n };\n\n await next();\n }\n}\n","import { Request } from './Request';\n\nexport class BodyParser {\n public static async parse(req: Request): Promise<void> {\n const contentType = req.headers['content-type'] || '';\n \n return new Promise((resolve, reject) => {\n let data = '';\n req.raw.on('data', (chunk) => {\n data += chunk;\n });\n\n req.raw.on('end', () => {\n try {\n if (contentType.includes('application/json')) {\n req.body = data ? JSON.parse(data) : {};\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const params = new URLSearchParams(data);\n const body: Record<string, string> = {};\n params.forEach((value, key) => {\n body[key] = value;\n });\n req.body = body;\n } else if (contentType.includes('text/plain')) {\n req.body = data;\n } else {\n req.body = data;\n }\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n\n req.raw.on('error', (err) => {\n reject(err);\n });\n });\n }\n}\n","export enum HttpMethod {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n PATCH = 'PATCH',\n DELETE = 'DELETE',\n OPTIONS = 'OPTIONS',\n HEAD = 'HEAD',\n}\n\nexport type HttpMethodType = keyof typeof HttpMethod | Lowercase<keyof typeof HttpMethod>;\n","export function normalizePath(path: string): string {\n if (path === '/') return path;\n return path.replace(/\\/+/g, '/').replace(/\\/+$/, '') || '/';\n}\n","import { Middleware } from './MiddlewareRunner';\nimport { HttpMethod } from '../http/methods';\nimport { normalizePath } from '../utils/normalize';\n\nexport interface Route {\n method: string;\n path: string;\n handler: Middleware;\n middlewares: Middleware[];\n}\n\nexport class Router {\n private routes: Route[] = [];\n private prefix: string = '';\n private middlewares: Middleware[] = [];\n\n constructor(prefix: string = '', middlewares: Middleware[] = []) {\n this.prefix = normalizePath(prefix);\n this.middlewares = middlewares;\n }\n\n public use(...middlewares: Middleware[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n private addRoute(method: string, path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n const fullPath = normalizePath(this.prefix + normalizePath(path));\n this.routes.push({\n method,\n path: fullPath,\n handler,\n middlewares: [...this.middlewares, ...middlewares],\n });\n return this;\n }\n\n public get(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.GET, path, handler, ...middlewares);\n }\n\n public post(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.POST, path, handler, ...middlewares);\n }\n\n public put(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PUT, path, handler, ...middlewares);\n }\n\n public patch(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PATCH, path, handler, ...middlewares);\n }\n\n public delete(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.DELETE, path, handler, ...middlewares);\n }\n\n public options(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.OPTIONS, path, handler, ...middlewares);\n }\n\n public head(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.HEAD, path, handler, ...middlewares);\n }\n\n public group(prefix: string, callback: (router: Router) => void, ...middlewares: Middleware[]): this {\n const subRouter = new Router(this.prefix + normalizePath(prefix), [...this.middlewares, ...middlewares]);\n callback(subRouter);\n this.routes.push(...subRouter.getRoutes());\n return this;\n }\n\n public getRoutes(): Route[] {\n return this.routes;\n }\n}\n","import { Server, ServerOptions } from '../core/Server';\nimport { Router } from '../core/Router';\nimport { Server as NodeServer } from 'node:http';\nimport { networkInterfaces } from 'node:os';\n\nexport class App extends Router {\n private server: Server;\n\n constructor() {\n super();\n this.server = new Server(this);\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const options = typeof optionsOrPort === 'number' \n ? { port: optionsOrPort } \n : optionsOrPort;\n \n const port = options.port || 3000;\n const host = options.host || 'localhost';\n \n const server = this.server.listen(optionsOrPort, () => {\n this.printServerInfo(port, host);\n if (callback) callback();\n });\n \n return server;\n }\n\n private printServerInfo(port: number, host: string): void {\n const green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\n const cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\n const blue = (text: string) => `\\x1b[34m${text}\\x1b[0m`;\n const bold = (text: string) => `\\x1b[1m${text}\\x1b[0m`;\n const dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\n const underline = (text: string) => `\\x1b[4m${text}\\x1b[0m`;\n \n console.log();\n \n const localUrl = `http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;\n console.log(`${green('✓')} ${bold('Server started successfully!')}`);\n console.log();\n console.log(` ${bold('➜')} ${cyan('Local:')} ${underline(blue(localUrl))}`);\n \n const networks = this.getNetworkAddresses();\n if (networks.length > 0) {\n networks.forEach(network => {\n const networkUrl = `http://${network.address}:${port}`;\n console.log(` ${bold('➜')} ${cyan(`${network.name}:`)} ${underline(blue(networkUrl))}`);\n });\n }\n \n console.log();\n console.log(` ${dim('Press Ctrl+C to stop the server')}`);\n console.log();\n }\n\n private getNetworkAddresses(): Array<{ name: string; address: string }> {\n const interfaces = networkInterfaces();\n const addresses: Array<{ name: string; address: string }> = [];\n \n for (const [name, netInterface] of Object.entries(interfaces)) {\n if (!netInterface) continue;\n \n for (const net of netInterface) {\n if (!net.internal && net.family === 'IPv4') {\n addresses.push({\n name: this.getNetworkName(name),\n address: net.address\n });\n }\n }\n }\n \n return addresses;\n }\n\n private getNetworkName(interfaceName: string): string {\n const nameMap: Record<string, string> = {\n 'en0': 'WiFi',\n 'en1': 'Ethernet',\n 'eth0': 'Ethernet',\n 'wlan0': 'WiFi',\n 'enp0s3': 'Network',\n 'ens33': 'Network'\n };\n \n return nameMap[interfaceName] || interfaceName;\n }\n\n public close(callback?: (err?: Error) => void): this {\n console.log('\\x1b[33m\\n Shutting down server...\\x1b[0m');\n this.server.close((err) => {\n if (err) {\n console.error('\\x1b[31m Error during shutdown:\\x1b[0m', err);\n } else {\n console.log('\\x1b[32m Server stopped successfully\\n\\x1b[0m');\n }\n if (callback) callback(err);\n });\n return this;\n }\n}","import { App } from './App';\n\nexport function createApp(): App {\n return new App();\n}\n","import { Middleware } from '../core/MiddlewareRunner';\n\ninterface LoggerOptions {\n silent?: boolean;\n showTimestamp?: boolean;\n showQuery?: boolean;\n excludePaths?: (string | RegExp)[];\n logLevel?: 'info' | 'debug' | 'error' | 'none';\n}\n\nexport function logger(options: LoggerOptions = {}): Middleware {\n const {\n silent = false,\n showTimestamp = true,\n showQuery = false,\n excludePaths = [],\n logLevel = 'info',\n } = options;\n\n return async (ctx, next) => {\n if (silent || logLevel === 'none') return next();\n\n const start = Date.now();\n const { req, res } = ctx;\n const url = req.url || '/';\n \n // Check exclude paths\n for (const pattern of excludePaths) {\n if (pattern instanceof RegExp && pattern.test(url)) return next();\n if (typeof pattern === 'string' && (url === pattern || url.startsWith(pattern))) return next();\n }\n \n // Parse query if needed\n let queryString = '';\n if (showQuery && req.url) {\n const queryIndex = req.url.indexOf('?');\n if (queryIndex !== -1) queryString = req.url.substring(queryIndex);\n }\n \n let statusCode = 200;\n try {\n await next();\n statusCode = res.raw?.statusCode || 200;\n } catch (err) {\n statusCode = 500;\n throw err;\n }\n \n const ms = Date.now() - start;\n const method = req.method || 'GET';\n \n // Filter by log level\n if (logLevel === 'error' && statusCode < 400) return;\n if (logLevel === 'debug' && statusCode < 300) return;\n \n // Format output\n const parts: string[] = [];\n const dim = '\\x1b[2m';\n const reset = '\\x1b[0m';\n \n if (showTimestamp) {\n parts.push(`${dim}[${new Date().toLocaleTimeString()}]${reset}`);\n }\n \n // Method color\n const methodColors: Record<string, string> = {\n GET: '\\x1b[34m', POST: '\\x1b[32m', PUT: '\\x1b[33m',\n DELETE: '\\x1b[31m', PATCH: '\\x1b[35m'\n };\n const methodColor = methodColors[method] || '\\x1b[37m';\n parts.push(`${methodColor}${method.padEnd(6)}${reset}`);\n \n // URL with query\n parts.push(`${url.split('?')[0]}${dim}${queryString}${reset}`);\n \n // Status color\n let statusColor = '\\x1b[32m';\n if (statusCode >= 400) statusColor = '\\x1b[33m';\n if (statusCode >= 500) statusColor = '\\x1b[31m';\n parts.push(`${statusColor}${statusCode}${reset}`);\n \n // Duration\n const durationColor = ms > 1000 ? '\\x1b[33m' : dim;\n parts.push(`${durationColor}${ms}ms${reset}`);\n \n console.log(parts.join(' '));\n };\n}\n\n// Development logger\nexport function devLogger(): Middleware {\n return logger({ showTimestamp: true, logLevel: 'debug' });\n}\n\n// Production logger (JSON format)\nexport function prodLogger(): Middleware {\n return async (ctx, next) => {\n const start = Date.now();\n const { req, res } = ctx;\n \n await next();\n \n const ms = Date.now() - start;\n console.log(JSON.stringify({\n timestamp: new Date().toISOString(),\n method: req.method,\n url: req.url,\n status: res.raw?.statusCode || 200,\n duration: ms,\n }));\n };\n}\n\n// Only log errors\nexport function errorLogger(): Middleware {\n return logger({ logLevel: 'error', showTimestamp: true });\n}\n\n// Detailed logging\nexport function detailedLogger(): Middleware {\n return logger({ \n showTimestamp: true, \n showQuery: true, \n logLevel: 'debug',\n excludePaths: ['/health', '/ping']\n });\n}","import { Middleware } from '../core/MiddlewareRunner';\nimport { HttpStatus } from '../http/status';\n\nexport interface RateLimitOptions {\n windowMs: number;\n max: number;\n message?: string;\n}\n\nexport function rateLimit(options: RateLimitOptions): Middleware {\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (ctx, next) => {\n const ip = ctx.req.ip || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, {\n count: 1,\n resetTime: now + options.windowMs,\n });\n return next();\n }\n\n record.count++;\n if (record.count > options.max) {\n ctx.res.status(HttpStatus.TOO_MANY_REQUESTS).json({\n success: false,\n message: options.message || 'Too many requests',\n });\n return;\n }\n\n return next();\n };\n}\n","import { Middleware } from '../core/MiddlewareRunner';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promises as fsPromises } from 'node:fs';\n\ninterface StaticOptions {\n dotfiles?: 'allow' | 'deny' | 'ignore';\n etag?: boolean;\n extensions?: string[];\n index?: string;\n maxAge?: number;\n cacheControl?: boolean;\n lastModified?: boolean;\n immutable?: boolean;\n fallthrough?: boolean;\n setHeaders?: (res: any, path: string, stat: fs.Stats) => void;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.mjs': 'application/javascript',\n '.json': 'application/json',\n '.map': 'application/json',\n '.xml': 'application/xml',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.pdf': 'application/pdf',\n '.doc': 'application/msword',\n '.docx':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx':\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx':\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.zip': 'application/zip',\n '.rar': 'application/x-rar-compressed',\n '.7z': 'application/x-7z-compressed',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tiff': 'image/tiff',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.eot': 'application/vnd.ms-fontobject',\n '.wasm': 'application/wasm',\n '.manifest': 'text/cache-manifest',\n '.webmanifest': 'application/manifest+json',\n};\n\nfunction setCacheHeaders(\n res: any,\n maxAge: number,\n immutable: boolean\n): void {\n let value: string;\n\n if (maxAge === 0) {\n value = 'no-cache, must-revalidate';\n } else {\n value = `public, max-age=${maxAge}`;\n\n if (immutable) {\n value += ', immutable';\n }\n }\n\n res.setHeader('Cache-Control', value);\n}\n\nexport function staticFiles(\n root: string,\n options: StaticOptions = {}\n): Middleware {\n const {\n dotfiles = 'ignore',\n etag = true,\n extensions = [],\n index = 'index.html',\n maxAge = 0,\n cacheControl = true,\n lastModified = true,\n immutable = false,\n fallthrough = true,\n setHeaders,\n } = options;\n\n const rootPath = path.resolve(root);\n\n return async (ctx, next) => {\n const { req, res } = ctx;\n\n let url = req.url || '/';\n url = url.split('?')[0] || '/';\n\n if (dotfiles !== 'allow') {\n const basename = path.basename(url);\n\n if (basename.startsWith('.')) {\n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n\n return next();\n }\n }\n\n let filePath = path.resolve(rootPath, `.${url}`);\n\n if (!filePath.startsWith(rootPath)) {\n if (!fallthrough) {\n res.status(403).json({ error: 'Forbidden' });\n return;\n }\n\n return next();\n }\n\n const serveFile = async (\n targetPath: string,\n stat: fs.Stats\n ): Promise<void> => {\n const ext = path.extname(targetPath).toLowerCase();\n const contentType =\n MIME_TYPES[ext] ?? 'application/octet-stream';\n\n res.setHeader('Content-Type', contentType);\n res.setHeader('Content-Length', String(stat.size));\n\n if (lastModified) {\n res.setHeader(\n 'Last-Modified',\n stat.mtime.toUTCString()\n );\n }\n\n if (etag) {\n const etagValue = generateEtag(stat);\n\n res.setHeader('ETag', etagValue);\n\n const ifNoneMatch = req.headers['if-none-match'];\n\n if (\n typeof ifNoneMatch === 'string' &&\n ifNoneMatch === etagValue\n ) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n\n if (cacheControl) {\n setCacheHeaders(res, maxAge, immutable);\n }\n\n if (lastModified) {\n const ifModifiedSince =\n req.headers['if-modified-since'];\n\n if (typeof ifModifiedSince === 'string') {\n const modifiedDate = new Date(ifModifiedSince);\n\n if (\n !Number.isNaN(modifiedDate.getTime()) &&\n stat.mtime <= modifiedDate\n ) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n }\n\n if (setHeaders) {\n setHeaders(res, targetPath, stat);\n }\n\n const stream = fs.createReadStream(targetPath);\n\n stream.pipe(res.raw);\n\n stream.on('error', () => {\n if (!res.raw.headersSent) {\n res.status(500);\n res.raw.end();\n }\n });\n\n res.raw.on('finish', () => {\n stream.destroy();\n });\n };\n\n try {\n let stat = await fsPromises.stat(filePath);\n\n if (stat.isDirectory()) {\n const indexPath = path.join(filePath, index);\n\n stat = await fsPromises.stat(indexPath);\n filePath = indexPath;\n }\n\n await serveFile(filePath, stat);\n return;\n } catch (err: any) {\n if (err?.code === 'ENOENT') {\n for (const extension of extensions) {\n const extPath = `${filePath}${extension}`;\n\n try {\n const stat = await fsPromises.stat(extPath);\n\n await serveFile(extPath, stat);\n return;\n } catch {}\n }\n\n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n\n return next();\n }\n\n if (!fallthrough) {\n res\n .status(500)\n .json({ error: 'Internal Server Error' });\n\n return;\n }\n\n return next();\n }\n };\n}\n\nfunction generateEtag(stat: fs.Stats): string {\n const mtime = stat.mtime.getTime().toString(16);\n const size = stat.size.toString(16);\n\n return `\"${size}-${mtime}\"`;\n}\n\nexport function sendFile(filePath: string): Middleware {\n return async (ctx) => {\n try {\n const resolvedPath = path.resolve(filePath);\n\n const stat = await fsPromises.stat(resolvedPath);\n\n const ext = path.extname(resolvedPath).toLowerCase();\n\n const contentType =\n MIME_TYPES[ext] ?? 'application/octet-stream';\n\n ctx.res.setHeader('Content-Type', contentType);\n ctx.res.setHeader('Content-Length', String(stat.size));\n\n const stream = fs.createReadStream(resolvedPath);\n\n stream.pipe(ctx.res.raw);\n\n stream.on('error', () => {\n if (!ctx.res.raw.headersSent) {\n ctx.res.status(500);\n ctx.res.raw.end();\n }\n });\n } catch {\n ctx.res.status(404).json({\n error: 'File not found',\n });\n }\n };\n}","export function isObject(item: unknown): item is Record<string, unknown> {\n return (item !== null && typeof item === 'object' && !Array.isArray(item));\n}\n","import { isObject } from './isObject';\n\nexport function mergeDeep<T extends Record<string, any>>(target: T, ...sources: T[]): T {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n mergeDeep(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return mergeDeep(target, ...sources);\n}\n","export function parseParams(pattern: string, path: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n patternParts.forEach((part, i) => {\n if (part.startsWith(':')) {\n const paramName = part.slice(1);\n params[paramName] = pathParts[i] || '';\n }\n });\n\n return params;\n}\n"],"mappings":"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","names":["HttpStatus","path","resolve","HttpMethod","path","path","basename","fsPromises","path"]}

@@ -618,2 +618,26 @@ // src/core/Server.ts

".json": "application/json",
".map": "application/json",
".xml": "application/xml",
".txt": "text/plain",
".md": "text/markdown",
".pdf": "application/pdf",
".doc": "application/msword",
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
".xls": "application/vnd.ms-excel",
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
".ppt": "application/vnd.ms-powerpoint",
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
".zip": "application/zip",
".rar": "application/x-rar-compressed",
".7z": "application/x-7z-compressed",
".tar": "application/x-tar",
".gz": "application/gzip",
".mp3": "audio/mpeg",
".wav": "audio/wav",
".ogg": "audio/ogg",
".m4a": "audio/mp4",
".mp4": "video/mp4",
".webm": "video/webm",
".avi": "video/x-msvideo",
".mov": "video/quicktime",
".png": "image/png",

@@ -625,14 +649,26 @@ ".jpg": "image/jpeg",

".ico": "image/x-icon",
".txt": "text/plain",
".xml": "application/xml",
".pdf": "application/pdf",
".zip": "application/zip",
".mp3": "audio/mpeg",
".mp4": "video/mp4",
".webp": "image/webp",
".bmp": "image/bmp",
".tiff": "image/tiff",
".woff": "font/woff",
".woff2": "font/woff2",
".ttf": "font/ttf",
".eot": "application/vnd.ms-fontobject"
".otf": "font/otf",
".eot": "application/vnd.ms-fontobject",
".wasm": "application/wasm",
".manifest": "text/cache-manifest",
".webmanifest": "application/manifest+json"
};
function setCacheHeaders(res, maxAge, immutable) {
let value;
if (maxAge === 0) {
value = "no-cache, must-revalidate";
} else {
value = `public, max-age=${maxAge}`;
if (immutable) {
value += ", immutable";
}
}
res.setHeader("Cache-Control", value);
}
function staticFiles(root, options = {}) {

@@ -654,4 +690,15 @@ const {

const { req, res } = ctx;
const url = req.url || "/";
let filePath = path.join(rootPath, url);
let url = req.url || "/";
url = url.split("?")[0] || "/";
if (dotfiles !== "allow") {
const basename2 = path.basename(url);
if (basename2.startsWith(".")) {
if (!fallthrough) {
res.status(404).json({ error: "Not Found" });
return;
}
return next();
}
}
let filePath = path.resolve(rootPath, `.${url}`);
if (!filePath.startsWith(rootPath)) {

@@ -664,33 +711,70 @@ if (!fallthrough) {

}
try {
const stat = await fsPromises.stat(filePath);
if (stat.isDirectory()) {
if (index !== false) {
filePath = path.join(filePath, index);
try {
const indexStat = await fsPromises.stat(filePath);
await serveFile(filePath, indexStat, ctx, options);
const serveFile = async (targetPath, stat) => {
const ext = path.extname(targetPath).toLowerCase();
const contentType = MIME_TYPES[ext] ?? "application/octet-stream";
res.setHeader("Content-Type", contentType);
res.setHeader("Content-Length", String(stat.size));
if (lastModified) {
res.setHeader(
"Last-Modified",
stat.mtime.toUTCString()
);
}
if (etag) {
const etagValue = generateEtag(stat);
res.setHeader("ETag", etagValue);
const ifNoneMatch = req.headers["if-none-match"];
if (typeof ifNoneMatch === "string" && ifNoneMatch === etagValue) {
res.status(304);
res.raw.end();
return;
}
}
if (cacheControl) {
setCacheHeaders(res, maxAge, immutable);
}
if (lastModified) {
const ifModifiedSince = req.headers["if-modified-since"];
if (typeof ifModifiedSince === "string") {
const modifiedDate = new Date(ifModifiedSince);
if (!Number.isNaN(modifiedDate.getTime()) && stat.mtime <= modifiedDate) {
res.status(304);
res.raw.end();
return;
} catch {
}
}
if (!fallthrough) {
res.status(404).json({ error: "Not Found" });
return;
}
if (setHeaders) {
setHeaders(res, targetPath, stat);
}
const stream = fs.createReadStream(targetPath);
stream.pipe(res.raw);
stream.on("error", () => {
if (!res.raw.headersSent) {
res.status(500);
res.raw.end();
}
return next();
});
res.raw.on("finish", () => {
stream.destroy();
});
};
try {
let stat = await fsPromises.stat(filePath);
if (stat.isDirectory()) {
const indexPath = path.join(filePath, index);
stat = await fsPromises.stat(indexPath);
filePath = indexPath;
}
await serveFile(filePath, stat, ctx, options);
await serveFile(filePath, stat);
return;
} catch (err) {
if (err.code === "ENOENT") {
if (extensions.length > 0) {
for (const ext of extensions) {
const extPath = filePath + ext;
try {
const extStat = await fsPromises.stat(extPath);
await serveFile(extPath, extStat, ctx, options);
return;
} catch {
continue;
}
if (err?.code === "ENOENT") {
for (const extension of extensions) {
const extPath = `${filePath}${extension}`;
try {
const stat = await fsPromises.stat(extPath);
await serveFile(extPath, stat);
return;
} catch {
}

@@ -712,56 +796,2 @@ }

}
async function serveFile(filePath, stat, ctx, options) {
const { req, res } = ctx;
const {
etag = true,
maxAge = 0,
cacheControl = true,
lastModified = true,
immutable = false,
setHeaders
} = options;
const ext = path.extname(filePath).toLowerCase();
const contentType = MIME_TYPES[ext] || "application/octet-stream";
res.setHeader("Content-Type", contentType);
res.setHeader("Content-Length", stat.size);
if (lastModified) {
res.setHeader("Last-Modified", stat.mtime.toUTCString());
}
if (etag) {
const etagValue = generateEtag(stat);
res.setHeader("ETag", etagValue);
const ifNoneMatch = req.headers["if-none-match"];
if (ifNoneMatch === etagValue) {
res.status(304);
res.raw.end();
return;
}
}
if (cacheControl) {
const cacheControlValue = immutable ? `public, max-age=${maxAge}, immutable` : `public, max-age=${maxAge}`;
res.setHeader("Cache-Control", cacheControlValue);
}
if (lastModified) {
const ifModifiedSince = req.headers["if-modified-since"];
if (ifModifiedSince) {
const ifModifiedSinceDate = new Date(ifModifiedSince);
if (stat.mtime <= ifModifiedSinceDate) {
res.status(304);
res.raw.end();
return;
}
}
}
if (setHeaders) {
setHeaders(res, filePath, stat);
}
const stream = fs.createReadStream(filePath);
stream.pipe(res.raw);
stream.on("error", () => {
if (!res.raw.headersSent) {
res.status(500);
res.raw.end();
}
});
}
function generateEtag(stat) {

@@ -773,9 +803,22 @@ const mtime = stat.mtime.getTime().toString(16);

function sendFile(filePath) {
return async (ctx, next) => {
return async (ctx) => {
try {
const resolvedPath = path.resolve(filePath);
const stat = await fsPromises.stat(resolvedPath);
await serveFile(resolvedPath, stat, ctx, {});
} catch (err) {
ctx.res.status(404).json({ error: "File not found" });
const ext = path.extname(resolvedPath).toLowerCase();
const contentType = MIME_TYPES[ext] ?? "application/octet-stream";
ctx.res.setHeader("Content-Type", contentType);
ctx.res.setHeader("Content-Length", String(stat.size));
const stream = fs.createReadStream(resolvedPath);
stream.pipe(ctx.res.raw);
stream.on("error", () => {
if (!ctx.res.raw.headersSent) {
ctx.res.status(500);
ctx.res.raw.end();
}
});
} catch {
ctx.res.status(404).json({
error: "File not found"
});
}

@@ -782,0 +825,0 @@ };

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/core/Server.ts","../src/utils/parseQuery.ts","../src/core/Request.ts","../src/http/status.ts","../src/core/Response.ts","../src/core/Context.ts","../src/core/RouteMatcher.ts","../src/core/MiddlewareRunner.ts","../src/core/BodyParser.ts","../src/http/methods.ts","../src/utils/normalize.ts","../src/core/Router.ts","../src/app/App.ts","../src/app/createApp.ts","../src/middleware/Logger.ts","../src/middleware/RateLimit.ts","../src/middleware/Static.ts","../src/utils/isObject.ts","../src/utils/merge.ts","../src/utils/parseParams.ts"],"sourcesContent":["import { createServer, IncomingMessage, ServerResponse, Server as NodeServer } from 'node:http';\nimport { Request } from './Request';\nimport { Response } from './Response';\nimport { Context } from './Context';\nimport { Router } from './Router';\nimport { RouteMatcher } from './RouteMatcher';\nimport { MiddlewareRunner } from './MiddlewareRunner';\nimport { BodyParser } from './BodyParser';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n}\n\nexport class Server {\n private nodeServer: NodeServer;\n\n constructor(private router: Router) {\n this.nodeServer = createServer(this.handleRequest.bind(this));\n }\n\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const request = new Request(req);\n const response = new Response(res);\n const context = new Context(request, response);\n\n try {\n await BodyParser.parse(request);\n\n const routes = this.router.getRoutes();\n let matchedRoute = null;\n\n for (const route of routes) {\n if (route.method === request.method) {\n const match = RouteMatcher.match(route.path, request.path);\n if (match.matches) {\n request.params = match.params;\n matchedRoute = route;\n break;\n }\n }\n }\n\n if (matchedRoute) {\n await MiddlewareRunner.run(context, matchedRoute.middlewares, matchedRoute.handler);\n } else {\n response.notFound('Route Not Found');\n }\n } catch (error) {\n console.error(error);\n response.internalError('Internal Server Error');\n }\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const port = typeof optionsOrPort === 'number' ? optionsOrPort : optionsOrPort.port || 3000;\n const host = typeof optionsOrPort === 'object' ? optionsOrPort.host || '0.0.0.0' : '0.0.0.0';\n\n return this.nodeServer.listen(port, host, callback);\n }\n\n public close(callback?: (err?: Error) => void): this {\n this.nodeServer.close(callback);\n return this;\n }\n}\n","export function parseQuery(url: string): Record<string, string | string[]> {\n const query: Record<string, string | string[]> = {};\n const queryString = url.split('?')[1];\n \n if (!queryString) return query;\n\n const pairs = queryString.split('&');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (!key) continue;\n \n const decodedKey = decodeURIComponent(key);\n const decodedValue = value ? decodeURIComponent(value) : '';\n\n const existing = query[decodedKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n query[decodedKey] = [existing, decodedValue];\n }\n } else {\n query[decodedKey] = decodedValue;\n }\n }\n\n return query;\n}\n","import { IncomingMessage } from 'node:http';\nimport { parseQuery } from '../utils/parseQuery';\n\nexport class Request {\n public params: Record<string, string> = {};\n public query: Record<string, string | string[]> = {};\n public body: any = null;\n public headers: IncomingMessage['headers'];\n public ip: string | undefined;\n public method: string;\n public path: string;\n public url: string;\n public originalUrl: string;\n\n constructor(private rawRequest: IncomingMessage) {\n this.headers = rawRequest.headers;\n this.method = rawRequest.method || 'GET';\n this.url = rawRequest.url || '/';\n this.originalUrl = rawRequest.url || '/';\n this.path = this.url.split('?')[0] || '/';\n this.query = parseQuery(this.url);\n this.ip = rawRequest.socket.remoteAddress;\n }\n\n get raw(): IncomingMessage {\n return this.rawRequest;\n }\n}\n","export enum HttpStatus {\n CONTINUE = 100,\n SWITCHING_PROTOCOLS = 101,\n PROCESSING = 102,\n EARLY_HINTS = 103,\n OK = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NON_AUTHORITATIVE_INFORMATION = 203,\n NO_CONTENT = 204,\n RESET_CONTENT = 205,\n PARTIAL_CONTENT = 206,\n MULTI_STATUS = 207,\n ALREADY_REPORTED = 208,\n IM_USED = 226,\n MULTIPLE_CHOICES = 300,\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n SEE_OTHER = 303,\n NOT_MODIFIED = 304,\n USE_PROXY = 305,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n PROXY_AUTHENTICATION_REQUIRED = 407,\n REQUEST_TIMEOUT = 408,\n CONFLICT = 409,\n GONE = 410,\n LENGTH_REQUIRED = 411,\n PRECONDITION_FAILED = 412,\n PAYLOAD_TOO_LARGE = 413,\n URI_TOO_LONG = 414,\n UNSUPPORTED_MEDIA_TYPE = 415,\n RANGE_NOT_SATISFIABLE = 416,\n EXPECTATION_FAILED = 417,\n IM_A_TEAPOT = 418,\n MISDIRECTED_REQUEST = 421,\n UNPROCESSABLE_ENTITY = 422,\n LOCKED = 423,\n FAILED_DEPENDENCY = 424,\n TOO_EARLY = 425,\n UPGRADE_REQUIRED = 426,\n PRECONDITION_REQUIRED = 428,\n TOO_MANY_REQUESTS = 429,\n REQUEST_HEADER_FIELDS_TOO_LARGE = 431,\n UNAVAILABLE_FOR_LEGAL_REASONS = 451,\n INTERNAL_SERVER_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n HTTP_VERSION_NOT_SUPPORTED = 505,\n VARIANT_ALSO_NEGOTIATES = 506,\n INSUFFICIENT_STORAGE = 507,\n LOOP_DETECTED = 508,\n BANDWIDTH_LIMIT_EXCEEDED = 509,\n NOT_EXTENDED = 510,\n NETWORK_AUTHENTICATION_REQUIRED = 511,\n}\n","import { ServerResponse } from 'node:http';\nimport { HttpStatus } from '../http/status';\n\nexport class Response {\n constructor(private rawResponse: ServerResponse) {}\n\n public status(code: number): this {\n this.rawResponse.statusCode = code;\n return this;\n }\n\n public setHeader(name: string, value: string | string[]): this {\n this.rawResponse.setHeader(name, value);\n return this;\n }\n\n public send(data: any): void {\n if (typeof data === 'string') {\n this.rawResponse.setHeader('Content-Type', 'text/plain');\n this.rawResponse.end(data);\n } else if (Buffer.isBuffer(data)) {\n this.rawResponse.end(data);\n } else {\n this.json(data);\n }\n }\n\n public json(data: any): void {\n const body = JSON.stringify(data);\n this.rawResponse.setHeader('Content-Type', 'application/json');\n this.rawResponse.end(body);\n }\n\n public success(data: any): void {\n this.status(HttpStatus.OK).json({\n success: true,\n data,\n });\n }\n\n public created(data: any): void {\n this.status(HttpStatus.CREATED).json({\n success: true,\n data,\n });\n }\n\n public error(message: string, code: number = HttpStatus.INTERNAL_SERVER_ERROR): void {\n this.status(code).json({\n success: false,\n message,\n });\n }\n\n public badRequest(message: string = 'Bad Request'): void {\n this.error(message, HttpStatus.BAD_REQUEST);\n }\n\n public unauthorized(message: string = 'Unauthorized'): void {\n this.error(message, HttpStatus.UNAUTHORIZED);\n }\n\n public forbidden(message: string = 'Forbidden'): void {\n this.error(message, HttpStatus.FORBIDDEN);\n }\n\n public notFound(message: string = 'Not Found'): void {\n this.error(message, HttpStatus.NOT_FOUND);\n }\n\n public conflict(message: string = 'Conflict'): void {\n this.error(message, HttpStatus.CONFLICT);\n }\n\n public internalError(message: string = 'Internal Server Error'): void {\n this.error(message, HttpStatus.INTERNAL_SERVER_ERROR);\n }\n\n get raw(): ServerResponse {\n return this.rawResponse;\n }\n}\n","import { Request } from './Request';\nimport { Response } from './Response';\n\nexport class Context {\n constructor(\n public readonly req: Request,\n public readonly res: Response\n ) {}\n}\n","export interface MatchResult {\n matches: boolean;\n params: Record<string, string>;\n}\n\nexport class RouteMatcher {\n public static match(pattern: string, path: string): MatchResult {\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return { matches: false, params: {} };\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i]!;\n const pathPart = pathParts[i]!;\n\n if (patternPart.startsWith(':')) {\n const paramName = patternPart.slice(1);\n params[paramName] = pathPart;\n } else if (patternPart !== pathPart) {\n return { matches: false, params: {} };\n }\n }\n\n return { matches: true, params };\n }\n}\n","import { Context } from './Context';\n\nexport type NextFunction = (err?: any) => void | Promise<void>;\nexport type Middleware = (ctx: Context, next: NextFunction) => void | Promise<void>;\n\nexport class MiddlewareRunner {\n public static async run(\n ctx: Context,\n middlewares: Middleware[],\n handler: Middleware\n ): Promise<void> {\n const allMiddlewares = [...middlewares, handler];\n let index = 0;\n\n const next: NextFunction = async (err?: any) => {\n if (err) {\n throw err;\n }\n\n if (index < allMiddlewares.length) {\n const middleware = allMiddlewares[index++];\n if (middleware) {\n await middleware(ctx, next);\n }\n }\n };\n\n await next();\n }\n}\n","import { Request } from './Request';\n\nexport class BodyParser {\n public static async parse(req: Request): Promise<void> {\n const contentType = req.headers['content-type'] || '';\n \n return new Promise((resolve, reject) => {\n let data = '';\n req.raw.on('data', (chunk) => {\n data += chunk;\n });\n\n req.raw.on('end', () => {\n try {\n if (contentType.includes('application/json')) {\n req.body = data ? JSON.parse(data) : {};\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const params = new URLSearchParams(data);\n const body: Record<string, string> = {};\n params.forEach((value, key) => {\n body[key] = value;\n });\n req.body = body;\n } else if (contentType.includes('text/plain')) {\n req.body = data;\n } else {\n req.body = data;\n }\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n\n req.raw.on('error', (err) => {\n reject(err);\n });\n });\n }\n}\n","export enum HttpMethod {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n PATCH = 'PATCH',\n DELETE = 'DELETE',\n OPTIONS = 'OPTIONS',\n HEAD = 'HEAD',\n}\n\nexport type HttpMethodType = keyof typeof HttpMethod | Lowercase<keyof typeof HttpMethod>;\n","export function normalizePath(path: string): string {\n if (path === '/') return path;\n return path.replace(/\\/+/g, '/').replace(/\\/+$/, '') || '/';\n}\n","import { Middleware } from './MiddlewareRunner';\nimport { HttpMethod } from '../http/methods';\nimport { normalizePath } from '../utils/normalize';\n\nexport interface Route {\n method: string;\n path: string;\n handler: Middleware;\n middlewares: Middleware[];\n}\n\nexport class Router {\n private routes: Route[] = [];\n private prefix: string = '';\n private middlewares: Middleware[] = [];\n\n constructor(prefix: string = '', middlewares: Middleware[] = []) {\n this.prefix = normalizePath(prefix);\n this.middlewares = middlewares;\n }\n\n public use(...middlewares: Middleware[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n private addRoute(method: string, path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n const fullPath = normalizePath(this.prefix + normalizePath(path));\n this.routes.push({\n method,\n path: fullPath,\n handler,\n middlewares: [...this.middlewares, ...middlewares],\n });\n return this;\n }\n\n public get(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.GET, path, handler, ...middlewares);\n }\n\n public post(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.POST, path, handler, ...middlewares);\n }\n\n public put(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PUT, path, handler, ...middlewares);\n }\n\n public patch(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PATCH, path, handler, ...middlewares);\n }\n\n public delete(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.DELETE, path, handler, ...middlewares);\n }\n\n public options(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.OPTIONS, path, handler, ...middlewares);\n }\n\n public head(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.HEAD, path, handler, ...middlewares);\n }\n\n public group(prefix: string, callback: (router: Router) => void, ...middlewares: Middleware[]): this {\n const subRouter = new Router(this.prefix + normalizePath(prefix), [...this.middlewares, ...middlewares]);\n callback(subRouter);\n this.routes.push(...subRouter.getRoutes());\n return this;\n }\n\n public getRoutes(): Route[] {\n return this.routes;\n }\n}\n","import { Server, ServerOptions } from '../core/Server';\nimport { Router } from '../core/Router';\nimport { Server as NodeServer } from 'node:http';\nimport { networkInterfaces } from 'node:os';\n\nexport class App extends Router {\n private server: Server;\n\n constructor() {\n super();\n this.server = new Server(this);\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const options = typeof optionsOrPort === 'number' \n ? { port: optionsOrPort } \n : optionsOrPort;\n \n const port = options.port || 3000;\n const host = options.host || 'localhost';\n \n const server = this.server.listen(optionsOrPort, () => {\n this.printServerInfo(port, host);\n if (callback) callback();\n });\n \n return server;\n }\n\n private printServerInfo(port: number, host: string): void {\n const green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\n const cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\n const blue = (text: string) => `\\x1b[34m${text}\\x1b[0m`;\n const bold = (text: string) => `\\x1b[1m${text}\\x1b[0m`;\n const dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\n const underline = (text: string) => `\\x1b[4m${text}\\x1b[0m`;\n \n console.log();\n \n const localUrl = `http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;\n console.log(`${green('✓')} ${bold('Server started successfully!')}`);\n console.log();\n console.log(` ${bold('➜')} ${cyan('Local:')} ${underline(blue(localUrl))}`);\n \n const networks = this.getNetworkAddresses();\n if (networks.length > 0) {\n networks.forEach(network => {\n const networkUrl = `http://${network.address}:${port}`;\n console.log(` ${bold('➜')} ${cyan(`${network.name}:`)} ${underline(blue(networkUrl))}`);\n });\n }\n \n console.log();\n console.log(` ${dim('Press Ctrl+C to stop the server')}`);\n console.log();\n }\n\n private getNetworkAddresses(): Array<{ name: string; address: string }> {\n const interfaces = networkInterfaces();\n const addresses: Array<{ name: string; address: string }> = [];\n \n for (const [name, netInterface] of Object.entries(interfaces)) {\n if (!netInterface) continue;\n \n for (const net of netInterface) {\n if (!net.internal && net.family === 'IPv4') {\n addresses.push({\n name: this.getNetworkName(name),\n address: net.address\n });\n }\n }\n }\n \n return addresses;\n }\n\n private getNetworkName(interfaceName: string): string {\n const nameMap: Record<string, string> = {\n 'en0': 'WiFi',\n 'en1': 'Ethernet',\n 'eth0': 'Ethernet',\n 'wlan0': 'WiFi',\n 'enp0s3': 'Network',\n 'ens33': 'Network'\n };\n \n return nameMap[interfaceName] || interfaceName;\n }\n\n public close(callback?: (err?: Error) => void): this {\n console.log('\\x1b[33m\\n Shutting down server...\\x1b[0m');\n this.server.close((err) => {\n if (err) {\n console.error('\\x1b[31m Error during shutdown:\\x1b[0m', err);\n } else {\n console.log('\\x1b[32m Server stopped successfully\\n\\x1b[0m');\n }\n if (callback) callback(err);\n });\n return this;\n }\n}","import { App } from './App';\n\nexport function createApp(): App {\n return new App();\n}\n","import { Middleware } from '../core/MiddlewareRunner';\n\ninterface LoggerOptions {\n silent?: boolean;\n showTimestamp?: boolean;\n showQuery?: boolean;\n excludePaths?: (string | RegExp)[];\n logLevel?: 'info' | 'debug' | 'error' | 'none';\n}\n\nexport function logger(options: LoggerOptions = {}): Middleware {\n const {\n silent = false,\n showTimestamp = true,\n showQuery = false,\n excludePaths = [],\n logLevel = 'info',\n } = options;\n\n return async (ctx, next) => {\n if (silent || logLevel === 'none') return next();\n\n const start = Date.now();\n const { req, res } = ctx;\n const url = req.url || '/';\n \n // Check exclude paths\n for (const pattern of excludePaths) {\n if (pattern instanceof RegExp && pattern.test(url)) return next();\n if (typeof pattern === 'string' && (url === pattern || url.startsWith(pattern))) return next();\n }\n \n // Parse query if needed\n let queryString = '';\n if (showQuery && req.url) {\n const queryIndex = req.url.indexOf('?');\n if (queryIndex !== -1) queryString = req.url.substring(queryIndex);\n }\n \n let statusCode = 200;\n try {\n await next();\n statusCode = res.raw?.statusCode || 200;\n } catch (err) {\n statusCode = 500;\n throw err;\n }\n \n const ms = Date.now() - start;\n const method = req.method || 'GET';\n \n // Filter by log level\n if (logLevel === 'error' && statusCode < 400) return;\n if (logLevel === 'debug' && statusCode < 300) return;\n \n // Format output\n const parts: string[] = [];\n const dim = '\\x1b[2m';\n const reset = '\\x1b[0m';\n \n if (showTimestamp) {\n parts.push(`${dim}[${new Date().toLocaleTimeString()}]${reset}`);\n }\n \n // Method color\n const methodColors: Record<string, string> = {\n GET: '\\x1b[34m', POST: '\\x1b[32m', PUT: '\\x1b[33m',\n DELETE: '\\x1b[31m', PATCH: '\\x1b[35m'\n };\n const methodColor = methodColors[method] || '\\x1b[37m';\n parts.push(`${methodColor}${method.padEnd(6)}${reset}`);\n \n // URL with query\n parts.push(`${url.split('?')[0]}${dim}${queryString}${reset}`);\n \n // Status color\n let statusColor = '\\x1b[32m';\n if (statusCode >= 400) statusColor = '\\x1b[33m';\n if (statusCode >= 500) statusColor = '\\x1b[31m';\n parts.push(`${statusColor}${statusCode}${reset}`);\n \n // Duration\n const durationColor = ms > 1000 ? '\\x1b[33m' : dim;\n parts.push(`${durationColor}${ms}ms${reset}`);\n \n console.log(parts.join(' '));\n };\n}\n\n// Development logger\nexport function devLogger(): Middleware {\n return logger({ showTimestamp: true, logLevel: 'debug' });\n}\n\n// Production logger (JSON format)\nexport function prodLogger(): Middleware {\n return async (ctx, next) => {\n const start = Date.now();\n const { req, res } = ctx;\n \n await next();\n \n const ms = Date.now() - start;\n console.log(JSON.stringify({\n timestamp: new Date().toISOString(),\n method: req.method,\n url: req.url,\n status: res.raw?.statusCode || 200,\n duration: ms,\n }));\n };\n}\n\n// Only log errors\nexport function errorLogger(): Middleware {\n return logger({ logLevel: 'error', showTimestamp: true });\n}\n\n// Detailed logging\nexport function detailedLogger(): Middleware {\n return logger({ \n showTimestamp: true, \n showQuery: true, \n logLevel: 'debug',\n excludePaths: ['/health', '/ping']\n });\n}","import { Middleware } from '../core/MiddlewareRunner';\nimport { HttpStatus } from '../http/status';\n\nexport interface RateLimitOptions {\n windowMs: number;\n max: number;\n message?: string;\n}\n\nexport function rateLimit(options: RateLimitOptions): Middleware {\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (ctx, next) => {\n const ip = ctx.req.ip || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, {\n count: 1,\n resetTime: now + options.windowMs,\n });\n return next();\n }\n\n record.count++;\n if (record.count > options.max) {\n ctx.res.status(HttpStatus.TOO_MANY_REQUESTS).json({\n success: false,\n message: options.message || 'Too many requests',\n });\n return;\n }\n\n return next();\n };\n}\n","import { Middleware } from '../core/MiddlewareRunner';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promises as fsPromises } from 'node:fs';\n\ninterface StaticOptions {\n dotfiles?: 'allow' | 'deny' | 'ignore';\n etag?: boolean;\n extensions?: string[];\n index?: string | false;\n maxAge?: number;\n cacheControl?: boolean;\n lastModified?: boolean;\n immutable?: boolean;\n fallthrough?: boolean;\n setHeaders?: (res: any, path: string, stat: fs.Stats) => void;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.mjs': 'application/javascript',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.txt': 'text/plain',\n '.xml': 'application/xml',\n '.pdf': 'application/pdf',\n '.zip': 'application/zip',\n '.mp3': 'audio/mpeg',\n '.mp4': 'video/mp4',\n '.webp': 'image/webp',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.eot': 'application/vnd.ms-fontobject',\n};\n\nexport function staticFiles(root: string, options: StaticOptions = {}): Middleware {\n const {\n dotfiles = 'ignore',\n etag = true,\n extensions = [],\n index = 'index.html',\n maxAge = 0,\n cacheControl = true,\n lastModified = true,\n immutable = false,\n fallthrough = true,\n setHeaders,\n } = options;\n\n const rootPath = path.resolve(root);\n\n return async (ctx, next) => {\n const { req, res } = ctx;\n const url = req.url || '/';\n \n let filePath = path.join(rootPath, url);\n \n if (!filePath.startsWith(rootPath)) {\n if (!fallthrough) {\n res.status(403).json({ error: 'Forbidden' });\n return;\n }\n return next();\n }\n\n try {\n const stat = await fsPromises.stat(filePath);\n \n if (stat.isDirectory()) {\n if (index !== false) {\n filePath = path.join(filePath, index as string);\n try {\n const indexStat = await fsPromises.stat(filePath);\n await serveFile(filePath, indexStat, ctx, options);\n return;\n } catch {\n // Index file not found\n }\n }\n \n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n return next();\n }\n \n await serveFile(filePath, stat, ctx, options);\n \n } catch (err: any) {\n if (err.code === 'ENOENT') {\n if (extensions.length > 0) {\n for (const ext of extensions) {\n const extPath = filePath + ext;\n try {\n const extStat = await fsPromises.stat(extPath);\n await serveFile(extPath, extStat, ctx, options);\n return;\n } catch {\n continue;\n }\n }\n }\n \n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n return next();\n }\n \n if (!fallthrough) {\n res.status(500).json({ error: 'Internal Server Error' });\n return;\n }\n return next();\n }\n };\n}\n\nasync function serveFile(\n filePath: string,\n stat: fs.Stats,\n ctx: any,\n options: StaticOptions\n): Promise<void> {\n const { req, res } = ctx;\n const {\n etag = true,\n maxAge = 0,\n cacheControl = true,\n lastModified = true,\n immutable = false,\n setHeaders,\n } = options;\n\n const ext = path.extname(filePath).toLowerCase();\n const contentType = MIME_TYPES[ext] || 'application/octet-stream';\n \n res.setHeader('Content-Type', contentType);\n res.setHeader('Content-Length', stat.size);\n \n if (lastModified) {\n res.setHeader('Last-Modified', stat.mtime.toUTCString());\n }\n \n if (etag) {\n const etagValue = generateEtag(stat);\n res.setHeader('ETag', etagValue);\n \n const ifNoneMatch = req.headers['if-none-match'];\n if (ifNoneMatch === etagValue) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n \n if (cacheControl) {\n const cacheControlValue = immutable \n ? `public, max-age=${maxAge}, immutable`\n : `public, max-age=${maxAge}`;\n res.setHeader('Cache-Control', cacheControlValue);\n }\n \n if (lastModified) {\n const ifModifiedSince = req.headers['if-modified-since'];\n if (ifModifiedSince) {\n const ifModifiedSinceDate = new Date(ifModifiedSince);\n if (stat.mtime <= ifModifiedSinceDate) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n }\n \n if (setHeaders) {\n setHeaders(res, filePath, stat);\n }\n \n const stream = fs.createReadStream(filePath);\n stream.pipe(res.raw);\n \n stream.on('error', () => {\n if (!res.raw.headersSent) {\n res.status(500);\n res.raw.end();\n }\n });\n}\n\nfunction generateEtag(stat: fs.Stats): string {\n const mtime = stat.mtime.getTime().toString(16);\n const size = stat.size.toString(16);\n return `\"${size}-${mtime}\"`;\n}\n\nexport function sendFile(filePath: string): Middleware {\n return async (ctx, next) => {\n try {\n const resolvedPath = path.resolve(filePath);\n const stat = await fsPromises.stat(resolvedPath);\n await serveFile(resolvedPath, stat, ctx, {});\n } catch (err) {\n ctx.res.status(404).json({ error: 'File not found' });\n }\n };\n}","export function isObject(item: unknown): item is Record<string, unknown> {\n return (item !== null && typeof item === 'object' && !Array.isArray(item));\n}\n","import { isObject } from './isObject';\n\nexport function mergeDeep<T extends Record<string, any>>(target: T, ...sources: T[]): T {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n mergeDeep(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return mergeDeep(target, ...sources);\n}\n","export function parseParams(pattern: string, path: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n patternParts.forEach((part, i) => {\n if (part.startsWith(':')) {\n const paramName = part.slice(1);\n params[paramName] = pathParts[i] || '';\n }\n });\n\n return params;\n}\n"],"mappings":";AAAA,SAAS,oBAA2E;;;ACA7E,SAAS,WAAW,KAAgD;AACzE,QAAM,QAA2C,CAAC;AAClD,QAAM,cAAc,IAAI,MAAM,GAAG,EAAE,CAAC;AAEpC,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,aAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,KAAK,KAAK,IAAI,KAAK,MAAM,GAAG;AACnC,QAAI,CAAC,IAAK;AAEV,UAAM,aAAa,mBAAmB,GAAG;AACzC,UAAM,eAAe,QAAQ,mBAAmB,KAAK,IAAI;AAEzD,UAAM,WAAW,MAAM,UAAU;AACjC,QAAI,UAAU;AACZ,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,iBAAS,KAAK,YAAY;AAAA,MAC5B,OAAO;AACL,cAAM,UAAU,IAAI,CAAC,UAAU,YAAY;AAAA,MAC7C;AAAA,IACF,OAAO;AACL,YAAM,UAAU,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;;;ACxBO,IAAM,UAAN,MAAc;AAAA,EAWnB,YAAoB,YAA6B;AAA7B;AAClB,SAAK,UAAU,WAAW;AAC1B,SAAK,SAAS,WAAW,UAAU;AACnC,SAAK,MAAM,WAAW,OAAO;AAC7B,SAAK,cAAc,WAAW,OAAO;AACrC,SAAK,OAAO,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AACtC,SAAK,QAAQ,WAAW,KAAK,GAAG;AAChC,SAAK,KAAK,WAAW,OAAO;AAAA,EAC9B;AAAA,EARoB;AAAA,EAVb,SAAiC,CAAC;AAAA,EAClC,QAA2C,CAAC;AAAA,EAC5C,OAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAYP,IAAI,MAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AACF;;;AC3BO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,wBAAA,cAAW,OAAX;AACA,EAAAA,wBAAA,yBAAsB,OAAtB;AACA,EAAAA,wBAAA,gBAAa,OAAb;AACA,EAAAA,wBAAA,iBAAc,OAAd;AACA,EAAAA,wBAAA,QAAK,OAAL;AACA,EAAAA,wBAAA,aAAU,OAAV;AACA,EAAAA,wBAAA,cAAW,OAAX;AACA,EAAAA,wBAAA,mCAAgC,OAAhC;AACA,EAAAA,wBAAA,gBAAa,OAAb;AACA,EAAAA,wBAAA,mBAAgB,OAAhB;AACA,EAAAA,wBAAA,qBAAkB,OAAlB;AACA,EAAAA,wBAAA,kBAAe,OAAf;AACA,EAAAA,wBAAA,sBAAmB,OAAnB;AACA,EAAAA,wBAAA,aAAU,OAAV;AACA,EAAAA,wBAAA,sBAAmB,OAAnB;AACA,EAAAA,wBAAA,uBAAoB,OAApB;AACA,EAAAA,wBAAA,WAAQ,OAAR;AACA,EAAAA,wBAAA,eAAY,OAAZ;AACA,EAAAA,wBAAA,kBAAe,OAAf;AACA,EAAAA,wBAAA,eAAY,OAAZ;AACA,EAAAA,wBAAA,wBAAqB,OAArB;AACA,EAAAA,wBAAA,wBAAqB,OAArB;AACA,EAAAA,wBAAA,iBAAc,OAAd;AACA,EAAAA,wBAAA,kBAAe,OAAf;AACA,EAAAA,wBAAA,sBAAmB,OAAnB;AACA,EAAAA,wBAAA,eAAY,OAAZ;AACA,EAAAA,wBAAA,eAAY,OAAZ;AACA,EAAAA,wBAAA,wBAAqB,OAArB;AACA,EAAAA,wBAAA,oBAAiB,OAAjB;AACA,EAAAA,wBAAA,mCAAgC,OAAhC;AACA,EAAAA,wBAAA,qBAAkB,OAAlB;AACA,EAAAA,wBAAA,cAAW,OAAX;AACA,EAAAA,wBAAA,UAAO,OAAP;AACA,EAAAA,wBAAA,qBAAkB,OAAlB;AACA,EAAAA,wBAAA,yBAAsB,OAAtB;AACA,EAAAA,wBAAA,uBAAoB,OAApB;AACA,EAAAA,wBAAA,kBAAe,OAAf;AACA,EAAAA,wBAAA,4BAAyB,OAAzB;AACA,EAAAA,wBAAA,2BAAwB,OAAxB;AACA,EAAAA,wBAAA,wBAAqB,OAArB;AACA,EAAAA,wBAAA,iBAAc,OAAd;AACA,EAAAA,wBAAA,yBAAsB,OAAtB;AACA,EAAAA,wBAAA,0BAAuB,OAAvB;AACA,EAAAA,wBAAA,YAAS,OAAT;AACA,EAAAA,wBAAA,uBAAoB,OAApB;AACA,EAAAA,wBAAA,eAAY,OAAZ;AACA,EAAAA,wBAAA,sBAAmB,OAAnB;AACA,EAAAA,wBAAA,2BAAwB,OAAxB;AACA,EAAAA,wBAAA,uBAAoB,OAApB;AACA,EAAAA,wBAAA,qCAAkC,OAAlC;AACA,EAAAA,wBAAA,mCAAgC,OAAhC;AACA,EAAAA,wBAAA,2BAAwB,OAAxB;AACA,EAAAA,wBAAA,qBAAkB,OAAlB;AACA,EAAAA,wBAAA,iBAAc,OAAd;AACA,EAAAA,wBAAA,yBAAsB,OAAtB;AACA,EAAAA,wBAAA,qBAAkB,OAAlB;AACA,EAAAA,wBAAA,gCAA6B,OAA7B;AACA,EAAAA,wBAAA,6BAA0B,OAA1B;AACA,EAAAA,wBAAA,0BAAuB,OAAvB;AACA,EAAAA,wBAAA,mBAAgB,OAAhB;AACA,EAAAA,wBAAA,8BAA2B,OAA3B;AACA,EAAAA,wBAAA,kBAAe,OAAf;AACA,EAAAA,wBAAA,qCAAkC,OAAlC;AA/DU,SAAAA;AAAA,GAAA;;;ACGL,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,aAA6B;AAA7B;AAAA,EAA8B;AAAA,EAA9B;AAAA,EAEb,OAAO,MAAoB;AAChC,SAAK,YAAY,aAAa;AAC9B,WAAO;AAAA,EACT;AAAA,EAEO,UAAU,MAAc,OAAgC;AAC7D,SAAK,YAAY,UAAU,MAAM,KAAK;AACtC,WAAO;AAAA,EACT;AAAA,EAEO,KAAK,MAAiB;AAC3B,QAAI,OAAO,SAAS,UAAU;AAC5B,WAAK,YAAY,UAAU,gBAAgB,YAAY;AACvD,WAAK,YAAY,IAAI,IAAI;AAAA,IAC3B,WAAW,OAAO,SAAS,IAAI,GAAG;AAChC,WAAK,YAAY,IAAI,IAAI;AAAA,IAC3B,OAAO;AACL,WAAK,KAAK,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EAEO,KAAK,MAAiB;AAC3B,UAAM,OAAO,KAAK,UAAU,IAAI;AAChC,SAAK,YAAY,UAAU,gBAAgB,kBAAkB;AAC7D,SAAK,YAAY,IAAI,IAAI;AAAA,EAC3B;AAAA,EAEO,QAAQ,MAAiB;AAC9B,SAAK,mBAAoB,EAAE,KAAK;AAAA,MAC9B,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,QAAQ,MAAiB;AAC9B,SAAK,wBAAyB,EAAE,KAAK;AAAA,MACnC,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,MAAM,SAAiB,wCAAuD;AACnF,SAAK,OAAO,IAAI,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,WAAW,UAAkB,eAAqB;AACvD,SAAK,MAAM,8BAA+B;AAAA,EAC5C;AAAA,EAEO,aAAa,UAAkB,gBAAsB;AAC1D,SAAK,MAAM,+BAAgC;AAAA,EAC7C;AAAA,EAEO,UAAU,UAAkB,aAAmB;AACpD,SAAK,MAAM,4BAA6B;AAAA,EAC1C;AAAA,EAEO,SAAS,UAAkB,aAAmB;AACnD,SAAK,MAAM,4BAA6B;AAAA,EAC1C;AAAA,EAEO,SAAS,UAAkB,YAAkB;AAClD,SAAK,MAAM,2BAA4B;AAAA,EACzC;AAAA,EAEO,cAAc,UAAkB,yBAA+B;AACpE,SAAK,MAAM,wCAAyC;AAAA,EACtD;AAAA,EAEA,IAAI,MAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AACF;;;AC9EO,IAAM,UAAN,MAAc;AAAA,EACnB,YACkB,KACA,KAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAFe;AAAA,EACA;AAEpB;;;ACHO,IAAM,eAAN,MAAmB;AAAA,EACxB,OAAc,MAAM,SAAiBC,OAA2B;AAC9D,UAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,UAAM,YAAYA,MAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEhD,QAAI,aAAa,WAAW,UAAU,QAAQ;AAC5C,aAAO,EAAE,SAAS,OAAO,QAAQ,CAAC,EAAE;AAAA,IACtC;AAEA,UAAM,SAAiC,CAAC;AACxC,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,YAAM,cAAc,aAAa,CAAC;AAClC,YAAM,WAAW,UAAU,CAAC;AAE5B,UAAI,YAAY,WAAW,GAAG,GAAG;AAC/B,cAAM,YAAY,YAAY,MAAM,CAAC;AACrC,eAAO,SAAS,IAAI;AAAA,MACtB,WAAW,gBAAgB,UAAU;AACnC,eAAO,EAAE,SAAS,OAAO,QAAQ,CAAC,EAAE;AAAA,MACtC;AAAA,IACF;AAEA,WAAO,EAAE,SAAS,MAAM,OAAO;AAAA,EACjC;AACF;;;ACxBO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,aAAoB,IAClB,KACA,aACA,SACe;AACf,UAAM,iBAAiB,CAAC,GAAG,aAAa,OAAO;AAC/C,QAAI,QAAQ;AAEZ,UAAM,OAAqB,OAAO,QAAc;AAC9C,UAAI,KAAK;AACP,cAAM;AAAA,MACR;AAEA,UAAI,QAAQ,eAAe,QAAQ;AACjC,cAAM,aAAa,eAAe,OAAO;AACzC,YAAI,YAAY;AACd,gBAAM,WAAW,KAAK,IAAI;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,EACb;AACF;;;AC3BO,IAAM,aAAN,MAAiB;AAAA,EACtB,aAAoB,MAAM,KAA6B;AACrD,UAAM,cAAc,IAAI,QAAQ,cAAc,KAAK;AAEnD,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAI,OAAO;AACX,UAAI,IAAI,GAAG,QAAQ,CAAC,UAAU;AAC5B,gBAAQ;AAAA,MACV,CAAC;AAED,UAAI,IAAI,GAAG,OAAO,MAAM;AACtB,YAAI;AACF,cAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,gBAAI,OAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,UACxC,WAAW,YAAY,SAAS,mCAAmC,GAAG;AACpE,kBAAM,SAAS,IAAI,gBAAgB,IAAI;AACvC,kBAAM,OAA+B,CAAC;AACtC,mBAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7B,mBAAK,GAAG,IAAI;AAAA,YACd,CAAC;AACD,gBAAI,OAAO;AAAA,UACb,WAAW,YAAY,SAAS,YAAY,GAAG;AAC7C,gBAAI,OAAO;AAAA,UACb,OAAO;AACL,gBAAI,OAAO;AAAA,UACb;AACA,UAAAA,SAAQ;AAAA,QACV,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAED,UAAI,IAAI,GAAG,SAAS,CAAC,QAAQ;AAC3B,eAAO,GAAG;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;ARzBO,IAAM,SAAN,MAAa;AAAA,EAGlB,YAAoB,QAAgB;AAAhB;AAClB,SAAK,aAAa,aAAa,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,EAC9D;AAAA,EAFoB;AAAA,EAFZ;AAAA,EAMR,MAAc,cAAc,KAAsB,KAAoC;AACpF,UAAM,UAAU,IAAI,QAAQ,GAAG;AAC/B,UAAM,WAAW,IAAI,SAAS,GAAG;AACjC,UAAM,UAAU,IAAI,QAAQ,SAAS,QAAQ;AAE7C,QAAI;AACF,YAAM,WAAW,MAAM,OAAO;AAE9B,YAAM,SAAS,KAAK,OAAO,UAAU;AACrC,UAAI,eAAe;AAEnB,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,WAAW,QAAQ,QAAQ;AACnC,gBAAM,QAAQ,aAAa,MAAM,MAAM,MAAM,QAAQ,IAAI;AACzD,cAAI,MAAM,SAAS;AACjB,oBAAQ,SAAS,MAAM;AACvB,2BAAe;AACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,cAAM,iBAAiB,IAAI,SAAS,aAAa,aAAa,aAAa,OAAO;AAAA,MACpF,OAAO;AACL,iBAAS,SAAS,iBAAiB;AAAA,MACrC;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK;AACnB,eAAS,cAAc,uBAAuB;AAAA,IAChD;AAAA,EACF;AAAA,EAEO,OAAO,eAAuC,UAAmC;AACtF,UAAM,OAAO,OAAO,kBAAkB,WAAW,gBAAgB,cAAc,QAAQ;AACvF,UAAM,OAAO,OAAO,kBAAkB,WAAW,cAAc,QAAQ,YAAY;AAEnF,WAAO,KAAK,WAAW,OAAO,MAAM,MAAM,QAAQ;AAAA,EACpD;AAAA,EAEO,MAAM,UAAwC;AACnD,SAAK,WAAW,MAAM,QAAQ;AAC9B,WAAO;AAAA,EACT;AACF;;;ASjEO,IAAK,aAAL,kBAAKC,gBAAL;AACL,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,aAAU;AACV,EAAAA,YAAA,UAAO;AAPG,SAAAA;AAAA,GAAA;;;ACAL,SAAS,cAAcC,OAAsB;AAClD,MAAIA,UAAS,IAAK,QAAOA;AACzB,SAAOA,MAAK,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,EAAE,KAAK;AAC1D;;;ACQO,IAAM,SAAN,MAAM,QAAO;AAAA,EACV,SAAkB,CAAC;AAAA,EACnB,SAAiB;AAAA,EACjB,cAA4B,CAAC;AAAA,EAErC,YAAY,SAAiB,IAAI,cAA4B,CAAC,GAAG;AAC/D,SAAK,SAAS,cAAc,MAAM;AAClC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEO,OAAO,aAAiC;AAC7C,SAAK,YAAY,KAAK,GAAG,WAAW;AACpC,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,QAAgBC,OAAc,YAAwB,aAAiC;AACtG,UAAM,WAAW,cAAc,KAAK,SAAS,cAAcA,KAAI,CAAC;AAChE,SAAK,OAAO,KAAK;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,aAAa,CAAC,GAAG,KAAK,aAAa,GAAG,WAAW;AAAA,IACnD,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEO,IAAIA,OAAc,YAAwB,aAAiC;AAChF,WAAO,KAAK,0BAAyBA,OAAM,SAAS,GAAG,WAAW;AAAA,EACpE;AAAA,EAEO,KAAKA,OAAc,YAAwB,aAAiC;AACjF,WAAO,KAAK,4BAA0BA,OAAM,SAAS,GAAG,WAAW;AAAA,EACrE;AAAA,EAEO,IAAIA,OAAc,YAAwB,aAAiC;AAChF,WAAO,KAAK,0BAAyBA,OAAM,SAAS,GAAG,WAAW;AAAA,EACpE;AAAA,EAEO,MAAMA,OAAc,YAAwB,aAAiC;AAClF,WAAO,KAAK,8BAA2BA,OAAM,SAAS,GAAG,WAAW;AAAA,EACtE;AAAA,EAEO,OAAOA,OAAc,YAAwB,aAAiC;AACnF,WAAO,KAAK,gCAA4BA,OAAM,SAAS,GAAG,WAAW;AAAA,EACvE;AAAA,EAEO,QAAQA,OAAc,YAAwB,aAAiC;AACpF,WAAO,KAAK,kCAA6BA,OAAM,SAAS,GAAG,WAAW;AAAA,EACxE;AAAA,EAEO,KAAKA,OAAc,YAAwB,aAAiC;AACjF,WAAO,KAAK,4BAA0BA,OAAM,SAAS,GAAG,WAAW;AAAA,EACrE;AAAA,EAEO,MAAM,QAAgB,aAAuC,aAAiC;AACnG,UAAM,YAAY,IAAI,QAAO,KAAK,SAAS,cAAc,MAAM,GAAG,CAAC,GAAG,KAAK,aAAa,GAAG,WAAW,CAAC;AACvG,aAAS,SAAS;AAClB,SAAK,OAAO,KAAK,GAAG,UAAU,UAAU,CAAC;AACzC,WAAO;AAAA,EACT;AAAA,EAEO,YAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AACF;;;ACxEA,SAAS,yBAAyB;AAE3B,IAAM,MAAN,cAAkB,OAAO;AAAA,EACtB;AAAA,EAER,cAAc;AACZ,UAAM;AACN,SAAK,SAAS,IAAI,OAAO,IAAI;AAAA,EAC/B;AAAA,EAEO,OAAO,eAAuC,UAAmC;AACtF,UAAM,UAAU,OAAO,kBAAkB,WACrC,EAAE,MAAM,cAAc,IACtB;AAEJ,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,OAAO,QAAQ,QAAQ;AAE7B,UAAM,SAAS,KAAK,OAAO,OAAO,eAAe,MAAM;AACrD,WAAK,gBAAgB,MAAM,IAAI;AAC/B,UAAI,SAAU,UAAS;AAAA,IACzB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,MAAc,MAAoB;AACxD,UAAM,QAAQ,CAAC,SAAiB,WAAW,IAAI;AAC/C,UAAM,OAAO,CAAC,SAAiB,WAAW,IAAI;AAC9C,UAAM,OAAO,CAAC,SAAiB,WAAW,IAAI;AAC9C,UAAM,OAAO,CAAC,SAAiB,UAAU,IAAI;AAC7C,UAAM,MAAM,CAAC,SAAiB,UAAU,IAAI;AAC5C,UAAM,YAAY,CAAC,SAAiB,UAAU,IAAI;AAElD,YAAQ,IAAI;AAEZ,UAAM,WAAW,UAAU,SAAS,YAAY,cAAc,IAAI,IAAI,IAAI;AAC1E,YAAQ,IAAI,GAAG,MAAM,QAAG,CAAC,KAAK,KAAK,8BAA8B,CAAC,EAAE;AACpE,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAK,KAAK,QAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,MAAM,UAAU,KAAK,QAAQ,CAAC,CAAC,EAAE;AAE9E,UAAM,WAAW,KAAK,oBAAoB;AAC1C,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,QAAQ,aAAW;AAC1B,cAAM,aAAa,UAAU,QAAQ,OAAO,IAAI,IAAI;AACpD,gBAAQ,IAAI,KAAK,KAAK,QAAG,CAAC,KAAK,KAAK,GAAG,QAAQ,IAAI,GAAG,CAAC,KAAK,UAAU,KAAK,UAAU,CAAC,CAAC,EAAE;AAAA,MAC3F,CAAC;AAAA,IACH;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAK,IAAI,iCAAiC,CAAC,EAAE;AACzD,YAAQ,IAAI;AAAA,EACd;AAAA,EAEQ,sBAAgE;AACtE,UAAM,aAAa,kBAAkB;AACrC,UAAM,YAAsD,CAAC;AAE7D,eAAW,CAAC,MAAM,YAAY,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC7D,UAAI,CAAC,aAAc;AAEnB,iBAAW,OAAO,cAAc;AAC9B,YAAI,CAAC,IAAI,YAAY,IAAI,WAAW,QAAQ;AAC1C,oBAAU,KAAK;AAAA,YACb,MAAM,KAAK,eAAe,IAAI;AAAA,YAC9B,SAAS,IAAI;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,eAA+B;AACpD,UAAM,UAAkC;AAAA,MACtC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAEA,WAAO,QAAQ,aAAa,KAAK;AAAA,EACnC;AAAA,EAEO,MAAM,UAAwC;AACnD,YAAQ,IAAI,4CAA4C;AACxD,SAAK,OAAO,MAAM,CAAC,QAAQ;AACzB,UAAI,KAAK;AACP,gBAAQ,MAAM,2CAA2C,GAAG;AAAA,MAC9D,OAAO;AACL,gBAAQ,IAAI,gDAAgD;AAAA,MAC9D;AACA,UAAI,SAAU,UAAS,GAAG;AAAA,IAC5B,CAAC;AACD,WAAO;AAAA,EACT;AACF;;;ACpGO,SAAS,YAAiB;AAC/B,SAAO,IAAI,IAAI;AACjB;;;ACMO,SAAS,OAAO,UAAyB,CAAC,GAAe;AAC9D,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,eAAe,CAAC;AAAA,IAChB,WAAW;AAAA,EACb,IAAI;AAEJ,SAAO,OAAO,KAAK,SAAS;AAC1B,QAAI,UAAU,aAAa,OAAQ,QAAO,KAAK;AAE/C,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,EAAE,KAAK,IAAI,IAAI;AACrB,UAAM,MAAM,IAAI,OAAO;AAGvB,eAAW,WAAW,cAAc;AAClC,UAAI,mBAAmB,UAAU,QAAQ,KAAK,GAAG,EAAG,QAAO,KAAK;AAChE,UAAI,OAAO,YAAY,aAAa,QAAQ,WAAW,IAAI,WAAW,OAAO,GAAI,QAAO,KAAK;AAAA,IAC/F;AAGA,QAAI,cAAc;AAClB,QAAI,aAAa,IAAI,KAAK;AACxB,YAAM,aAAa,IAAI,IAAI,QAAQ,GAAG;AACtC,UAAI,eAAe,GAAI,eAAc,IAAI,IAAI,UAAU,UAAU;AAAA,IACnE;AAEA,QAAI,aAAa;AACjB,QAAI;AACF,YAAM,KAAK;AACX,mBAAa,IAAI,KAAK,cAAc;AAAA,IACtC,SAAS,KAAK;AACZ,mBAAa;AACb,YAAM;AAAA,IACR;AAEA,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,UAAM,SAAS,IAAI,UAAU;AAG7B,QAAI,aAAa,WAAW,aAAa,IAAK;AAC9C,QAAI,aAAa,WAAW,aAAa,IAAK;AAG9C,UAAM,QAAkB,CAAC;AACzB,UAAM,MAAM;AACZ,UAAM,QAAQ;AAEd,QAAI,eAAe;AACjB,YAAM,KAAK,GAAG,GAAG,KAAI,oBAAI,KAAK,GAAE,mBAAmB,CAAC,IAAI,KAAK,EAAE;AAAA,IACjE;AAGA,UAAM,eAAuC;AAAA,MAC3C,KAAK;AAAA,MAAY,MAAM;AAAA,MAAY,KAAK;AAAA,MACxC,QAAQ;AAAA,MAAY,OAAO;AAAA,IAC7B;AACA,UAAM,cAAc,aAAa,MAAM,KAAK;AAC5C,UAAM,KAAK,GAAG,WAAW,GAAG,OAAO,OAAO,CAAC,CAAC,GAAG,KAAK,EAAE;AAGtD,UAAM,KAAK,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,WAAW,GAAG,KAAK,EAAE;AAG7D,QAAI,cAAc;AAClB,QAAI,cAAc,IAAK,eAAc;AACrC,QAAI,cAAc,IAAK,eAAc;AACrC,UAAM,KAAK,GAAG,WAAW,GAAG,UAAU,GAAG,KAAK,EAAE;AAGhD,UAAM,gBAAgB,KAAK,MAAO,aAAa;AAC/C,UAAM,KAAK,GAAG,aAAa,GAAG,EAAE,KAAK,KAAK,EAAE;AAE5C,YAAQ,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EAC7B;AACF;AAGO,SAAS,YAAwB;AACtC,SAAO,OAAO,EAAE,eAAe,MAAM,UAAU,QAAQ,CAAC;AAC1D;AAGO,SAAS,aAAyB;AACvC,SAAO,OAAO,KAAK,SAAS;AAC1B,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,EAAE,KAAK,IAAI,IAAI;AAErB,UAAM,KAAK;AAEX,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAQ,IAAI;AAAA,MACZ,KAAK,IAAI;AAAA,MACT,QAAQ,IAAI,KAAK,cAAc;AAAA,MAC/B,UAAU;AAAA,IACZ,CAAC,CAAC;AAAA,EACJ;AACF;AAGO,SAAS,cAA0B;AACxC,SAAO,OAAO,EAAE,UAAU,SAAS,eAAe,KAAK,CAAC;AAC1D;AAGO,SAAS,iBAA6B;AAC3C,SAAO,OAAO;AAAA,IACZ,eAAe;AAAA,IACf,WAAW;AAAA,IACX,UAAU;AAAA,IACV,cAAc,CAAC,WAAW,OAAO;AAAA,EACnC,CAAC;AACH;;;ACrHO,SAAS,UAAU,SAAuC;AAC/D,QAAM,QAAQ,oBAAI,IAAkD;AAEpE,SAAO,OAAO,KAAK,SAAS;AAC1B,UAAM,KAAK,IAAI,IAAI,MAAM;AACzB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,MAAM,IAAI,EAAE;AAE3B,QAAI,CAAC,UAAU,MAAM,OAAO,WAAW;AACrC,YAAM,IAAI,IAAI;AAAA,QACZ,OAAO;AAAA,QACP,WAAW,MAAM,QAAQ;AAAA,MAC3B,CAAC;AACD,aAAO,KAAK;AAAA,IACd;AAEA,WAAO;AACP,QAAI,OAAO,QAAQ,QAAQ,KAAK;AAC9B,UAAI,IAAI,kCAAmC,EAAE,KAAK;AAAA,QAChD,SAAS;AAAA,QACT,SAAS,QAAQ,WAAW;AAAA,MAC9B,CAAC;AACD;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,EACd;AACF;;;ACnCA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,YAAY,kBAAkB;AAevC,IAAM,aAAqC;AAAA,EACzC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,YAAY,MAAc,UAAyB,CAAC,GAAe;AACjF,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,OAAO;AAAA,IACP,aAAa,CAAC;AAAA,IACd,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,IACd;AAAA,EACF,IAAI;AAEJ,QAAM,WAAgB,aAAQ,IAAI;AAElC,SAAO,OAAO,KAAK,SAAS;AAC1B,UAAM,EAAE,KAAK,IAAI,IAAI;AACrB,UAAM,MAAM,IAAI,OAAO;AAEvB,QAAI,WAAgB,UAAK,UAAU,GAAG;AAEtC,QAAI,CAAC,SAAS,WAAW,QAAQ,GAAG;AAClC,UAAI,CAAC,aAAa;AAChB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,CAAC;AAC3C;AAAA,MACF;AACA,aAAO,KAAK;AAAA,IACd;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,WAAW,KAAK,QAAQ;AAE3C,UAAI,KAAK,YAAY,GAAG;AACtB,YAAI,UAAU,OAAO;AACnB,qBAAgB,UAAK,UAAU,KAAe;AAC9C,cAAI;AACF,kBAAM,YAAY,MAAM,WAAW,KAAK,QAAQ;AAChD,kBAAM,UAAU,UAAU,WAAW,KAAK,OAAO;AACjD;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAEA,YAAI,CAAC,aAAa;AAChB,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,CAAC;AAC3C;AAAA,QACF;AACA,eAAO,KAAK;AAAA,MACd;AAEA,YAAM,UAAU,UAAU,MAAM,KAAK,OAAO;AAAA,IAE9C,SAAS,KAAU;AACjB,UAAI,IAAI,SAAS,UAAU;AACzB,YAAI,WAAW,SAAS,GAAG;AACzB,qBAAW,OAAO,YAAY;AAC5B,kBAAM,UAAU,WAAW;AAC3B,gBAAI;AACF,oBAAM,UAAU,MAAM,WAAW,KAAK,OAAO;AAC7C,oBAAM,UAAU,SAAS,SAAS,KAAK,OAAO;AAC9C;AAAA,YACF,QAAQ;AACN;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,aAAa;AAChB,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,CAAC;AAC3C;AAAA,QACF;AACA,eAAO,KAAK;AAAA,MACd;AAEA,UAAI,CAAC,aAAa;AAChB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;AAAA,MACF;AACA,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAEA,eAAe,UACb,UACA,MACA,KACA,SACe;AACf,QAAM,EAAE,KAAK,IAAI,IAAI;AACrB,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,YAAY;AAAA,IACZ;AAAA,EACF,IAAI;AAEJ,QAAM,MAAW,aAAQ,QAAQ,EAAE,YAAY;AAC/C,QAAM,cAAc,WAAW,GAAG,KAAK;AAEvC,MAAI,UAAU,gBAAgB,WAAW;AACzC,MAAI,UAAU,kBAAkB,KAAK,IAAI;AAEzC,MAAI,cAAc;AAChB,QAAI,UAAU,iBAAiB,KAAK,MAAM,YAAY,CAAC;AAAA,EACzD;AAEA,MAAI,MAAM;AACR,UAAM,YAAY,aAAa,IAAI;AACnC,QAAI,UAAU,QAAQ,SAAS;AAE/B,UAAM,cAAc,IAAI,QAAQ,eAAe;AAC/C,QAAI,gBAAgB,WAAW;AAC7B,UAAI,OAAO,GAAG;AACd,UAAI,IAAI,IAAI;AACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc;AAChB,UAAM,oBAAoB,YACtB,mBAAmB,MAAM,gBACzB,mBAAmB,MAAM;AAC7B,QAAI,UAAU,iBAAiB,iBAAiB;AAAA,EAClD;AAEA,MAAI,cAAc;AAChB,UAAM,kBAAkB,IAAI,QAAQ,mBAAmB;AACvD,QAAI,iBAAiB;AACnB,YAAM,sBAAsB,IAAI,KAAK,eAAe;AACpD,UAAI,KAAK,SAAS,qBAAqB;AACrC,YAAI,OAAO,GAAG;AACd,YAAI,IAAI,IAAI;AACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AACd,eAAW,KAAK,UAAU,IAAI;AAAA,EAChC;AAEA,QAAM,SAAY,oBAAiB,QAAQ;AAC3C,SAAO,KAAK,IAAI,GAAG;AAEnB,SAAO,GAAG,SAAS,MAAM;AACvB,QAAI,CAAC,IAAI,IAAI,aAAa;AACxB,UAAI,OAAO,GAAG;AACd,UAAI,IAAI,IAAI;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,MAAwB;AAC5C,QAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE,SAAS,EAAE;AAC9C,QAAM,OAAO,KAAK,KAAK,SAAS,EAAE;AAClC,SAAO,IAAI,IAAI,IAAI,KAAK;AAC1B;AAEO,SAAS,SAAS,UAA8B;AACrD,SAAO,OAAO,KAAK,SAAS;AAC1B,QAAI;AACF,YAAM,eAAoB,aAAQ,QAAQ;AAC1C,YAAM,OAAO,MAAM,WAAW,KAAK,YAAY;AAC/C,YAAM,UAAU,cAAc,MAAM,KAAK,CAAC,CAAC;AAAA,IAC7C,SAAS,KAAK;AACZ,UAAI,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,IACtD;AAAA,EACF;AACF;;;ACzNO,SAAS,SAAS,MAAgD;AACvE,SAAQ,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI;AAC1E;;;ACAO,SAAS,UAAyC,WAAc,SAAiB;AACtF,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,SAAS,QAAQ,MAAM;AAE7B,MAAI,SAAS,MAAM,KAAK,SAAS,MAAM,GAAG;AACxC,eAAW,OAAO,QAAQ;AACxB,UAAI,SAAS,OAAO,GAAG,CAAC,GAAG;AACzB,YAAI,CAAC,OAAO,GAAG,EAAG,QAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AACrD,kBAAU,OAAO,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,MACpC,OAAO;AACL,eAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,QAAQ,GAAG,OAAO;AACrC;;;AClBO,SAAS,YAAY,SAAiBC,OAAsC;AACjF,QAAM,SAAiC,CAAC;AACxC,QAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,QAAM,YAAYA,MAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEhD,eAAa,QAAQ,CAAC,MAAM,MAAM;AAChC,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB,YAAM,YAAY,KAAK,MAAM,CAAC;AAC9B,aAAO,SAAS,IAAI,UAAU,CAAC,KAAK;AAAA,IACtC;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":["HttpStatus","path","resolve","HttpMethod","path","path","path"]}
{"version":3,"sources":["../src/core/Server.ts","../src/utils/parseQuery.ts","../src/core/Request.ts","../src/http/status.ts","../src/core/Response.ts","../src/core/Context.ts","../src/core/RouteMatcher.ts","../src/core/MiddlewareRunner.ts","../src/core/BodyParser.ts","../src/http/methods.ts","../src/utils/normalize.ts","../src/core/Router.ts","../src/app/App.ts","../src/app/createApp.ts","../src/middleware/Logger.ts","../src/middleware/RateLimit.ts","../src/middleware/Static.ts","../src/utils/isObject.ts","../src/utils/merge.ts","../src/utils/parseParams.ts"],"sourcesContent":["import { createServer, IncomingMessage, ServerResponse, Server as NodeServer } from 'node:http';\nimport { Request } from './Request';\nimport { Response } from './Response';\nimport { Context } from './Context';\nimport { Router } from './Router';\nimport { RouteMatcher } from './RouteMatcher';\nimport { MiddlewareRunner } from './MiddlewareRunner';\nimport { BodyParser } from './BodyParser';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n}\n\nexport class Server {\n private nodeServer: NodeServer;\n\n constructor(private router: Router) {\n this.nodeServer = createServer(this.handleRequest.bind(this));\n }\n\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const request = new Request(req);\n const response = new Response(res);\n const context = new Context(request, response);\n\n try {\n await BodyParser.parse(request);\n\n const routes = this.router.getRoutes();\n let matchedRoute = null;\n\n for (const route of routes) {\n if (route.method === request.method) {\n const match = RouteMatcher.match(route.path, request.path);\n if (match.matches) {\n request.params = match.params;\n matchedRoute = route;\n break;\n }\n }\n }\n\n if (matchedRoute) {\n await MiddlewareRunner.run(context, matchedRoute.middlewares, matchedRoute.handler);\n } else {\n response.notFound('Route Not Found');\n }\n } catch (error) {\n console.error(error);\n response.internalError('Internal Server Error');\n }\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const port = typeof optionsOrPort === 'number' ? optionsOrPort : optionsOrPort.port || 3000;\n const host = typeof optionsOrPort === 'object' ? optionsOrPort.host || '0.0.0.0' : '0.0.0.0';\n\n return this.nodeServer.listen(port, host, callback);\n }\n\n public close(callback?: (err?: Error) => void): this {\n this.nodeServer.close(callback);\n return this;\n }\n}\n","export function parseQuery(url: string): Record<string, string | string[]> {\n const query: Record<string, string | string[]> = {};\n const queryString = url.split('?')[1];\n \n if (!queryString) return query;\n\n const pairs = queryString.split('&');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (!key) continue;\n \n const decodedKey = decodeURIComponent(key);\n const decodedValue = value ? decodeURIComponent(value) : '';\n\n const existing = query[decodedKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n query[decodedKey] = [existing, decodedValue];\n }\n } else {\n query[decodedKey] = decodedValue;\n }\n }\n\n return query;\n}\n","import { IncomingMessage } from 'node:http';\nimport { parseQuery } from '../utils/parseQuery';\n\nexport class Request {\n public params: Record<string, string> = {};\n public query: Record<string, string | string[]> = {};\n public body: any = null;\n public headers: IncomingMessage['headers'];\n public ip: string | undefined;\n public method: string;\n public path: string;\n public url: string;\n public originalUrl: string;\n\n constructor(private rawRequest: IncomingMessage) {\n this.headers = rawRequest.headers;\n this.method = rawRequest.method || 'GET';\n this.url = rawRequest.url || '/';\n this.originalUrl = rawRequest.url || '/';\n this.path = this.url.split('?')[0] || '/';\n this.query = parseQuery(this.url);\n this.ip = rawRequest.socket.remoteAddress;\n }\n\n get raw(): IncomingMessage {\n return this.rawRequest;\n }\n}\n","export enum HttpStatus {\n CONTINUE = 100,\n SWITCHING_PROTOCOLS = 101,\n PROCESSING = 102,\n EARLY_HINTS = 103,\n OK = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NON_AUTHORITATIVE_INFORMATION = 203,\n NO_CONTENT = 204,\n RESET_CONTENT = 205,\n PARTIAL_CONTENT = 206,\n MULTI_STATUS = 207,\n ALREADY_REPORTED = 208,\n IM_USED = 226,\n MULTIPLE_CHOICES = 300,\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n SEE_OTHER = 303,\n NOT_MODIFIED = 304,\n USE_PROXY = 305,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n PROXY_AUTHENTICATION_REQUIRED = 407,\n REQUEST_TIMEOUT = 408,\n CONFLICT = 409,\n GONE = 410,\n LENGTH_REQUIRED = 411,\n PRECONDITION_FAILED = 412,\n PAYLOAD_TOO_LARGE = 413,\n URI_TOO_LONG = 414,\n UNSUPPORTED_MEDIA_TYPE = 415,\n RANGE_NOT_SATISFIABLE = 416,\n EXPECTATION_FAILED = 417,\n IM_A_TEAPOT = 418,\n MISDIRECTED_REQUEST = 421,\n UNPROCESSABLE_ENTITY = 422,\n LOCKED = 423,\n FAILED_DEPENDENCY = 424,\n TOO_EARLY = 425,\n UPGRADE_REQUIRED = 426,\n PRECONDITION_REQUIRED = 428,\n TOO_MANY_REQUESTS = 429,\n REQUEST_HEADER_FIELDS_TOO_LARGE = 431,\n UNAVAILABLE_FOR_LEGAL_REASONS = 451,\n INTERNAL_SERVER_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n HTTP_VERSION_NOT_SUPPORTED = 505,\n VARIANT_ALSO_NEGOTIATES = 506,\n INSUFFICIENT_STORAGE = 507,\n LOOP_DETECTED = 508,\n BANDWIDTH_LIMIT_EXCEEDED = 509,\n NOT_EXTENDED = 510,\n NETWORK_AUTHENTICATION_REQUIRED = 511,\n}\n","import { ServerResponse } from 'node:http';\nimport { HttpStatus } from '../http/status';\n\nexport class Response {\n constructor(private rawResponse: ServerResponse) {}\n\n public status(code: number): this {\n this.rawResponse.statusCode = code;\n return this;\n }\n\n public setHeader(name: string, value: string | string[]): this {\n this.rawResponse.setHeader(name, value);\n return this;\n }\n\n public send(data: any): void {\n if (typeof data === 'string') {\n this.rawResponse.setHeader('Content-Type', 'text/plain');\n this.rawResponse.end(data);\n } else if (Buffer.isBuffer(data)) {\n this.rawResponse.end(data);\n } else {\n this.json(data);\n }\n }\n\n public json(data: any): void {\n const body = JSON.stringify(data);\n this.rawResponse.setHeader('Content-Type', 'application/json');\n this.rawResponse.end(body);\n }\n\n public success(data: any): void {\n this.status(HttpStatus.OK).json({\n success: true,\n data,\n });\n }\n\n public created(data: any): void {\n this.status(HttpStatus.CREATED).json({\n success: true,\n data,\n });\n }\n\n public error(message: string, code: number = HttpStatus.INTERNAL_SERVER_ERROR): void {\n this.status(code).json({\n success: false,\n message,\n });\n }\n\n public badRequest(message: string = 'Bad Request'): void {\n this.error(message, HttpStatus.BAD_REQUEST);\n }\n\n public unauthorized(message: string = 'Unauthorized'): void {\n this.error(message, HttpStatus.UNAUTHORIZED);\n }\n\n public forbidden(message: string = 'Forbidden'): void {\n this.error(message, HttpStatus.FORBIDDEN);\n }\n\n public notFound(message: string = 'Not Found'): void {\n this.error(message, HttpStatus.NOT_FOUND);\n }\n\n public conflict(message: string = 'Conflict'): void {\n this.error(message, HttpStatus.CONFLICT);\n }\n\n public internalError(message: string = 'Internal Server Error'): void {\n this.error(message, HttpStatus.INTERNAL_SERVER_ERROR);\n }\n\n get raw(): ServerResponse {\n return this.rawResponse;\n }\n}\n","import { Request } from './Request';\nimport { Response } from './Response';\n\nexport class Context {\n constructor(\n public readonly req: Request,\n public readonly res: Response\n ) {}\n}\n","export interface MatchResult {\n matches: boolean;\n params: Record<string, string>;\n}\n\nexport class RouteMatcher {\n public static match(pattern: string, path: string): MatchResult {\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return { matches: false, params: {} };\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i]!;\n const pathPart = pathParts[i]!;\n\n if (patternPart.startsWith(':')) {\n const paramName = patternPart.slice(1);\n params[paramName] = pathPart;\n } else if (patternPart !== pathPart) {\n return { matches: false, params: {} };\n }\n }\n\n return { matches: true, params };\n }\n}\n","import { Context } from './Context';\n\nexport type NextFunction = (err?: any) => void | Promise<void>;\nexport type Middleware = (ctx: Context, next: NextFunction) => void | Promise<void>;\n\nexport class MiddlewareRunner {\n public static async run(\n ctx: Context,\n middlewares: Middleware[],\n handler: Middleware\n ): Promise<void> {\n const allMiddlewares = [...middlewares, handler];\n let index = 0;\n\n const next: NextFunction = async (err?: any) => {\n if (err) {\n throw err;\n }\n\n if (index < allMiddlewares.length) {\n const middleware = allMiddlewares[index++];\n if (middleware) {\n await middleware(ctx, next);\n }\n }\n };\n\n await next();\n }\n}\n","import { Request } from './Request';\n\nexport class BodyParser {\n public static async parse(req: Request): Promise<void> {\n const contentType = req.headers['content-type'] || '';\n \n return new Promise((resolve, reject) => {\n let data = '';\n req.raw.on('data', (chunk) => {\n data += chunk;\n });\n\n req.raw.on('end', () => {\n try {\n if (contentType.includes('application/json')) {\n req.body = data ? JSON.parse(data) : {};\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const params = new URLSearchParams(data);\n const body: Record<string, string> = {};\n params.forEach((value, key) => {\n body[key] = value;\n });\n req.body = body;\n } else if (contentType.includes('text/plain')) {\n req.body = data;\n } else {\n req.body = data;\n }\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n\n req.raw.on('error', (err) => {\n reject(err);\n });\n });\n }\n}\n","export enum HttpMethod {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n PATCH = 'PATCH',\n DELETE = 'DELETE',\n OPTIONS = 'OPTIONS',\n HEAD = 'HEAD',\n}\n\nexport type HttpMethodType = keyof typeof HttpMethod | Lowercase<keyof typeof HttpMethod>;\n","export function normalizePath(path: string): string {\n if (path === '/') return path;\n return path.replace(/\\/+/g, '/').replace(/\\/+$/, '') || '/';\n}\n","import { Middleware } from './MiddlewareRunner';\nimport { HttpMethod } from '../http/methods';\nimport { normalizePath } from '../utils/normalize';\n\nexport interface Route {\n method: string;\n path: string;\n handler: Middleware;\n middlewares: Middleware[];\n}\n\nexport class Router {\n private routes: Route[] = [];\n private prefix: string = '';\n private middlewares: Middleware[] = [];\n\n constructor(prefix: string = '', middlewares: Middleware[] = []) {\n this.prefix = normalizePath(prefix);\n this.middlewares = middlewares;\n }\n\n public use(...middlewares: Middleware[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n private addRoute(method: string, path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n const fullPath = normalizePath(this.prefix + normalizePath(path));\n this.routes.push({\n method,\n path: fullPath,\n handler,\n middlewares: [...this.middlewares, ...middlewares],\n });\n return this;\n }\n\n public get(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.GET, path, handler, ...middlewares);\n }\n\n public post(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.POST, path, handler, ...middlewares);\n }\n\n public put(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PUT, path, handler, ...middlewares);\n }\n\n public patch(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.PATCH, path, handler, ...middlewares);\n }\n\n public delete(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.DELETE, path, handler, ...middlewares);\n }\n\n public options(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.OPTIONS, path, handler, ...middlewares);\n }\n\n public head(path: string, handler: Middleware, ...middlewares: Middleware[]): this {\n return this.addRoute(HttpMethod.HEAD, path, handler, ...middlewares);\n }\n\n public group(prefix: string, callback: (router: Router) => void, ...middlewares: Middleware[]): this {\n const subRouter = new Router(this.prefix + normalizePath(prefix), [...this.middlewares, ...middlewares]);\n callback(subRouter);\n this.routes.push(...subRouter.getRoutes());\n return this;\n }\n\n public getRoutes(): Route[] {\n return this.routes;\n }\n}\n","import { Server, ServerOptions } from '../core/Server';\nimport { Router } from '../core/Router';\nimport { Server as NodeServer } from 'node:http';\nimport { networkInterfaces } from 'node:os';\n\nexport class App extends Router {\n private server: Server;\n\n constructor() {\n super();\n this.server = new Server(this);\n }\n\n public listen(optionsOrPort: number | ServerOptions, callback?: () => void): NodeServer {\n const options = typeof optionsOrPort === 'number' \n ? { port: optionsOrPort } \n : optionsOrPort;\n \n const port = options.port || 3000;\n const host = options.host || 'localhost';\n \n const server = this.server.listen(optionsOrPort, () => {\n this.printServerInfo(port, host);\n if (callback) callback();\n });\n \n return server;\n }\n\n private printServerInfo(port: number, host: string): void {\n const green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\n const cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\n const blue = (text: string) => `\\x1b[34m${text}\\x1b[0m`;\n const bold = (text: string) => `\\x1b[1m${text}\\x1b[0m`;\n const dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\n const underline = (text: string) => `\\x1b[4m${text}\\x1b[0m`;\n \n console.log();\n \n const localUrl = `http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;\n console.log(`${green('✓')} ${bold('Server started successfully!')}`);\n console.log();\n console.log(` ${bold('➜')} ${cyan('Local:')} ${underline(blue(localUrl))}`);\n \n const networks = this.getNetworkAddresses();\n if (networks.length > 0) {\n networks.forEach(network => {\n const networkUrl = `http://${network.address}:${port}`;\n console.log(` ${bold('➜')} ${cyan(`${network.name}:`)} ${underline(blue(networkUrl))}`);\n });\n }\n \n console.log();\n console.log(` ${dim('Press Ctrl+C to stop the server')}`);\n console.log();\n }\n\n private getNetworkAddresses(): Array<{ name: string; address: string }> {\n const interfaces = networkInterfaces();\n const addresses: Array<{ name: string; address: string }> = [];\n \n for (const [name, netInterface] of Object.entries(interfaces)) {\n if (!netInterface) continue;\n \n for (const net of netInterface) {\n if (!net.internal && net.family === 'IPv4') {\n addresses.push({\n name: this.getNetworkName(name),\n address: net.address\n });\n }\n }\n }\n \n return addresses;\n }\n\n private getNetworkName(interfaceName: string): string {\n const nameMap: Record<string, string> = {\n 'en0': 'WiFi',\n 'en1': 'Ethernet',\n 'eth0': 'Ethernet',\n 'wlan0': 'WiFi',\n 'enp0s3': 'Network',\n 'ens33': 'Network'\n };\n \n return nameMap[interfaceName] || interfaceName;\n }\n\n public close(callback?: (err?: Error) => void): this {\n console.log('\\x1b[33m\\n Shutting down server...\\x1b[0m');\n this.server.close((err) => {\n if (err) {\n console.error('\\x1b[31m Error during shutdown:\\x1b[0m', err);\n } else {\n console.log('\\x1b[32m Server stopped successfully\\n\\x1b[0m');\n }\n if (callback) callback(err);\n });\n return this;\n }\n}","import { App } from './App';\n\nexport function createApp(): App {\n return new App();\n}\n","import { Middleware } from '../core/MiddlewareRunner';\n\ninterface LoggerOptions {\n silent?: boolean;\n showTimestamp?: boolean;\n showQuery?: boolean;\n excludePaths?: (string | RegExp)[];\n logLevel?: 'info' | 'debug' | 'error' | 'none';\n}\n\nexport function logger(options: LoggerOptions = {}): Middleware {\n const {\n silent = false,\n showTimestamp = true,\n showQuery = false,\n excludePaths = [],\n logLevel = 'info',\n } = options;\n\n return async (ctx, next) => {\n if (silent || logLevel === 'none') return next();\n\n const start = Date.now();\n const { req, res } = ctx;\n const url = req.url || '/';\n \n // Check exclude paths\n for (const pattern of excludePaths) {\n if (pattern instanceof RegExp && pattern.test(url)) return next();\n if (typeof pattern === 'string' && (url === pattern || url.startsWith(pattern))) return next();\n }\n \n // Parse query if needed\n let queryString = '';\n if (showQuery && req.url) {\n const queryIndex = req.url.indexOf('?');\n if (queryIndex !== -1) queryString = req.url.substring(queryIndex);\n }\n \n let statusCode = 200;\n try {\n await next();\n statusCode = res.raw?.statusCode || 200;\n } catch (err) {\n statusCode = 500;\n throw err;\n }\n \n const ms = Date.now() - start;\n const method = req.method || 'GET';\n \n // Filter by log level\n if (logLevel === 'error' && statusCode < 400) return;\n if (logLevel === 'debug' && statusCode < 300) return;\n \n // Format output\n const parts: string[] = [];\n const dim = '\\x1b[2m';\n const reset = '\\x1b[0m';\n \n if (showTimestamp) {\n parts.push(`${dim}[${new Date().toLocaleTimeString()}]${reset}`);\n }\n \n // Method color\n const methodColors: Record<string, string> = {\n GET: '\\x1b[34m', POST: '\\x1b[32m', PUT: '\\x1b[33m',\n DELETE: '\\x1b[31m', PATCH: '\\x1b[35m'\n };\n const methodColor = methodColors[method] || '\\x1b[37m';\n parts.push(`${methodColor}${method.padEnd(6)}${reset}`);\n \n // URL with query\n parts.push(`${url.split('?')[0]}${dim}${queryString}${reset}`);\n \n // Status color\n let statusColor = '\\x1b[32m';\n if (statusCode >= 400) statusColor = '\\x1b[33m';\n if (statusCode >= 500) statusColor = '\\x1b[31m';\n parts.push(`${statusColor}${statusCode}${reset}`);\n \n // Duration\n const durationColor = ms > 1000 ? '\\x1b[33m' : dim;\n parts.push(`${durationColor}${ms}ms${reset}`);\n \n console.log(parts.join(' '));\n };\n}\n\n// Development logger\nexport function devLogger(): Middleware {\n return logger({ showTimestamp: true, logLevel: 'debug' });\n}\n\n// Production logger (JSON format)\nexport function prodLogger(): Middleware {\n return async (ctx, next) => {\n const start = Date.now();\n const { req, res } = ctx;\n \n await next();\n \n const ms = Date.now() - start;\n console.log(JSON.stringify({\n timestamp: new Date().toISOString(),\n method: req.method,\n url: req.url,\n status: res.raw?.statusCode || 200,\n duration: ms,\n }));\n };\n}\n\n// Only log errors\nexport function errorLogger(): Middleware {\n return logger({ logLevel: 'error', showTimestamp: true });\n}\n\n// Detailed logging\nexport function detailedLogger(): Middleware {\n return logger({ \n showTimestamp: true, \n showQuery: true, \n logLevel: 'debug',\n excludePaths: ['/health', '/ping']\n });\n}","import { Middleware } from '../core/MiddlewareRunner';\nimport { HttpStatus } from '../http/status';\n\nexport interface RateLimitOptions {\n windowMs: number;\n max: number;\n message?: string;\n}\n\nexport function rateLimit(options: RateLimitOptions): Middleware {\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (ctx, next) => {\n const ip = ctx.req.ip || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, {\n count: 1,\n resetTime: now + options.windowMs,\n });\n return next();\n }\n\n record.count++;\n if (record.count > options.max) {\n ctx.res.status(HttpStatus.TOO_MANY_REQUESTS).json({\n success: false,\n message: options.message || 'Too many requests',\n });\n return;\n }\n\n return next();\n };\n}\n","import { Middleware } from '../core/MiddlewareRunner';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promises as fsPromises } from 'node:fs';\n\ninterface StaticOptions {\n dotfiles?: 'allow' | 'deny' | 'ignore';\n etag?: boolean;\n extensions?: string[];\n index?: string;\n maxAge?: number;\n cacheControl?: boolean;\n lastModified?: boolean;\n immutable?: boolean;\n fallthrough?: boolean;\n setHeaders?: (res: any, path: string, stat: fs.Stats) => void;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.mjs': 'application/javascript',\n '.json': 'application/json',\n '.map': 'application/json',\n '.xml': 'application/xml',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.pdf': 'application/pdf',\n '.doc': 'application/msword',\n '.docx':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx':\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx':\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.zip': 'application/zip',\n '.rar': 'application/x-rar-compressed',\n '.7z': 'application/x-7z-compressed',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tiff': 'image/tiff',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.eot': 'application/vnd.ms-fontobject',\n '.wasm': 'application/wasm',\n '.manifest': 'text/cache-manifest',\n '.webmanifest': 'application/manifest+json',\n};\n\nfunction setCacheHeaders(\n res: any,\n maxAge: number,\n immutable: boolean\n): void {\n let value: string;\n\n if (maxAge === 0) {\n value = 'no-cache, must-revalidate';\n } else {\n value = `public, max-age=${maxAge}`;\n\n if (immutable) {\n value += ', immutable';\n }\n }\n\n res.setHeader('Cache-Control', value);\n}\n\nexport function staticFiles(\n root: string,\n options: StaticOptions = {}\n): Middleware {\n const {\n dotfiles = 'ignore',\n etag = true,\n extensions = [],\n index = 'index.html',\n maxAge = 0,\n cacheControl = true,\n lastModified = true,\n immutable = false,\n fallthrough = true,\n setHeaders,\n } = options;\n\n const rootPath = path.resolve(root);\n\n return async (ctx, next) => {\n const { req, res } = ctx;\n\n let url = req.url || '/';\n url = url.split('?')[0] || '/';\n\n if (dotfiles !== 'allow') {\n const basename = path.basename(url);\n\n if (basename.startsWith('.')) {\n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n\n return next();\n }\n }\n\n let filePath = path.resolve(rootPath, `.${url}`);\n\n if (!filePath.startsWith(rootPath)) {\n if (!fallthrough) {\n res.status(403).json({ error: 'Forbidden' });\n return;\n }\n\n return next();\n }\n\n const serveFile = async (\n targetPath: string,\n stat: fs.Stats\n ): Promise<void> => {\n const ext = path.extname(targetPath).toLowerCase();\n const contentType =\n MIME_TYPES[ext] ?? 'application/octet-stream';\n\n res.setHeader('Content-Type', contentType);\n res.setHeader('Content-Length', String(stat.size));\n\n if (lastModified) {\n res.setHeader(\n 'Last-Modified',\n stat.mtime.toUTCString()\n );\n }\n\n if (etag) {\n const etagValue = generateEtag(stat);\n\n res.setHeader('ETag', etagValue);\n\n const ifNoneMatch = req.headers['if-none-match'];\n\n if (\n typeof ifNoneMatch === 'string' &&\n ifNoneMatch === etagValue\n ) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n\n if (cacheControl) {\n setCacheHeaders(res, maxAge, immutable);\n }\n\n if (lastModified) {\n const ifModifiedSince =\n req.headers['if-modified-since'];\n\n if (typeof ifModifiedSince === 'string') {\n const modifiedDate = new Date(ifModifiedSince);\n\n if (\n !Number.isNaN(modifiedDate.getTime()) &&\n stat.mtime <= modifiedDate\n ) {\n res.status(304);\n res.raw.end();\n return;\n }\n }\n }\n\n if (setHeaders) {\n setHeaders(res, targetPath, stat);\n }\n\n const stream = fs.createReadStream(targetPath);\n\n stream.pipe(res.raw);\n\n stream.on('error', () => {\n if (!res.raw.headersSent) {\n res.status(500);\n res.raw.end();\n }\n });\n\n res.raw.on('finish', () => {\n stream.destroy();\n });\n };\n\n try {\n let stat = await fsPromises.stat(filePath);\n\n if (stat.isDirectory()) {\n const indexPath = path.join(filePath, index);\n\n stat = await fsPromises.stat(indexPath);\n filePath = indexPath;\n }\n\n await serveFile(filePath, stat);\n return;\n } catch (err: any) {\n if (err?.code === 'ENOENT') {\n for (const extension of extensions) {\n const extPath = `${filePath}${extension}`;\n\n try {\n const stat = await fsPromises.stat(extPath);\n\n await serveFile(extPath, stat);\n return;\n } catch {}\n }\n\n if (!fallthrough) {\n res.status(404).json({ error: 'Not Found' });\n return;\n }\n\n return next();\n }\n\n if (!fallthrough) {\n res\n .status(500)\n .json({ error: 'Internal Server Error' });\n\n return;\n }\n\n return next();\n }\n };\n}\n\nfunction generateEtag(stat: fs.Stats): string {\n const mtime = stat.mtime.getTime().toString(16);\n const size = stat.size.toString(16);\n\n return `\"${size}-${mtime}\"`;\n}\n\nexport function sendFile(filePath: string): Middleware {\n return async (ctx) => {\n try {\n const resolvedPath = path.resolve(filePath);\n\n const stat = await fsPromises.stat(resolvedPath);\n\n const ext = path.extname(resolvedPath).toLowerCase();\n\n const contentType =\n MIME_TYPES[ext] ?? 'application/octet-stream';\n\n ctx.res.setHeader('Content-Type', contentType);\n ctx.res.setHeader('Content-Length', String(stat.size));\n\n const stream = fs.createReadStream(resolvedPath);\n\n stream.pipe(ctx.res.raw);\n\n stream.on('error', () => {\n if (!ctx.res.raw.headersSent) {\n ctx.res.status(500);\n ctx.res.raw.end();\n }\n });\n } catch {\n ctx.res.status(404).json({\n error: 'File not found',\n });\n }\n };\n}","export function isObject(item: unknown): item is Record<string, unknown> {\n return (item !== null && typeof item === 'object' && !Array.isArray(item));\n}\n","import { isObject } from './isObject';\n\nexport function mergeDeep<T extends Record<string, any>>(target: T, ...sources: T[]): T {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n mergeDeep(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return mergeDeep(target, ...sources);\n}\n","export function parseParams(pattern: string, path: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = path.split('/').filter(Boolean);\n\n patternParts.forEach((part, i) => {\n if (part.startsWith(':')) {\n const paramName = part.slice(1);\n params[paramName] = pathParts[i] || '';\n }\n });\n\n return params;\n}\n"],"mappings":"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","names":["HttpStatus","path","resolve","HttpMethod","path","path","basename","path"]}

@@ -135,3 +135,3 @@ import { IncomingMessage, ServerResponse, Server as Server$1 } from 'node:http';

extensions?: string[];
index?: string | false;
index?: string;
maxAge?: number;

@@ -138,0 +138,0 @@ cacheControl?: boolean;

@@ -135,3 +135,3 @@ import { IncomingMessage, ServerResponse, Server as Server$1 } from 'node:http';

extensions?: string[];
index?: string | false;
index?: string;
maxAge?: number;

@@ -138,0 +138,0 @@ cacheControl?: boolean;

{
"name": "@threew/app",
"version": "1.0.4",
"version": "1.0.5",
"main": "./dist/cjs/index.cjs",

@@ -5,0 +5,0 @@ "module": "./dist/esm/index.js",