@je-es/server 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mod/db.ts","../src/mod/router.ts","../src/mod/security.ts","../src/mod/logger.ts","../src/types.d.ts","../src/main.ts"],"names":["DB","path","Database","schema","sql","index","indexSql","tableName","table","conditions","whereConditions","column","value","id","data","lastId","callback","error","params","builder","self","columns","condition","whereClauses","cond","placeholders","val","direction","count","setClauses","col","updateValues","result","results","columnDefs","def","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references","Router","method","key","route","match","staticRoutes","handler","colonIndex","dynamicRoutes","r","config","pattern","existingIndex","SecurityManager","max","windowMs","now","record","sessionId","ttl","token","crypto","stored","html","input","ip","status","duration","first","Logger","level","pretty","msg","levelNum","ts","safeData","output","str","AppError","message","statusCode","code","ValidationError","issues","DatabaseError","TimeoutError","RateLimitError","security","router","server","port","hostname","maxReqSize","requestTimeout","gracefulShutdownTimeout","logCfg","logger","dbs","routes","activeRequests","cleanupInterval","handleRequest","request","startTime","requestId","getClientIp","contentLength","corsHeaders","handleCors","rateLimitCfg","rateLimitKey","body","parseBody","defaultDb","routeMatch","ctx","createAppContext","controller","timeoutPromise","_","reject","response","resHeaders","errorMessage","healthRoute","c","readinessRoute","dbConnected","ready","m","bunServer","instance","dbConfigs","dbCfg","dbName","db","tableSchema","url","deadline","resolve","e","maxSize","contentType","parseCookies","cookieHeader","cookies","pairs","pair","valueParts","query","headers","cookieStore","parsedCookies","file","options","cookie","h","forwarded","realIp","corsConfig","origin","methods","allowedHeaders","main_default"],"mappings":"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","file":"main.js","sourcesContent":["// src/mod/db.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Database } from 'bun:sqlite'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type ColumnType = 'INTEGER' | 'TEXT' | 'REAL' | 'BLOB' | 'NUMERIC'\r\n export type SqlValue = string | number | boolean | null | Uint8Array\r\n\r\n export interface ColumnDefinition {\r\n name : string\r\n type : ColumnType\r\n primaryKey? : boolean\r\n autoIncrement? : boolean\r\n notNull? : boolean\r\n unique? : boolean\r\n default? : SqlValue\r\n references? : { table: string; column: string }\r\n }\r\n\r\n export interface TableSchema {\r\n name : string\r\n columns : ColumnDefinition[]\r\n indexes? : { name: string; columns: string[]; unique?: boolean }[]\r\n }\r\n\r\n export interface WhereCondition {\r\n column : string\r\n operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL'\r\n value? : SqlValue | SqlValue[]\r\n }\r\n\r\n export interface QueryBuilder {\r\n select : (columns?: string[]) => QueryBuilder\r\n from : (table: string) => QueryBuilder\r\n where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder\r\n and : (condition: WhereCondition) => QueryBuilder\r\n or : (condition: WhereCondition) => QueryBuilder\r\n orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder\r\n limit : (count: number) => QueryBuilder\r\n offset : (count: number) => QueryBuilder\r\n insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n update : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n delete : (table: string) => QueryBuilder\r\n execute : () => any[]\r\n executeOne : () => any | null\r\n executeRaw : (sql: string, params?: SqlValue[]) => any[]\r\n raw : (sql: string, params?: SqlValue[]) => QueryBuilder\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class DB {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private db : Database\r\n private schemas : Map<string, TableSchema> = new Map()\r\n private currentQuery : string = ''\r\n private currentParams : SqlValue[] = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\r\n\r\n constructor(path: string = ':memory:') {\r\n this.db = new Database(path)\r\n this.db.exec('PRAGMA foreign_keys = ON')\r\n }\r\n\r\n close() {\r\n this.db.close()\r\n }\r\n\r\n // ════════ Schema Management ════════\r\n defineSchema(schema: TableSchema): void {\r\n this.schemas.set(schema.name, schema)\r\n const sql = this.generateCreateTableSQL(schema)\r\n this.db.exec(sql)\r\n\r\n // Create indexes\r\n if (schema.indexes) {\r\n for (const index of schema.indexes) {\r\n const uniqueStr = index.unique ? 'UNIQUE' : ''\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`\r\n this.db.exec(indexSql)\r\n }\r\n }\r\n }\r\n\r\n getSchema(tableName: string): TableSchema | undefined {\r\n return this.schemas.get(tableName)\r\n }\r\n\r\n listTables(): string[] {\r\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all()\r\n return result.map((r: any) => r.name)\r\n }\r\n\r\n dropTable(tableName: string): void {\r\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`)\r\n this.schemas.delete(tableName)\r\n }\r\n\r\n // ════════ Query Builder ════════\r\n query(): QueryBuilder {\r\n this.reset()\r\n return this.createQueryBuilder()\r\n }\r\n\r\n // ════════ Quick Operations ════════\r\n find(table: string, conditions: Record<string, SqlValue>): any[] {\r\n const whereConditions: WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n }))\r\n\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(whereConditions)\r\n .execute()\r\n }\r\n\r\n findOne(table: string, conditions: Record<string, SqlValue>): any | null {\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n })))\r\n .limit(1)\r\n .executeOne()\r\n }\r\n\r\n findById(table: string, id: number | string): any | null {\r\n return this.findOne(table, { id })\r\n }\r\n\r\n all(table: string): any[] {\r\n return this.query().select().from(table).execute()\r\n }\r\n\r\n insert(table: string, data: Record<string, SqlValue>): any {\r\n this.query().insert(table, data).execute()\r\n\r\n // Return inserted row\r\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as any\r\n return this.findById(table, lastId.id)\r\n }\r\n\r\n update(table: string, id: number | string, data: Record<string, SqlValue>): any | null {\r\n this.query()\r\n .update(table, data)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return this.findById(table, id)\r\n }\r\n\r\n delete(table: string, id: number | string): boolean {\r\n const result = this.query()\r\n .delete(table)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return true\r\n }\r\n\r\n // ════════ Transactions ════════\r\n transaction(callback: (db: DB) => void): void {\r\n this.db.exec('BEGIN TRANSACTION')\r\n try {\r\n callback(this)\r\n this.db.exec('COMMIT')\r\n } catch (error) {\r\n this.db.exec('ROLLBACK')\r\n throw error\r\n }\r\n }\r\n\r\n // ════════ Raw SQL ════════\r\n exec(sql: string): void {\r\n this.db.exec(sql)\r\n }\r\n\r\n raw(sql: string, params: SqlValue[] = []): any[] {\r\n const stmt = this.db.query(sql)\r\n return stmt.all(...params) as any[]\r\n }\r\n\r\n rawOne(sql: string, params: SqlValue[] = []): any | null {\r\n const stmt = this.db.query(sql)\r\n return stmt.get(...params) as any | null\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private reset(): void {\r\n this.currentQuery = ''\r\n this.currentParams = []\r\n }\r\n\r\n private createQueryBuilder(): QueryBuilder {\r\n const builder: any = {\r\n _select: ['*'],\r\n _from: '',\r\n _where: [] as string[],\r\n _orderBy: '',\r\n _limit: null as number | null,\r\n _offset: null as number | null,\r\n _isInsert: false,\r\n _isUpdate: false,\r\n _isDelete: false,\r\n _insertData: null as Record<string, SqlValue> | null,\r\n _updateData: null as Record<string, SqlValue> | null\r\n }\r\n\r\n const self = this\r\n\r\n builder.select = function(columns?: string[]) {\r\n this._select = columns || ['*']\r\n return this\r\n }\r\n\r\n builder.from = function(table: string) {\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.where = function(condition: WhereCondition | WhereCondition[]) {\r\n const conditions = Array.isArray(condition) ? condition : [condition]\r\n\r\n const whereClauses = conditions.map(cond => {\r\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\r\n return `${cond.column} ${cond.operator}`\r\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\r\n const placeholders = cond.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n cond.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n return `${cond.column} IN (${placeholders})`\r\n } else {\r\n self.currentParams.push(cond.value as SqlValue)\r\n return `${cond.column} ${cond.operator} ?`\r\n }\r\n })\r\n\r\n this._where.push(...whereClauses)\r\n return this\r\n }\r\n\r\n builder.and = function(condition: WhereCondition) {\r\n return this.where(condition)\r\n }\r\n\r\n builder.or = function(condition: WhereCondition) {\r\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\r\n this._where.push(`OR ${condition.column} ${condition.operator}`)\r\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\r\n const placeholders = condition.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n condition.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n this._where.push(`OR ${condition.column} IN (${placeholders})`)\r\n } else {\r\n self.currentParams.push(condition.value as SqlValue)\r\n this._where.push(`OR ${condition.column} ${condition.operator} ?`)\r\n }\r\n return this\r\n }\r\n\r\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC') {\r\n this._orderBy = `ORDER BY ${column} ${direction}`\r\n return this\r\n }\r\n\r\n builder.limit = function(count: number) {\r\n this._limit = count\r\n return this\r\n }\r\n\r\n builder.offset = function(count: number) {\r\n this._offset = count\r\n return this\r\n }\r\n\r\n builder.insert = function(table: string, data: Record<string, SqlValue>) {\r\n this._isInsert = true\r\n this._from = table\r\n this._insertData = data\r\n return this\r\n }\r\n\r\n builder.update = function(table: string, data: Record<string, SqlValue>) {\r\n this._isUpdate = true\r\n this._from = table\r\n this._updateData = data\r\n return this\r\n }\r\n\r\n builder.delete = function(table: string) {\r\n this._isDelete = true\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.raw = function(sql: string, params: SqlValue[] = []) {\r\n self.currentQuery = sql\r\n self.currentParams = params\r\n return this\r\n }\r\n\r\n builder.execute = function() {\r\n let sql = ''\r\n\r\n if (this._isInsert && this._insertData) {\r\n const columns = Object.keys(this._insertData)\r\n const placeholders = columns.map(() => '?').join(', ')\r\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`\r\n self.currentParams = Object.values(this._insertData)\r\n } else if (this._isUpdate && this._updateData) {\r\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`)\r\n const updateValues = Object.values(this._updateData)\r\n self.currentParams = [...updateValues, ...self.currentParams] as SqlValue[]\r\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else if (this._isDelete) {\r\n sql = `DELETE FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else {\r\n // SELECT query\r\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n\r\n if (this._orderBy) {\r\n sql += ` ${this._orderBy}`\r\n }\r\n\r\n if (this._limit !== null) {\r\n sql += ` LIMIT ${this._limit}`\r\n }\r\n\r\n if (this._offset !== null) {\r\n sql += ` OFFSET ${this._offset}`\r\n }\r\n }\r\n\r\n if (!sql && self.currentQuery) {\r\n sql = self.currentQuery\r\n }\r\n\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...self.currentParams) as unknown[]\r\n self.reset()\r\n return result as any[]\r\n }\r\n\r\n builder.executeOne = function() {\r\n const results = this.execute()\r\n return results.length > 0 ? results[0] : null\r\n }\r\n\r\n builder.executeRaw = function(sql: string, params: SqlValue[] = []) {\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...params) as unknown[]\r\n return result as any[]\r\n }\r\n\r\n return builder as QueryBuilder\r\n }\r\n\r\n private generateCreateTableSQL(schema: TableSchema): string {\r\n const columnDefs = schema.columns.map(col => {\r\n let def = `${col.name} ${col.type}`\r\n\r\n if (col.primaryKey) {\r\n def += ' PRIMARY KEY'\r\n if (col.autoIncrement) {\r\n def += ' AUTOINCREMENT'\r\n }\r\n }\r\n\r\n if (col.notNull && !col.primaryKey) {\r\n def += ' NOT NULL'\r\n }\r\n\r\n if (col.unique) {\r\n def += ' UNIQUE'\r\n }\r\n\r\n if (col.default !== undefined) {\r\n if (typeof col.default === 'string') {\r\n def += ` DEFAULT '${col.default}'`\r\n } else if (col.default === null) {\r\n def += ' DEFAULT NULL'\r\n } else {\r\n def += ` DEFAULT ${col.default}`\r\n }\r\n }\r\n\r\n if (col.references) {\r\n def += ` REFERENCES ${col.references.table}(${col.references.column})`\r\n }\r\n\r\n return def\r\n })\r\n\r\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${columnDefs.join(', ')})`\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // ════════ Schema Builder Helpers ════════\r\n export function table(name: string, columns: ColumnDefinition[]): TableSchema {\r\n return { name, columns }\r\n }\r\n\r\n export function column(name: string, type: ColumnType): ColumnDefinition {\r\n return { name, type }\r\n }\r\n\r\n export function integer(name: string): ColumnDefinition {\r\n return { name, type: 'INTEGER' }\r\n }\r\n\r\n export function text(name: string): ColumnDefinition {\r\n return { name, type: 'TEXT' }\r\n }\r\n\r\n export function real(name: string): ColumnDefinition {\r\n return { name, type: 'REAL' }\r\n }\r\n\r\n export function blob(name: string): ColumnDefinition {\r\n return { name, type: 'BLOB' }\r\n }\r\n\r\n export function numeric(name: string): ColumnDefinition {\r\n return { name, type: 'NUMERIC' }\r\n }\r\n\r\n // ════════ Column Modifiers ════════\r\n export function primaryKey(col: ColumnDefinition, autoIncrement = false): ColumnDefinition {\r\n return { ...col, primaryKey: true, autoIncrement }\r\n }\r\n\r\n export function notNull(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, notNull: true }\r\n }\r\n\r\n export function unique(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, unique: true }\r\n }\r\n\r\n export function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition {\r\n return { ...col, default: value }\r\n }\r\n\r\n export function references(col: ColumnDefinition, table: string, column: string): ColumnDefinition {\r\n return { ...col, references: { table, column } }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/router.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n\texport interface RegexRoute {\r\n\t\tpattern\t\t: RegExp\r\n\t\tmethod\t\t: string\r\n\t\thandler\t\t: any\r\n\t\tkey\t\t\t: string\r\n\t}\r\n\r\n\texport type RegexRoutes = Array<RegexRoute>\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Router {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate routes \t\t\t= new Map<string, any>()\r\n\t\t\tprivate regexRoutes\t\t: RegexRoutes = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tmatch(method: string, path: string): { handler: any; params: Record<string, string> } | null {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\t// Try static route first (faster)\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\treturn { handler: this.routes.get(key), params: {} }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Try dynamic routes\r\n\t\t\t\tfor (const route of this.regexRoutes) {\r\n\t\t\t\tif (route.method === method) {\r\n\t\t\t\t\tconst match = path.match(route.pattern)\r\n\t\t\t\t\tif (match?.groups) {\r\n\t\t\t\t\treturn { handler: route.handler, params: match.groups }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tgetAll() {\r\n\t\t\t\tconst staticRoutes = Array.from(this.routes.entries()).map(([key, handler]) => {\r\n\t\t\t\tconst colonIndex = key.indexOf(':')\r\n\t\t\t\tconst method = key.substring(0, colonIndex)\r\n\t\t\t\tconst path = key.substring(colonIndex + 1)\r\n\t\t\t\treturn { method, path, handler }\r\n\t\t\t\t})\r\n\r\n\t\t\t\tconst dynamicRoutes = this.regexRoutes.map(route => {\r\n\t\t\t\tconst colonIndex = route.key.indexOf(':')\r\n\t\t\t\treturn {\r\n\t\t\t\t\tmethod: route.method,\r\n\t\t\t\t\tpath: route.key.substring(colonIndex + 1),\r\n\t\t\t\t\thandler: route.handler\r\n\t\t\t\t}\r\n\t\t\t\t})\r\n\r\n\t\t\t\treturn [...staticRoutes, ...dynamicRoutes]\r\n\t\t\t}\r\n\r\n\t\t\tclear() {\r\n\t\t\t\tthis.routes.clear()\r\n\t\t\t\tthis.regexRoutes = []\r\n\t\t\t}\r\n\r\n\t\t\tremove(method: string, path: string): boolean {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\tthis.routes.delete(key)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst index = this.regexRoutes.findIndex(r => r.key === key)\r\n\t\t\t\tif (index >= 0) {\r\n\t\t\t\tthis.regexRoutes.splice(index, 1)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\tregister(method: string, path: string, handler: any, config: any = {}) {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (path.includes(':')) {\r\n\t\t\t\t// Dynamic route with params\r\n\t\t\t\tconst pattern = this.pathToRegex(path)\r\n\r\n\t\t\t\t// Check if route already exists to prevent duplicates\r\n\t\t\t\tconst existingIndex = this.regexRoutes.findIndex(r => r.key === key)\r\n\r\n\t\t\t\tconst route = {\r\n\t\t\t\t\tpattern,\r\n\t\t\t\t\tmethod,\r\n\t\t\t\t\thandler,\r\n\t\t\t\t\tkey\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (existingIndex >= 0) {\r\n\t\t\t\t\t// Update existing route\r\n\t\t\t\t\tthis.regexRoutes[existingIndex] = route\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Add new route\r\n\t\t\t\t\tthis.regexRoutes.push(route)\r\n\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t// Static route\r\n\t\t\t\tthis.routes.set(key, handler)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate pathToRegex(path: string): RegExp {\r\n\t\t\t\t// Escape special regex characters except ':'\r\n\t\t\t\tconst escaped = path.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n\t\t\t\t// Replace :param with named capture groups\r\n\t\t\t\tconst pattern = escaped.replace(/:(\\w+)/g, '(?<$1>[^/]+)')\r\n\t\t\t\treturn new RegExp(`^${pattern}$`)\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/security.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import crypto from 'crypto'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class SecurityManager {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate rateLimitStore \t= new Map<string, { count: number; reset: number }>()\r\n\t\t\tprivate csrfTokens \t\t= new Map<string, { sessionId: string; expires: number }>()\r\n\t\t\tprivate requestLog\t\t= new Map<string, any>()\r\n\r\n\t\t\tprivate readonly MAX_REQUEST_LOG_SIZE = 1000\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\t// Rate Limiting with proper overflow handling\r\n\t\t\tcheckRateLimit(key: string, max: number, windowMs: number): boolean {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tconst record = this.rateLimitStore.get(key)\r\n\r\n\t\t\tif (record) {\r\n\t\t\t\tif (now < record.reset) {\r\n\t\t\t\t// Within the current window\r\n\t\t\t\tif (record.count >= max) {\r\n\t\t\t\t\treturn false // Rate limit exceeded\r\n\t\t\t\t}\r\n\t\t\t\trecord.count++\r\n\t\t\t\treturn true\r\n\t\t\t\t} else {\r\n\t\t\t\t// Window expired, reset\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// First request for this key\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup old rate limit records\r\n\t\t\tcleanupRateLimit() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [key, record] of this.rateLimitStore.entries()) {\r\n\t\t\t\tif (now > record.reset) {\r\n\t\t\t\tthis.rateLimitStore.delete(key)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// CSRF Token Generation with TTL\r\n\t\t\tgenerateCsrfToken(sessionId: string, ttl = 3600000): string {\r\n\t\t\tconst token = crypto.randomBytes(32).toString('hex')\r\n\t\t\tthis.csrfTokens.set(token, {\r\n\t\t\t\tsessionId,\r\n\t\t\t\texpires: Date.now() + ttl\r\n\t\t\t})\r\n\t\t\treturn token\r\n\t\t\t}\r\n\r\n\t\t\t// Validate CSRF Token with expiration check\r\n\t\t\tvalidateCsrfToken(token: string, sessionId: string): boolean {\r\n\t\t\tconst stored = this.csrfTokens.get(token)\r\n\r\n\t\t\tif (!stored) {\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Check if token has expired\r\n\t\t\tif (Date.now() > stored.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Validate session ID\r\n\t\t\tif (stored.sessionId === sessionId) {\r\n\t\t\t\tthis.csrfTokens.delete(token) // One-time use\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\r\n\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup expired CSRF tokens\r\n\t\t\tcleanupCsrfTokens() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [token, data] of this.csrfTokens.entries()) {\r\n\t\t\t\tif (now > data.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// HTML Sanitization - comprehensive\r\n\t\t\tsanitizeHtml(html: string): string {\r\n\t\t\tif (!html) return ''\r\n\r\n\t\t\treturn html\r\n\t\t\t\t.replace(/&/g, '&amp;')\r\n\t\t\t\t.replace(/</g, '&lt;')\r\n\t\t\t\t.replace(/>/g, '&gt;')\r\n\t\t\t\t.replace(/\"/g, '&quot;')\r\n\t\t\t\t.replace(/'/g, '&#x27;')\r\n\t\t\t\t.replace(/\\//g, '&#x2F;')\r\n\t\t\t}\r\n\r\n\t\t\t// SQL Injection Prevention\r\n\t\t\tsanitizeSql(input: string): string {\r\n\t\t\tif (!input) return ''\r\n\r\n\t\t\treturn input\r\n\t\t\t\t.replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\r\n\t\t\t\t.replace(/;/g, '') // Remove semicolons to prevent multi-statement injection\r\n\t\t\t\t.replace(/'/g, \"''\") // Escape single quotes (SQL standard)\r\n\t\t\t\t.replace(/\"/g, '\\\\\"') // Escape double quotes\r\n\t\t\t\t.replace(/\\x00/g, '') // Remove null bytes\r\n\t\t\t}\r\n\r\n\t\t\t// Log request for audit trail with size limit\r\n\t\t\tlogRequest(\r\n\t\t\tid: string,\r\n\t\t\tmethod: string,\r\n\t\t\tpath: string,\r\n\t\t\tip: string,\r\n\t\t\tstatus: number,\r\n\t\t\tduration: number\r\n\t\t\t) {\r\n\t\t\tthis.requestLog.set(id, {\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\tmethod,\r\n\t\t\t\tpath,\r\n\t\t\t\tip,\r\n\t\t\t\tstatus,\r\n\t\t\t\tduration\r\n\t\t\t})\r\n\r\n\t\t\t// Keep only last MAX_REQUEST_LOG_SIZE requests\r\n\t\t\tif (this.requestLog.size > this.MAX_REQUEST_LOG_SIZE) {\r\n\t\t\t\tconst { value: first } = this.requestLog.keys().next() || { value: null }\r\n\t\t\t\tif (first) {\r\n\t\t\t\tthis.requestLog.delete(first)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Get request log by ID\r\n\t\t\tgetRequestLog(id: string) {\r\n\t\t\treturn this.requestLog.get(id)\r\n\t\t\t}\r\n\r\n\t\t\t// Get all request logs\r\n\t\t\tgetAllRequestLogs() {\r\n\t\t\treturn Array.from(this.requestLog.values())\r\n\t\t\t}\r\n\r\n\t\t\t// Clear all\r\n\t\t\tclearAll() {\r\n\t\t\tthis.rateLimitStore.clear()\r\n\t\t\tthis.csrfTokens.clear()\r\n\t\t\tthis.requestLog.clear()\r\n\t\t\t}\r\n\r\n\t\t\t// Get stats\r\n\t\t\tgetStats() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\trateLimitEntries: this.rateLimitStore.size,\r\n\t\t\t\t\tcsrfTokens: this.csrfTokens.size,\r\n\t\t\t\t\trequestLogs: this.requestLog.size\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/logger.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n\texport class Logger {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate level\t: number \t= 1\r\n\t\t\tprivate pretty\t: boolean \t= false\r\n\t\t\tprivate levels\t\t\t\t= { debug: 0, info: 1, warn: 2, error: 3, fatal: 4 }\r\n\r\n\t\t\tconstructor(level: 'debug' | 'info' | 'warn' | 'error' = 'info', pretty = false) {\r\n\t\t\t\tthis.level \t= this.levels[level] ?? 1\r\n\t\t\t\tthis.pretty = pretty\r\n\t\t\t}\r\n\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tdebug(data: any, msg?: string) {\r\n\t\t\t\tthis.log('debug', this.levels.debug, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tinfo(data: any, msg?: string) {\r\n\t\t\t\tthis.log('info', this.levels.info, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\twarn(data: any, msg?: string) {\r\n\t\t\t\tthis.log('warn', this.levels.warn, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\terror(data: any, msg?: string) {\r\n\t\t\t\tthis.log('error', this.levels.error, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tfatal(data: any, msg?: string) {\r\n\t\t\t\tthis.log('fatal', this.levels.fatal, data, msg)\r\n\t\t\t\t// Fatal errors might need additional handling in production\r\n\t\t\t\tif (process.env.NODE_ENV === 'production') {\r\n\t\t\t\t\t// Could send to external logging service here\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate log(level: string, levelNum: number, data: any, msg?: string) {\r\n\t\t\t\tif (levelNum < this.level) return\r\n\r\n\t\t\t\tconst ts = new Date().toISOString()\r\n\r\n\t\t\t\t// Handle null/undefined data gracefully\r\n\t\t\t\tconst safeData = data ?? {}\r\n\r\n\t\t\t\tconst output = {\r\n\t\t\t\t\ttimestamp\t: ts,\r\n\t\t\t\t\tlevel\t\t: level.toUpperCase(),\r\n\t\t\t\t\tmessage\t\t: msg || 'No message',\r\n\t\t\t\t\t...safeData\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst str = this.pretty\r\n\t\t\t\t? `[${ts}] ${level.toUpperCase()} ${msg || 'No message'}\\n${JSON.stringify(safeData, null, 2)}`\r\n\t\t\t\t: JSON.stringify(output)\r\n\r\n\t\t\t\tif (level === 'error' || level === 'fatal') {\r\n\t\t\t\t\tconsole.error(str)\r\n\t\t\t\t} else if (level === 'warn') {\r\n\t\t\t\t\tconsole.warn(str)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log(str)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\t}\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/types.d.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD'\r\n export type RouteHandler = (c: AppContext) => any | Promise<any>\r\n export type AppMiddleware = (c: AppContext, next: () => Promise<void>) => void | Promise<void>\r\n\r\n export interface AppContext {\r\n request : Request\r\n params : Record<string, string>\r\n query : Record<string, any>\r\n body : any\r\n headers : Headers\r\n db : any\r\n logger : Logger | null\r\n user? : any\r\n requestId : string\r\n\r\n // Response methods\r\n json (data: any, status?: number): Response\r\n text (data: string, status?: number): Response\r\n html (data: string, status?: number): Response\r\n redirect (url: string, status?: number): Response\r\n file (path: string, contentType?: string): Response\r\n\r\n // Cookie methods\r\n setCookie (name: string, value: string, options?: CookieOptions): AppContext\r\n getCookie (name: string): string | undefined\r\n deleteCookie (name: string, options?: Partial<CookieOptions>): AppContext\r\n\r\n // Header methods\r\n setHeader(key: string, value: string): AppContext\r\n getHeader(key: string): string | undefined\r\n\r\n // Status code\r\n status(code: number): AppContext\r\n statusCode: number\r\n }\r\n\r\n export interface CookieOptions {\r\n maxAge? : number\r\n expires? : Date\r\n path? : string\r\n domain? : string\r\n secure? : boolean\r\n httpOnly? : boolean\r\n sameSite? : 'Strict' | 'Lax' | 'None'\r\n }\r\n\r\n export interface RouteDefinition {\r\n method : HttpMethod | HttpMethod[]\r\n path : string\r\n handler : RouteHandler\r\n validate? : { body?: any, query?: any, params?: any }\r\n middlewares? : AppMiddleware[]\r\n timeout? : number\r\n rateLimit? : { max: number; windowMs: number }\r\n cache? : number\r\n tags? : string[]\r\n }\r\n\r\n export interface DatabaseConfig {\r\n name? : string\r\n connection : string // File path or ':memory:'\r\n schema? : Record<string, any>\r\n timeout? : number\r\n }\r\n\r\n export interface SecurityConfig {\r\n cors? : boolean | CorsConfig\r\n rateLimit? : boolean | RateLimitConfig\r\n csrf? : boolean | CsrfConfig\r\n helmet? : boolean | HelmetConfig\r\n auth? : boolean | AuthConfig\r\n validation? : boolean\r\n sanitize? : boolean\r\n }\r\n\r\n export interface CorsConfig {\r\n origin? : string | string[] | ((origin: string) => boolean)\r\n methods? : HttpMethod[]\r\n allowedHeaders? : string[]\r\n credentials? : boolean\r\n maxAge? : number\r\n }\r\n\r\n export interface RateLimitConfig {\r\n windowMs? : number\r\n max? : number\r\n keyGenerator? : (c: AppContext) => string\r\n message? : string\r\n }\r\n\r\n export interface CsrfConfig {\r\n secret? : string\r\n headerName? : string\r\n tokenTTL? : number\r\n }\r\n\r\n export interface HelmetConfig {\r\n contentSecurityPolicy? : Record<string, string[]> | boolean\r\n hsts? : boolean | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean }\r\n frameguard? : boolean | { action: 'deny' | 'sameorigin' }\r\n noSniff? : boolean\r\n xssFilter? : boolean\r\n referrerPolicy? : string | boolean\r\n }\r\n\r\n export interface AuthConfig {\r\n jwt? : boolean | { secret: string; expiresIn?: string }\r\n apiKey? : boolean | { header?: string }\r\n bearer? : boolean\r\n }\r\n\r\n export interface ServerConfig {\r\n port? : number\r\n hostname? : string\r\n requestTimeout? : number\r\n maxRequestSize? : number\r\n maxJsonSize? : number\r\n\r\n database? : DatabaseConfig | DatabaseConfig[]\r\n\r\n security? : boolean | SecurityConfig\r\n\r\n compression? : boolean | { threshold?: number }\r\n\r\n logging? : boolean | { level?: 'debug' | 'info' | 'warn' | 'error'; pretty?: boolean }\r\n\r\n routes? : RouteDefinition[]\r\n middlewares? : AppMiddleware[]\r\n\r\n errorHandler? : (error: Error, context: AppContext) => void | Promise<void>\r\n onShutdown? : () => void | Promise<void>\r\n\r\n apiPrefix? : string\r\n apiVersion? : string\r\n\r\n gracefulShutdownTimeout?: number\r\n }\r\n\r\n export interface ServerInstance {\r\n app : any\r\n logger : Logger | null\r\n db : Map<string, any>\r\n bunServer : any\r\n start : () => Promise<void>\r\n stop : () => Promise<void>\r\n addRoute : (route: RouteDefinition) => void\r\n getRoutes : () => RouteDefinition[]\r\n }\r\n\r\n export interface Logger {\r\n debug (data: any, msg?: string): void\r\n info (data: any, msg?: string): void\r\n warn (data: any, msg?: string): void\r\n error (data: any, msg?: string): void\r\n fatal (data: any, msg?: string): void\r\n }\r\n\r\n export class AppError extends Error {\r\n constructor(public message: string, public statusCode: number = 500, public code?: string) {\r\n super(message)\r\n this.name = 'AppError'\r\n }\r\n }\r\n\r\n export class ValidationError extends AppError {\r\n constructor(message: string, public issues?: any) {\r\n super(message, 400, 'VALIDATION_ERROR')\r\n this.name = 'ValidationError'\r\n }\r\n }\r\n\r\n export class DatabaseError extends AppError {\r\n constructor(message: string) {\r\n super(message, 500, 'DATABASE_ERROR')\r\n this.name = 'DatabaseError'\r\n }\r\n }\r\n\r\n export class TimeoutError extends AppError {\r\n constructor(message = 'Request timeout') {\r\n super(message, 408, 'TIMEOUT_ERROR')\r\n this.name = 'TimeoutError'\r\n }\r\n }\r\n\r\n export class RateLimitError extends AppError {\r\n constructor(message = 'Too many requests') {\r\n super(message, 429, 'RATE_LIMIT_ERROR')\r\n this.name = 'RateLimitError'\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\n//\n// Developed with ❤️ by Maysara.\n\n\n\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\n\n import { DB } from './mod/db'\n import { Router } from './mod/router'\n import { SecurityManager } from './mod/security'\n import { Logger } \tfrom './mod/logger'\n import * as types from './types.d'\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\n\n const security = new SecurityManager()\n const router = new Router()\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\n\n export function server(config: types.ServerConfig = {}): types.ServerInstance {\n\n\t\t// ════════ Configuration ════════\n\t\tconst port = config.port || 3000\n\t\tconst hostname = config.hostname || 'localhost'\n\t\tconst maxReqSize = config.maxRequestSize || 10 * 1024 * 1024\n\t\tconst requestTimeout = config.requestTimeout || 30000\n\t\tconst gracefulShutdownTimeout = config.gracefulShutdownTimeout || 10000\n\n\t\tconst logCfg = typeof config.logging === 'object' ? config.logging : {}\n\t\tconst logger = config.logging ? new Logger(logCfg.level || 'info', logCfg.pretty) : null\n\n\t\tconst dbs = new Map<string, any>()\n\t\tconst routes: types.RouteDefinition[] = []\n\t\tconst activeRequests = new Set<string>()\n\n\t\t// ════════ Cleanup intervals ════════\n const cleanupInterval = setInterval(() => {\n security.cleanupRateLimit()\n security.cleanupCsrfTokens()\n }, 2 * 60 * 1000)\n\n async function handleRequest(request: Request): Promise<Response> {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n const url = new URL(request.url)\n const path = url.pathname\n const method = request.method.toUpperCase()\n const ip = getClientIp(request)\n\n activeRequests.add(requestId)\n\n try {\n // Check request size from header\n const contentLength = request.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > maxReqSize) {\n\n logger?.warn({ requestId, size: contentLength, ip }, 'Request too large')\n\n return new Response(JSON.stringify({ error: 'Payload too large' }), {\n\t\t\t\t\t\tstatus\t: 413,\n\t\t\t\t\t\theaders\t: { 'Content-Type': 'application/json' }\n })\n }\n\n // CORS handling\n const corsHeaders = handleCors(request, config)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders })\n }\n\n // Rate limiting\n if (config.security && typeof config.security === 'object' && config.security.rateLimit) {\n const rateLimitCfg = typeof config.security.rateLimit === 'object'\n ? config.security.rateLimit\n : {}\n const max = rateLimitCfg.max || 100\n const windowMs = rateLimitCfg.windowMs || 60000\n const rateLimitKey = rateLimitCfg.keyGenerator\n ? rateLimitCfg.keyGenerator({ request, ip } as any)\n : ip\n\n if (!security.checkRateLimit(rateLimitKey, max, windowMs)) {\n logger?.warn({ requestId, ip, key: rateLimitKey }, 'Rate limit exceeded')\n return new Response(\n JSON.stringify({ error: rateLimitCfg.message || 'Too many requests' }),\n { status: 429, headers: { 'Content-Type': 'application/json' } }\n )\n }\n }\n\n // Parse body\n let body: any = null\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n body = await parseBody(request, logger, maxReqSize)\n }\n\n // Get database\n const defaultDb = dbs.get('default')\n\n // Match route\n const routeMatch = router.match(method, path)\n if (!routeMatch) {\n const ctx = createAppContext(request, {}, defaultDb, logger, requestId)\n logger?.warn({ requestId, method, path, ip }, 'Route not found')\n return ctx.json({ error: 'Not Found', path }, 404)\n }\n\n const ctx = createAppContext(request, routeMatch.params || {}, defaultDb, logger, requestId)\n ctx.body = body\n ctx.request = request\n\n // Execute route handler with timeout\n const controller = new AbortController()\n const timeoutPromise = new Promise<never>((_, reject) => {\n const id = setTimeout(() => {\n controller.abort()\n reject(new types.TimeoutError('Request timeout'))\n }, requestTimeout)\n controller.signal.addEventListener('abort', () => clearTimeout(id))\n })\n\n const response = await Promise.race([\n routeMatch.handler(ctx),\n timeoutPromise\n ]) as Response\n\n // Merge CORS and security headers\n const resHeaders = new Headers(response.headers)\n corsHeaders.forEach((value, key) => {\n if (!resHeaders.has(key)) resHeaders.set(key, value)\n })\n\n resHeaders.set('X-Request-ID', requestId)\n resHeaders.set('X-Content-Type-Options', 'nosniff')\n resHeaders.set('X-Frame-Options', 'DENY')\n resHeaders.set('X-XSS-Protection', '1; mode=block')\n resHeaders.set('Referrer-Policy', 'strict-origin-when-cross-origin')\n\n // Audit log\n const duration = Date.now() - startTime\n security.logRequest(requestId, method, path, ip, response.status, duration)\n logger?.info({\n requestId,\n method,\n path,\n status: response.status,\n duration,\n ip\n }, 'Request completed')\n\n return new Response(response.body, {\n status: response.status,\n headers: resHeaders\n })\n } catch (error) {\n if (error instanceof types.AppError) {\n logger?.warn({ error: error.message, requestId, ip }, `App error: ${error.message}`)\n return new Response(\n JSON.stringify({\n error\t: error.message,\n code\t: error.code,\n requestId\n }),\n { status: error.statusCode, headers: { 'Content-Type': 'application/json' } }\n )\n }\n\n logger?.error({ error: String(error), requestId, ip }, 'Unhandled error')\n\n const errorMessage = process.env.NODE_ENV === 'production'\n ? 'Internal Server Error'\n : (error as Error).message\n\n return new Response(\n JSON.stringify({ error: errorMessage, requestId }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n )\n } finally {\n activeRequests.delete(requestId)\n }\n }\n\n // ════════ Health & Readiness routes ════════\n const healthRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/health',\n handler : (c: types.AppContext) => c.json({\n status : 'healthy',\n timestamp : new Date().toISOString(),\n uptime : process.uptime(),\n activeRequests : activeRequests.size\n })\n }\n\n const readinessRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/readiness',\n handler : (c: types.AppContext) => {\n const dbConnected = dbs.size > 0\n const ready = dbConnected || dbs.size === 0\n return c.json({\n ready,\n checks : {\n database : dbConnected ? 'connected' : 'not configured',\n activeRequests : activeRequests.size\n },\n timestamp: new Date().toISOString()\n }, ready ? 200 : 503)\n }\n }\n\n // ════════ Register routes ════════\n if (config.routes) {\n config.routes.forEach(route => {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n })\n }\n\n routes.push(healthRoute, readinessRoute)\n router.register('GET', '/health', healthRoute.handler, healthRoute)\n router.register('GET', '/readiness', readinessRoute.handler, readinessRoute)\n\n let bunServer: any = null\n\n const instance: types.ServerInstance = {\n app : null,\n logger,\n db : dbs,\n bunServer : null,\n\n async start() {\n // Initialize databases with our custom DB solution\n if (config.database) {\n const dbConfigs = Array.isArray(config.database) ? config.database : [config.database]\n for (const dbCfg of dbConfigs) {\n const dbName = dbCfg.name || 'default'\n\n try {\n if (typeof dbCfg.connection === 'string') {\n // Create DB instance with connection string\n const db = new DB(dbCfg.connection)\n\n // Define schemas if provided\n if (dbCfg.schema && typeof dbCfg.schema === 'object') {\n for (const [tableName, tableSchema] of Object.entries(dbCfg.schema)) {\n if (tableSchema && typeof tableSchema === 'object') {\n db.defineSchema(tableSchema as any)\n }\n }\n }\n\n dbs.set(dbName, db)\n\n logger?.info({\n name: dbName,\n connection: dbCfg.connection\n }, '✅ Database connected')\n } else {\n throw new Error(`Database connection must be a string path (got ${typeof dbCfg.connection})`)\n }\n } catch (error) {\n logger?.error({\n error: String(error),\n name: dbName\n }, 'Failed to connect to database')\n throw error\n }\n }\n }\n\n bunServer = Bun.serve({ port, hostname, fetch: handleRequest })\n instance.bunServer = bunServer\n\n const url = `http://${hostname}:${port}`\n console.log(\n `→ URL: ${url}` + `\\n` +\n `→ Environment: ${(process.env.NODE_ENV || 'development')}` + `\\n` +\n `→ Routes: ${routes.length.toString()}` + `\\n` +\n `→ Database: ${(dbs.size > 0 ? '✅ Connected' : '❌ None')}` + `\\n` +\n `→ Security: ${(config.security ? '✅ ENABLED' : '❌ Disabled')}` + `\\n` +\n `\\n` +\n `🔍 Health: ${url}/health` + `\\n` +\n `🔍 Ready: ${url}/readiness`+ `\\n`\n )\n\n logger?.info({ url }, 'Server started')\n },\n\n async stop() {\n logger?.info('Stopping server...')\n\n // Wait for active requests to complete\n if (activeRequests.size > 0) {\n logger?.info({ count: activeRequests.size }, 'Waiting for active requests...')\n const deadline = Date.now() + gracefulShutdownTimeout\n\n while (activeRequests.size > 0 && Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n if (activeRequests.size > 0) {\n logger?.warn({ count: activeRequests.size }, 'Force closing with active requests')\n }\n }\n\n clearInterval(cleanupInterval)\n\n if (config.onShutdown) {\n try {\n await config.onShutdown()\n } catch (e) {\n logger?.error({ error: String(e) }, 'Error in shutdown handler')\n }\n }\n\n // Close database connections\n for (const [name, db] of dbs.entries()) {\n try {\n if (db && typeof db.close === 'function') {\n db.close()\n }\n logger?.info({ name }, 'Database closed')\n } catch (e) {\n logger?.error({ error: String(e), name }, 'Error closing database')\n }\n }\n\n if (bunServer) {\n bunServer.stop()\n logger?.info('Bun server stopped')\n }\n\n logger?.info('Server stopped successfully')\n },\n\n addRoute(route: types.RouteDefinition) {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n logger?.info({ method: route.method, path: route.path }, 'Route added')\n },\n\n getRoutes() {\n return routes\n }\n }\n\n return instance\n\t}\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\n\n // Better body parsing with size validation\n async function parseBody(\n request : Request,\n logger : Logger | null,\n maxSize : number\n ): Promise<any> {\n const contentType = request.headers.get('content-type') || ''\n\n try {\n if (contentType.includes('application/json')) {\n\t\t\t\tconst text = await request.text()\n\n\t\t\t\t// Validate size after reading\n\t\t\t\tif (text.length > maxSize) {\n\t\t\t\t\tthrow new types.ValidationError('Payload too large')\n\t\t\t\t}\n\n\t\t\t\tif (!text.trim()) return {}\n\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(text)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger?.warn({\n\t\t\t\t\t\terror\t\t: String(e),\n\t\t\t\t\t\tbodyPreview\t: text.substring(0, 100)\n\t\t\t\t\t}, 'Invalid JSON in request body')\n\n\t\t\t\t\tthrow new types.ValidationError('Invalid JSON in request body')\n\t\t\t\t}\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const text = await request.text()\n if (text.length > maxSize) {\n throw new types.ValidationError('Payload too large')\n }\n\n return Object.fromEntries(new URLSearchParams(text))\n }\n\n if (contentType.includes('multipart/form-data')) {\n // Note: FormData size can't be validated before parsing\n return await request.formData()\n }\n\n } catch (e) {\n if (e instanceof types.ValidationError) throw e\n logger?.error({ error: String(e) }, 'Error parsing request body')\n throw new types.ValidationError('Failed to parse request body')\n }\n\n return {}\n }\n\n // Better cookie parsing\n function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = new Map<string, string>()\n\n if (!cookieHeader) return cookies\n\n const pairs = cookieHeader.split(';')\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.trim().split('=')\n if (key) {\n const value = valueParts.join('=') // Handle '=' in value\n cookies.set(key, value ? decodeURIComponent(value) : '')\n }\n }\n\n return cookies\n }\n\n // Create app context with request ID\n function createAppContext(\n request : Request,\n params : Record<string, string>,\n db : any,\n logger : Logger | null,\n requestId : string\n ): types.AppContext {\n const url = new URL(request.url)\n const query = Object.fromEntries(url.searchParams)\n const headers = request.headers\n let statusCode = 200\n const cookieStore = new Map<string, string>()\n const parsedCookies = parseCookies(headers.get('cookie') || '')\n\n const ctx: any = {\n request,\n params,\n query,\n headers,\n db,\n logger,\n requestId,\n get statusCode() { return statusCode },\n set statusCode(code: number) { statusCode = code },\n body: null,\n\n json(data: any, status?: number): Response {\n return new Response(JSON.stringify(data), {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'application/json',\n ...this._setCookieHeaders()\n }\n })\n },\n\n text(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/plain',\n ...this._setCookieHeaders()\n }\n })\n },\n\n html(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/html; charset=utf-8',\n ...this._setCookieHeaders()\n }\n })\n },\n\n redirect(url: string, status = 302): Response {\n return new Response(null, {\n status,\n headers : {\n Location : url,\n ...this._setCookieHeaders()\n }\n })\n },\n\n file(path: string, contentType = 'application/octet-stream'): Response {\n const file = Bun.file(path)\n return new Response(file, {\n headers: {\n 'Content-Type': contentType,\n ...this._setCookieHeaders()\n }\n })\n },\n\n setCookie(name: string, value: string, options: types.CookieOptions = {}): types.AppContext {\n let cookie = `${name}=${encodeURIComponent(value)}`\n\n if (options.maxAge !== undefined) {\n cookie += `; Max-Age=${options.maxAge}`\n }\n if (options.expires) {\n cookie += `; Expires=${options.expires.toUTCString()}`\n }\n if (options.path) {\n cookie += `; Path=${options.path}`\n }\n if (options.domain) {\n cookie += `; Domain=${options.domain}`\n }\n if (options.secure) {\n cookie += '; Secure'\n }\n if (options.httpOnly) {\n cookie += '; HttpOnly'\n }\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite}`\n }\n\n cookieStore.set(name, cookie)\n return ctx\n },\n\n getCookie(name: string): string | undefined {\n return parsedCookies.get(name)\n },\n\n deleteCookie(name: string, options: Partial<types.CookieOptions> = {}): types.AppContext {\n return ctx.setCookie(name, '', {\n ...options,\n maxAge: 0,\n path: options.path || '/'\n })\n },\n\n setHeader(key: string, value: string): types.AppContext {\n headers.set(key, value)\n return ctx\n },\n\n getHeader(key: string): string | undefined {\n return headers.get(key) || undefined\n },\n\n status(code: number): types.AppContext {\n statusCode = code\n return ctx\n },\n\n _setCookieHeaders(): Record<string, string | string[]> {\n const h: any = {}\n if (cookieStore.size > 0) {\n h['Set-Cookie'] = Array.from(cookieStore.values())\n }\n return h\n }\n }\n\n return ctx\n }\n\n // Better IP extraction\n function getClientIp(request: Request): string {\n const forwarded = request.headers.get('x-forwarded-for')\n\n if (forwarded) {\n const ips = forwarded.split(',').map(ip => ip.trim())\n return ips[0] || 'unknown'\n }\n\n const realIp = request.headers.get('x-real-ip')\n if (realIp) return realIp\n return 'unknown'\n }\n\n // CORS helper with proper configuration\n function handleCors(request: Request, config: types.ServerConfig): Headers {\n const headers = new Headers()\n\n if (!config.security || typeof config.security !== 'object' || !config.security.cors) {\n return headers\n }\n\n const corsConfig = typeof config.security.cors === 'object' ? config.security.cors : {}\n const origin = request.headers.get('Origin')\n\n if (origin) {\n if (typeof corsConfig.origin === 'function') {\n if (corsConfig.origin(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (Array.isArray(corsConfig.origin)) {\n if (corsConfig.origin.includes(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (typeof corsConfig.origin === 'string') {\n headers.set('Access-Control-Allow-Origin', corsConfig.origin)\n } else {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n\n const methods = corsConfig.methods || ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']\n headers.set('Access-Control-Allow-Methods', methods.join(', '))\n\n const allowedHeaders = corsConfig.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With']\n headers.set('Access-Control-Allow-Headers', allowedHeaders.join(', '))\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true')\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', corsConfig.maxAge.toString())\n }\n }\n\n return headers\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\n\n // Export all types\n export * from './types.d';\n\n // Export Logger\n export { Logger };\n\n // Export SecurityManager for advanced use cases\n export { SecurityManager };\n\n // Export Router for advanced use cases\n export { Router };\n\n // Export DB and database helpers\n export {\n DB,\n table,\n column,\n integer,\n text,\n real,\n blob,\n numeric,\n primaryKey,\n notNull,\n unique,\n defaultValue,\n references\n } from './mod/db';\n\n // Export DB types\n export type {\n ColumnType,\n SqlValue,\n ColumnDefinition,\n TableSchema,\n WhereCondition,\n QueryBuilder\n } from './mod/db';\n\n // Default export\n export default server;\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
1
+ {"version":3,"sources":["../src/mod/db.ts","../src/mod/router.ts","../src/mod/security.ts","../src/mod/logger.ts","../src/types.d.ts","../src/main.ts"],"names":["DB","path","Database","schema","sql","index","indexSql","tableName","table","conditions","whereConditions","column","value","id","data","lastId","callback","error","params","builder","self","columns","condition","whereClauses","cond","placeholders","val","direction","count","setClauses","col","updateValues","result","results","columnDefs","def","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references","Router","method","key","route","match","staticRoutes","handler","colonIndex","dynamicRoutes","r","config","pattern","existingIndex","SecurityManager","max","windowMs","now","record","sessionId","ttl","token","crypto","stored","html","input","ip","status","duration","first","Logger","level","pretty","msg","levelNum","ts","safeData","output","str","AppError","message","statusCode","code","ValidationError","issues","DatabaseError","TimeoutError","RateLimitError","security","router","server","port","hostname","maxReqSize","requestTimeout","gracefulShutdownTimeout","logCfg","logger","dbs","routes","activeRequests","cleanupInterval","handleRequest","request","startTime","requestId","getClientIp","contentLength","corsHeaders","handleCors","rateLimitCfg","rateLimitKey","body","parseBody","defaultDb","routeMatch","ctx","createAppContext","controller","timeoutPromise","_","reject","response","resHeaders","errorMessage","healthRoute","c","readinessRoute","dbConnected","ready","m","bunServer","instance","dbConfigs","dbCfg","dbName","db","tableSchema","url","deadline","resolve","e","maxSize","contentType","parseCookies","cookieHeader","cookies","pairs","pair","valueParts","query","headers","cookieStore","parsedCookies","file","options","cookie","h","forwarded","realIp","corsConfig","origin","methods","allowedHeaders","main_default"],"mappings":"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","file":"main.js","sourcesContent":["// src/mod/db.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Database } from 'bun:sqlite'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type ColumnType = 'INTEGER' | 'TEXT' | 'REAL' | 'BLOB' | 'NUMERIC'\r\n export type SqlValue = string | number | boolean | null | Uint8Array\r\n\r\n export interface ColumnDefinition {\r\n name : string\r\n type : ColumnType\r\n primaryKey? : boolean\r\n autoIncrement? : boolean\r\n notNull? : boolean\r\n unique? : boolean\r\n default? : SqlValue\r\n references? : { table: string; column: string }\r\n }\r\n\r\n export interface TableSchema {\r\n name : string\r\n columns : ColumnDefinition[]\r\n indexes? : { name: string; columns: string[]; unique?: boolean }[]\r\n }\r\n\r\n export interface WhereCondition {\r\n column : string\r\n operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL'\r\n value? : SqlValue | SqlValue[]\r\n }\r\n\r\n export interface QueryBuilder {\r\n select : (columns?: string[]) => QueryBuilder\r\n from : (table: string) => QueryBuilder\r\n where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder\r\n and : (condition: WhereCondition) => QueryBuilder\r\n or : (condition: WhereCondition) => QueryBuilder\r\n orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder\r\n limit : (count: number) => QueryBuilder\r\n offset : (count: number) => QueryBuilder\r\n insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n update : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n delete : (table: string) => QueryBuilder\r\n execute : () => any[]\r\n executeOne : () => any | null\r\n executeRaw : (sql: string, params?: SqlValue[]) => any[]\r\n raw : (sql: string, params?: SqlValue[]) => QueryBuilder\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class DB {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private db : Database\r\n private schemas : Map<string, TableSchema> = new Map()\r\n private currentQuery : string = ''\r\n private currentParams : SqlValue[] = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\r\n\r\n constructor(path: string = ':memory:') {\r\n this.db = new Database(path)\r\n this.db.exec('PRAGMA foreign_keys = ON')\r\n }\r\n\r\n close() {\r\n this.db.close()\r\n }\r\n\r\n // ════════ Schema Management ════════\r\n defineSchema(schema: TableSchema): void {\r\n this.schemas.set(schema.name, schema)\r\n const sql = this.generateCreateTableSQL(schema)\r\n this.db.exec(sql)\r\n\r\n // Create indexes\r\n if (schema.indexes) {\r\n for (const index of schema.indexes) {\r\n const uniqueStr = index.unique ? 'UNIQUE' : ''\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`\r\n this.db.exec(indexSql)\r\n }\r\n }\r\n }\r\n\r\n getSchema(tableName: string): TableSchema | undefined {\r\n return this.schemas.get(tableName)\r\n }\r\n\r\n listTables(): string[] {\r\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all()\r\n return result.map((r: any) => r.name)\r\n }\r\n\r\n dropTable(tableName: string): void {\r\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`)\r\n this.schemas.delete(tableName)\r\n }\r\n\r\n // ════════ Query Builder ════════\r\n query(): QueryBuilder {\r\n this.reset()\r\n return this.createQueryBuilder()\r\n }\r\n\r\n // ════════ Quick Operations ════════\r\n find(table: string, conditions: Record<string, SqlValue>): any[] {\r\n const whereConditions: WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n }))\r\n\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(whereConditions)\r\n .execute()\r\n }\r\n\r\n findOne(table: string, conditions: Record<string, SqlValue>): any | null {\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n })))\r\n .limit(1)\r\n .executeOne()\r\n }\r\n\r\n findById(table: string, id: number | string): any | null {\r\n return this.findOne(table, { id })\r\n }\r\n\r\n all(table: string): any[] {\r\n return this.query().select().from(table).execute()\r\n }\r\n\r\n insert(table: string, data: Record<string, SqlValue>): any {\r\n this.query().insert(table, data).execute()\r\n\r\n // Return inserted row\r\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as any\r\n return this.findById(table, lastId.id)\r\n }\r\n\r\n update(table: string, id: number | string, data: Record<string, SqlValue>): any | null {\r\n this.query()\r\n .update(table, data)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return this.findById(table, id)\r\n }\r\n\r\n delete(table: string, id: number | string): boolean {\r\n const result = this.query()\r\n .delete(table)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return true\r\n }\r\n\r\n // ════════ Transactions ════════\r\n transaction(callback: (db: DB) => void): void {\r\n this.db.exec('BEGIN TRANSACTION')\r\n try {\r\n callback(this)\r\n this.db.exec('COMMIT')\r\n } catch (error) {\r\n this.db.exec('ROLLBACK')\r\n throw error\r\n }\r\n }\r\n\r\n // ════════ Raw SQL ════════\r\n exec(sql: string): void {\r\n this.db.exec(sql)\r\n }\r\n\r\n raw(sql: string, params: SqlValue[] = []): any[] {\r\n const stmt = this.db.query(sql)\r\n return stmt.all(...params) as any[]\r\n }\r\n\r\n rawOne(sql: string, params: SqlValue[] = []): any | null {\r\n const stmt = this.db.query(sql)\r\n return stmt.get(...params) as any | null\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private reset(): void {\r\n this.currentQuery = ''\r\n this.currentParams = []\r\n }\r\n\r\n private createQueryBuilder(): QueryBuilder {\r\n const builder: any = {\r\n _select: ['*'],\r\n _from: '',\r\n _where: [] as string[],\r\n _orderBy: '',\r\n _limit: null as number | null,\r\n _offset: null as number | null,\r\n _isInsert: false,\r\n _isUpdate: false,\r\n _isDelete: false,\r\n _insertData: null as Record<string, SqlValue> | null,\r\n _updateData: null as Record<string, SqlValue> | null\r\n }\r\n\r\n const self = this\r\n\r\n builder.select = function(columns?: string[]) {\r\n this._select = columns || ['*']\r\n return this\r\n }\r\n\r\n builder.from = function(table: string) {\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.where = function(condition: WhereCondition | WhereCondition[]) {\r\n const conditions = Array.isArray(condition) ? condition : [condition]\r\n\r\n const whereClauses = conditions.map(cond => {\r\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\r\n return `${cond.column} ${cond.operator}`\r\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\r\n const placeholders = cond.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n cond.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n return `${cond.column} IN (${placeholders})`\r\n } else {\r\n self.currentParams.push(cond.value as SqlValue)\r\n return `${cond.column} ${cond.operator} ?`\r\n }\r\n })\r\n\r\n this._where.push(...whereClauses)\r\n return this\r\n }\r\n\r\n builder.and = function(condition: WhereCondition) {\r\n return this.where(condition)\r\n }\r\n\r\n builder.or = function(condition: WhereCondition) {\r\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\r\n this._where.push(`OR ${condition.column} ${condition.operator}`)\r\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\r\n const placeholders = condition.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n condition.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n this._where.push(`OR ${condition.column} IN (${placeholders})`)\r\n } else {\r\n self.currentParams.push(condition.value as SqlValue)\r\n this._where.push(`OR ${condition.column} ${condition.operator} ?`)\r\n }\r\n return this\r\n }\r\n\r\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC') {\r\n this._orderBy = `ORDER BY ${column} ${direction}`\r\n return this\r\n }\r\n\r\n builder.limit = function(count: number) {\r\n this._limit = count\r\n return this\r\n }\r\n\r\n builder.offset = function(count: number) {\r\n this._offset = count\r\n return this\r\n }\r\n\r\n builder.insert = function(table: string, data: Record<string, SqlValue>) {\r\n this._isInsert = true\r\n this._from = table\r\n this._insertData = data\r\n return this\r\n }\r\n\r\n builder.update = function(table: string, data: Record<string, SqlValue>) {\r\n this._isUpdate = true\r\n this._from = table\r\n this._updateData = data\r\n return this\r\n }\r\n\r\n builder.delete = function(table: string) {\r\n this._isDelete = true\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.raw = function(sql: string, params: SqlValue[] = []) {\r\n self.currentQuery = sql\r\n self.currentParams = params\r\n return this\r\n }\r\n\r\n builder.execute = function() {\r\n let sql = ''\r\n\r\n if (this._isInsert && this._insertData) {\r\n const columns = Object.keys(this._insertData)\r\n const placeholders = columns.map(() => '?').join(', ')\r\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`\r\n self.currentParams = Object.values(this._insertData)\r\n } else if (this._isUpdate && this._updateData) {\r\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`)\r\n const updateValues = Object.values(this._updateData)\r\n self.currentParams = [...updateValues, ...self.currentParams] as SqlValue[]\r\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else if (this._isDelete) {\r\n sql = `DELETE FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else {\r\n // SELECT query\r\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n\r\n if (this._orderBy) {\r\n sql += ` ${this._orderBy}`\r\n }\r\n\r\n if (this._limit !== null) {\r\n sql += ` LIMIT ${this._limit}`\r\n }\r\n\r\n if (this._offset !== null) {\r\n sql += ` OFFSET ${this._offset}`\r\n }\r\n }\r\n\r\n if (!sql && self.currentQuery) {\r\n sql = self.currentQuery\r\n }\r\n\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...self.currentParams) as unknown[]\r\n self.reset()\r\n return result as any[]\r\n }\r\n\r\n builder.executeOne = function() {\r\n const results = this.execute()\r\n return results.length > 0 ? results[0] : null\r\n }\r\n\r\n builder.executeRaw = function(sql: string, params: SqlValue[] = []) {\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...params) as unknown[]\r\n return result as any[]\r\n }\r\n\r\n return builder as QueryBuilder\r\n }\r\n\r\n private generateCreateTableSQL(schema: TableSchema): string {\r\n const columnDefs = schema.columns.map(col => {\r\n let def = `${col.name} ${col.type}`\r\n\r\n if (col.primaryKey) {\r\n def += ' PRIMARY KEY'\r\n if (col.autoIncrement) {\r\n def += ' AUTOINCREMENT'\r\n }\r\n }\r\n\r\n if (col.notNull && !col.primaryKey) {\r\n def += ' NOT NULL'\r\n }\r\n\r\n if (col.unique) {\r\n def += ' UNIQUE'\r\n }\r\n\r\n if (col.default !== undefined) {\r\n if (typeof col.default === 'string') {\r\n def += ` DEFAULT '${col.default}'`\r\n } else if (col.default === null) {\r\n def += ' DEFAULT NULL'\r\n } else {\r\n def += ` DEFAULT ${col.default}`\r\n }\r\n }\r\n\r\n if (col.references) {\r\n def += ` REFERENCES ${col.references.table}(${col.references.column})`\r\n }\r\n\r\n return def\r\n })\r\n\r\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${columnDefs.join(', ')})`\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // ════════ Schema Builder Helpers ════════\r\n export function table(name: string, columns: ColumnDefinition[]): TableSchema {\r\n return { name, columns }\r\n }\r\n\r\n export function column(name: string, type: ColumnType): ColumnDefinition {\r\n return { name, type }\r\n }\r\n\r\n export function integer(name: string): ColumnDefinition {\r\n return { name, type: 'INTEGER' }\r\n }\r\n\r\n export function text(name: string): ColumnDefinition {\r\n return { name, type: 'TEXT' }\r\n }\r\n\r\n export function real(name: string): ColumnDefinition {\r\n return { name, type: 'REAL' }\r\n }\r\n\r\n export function blob(name: string): ColumnDefinition {\r\n return { name, type: 'BLOB' }\r\n }\r\n\r\n export function numeric(name: string): ColumnDefinition {\r\n return { name, type: 'NUMERIC' }\r\n }\r\n\r\n // ════════ Column Modifiers ════════\r\n export function primaryKey(col: ColumnDefinition, autoIncrement = false): ColumnDefinition {\r\n return { ...col, primaryKey: true, autoIncrement }\r\n }\r\n\r\n export function notNull(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, notNull: true }\r\n }\r\n\r\n export function unique(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, unique: true }\r\n }\r\n\r\n export function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition {\r\n return { ...col, default: value }\r\n }\r\n\r\n export function references(col: ColumnDefinition, table: string, column: string): ColumnDefinition {\r\n return { ...col, references: { table, column } }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/router.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n\texport interface RegexRoute {\r\n\t\tpattern\t\t: RegExp\r\n\t\tmethod\t\t: string\r\n\t\thandler\t\t: any\r\n\t\tkey\t\t\t: string\r\n\t}\r\n\r\n\texport type RegexRoutes = Array<RegexRoute>\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Router {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate routes \t\t\t= new Map<string, any>()\r\n\t\t\tprivate regexRoutes\t\t: RegexRoutes = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tmatch(method: string, path: string): { handler: any; params: Record<string, string> } | null {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\t// Try static route first (faster)\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\treturn { handler: this.routes.get(key), params: {} }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Try dynamic routes\r\n\t\t\t\tfor (const route of this.regexRoutes) {\r\n\t\t\t\tif (route.method === method) {\r\n\t\t\t\t\tconst match = path.match(route.pattern)\r\n\t\t\t\t\tif (match?.groups) {\r\n\t\t\t\t\treturn { handler: route.handler, params: match.groups }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tgetAll() {\r\n\t\t\t\tconst staticRoutes = Array.from(this.routes.entries()).map(([key, handler]) => {\r\n\t\t\t\tconst colonIndex = key.indexOf(':')\r\n\t\t\t\tconst method = key.substring(0, colonIndex)\r\n\t\t\t\tconst path = key.substring(colonIndex + 1)\r\n\t\t\t\treturn { method, path, handler }\r\n\t\t\t\t})\r\n\r\n\t\t\t\tconst dynamicRoutes = this.regexRoutes.map(route => {\r\n\t\t\t\tconst colonIndex = route.key.indexOf(':')\r\n\t\t\t\treturn {\r\n\t\t\t\t\tmethod: route.method,\r\n\t\t\t\t\tpath: route.key.substring(colonIndex + 1),\r\n\t\t\t\t\thandler: route.handler\r\n\t\t\t\t}\r\n\t\t\t\t})\r\n\r\n\t\t\t\treturn [...staticRoutes, ...dynamicRoutes]\r\n\t\t\t}\r\n\r\n\t\t\tclear() {\r\n\t\t\t\tthis.routes.clear()\r\n\t\t\t\tthis.regexRoutes = []\r\n\t\t\t}\r\n\r\n\t\t\tremove(method: string, path: string): boolean {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\tthis.routes.delete(key)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst index = this.regexRoutes.findIndex(r => r.key === key)\r\n\t\t\t\tif (index >= 0) {\r\n\t\t\t\tthis.regexRoutes.splice(index, 1)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\tregister(method: string, path: string, handler: any, config: any = {}) {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (path.includes(':')) {\r\n\t\t\t\t// Dynamic route with params\r\n\t\t\t\tconst pattern = this.pathToRegex(path)\r\n\r\n\t\t\t\t// Check if route already exists to prevent duplicates\r\n\t\t\t\tconst existingIndex = this.regexRoutes.findIndex(r => r.key === key)\r\n\r\n\t\t\t\tconst route = {\r\n\t\t\t\t\tpattern,\r\n\t\t\t\t\tmethod,\r\n\t\t\t\t\thandler,\r\n\t\t\t\t\tkey\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (existingIndex >= 0) {\r\n\t\t\t\t\t// Update existing route\r\n\t\t\t\t\tthis.regexRoutes[existingIndex] = route\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Add new route\r\n\t\t\t\t\tthis.regexRoutes.push(route)\r\n\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t// Static route\r\n\t\t\t\tthis.routes.set(key, handler)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate pathToRegex(path: string): RegExp {\r\n\t\t\t\t// Escape special regex characters except ':'\r\n\t\t\t\tconst escaped = path.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n\t\t\t\t// Replace :param with named capture groups\r\n\t\t\t\tconst pattern = escaped.replace(/:(\\w+)/g, '(?<$1>[^/]+)')\r\n\t\t\t\treturn new RegExp(`^${pattern}$`)\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/security.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import crypto from 'crypto'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class SecurityManager {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate rateLimitStore \t= new Map<string, { count: number; reset: number }>()\r\n\t\t\tprivate csrfTokens \t\t= new Map<string, { sessionId: string; expires: number }>()\r\n\t\t\tprivate requestLog\t\t= new Map<string, any>()\r\n\r\n\t\t\tprivate readonly MAX_REQUEST_LOG_SIZE = 1000\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\t// Rate Limiting with proper overflow handling\r\n\t\t\tcheckRateLimit(key: string, max: number, windowMs: number): boolean {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tconst record = this.rateLimitStore.get(key)\r\n\r\n\t\t\tif (record) {\r\n\t\t\t\tif (now < record.reset) {\r\n\t\t\t\t// Within the current window\r\n\t\t\t\tif (record.count >= max) {\r\n\t\t\t\t\treturn false // Rate limit exceeded\r\n\t\t\t\t}\r\n\t\t\t\trecord.count++\r\n\t\t\t\treturn true\r\n\t\t\t\t} else {\r\n\t\t\t\t// Window expired, reset\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// First request for this key\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup old rate limit records\r\n\t\t\tcleanupRateLimit() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [key, record] of this.rateLimitStore.entries()) {\r\n\t\t\t\tif (now > record.reset) {\r\n\t\t\t\tthis.rateLimitStore.delete(key)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// CSRF Token Generation with TTL\r\n\t\t\tgenerateCsrfToken(sessionId: string, ttl = 3600000): string {\r\n\t\t\tconst token = crypto.randomBytes(32).toString('hex')\r\n\t\t\tthis.csrfTokens.set(token, {\r\n\t\t\t\tsessionId,\r\n\t\t\t\texpires: Date.now() + ttl\r\n\t\t\t})\r\n\t\t\treturn token\r\n\t\t\t}\r\n\r\n\t\t\t// Validate CSRF Token with expiration check\r\n\t\t\tvalidateCsrfToken(token: string, sessionId: string): boolean {\r\n\t\t\tconst stored = this.csrfTokens.get(token)\r\n\r\n\t\t\tif (!stored) {\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Check if token has expired\r\n\t\t\tif (Date.now() > stored.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Validate session ID\r\n\t\t\tif (stored.sessionId === sessionId) {\r\n\t\t\t\tthis.csrfTokens.delete(token) // One-time use\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\r\n\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup expired CSRF tokens\r\n\t\t\tcleanupCsrfTokens() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [token, data] of this.csrfTokens.entries()) {\r\n\t\t\t\tif (now > data.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// HTML Sanitization - comprehensive\r\n\t\t\tsanitizeHtml(html: string): string {\r\n\t\t\tif (!html) return ''\r\n\r\n\t\t\treturn html\r\n\t\t\t\t.replace(/&/g, '&amp;')\r\n\t\t\t\t.replace(/</g, '&lt;')\r\n\t\t\t\t.replace(/>/g, '&gt;')\r\n\t\t\t\t.replace(/\"/g, '&quot;')\r\n\t\t\t\t.replace(/'/g, '&#x27;')\r\n\t\t\t\t.replace(/\\//g, '&#x2F;')\r\n\t\t\t}\r\n\r\n\t\t\t// SQL Injection Prevention\r\n\t\t\tsanitizeSql(input: string): string {\r\n\t\t\tif (!input) return ''\r\n\r\n\t\t\treturn input\r\n\t\t\t\t.replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\r\n\t\t\t\t.replace(/;/g, '') // Remove semicolons to prevent multi-statement injection\r\n\t\t\t\t.replace(/'/g, \"''\") // Escape single quotes (SQL standard)\r\n\t\t\t\t.replace(/\"/g, '\\\\\"') // Escape double quotes\r\n\t\t\t\t.replace(/\\x00/g, '') // Remove null bytes\r\n\t\t\t}\r\n\r\n\t\t\t// Log request for audit trail with size limit\r\n\t\t\tlogRequest(\r\n\t\t\tid: string,\r\n\t\t\tmethod: string,\r\n\t\t\tpath: string,\r\n\t\t\tip: string,\r\n\t\t\tstatus: number,\r\n\t\t\tduration: number\r\n\t\t\t) {\r\n\t\t\tthis.requestLog.set(id, {\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\tmethod,\r\n\t\t\t\tpath,\r\n\t\t\t\tip,\r\n\t\t\t\tstatus,\r\n\t\t\t\tduration\r\n\t\t\t})\r\n\r\n\t\t\t// Keep only last MAX_REQUEST_LOG_SIZE requests\r\n\t\t\tif (this.requestLog.size > this.MAX_REQUEST_LOG_SIZE) {\r\n\t\t\t\tconst { value: first } = this.requestLog.keys().next() || { value: null }\r\n\t\t\t\tif (first) {\r\n\t\t\t\tthis.requestLog.delete(first)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Get request log by ID\r\n\t\t\tgetRequestLog(id: string) {\r\n\t\t\treturn this.requestLog.get(id)\r\n\t\t\t}\r\n\r\n\t\t\t// Get all request logs\r\n\t\t\tgetAllRequestLogs() {\r\n\t\t\treturn Array.from(this.requestLog.values())\r\n\t\t\t}\r\n\r\n\t\t\t// Clear all\r\n\t\t\tclearAll() {\r\n\t\t\tthis.rateLimitStore.clear()\r\n\t\t\tthis.csrfTokens.clear()\r\n\t\t\tthis.requestLog.clear()\r\n\t\t\t}\r\n\r\n\t\t\t// Get stats\r\n\t\t\tgetStats() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\trateLimitEntries: this.rateLimitStore.size,\r\n\t\t\t\t\tcsrfTokens: this.csrfTokens.size,\r\n\t\t\t\t\trequestLogs: this.requestLog.size\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/logger.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n\texport class Logger {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate level\t: number \t= 1\r\n\t\t\tprivate pretty\t: boolean \t= false\r\n\t\t\tprivate levels\t\t\t\t= { debug: 0, info: 1, warn: 2, error: 3, fatal: 4 }\r\n\r\n\t\t\tconstructor(level: 'debug' | 'info' | 'warn' | 'error' = 'info', pretty = false) {\r\n\t\t\t\tthis.level \t= this.levels[level] ?? 1\r\n\t\t\t\tthis.pretty = pretty\r\n\t\t\t}\r\n\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tdebug(data: any, msg?: string) {\r\n\t\t\t\tthis.log('debug', this.levels.debug, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tinfo(data: any, msg?: string) {\r\n\t\t\t\tthis.log('info', this.levels.info, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\twarn(data: any, msg?: string) {\r\n\t\t\t\tthis.log('warn', this.levels.warn, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\terror(data: any, msg?: string) {\r\n\t\t\t\tthis.log('error', this.levels.error, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tfatal(data: any, msg?: string) {\r\n\t\t\t\tthis.log('fatal', this.levels.fatal, data, msg)\r\n\t\t\t\t// Fatal errors might need additional handling in production\r\n\t\t\t\tif (process.env.NODE_ENV === 'production') {\r\n\t\t\t\t\t// Could send to external logging service here\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate log(level: string, levelNum: number, data: any, msg?: string) {\r\n\t\t\t\tif (levelNum < this.level) return\r\n\r\n\t\t\t\tconst ts = new Date().toISOString()\r\n\r\n\t\t\t\t// Handle null/undefined data gracefully\r\n\t\t\t\tconst safeData = data ?? {}\r\n\r\n\t\t\t\tconst output = {\r\n\t\t\t\t\ttimestamp\t: ts,\r\n\t\t\t\t\tlevel\t\t: level.toUpperCase(),\r\n\t\t\t\t\tmessage\t\t: msg || 'No message',\r\n\t\t\t\t\t...safeData\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst str = this.pretty\r\n\t\t\t\t? `[${ts}] ${level.toUpperCase()} ${msg || 'No message'}\\n${JSON.stringify(safeData, null, 2)}`\r\n\t\t\t\t: JSON.stringify(output)\r\n\r\n\t\t\t\tif (level === 'error' || level === 'fatal') {\r\n\t\t\t\t\tconsole.error(str)\r\n\t\t\t\t} else if (level === 'warn') {\r\n\t\t\t\t\tconsole.warn(str)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log(str)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\t}\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/types.d.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD'\r\n export type RouteHandler = (c: AppContext) => any | Promise<any>\r\n export type AppMiddleware = (c: AppContext, next: () => Promise<void>) => void | Promise<void>\r\n\r\n export interface AppContext {\r\n request : Request\r\n params : Record<string, string>\r\n query : Record<string, any>\r\n body : any\r\n headers : Headers\r\n db : any\r\n logger : Logger | null\r\n user? : any\r\n requestId : string\r\n\r\n // Response methods\r\n json (data: any, status?: number): Response\r\n text (data: string, status?: number): Response\r\n html (data: string, status?: number): Response\r\n redirect (url: string, status?: number): Response\r\n file (path: string, contentType?: string): Response\r\n\r\n // Cookie methods\r\n setCookie (name: string, value: string, options?: CookieOptions): AppContext\r\n getCookie (name: string): string | undefined\r\n deleteCookie (name: string, options?: Partial<CookieOptions>): AppContext\r\n\r\n // Header methods\r\n setHeader(key: string, value: string): AppContext\r\n getHeader(key: string): string | undefined\r\n\r\n // Status code\r\n status(code: number): AppContext\r\n statusCode: number\r\n }\r\n\r\n export interface CookieOptions {\r\n maxAge? : number\r\n expires? : Date\r\n path? : string\r\n domain? : string\r\n secure? : boolean\r\n httpOnly? : boolean\r\n sameSite? : 'Strict' | 'Lax' | 'None'\r\n }\r\n\r\n export interface RouteDefinition {\r\n method : HttpMethod | HttpMethod[]\r\n path : string\r\n handler : RouteHandler\r\n validate? : { body?: any, query?: any, params?: any }\r\n middlewares? : AppMiddleware[]\r\n timeout? : number\r\n rateLimit? : { max: number; windowMs: number }\r\n cache? : number\r\n tags? : string[]\r\n }\r\n\r\n export interface DatabaseConfig {\r\n name? : string\r\n connection : string // File path or ':memory:'\r\n schema? : Record<string, any>\r\n timeout? : number\r\n }\r\n\r\n export interface SecurityConfig {\r\n cors? : boolean | CorsConfig\r\n rateLimit? : boolean | RateLimitConfig\r\n csrf? : boolean | CsrfConfig\r\n helmet? : boolean | HelmetConfig\r\n auth? : boolean | AuthConfig\r\n validation? : boolean\r\n sanitize? : boolean\r\n }\r\n\r\n export interface CorsConfig {\r\n origin? : string | string[] | ((origin: string) => boolean)\r\n methods? : HttpMethod[]\r\n allowedHeaders? : string[]\r\n credentials? : boolean\r\n maxAge? : number\r\n }\r\n\r\n export interface RateLimitConfig {\r\n windowMs? : number\r\n max? : number\r\n keyGenerator? : (c: AppContext) => string\r\n message? : string\r\n }\r\n\r\n export interface CsrfConfig {\r\n secret? : string\r\n headerName? : string\r\n tokenTTL? : number\r\n }\r\n\r\n export interface HelmetConfig {\r\n contentSecurityPolicy? : Record<string, string[]> | boolean\r\n hsts? : boolean | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean }\r\n frameguard? : boolean | { action: 'deny' | 'sameorigin' }\r\n noSniff? : boolean\r\n xssFilter? : boolean\r\n referrerPolicy? : string | boolean\r\n }\r\n\r\n export interface AuthConfig {\r\n jwt? : boolean | { secret: string; expiresIn?: string }\r\n apiKey? : boolean | { header?: string }\r\n bearer? : boolean\r\n }\r\n\r\n export interface ServerConfig {\r\n port? : number | string\r\n hostname? : string\r\n requestTimeout? : number\r\n maxRequestSize? : number\r\n maxJsonSize? : number\r\n\r\n database? : DatabaseConfig | DatabaseConfig[]\r\n\r\n security? : boolean | SecurityConfig\r\n\r\n compression? : boolean | { threshold?: number }\r\n\r\n logging? : boolean | { level?: 'debug' | 'info' | 'warn' | 'error'; pretty?: boolean }\r\n\r\n routes? : RouteDefinition[]\r\n middlewares? : AppMiddleware[]\r\n\r\n errorHandler? : (error: Error, context: AppContext) => void | Promise<void>\r\n onShutdown? : () => void | Promise<void>\r\n\r\n apiPrefix? : string\r\n apiVersion? : string\r\n\r\n gracefulShutdownTimeout?: number\r\n }\r\n\r\n export interface ServerInstance {\r\n app : any\r\n logger : Logger | null\r\n db : Map<string, any>\r\n bunServer : any\r\n start : () => Promise<void>\r\n stop : () => Promise<void>\r\n addRoute : (route: RouteDefinition) => void\r\n getRoutes : () => RouteDefinition[]\r\n }\r\n\r\n export interface Logger {\r\n debug (data: any, msg?: string): void\r\n info (data: any, msg?: string): void\r\n warn (data: any, msg?: string): void\r\n error (data: any, msg?: string): void\r\n fatal (data: any, msg?: string): void\r\n }\r\n\r\n export class AppError extends Error {\r\n constructor(public message: string, public statusCode: number = 500, public code?: string) {\r\n super(message)\r\n this.name = 'AppError'\r\n }\r\n }\r\n\r\n export class ValidationError extends AppError {\r\n constructor(message: string, public issues?: any) {\r\n super(message, 400, 'VALIDATION_ERROR')\r\n this.name = 'ValidationError'\r\n }\r\n }\r\n\r\n export class DatabaseError extends AppError {\r\n constructor(message: string) {\r\n super(message, 500, 'DATABASE_ERROR')\r\n this.name = 'DatabaseError'\r\n }\r\n }\r\n\r\n export class TimeoutError extends AppError {\r\n constructor(message = 'Request timeout') {\r\n super(message, 408, 'TIMEOUT_ERROR')\r\n this.name = 'TimeoutError'\r\n }\r\n }\r\n\r\n export class RateLimitError extends AppError {\r\n constructor(message = 'Too many requests') {\r\n super(message, 429, 'RATE_LIMIT_ERROR')\r\n this.name = 'RateLimitError'\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\n//\n// Developed with ❤️ by Maysara.\n\n\n\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\n\n import { DB } from './mod/db'\n import { Router } from './mod/router'\n import { SecurityManager } from './mod/security'\n import { Logger } \tfrom './mod/logger'\n import * as types from './types.d'\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\n\n const security = new SecurityManager()\n const router = new Router()\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\n\n export function server(config: types.ServerConfig = {}): types.ServerInstance {\n\n\t\t// ════════ Configuration ════════\n\t\tconst port = Number(config.port) || 3000\n\t\tconst hostname = config.hostname || 'localhost'\n\t\tconst maxReqSize = config.maxRequestSize || 10 * 1024 * 1024\n\t\tconst requestTimeout = config.requestTimeout || 30000\n\t\tconst gracefulShutdownTimeout = config.gracefulShutdownTimeout || 10000\n\n\t\tconst logCfg = typeof config.logging === 'object' ? config.logging : {}\n\t\tconst logger = config.logging ? new Logger(logCfg.level || 'info', logCfg.pretty) : null\n\n\t\tconst dbs = new Map<string, any>()\n\t\tconst routes: types.RouteDefinition[] = []\n\t\tconst activeRequests = new Set<string>()\n\n\t\t// ════════ Cleanup intervals ════════\n const cleanupInterval = setInterval(() => {\n security.cleanupRateLimit()\n security.cleanupCsrfTokens()\n }, 2 * 60 * 1000)\n\n async function handleRequest(request: Request): Promise<Response> {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n const url = new URL(request.url)\n const path = url.pathname\n const method = request.method.toUpperCase()\n const ip = getClientIp(request)\n\n activeRequests.add(requestId)\n\n try {\n // Check request size from header\n const contentLength = request.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > maxReqSize) {\n\n logger?.warn({ requestId, size: contentLength, ip }, 'Request too large')\n\n return new Response(JSON.stringify({ error: 'Payload too large' }), {\n\t\t\t\t\t\tstatus\t: 413,\n\t\t\t\t\t\theaders\t: { 'Content-Type': 'application/json' }\n })\n }\n\n // CORS handling\n const corsHeaders = handleCors(request, config)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders })\n }\n\n // Rate limiting\n if (config.security && typeof config.security === 'object' && config.security.rateLimit) {\n const rateLimitCfg = typeof config.security.rateLimit === 'object'\n ? config.security.rateLimit\n : {}\n const max = rateLimitCfg.max || 100\n const windowMs = rateLimitCfg.windowMs || 60000\n const rateLimitKey = rateLimitCfg.keyGenerator\n ? rateLimitCfg.keyGenerator({ request, ip } as any)\n : ip\n\n if (!security.checkRateLimit(rateLimitKey, max, windowMs)) {\n logger?.warn({ requestId, ip, key: rateLimitKey }, 'Rate limit exceeded')\n return new Response(\n JSON.stringify({ error: rateLimitCfg.message || 'Too many requests' }),\n { status: 429, headers: { 'Content-Type': 'application/json' } }\n )\n }\n }\n\n // Parse body\n let body: any = null\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n body = await parseBody(request, logger, maxReqSize)\n }\n\n // Get database\n const defaultDb = dbs.get('default')\n\n // Match route\n const routeMatch = router.match(method, path)\n if (!routeMatch) {\n const ctx = createAppContext(request, {}, defaultDb, logger, requestId)\n logger?.warn({ requestId, method, path, ip }, 'Route not found')\n return ctx.json({ error: 'Not Found', path }, 404)\n }\n\n const ctx = createAppContext(request, routeMatch.params || {}, defaultDb, logger, requestId)\n ctx.body = body\n ctx.request = request\n\n // Execute route handler with timeout\n const controller = new AbortController()\n const timeoutPromise = new Promise<never>((_, reject) => {\n const id = setTimeout(() => {\n controller.abort()\n reject(new types.TimeoutError('Request timeout'))\n }, requestTimeout)\n controller.signal.addEventListener('abort', () => clearTimeout(id))\n })\n\n const response = await Promise.race([\n routeMatch.handler(ctx),\n timeoutPromise\n ]) as Response\n\n // Merge CORS and security headers\n const resHeaders = new Headers(response.headers)\n corsHeaders.forEach((value, key) => {\n if (!resHeaders.has(key)) resHeaders.set(key, value)\n })\n\n resHeaders.set('X-Request-ID', requestId)\n resHeaders.set('X-Content-Type-Options', 'nosniff')\n resHeaders.set('X-Frame-Options', 'DENY')\n resHeaders.set('X-XSS-Protection', '1; mode=block')\n resHeaders.set('Referrer-Policy', 'strict-origin-when-cross-origin')\n\n // Audit log\n const duration = Date.now() - startTime\n security.logRequest(requestId, method, path, ip, response.status, duration)\n logger?.info({\n requestId,\n method,\n path,\n status: response.status,\n duration,\n ip\n }, 'Request completed')\n\n return new Response(response.body, {\n status: response.status,\n headers: resHeaders\n })\n } catch (error) {\n if (error instanceof types.AppError) {\n logger?.warn({ error: error.message, requestId, ip }, `App error: ${error.message}`)\n return new Response(\n JSON.stringify({\n error\t: error.message,\n code\t: error.code,\n requestId\n }),\n { status: error.statusCode, headers: { 'Content-Type': 'application/json' } }\n )\n }\n\n logger?.error({ error: String(error), requestId, ip }, 'Unhandled error')\n\n const errorMessage = process.env.NODE_ENV === 'production'\n ? 'Internal Server Error'\n : (error as Error).message\n\n return new Response(\n JSON.stringify({ error: errorMessage, requestId }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n )\n } finally {\n activeRequests.delete(requestId)\n }\n }\n\n // ════════ Health & Readiness routes ════════\n const healthRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/health',\n handler : (c: types.AppContext) => c.json({\n status : 'healthy',\n timestamp : new Date().toISOString(),\n uptime : process.uptime(),\n activeRequests : activeRequests.size\n })\n }\n\n const readinessRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/readiness',\n handler : (c: types.AppContext) => {\n const dbConnected = dbs.size > 0\n const ready = dbConnected || dbs.size === 0\n return c.json({\n ready,\n checks : {\n database : dbConnected ? 'connected' : 'not configured',\n activeRequests : activeRequests.size\n },\n timestamp: new Date().toISOString()\n }, ready ? 200 : 503)\n }\n }\n\n // ════════ Register routes ════════\n if (config.routes) {\n config.routes.forEach(route => {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n })\n }\n\n routes.push(healthRoute, readinessRoute)\n router.register('GET', '/health', healthRoute.handler, healthRoute)\n router.register('GET', '/readiness', readinessRoute.handler, readinessRoute)\n\n let bunServer: any = null\n\n const instance: types.ServerInstance = {\n app : null,\n logger,\n db : dbs,\n bunServer : null,\n\n async start() {\n // Initialize databases with our custom DB solution\n if (config.database) {\n const dbConfigs = Array.isArray(config.database) ? config.database : [config.database]\n for (const dbCfg of dbConfigs) {\n const dbName = dbCfg.name || 'default'\n\n try {\n if (typeof dbCfg.connection === 'string') {\n // Create DB instance with connection string\n const db = new DB(dbCfg.connection)\n\n // Define schemas if provided\n if (dbCfg.schema && typeof dbCfg.schema === 'object') {\n for (const [tableName, tableSchema] of Object.entries(dbCfg.schema)) {\n if (tableSchema && typeof tableSchema === 'object') {\n db.defineSchema(tableSchema as any)\n }\n }\n }\n\n dbs.set(dbName, db)\n\n logger?.info({\n name: dbName,\n connection: dbCfg.connection\n }, '✅ Database connected')\n } else {\n throw new Error(`Database connection must be a string path (got ${typeof dbCfg.connection})`)\n }\n } catch (error) {\n logger?.error({\n error: String(error),\n name: dbName\n }, 'Failed to connect to database')\n throw error\n }\n }\n }\n\n bunServer = Bun.serve({ port, hostname, fetch: handleRequest })\n instance.bunServer = bunServer\n\n const url = `http://${hostname}:${port}`\n console.log(\n `→ URL: ${url}` + `\\n` +\n `→ Environment: ${(process.env.NODE_ENV || 'development')}` + `\\n` +\n `→ Routes: ${routes.length.toString()}` + `\\n` +\n `→ Database: ${(dbs.size > 0 ? '✅ Connected' : '❌ None')}` + `\\n` +\n `→ Security: ${(config.security ? '✅ ENABLED' : '❌ Disabled')}` + `\\n` +\n `\\n` +\n `🔍 Health: ${url}/health` + `\\n` +\n `🔍 Ready: ${url}/readiness`+ `\\n`\n )\n\n logger?.info({ url }, 'Server started')\n },\n\n async stop() {\n logger?.info('Stopping server...')\n\n // Wait for active requests to complete\n if (activeRequests.size > 0) {\n logger?.info({ count: activeRequests.size }, 'Waiting for active requests...')\n const deadline = Date.now() + gracefulShutdownTimeout\n\n while (activeRequests.size > 0 && Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n if (activeRequests.size > 0) {\n logger?.warn({ count: activeRequests.size }, 'Force closing with active requests')\n }\n }\n\n clearInterval(cleanupInterval)\n\n if (config.onShutdown) {\n try {\n await config.onShutdown()\n } catch (e) {\n logger?.error({ error: String(e) }, 'Error in shutdown handler')\n }\n }\n\n // Close database connections\n for (const [name, db] of dbs.entries()) {\n try {\n if (db && typeof db.close === 'function') {\n db.close()\n }\n logger?.info({ name }, 'Database closed')\n } catch (e) {\n logger?.error({ error: String(e), name }, 'Error closing database')\n }\n }\n\n if (bunServer) {\n bunServer.stop()\n logger?.info('Bun server stopped')\n }\n\n logger?.info('Server stopped successfully')\n },\n\n addRoute(route: types.RouteDefinition) {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n logger?.info({ method: route.method, path: route.path }, 'Route added')\n },\n\n getRoutes() {\n return routes\n }\n }\n\n return instance\n\t}\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\n\n // Better body parsing with size validation\n async function parseBody(\n request : Request,\n logger : Logger | null,\n maxSize : number\n ): Promise<any> {\n const contentType = request.headers.get('content-type') || ''\n\n try {\n if (contentType.includes('application/json')) {\n\t\t\t\tconst text = await request.text()\n\n\t\t\t\t// Validate size after reading\n\t\t\t\tif (text.length > maxSize) {\n\t\t\t\t\tthrow new types.ValidationError('Payload too large')\n\t\t\t\t}\n\n\t\t\t\tif (!text.trim()) return {}\n\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(text)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger?.warn({\n\t\t\t\t\t\terror\t\t: String(e),\n\t\t\t\t\t\tbodyPreview\t: text.substring(0, 100)\n\t\t\t\t\t}, 'Invalid JSON in request body')\n\n\t\t\t\t\tthrow new types.ValidationError('Invalid JSON in request body')\n\t\t\t\t}\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const text = await request.text()\n if (text.length > maxSize) {\n throw new types.ValidationError('Payload too large')\n }\n\n return Object.fromEntries(new URLSearchParams(text))\n }\n\n if (contentType.includes('multipart/form-data')) {\n // Note: FormData size can't be validated before parsing\n return await request.formData()\n }\n\n } catch (e) {\n if (e instanceof types.ValidationError) throw e\n logger?.error({ error: String(e) }, 'Error parsing request body')\n throw new types.ValidationError('Failed to parse request body')\n }\n\n return {}\n }\n\n // Better cookie parsing\n function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = new Map<string, string>()\n\n if (!cookieHeader) return cookies\n\n const pairs = cookieHeader.split(';')\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.trim().split('=')\n if (key) {\n const value = valueParts.join('=') // Handle '=' in value\n cookies.set(key, value ? decodeURIComponent(value) : '')\n }\n }\n\n return cookies\n }\n\n // Create app context with request ID\n function createAppContext(\n request : Request,\n params : Record<string, string>,\n db : any,\n logger : Logger | null,\n requestId : string\n ): types.AppContext {\n const url = new URL(request.url)\n const query = Object.fromEntries(url.searchParams)\n const headers = request.headers\n let statusCode = 200\n const cookieStore = new Map<string, string>()\n const parsedCookies = parseCookies(headers.get('cookie') || '')\n\n const ctx: any = {\n request,\n params,\n query,\n headers,\n db,\n logger,\n requestId,\n get statusCode() { return statusCode },\n set statusCode(code: number) { statusCode = code },\n body: null,\n\n json(data: any, status?: number): Response {\n return new Response(JSON.stringify(data), {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'application/json',\n ...this._setCookieHeaders()\n }\n })\n },\n\n text(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/plain',\n ...this._setCookieHeaders()\n }\n })\n },\n\n html(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/html; charset=utf-8',\n ...this._setCookieHeaders()\n }\n })\n },\n\n redirect(url: string, status = 302): Response {\n return new Response(null, {\n status,\n headers : {\n Location : url,\n ...this._setCookieHeaders()\n }\n })\n },\n\n file(path: string, contentType = 'application/octet-stream'): Response {\n const file = Bun.file(path)\n return new Response(file, {\n headers: {\n 'Content-Type': contentType,\n ...this._setCookieHeaders()\n }\n })\n },\n\n setCookie(name: string, value: string, options: types.CookieOptions = {}): types.AppContext {\n let cookie = `${name}=${encodeURIComponent(value)}`\n\n if (options.maxAge !== undefined) {\n cookie += `; Max-Age=${options.maxAge}`\n }\n if (options.expires) {\n cookie += `; Expires=${options.expires.toUTCString()}`\n }\n if (options.path) {\n cookie += `; Path=${options.path}`\n }\n if (options.domain) {\n cookie += `; Domain=${options.domain}`\n }\n if (options.secure) {\n cookie += '; Secure'\n }\n if (options.httpOnly) {\n cookie += '; HttpOnly'\n }\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite}`\n }\n\n cookieStore.set(name, cookie)\n return ctx\n },\n\n getCookie(name: string): string | undefined {\n return parsedCookies.get(name)\n },\n\n deleteCookie(name: string, options: Partial<types.CookieOptions> = {}): types.AppContext {\n return ctx.setCookie(name, '', {\n ...options,\n maxAge: 0,\n path: options.path || '/'\n })\n },\n\n setHeader(key: string, value: string): types.AppContext {\n headers.set(key, value)\n return ctx\n },\n\n getHeader(key: string): string | undefined {\n return headers.get(key) || undefined\n },\n\n status(code: number): types.AppContext {\n statusCode = code\n return ctx\n },\n\n _setCookieHeaders(): Record<string, string | string[]> {\n const h: any = {}\n if (cookieStore.size > 0) {\n h['Set-Cookie'] = Array.from(cookieStore.values())\n }\n return h\n }\n }\n\n return ctx\n }\n\n // Better IP extraction\n function getClientIp(request: Request): string {\n const forwarded = request.headers.get('x-forwarded-for')\n\n if (forwarded) {\n const ips = forwarded.split(',').map(ip => ip.trim())\n return ips[0] || 'unknown'\n }\n\n const realIp = request.headers.get('x-real-ip')\n if (realIp) return realIp\n return 'unknown'\n }\n\n // CORS helper with proper configuration\n function handleCors(request: Request, config: types.ServerConfig): Headers {\n const headers = new Headers()\n\n if (!config.security || typeof config.security !== 'object' || !config.security.cors) {\n return headers\n }\n\n const corsConfig = typeof config.security.cors === 'object' ? config.security.cors : {}\n const origin = request.headers.get('Origin')\n\n if (origin) {\n if (typeof corsConfig.origin === 'function') {\n if (corsConfig.origin(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (Array.isArray(corsConfig.origin)) {\n if (corsConfig.origin.includes(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (typeof corsConfig.origin === 'string') {\n headers.set('Access-Control-Allow-Origin', corsConfig.origin)\n } else {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n\n const methods = corsConfig.methods || ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']\n headers.set('Access-Control-Allow-Methods', methods.join(', '))\n\n const allowedHeaders = corsConfig.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With']\n headers.set('Access-Control-Allow-Headers', allowedHeaders.join(', '))\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true')\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', corsConfig.maxAge.toString())\n }\n }\n\n return headers\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\n\n // Export all types\n export * from './types.d';\n\n // Export Logger\n export { Logger };\n\n // Export SecurityManager for advanced use cases\n export { SecurityManager };\n\n // Export Router for advanced use cases\n export { Router };\n\n // Export DB and database helpers\n export {\n DB,\n table,\n column,\n integer,\n text,\n real,\n blob,\n numeric,\n primaryKey,\n notNull,\n unique,\n defaultValue,\n references\n } from './mod/db';\n\n // Export DB types\n export type {\n ColumnType,\n SqlValue,\n ColumnDefinition,\n TableSchema,\n WhereCondition,\n QueryBuilder\n } from './mod/db';\n\n // Default export\n export default server;\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@je-es/server",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Build faster, Sleep better !",
5
5
  "keywords": ["je-es", "server"],
6
6
  "license": "MIT",