speexjs 0.3.0 → 0.4.0
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/{index-CMkhSDh7.d.ts → index-C4xilc_E.d.ts} +4 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2706 -2344
- package/dist/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +2 -1
- package/dist/server/cache/index.d.ts +2 -1
- package/dist/server/controller/index.d.ts +2 -1
- package/dist/server/database/index.d.ts +14 -2
- package/dist/server/database/index.js +123 -15
- package/dist/server/database/index.js.map +1 -1
- package/dist/server/gate/index.d.ts +2 -1
- package/dist/server/index.d.ts +56 -3
- package/dist/server/index.js +1940 -1578
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/index.d.ts +2 -1
- package/dist/server/middleware/index.js +32 -1
- package/dist/server/middleware/index.js.map +1 -1
- package/dist/server/router/index.d.ts +2 -1
- package/dist/server/router/index.js.map +1 -1
- package/package.json +142 -141
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/better-sqlite3/lib/util.js","../../node_modules/better-sqlite3/lib/sqlite-error.js","../../node_modules/file-uri-to-path/index.js","../../node_modules/bindings/bindings.js","../../node_modules/better-sqlite3/lib/methods/wrappers.js","../../node_modules/better-sqlite3/lib/methods/transaction.js","../../node_modules/better-sqlite3/lib/methods/pragma.js","../../node_modules/better-sqlite3/lib/methods/backup.js","../../node_modules/better-sqlite3/lib/methods/serialize.js","../../node_modules/better-sqlite3/lib/methods/function.js","../../node_modules/better-sqlite3/lib/methods/aggregate.js","../../node_modules/better-sqlite3/lib/methods/table.js","../../node_modules/better-sqlite3/lib/methods/inspect.js","../../node_modules/better-sqlite3/lib/database.js","../../node_modules/better-sqlite3/lib/index.js","../../src/server/container/index.ts","../../src/server/http/status.ts","../../src/server/controller/index.ts","../../src/server/engine/index.ts","../../src/server/http/headers.ts","../../src/server/http/cookie.ts","../../src/server/http/upload.ts","../../src/server/http/request.ts","../../src/server/http/response.ts","../../src/server/middleware/index.ts","../../src/server/router/index.ts","../../src/server/cache/index.ts","../../src/server/database/connection.ts","../../src/server/database/dialect.ts","../../src/server/database/driver.ts","../../src/server/database/query.ts","../../src/server/database/migration.ts","../../src/server/database/pagination.ts","../../src/server/database/seeder.ts","../../src/server/database/model.ts","../../src/server/events/index.ts","../../src/server/helpers.ts","../../src/server/storage/index.ts","../../src/server/index.ts"],"sourcesContent":["'use strict';\n\nexports.getBooleanOption = (options, key) => {\n\tlet value = false;\n\tif (key in options && typeof (value = options[key]) !== 'boolean') {\n\t\tthrow new TypeError(`Expected the \"${key}\" option to be a boolean`);\n\t}\n\treturn value;\n};\n\nexports.cppdb = Symbol();\nexports.inspect = Symbol.for('nodejs.util.inspect.custom');\n","'use strict';\nconst descriptor = { value: 'SqliteError', writable: true, enumerable: false, configurable: true };\n\nfunction SqliteError(message, code) {\n\tif (new.target !== SqliteError) {\n\t\treturn new SqliteError(message, code);\n\t}\n\tif (typeof code !== 'string') {\n\t\tthrow new TypeError('Expected second argument to be a string');\n\t}\n\tError.call(this, message);\n\tdescriptor.value = '' + message;\n\tObject.defineProperty(this, 'message', descriptor);\n\tError.captureStackTrace(this, SqliteError);\n\tthis.code = code;\n}\nObject.setPrototypeOf(SqliteError, Error);\nObject.setPrototypeOf(SqliteError.prototype, Error.prototype);\nObject.defineProperty(SqliteError.prototype, 'name', descriptor);\nmodule.exports = SqliteError;\n","\n/**\n * Module dependencies.\n */\n\nvar sep = require('path').sep || '/';\n\n/**\n * Module exports.\n */\n\nmodule.exports = fileUriToPath;\n\n/**\n * File URI to Path function.\n *\n * @param {String} uri\n * @return {String} path\n * @api public\n */\n\nfunction fileUriToPath (uri) {\n if ('string' != typeof uri ||\n uri.length <= 7 ||\n 'file://' != uri.substring(0, 7)) {\n throw new TypeError('must pass in a file:// URI to convert to a file path');\n }\n\n var rest = decodeURI(uri.substring(7));\n var firstSlash = rest.indexOf('/');\n var host = rest.substring(0, firstSlash);\n var path = rest.substring(firstSlash + 1);\n\n // 2. Scheme Definition\n // As a special case, <host> can be the string \"localhost\" or the empty\n // string; this is interpreted as \"the machine from which the URL is\n // being interpreted\".\n if ('localhost' == host) host = '';\n\n if (host) {\n host = sep + sep + host;\n }\n\n // 3.2 Drives, drive letters, mount points, file system root\n // Drive letters are mapped into the top of a file URI in various ways,\n // depending on the implementation; some applications substitute\n // vertical bar (\"|\") for the colon after the drive letter, yielding\n // \"file:///c|/tmp/test.txt\". In some cases, the colon is left\n // unchanged, as in \"file:///c:/tmp/test.txt\". In other cases, the\n // colon is simply omitted, as in \"file:///c/tmp/test.txt\".\n path = path.replace(/^(.+)\\|/, '$1:');\n\n // for Windows, we need to invert the path separators from what a URI uses\n if (sep == '\\\\') {\n path = path.replace(/\\//g, '\\\\');\n }\n\n if (/^.+\\:/.test(path)) {\n // has Windows drive at beginning of path\n } else {\n // unix path…\n path = sep + path;\n }\n\n return host + path;\n}\n","/**\n * Module dependencies.\n */\n\nvar fs = require('fs'),\n path = require('path'),\n fileURLToPath = require('file-uri-to-path'),\n join = path.join,\n dirname = path.dirname,\n exists =\n (fs.accessSync &&\n function(path) {\n try {\n fs.accessSync(path);\n } catch (e) {\n return false;\n }\n return true;\n }) ||\n fs.existsSync ||\n path.existsSync,\n defaults = {\n arrow: process.env.NODE_BINDINGS_ARROW || ' → ',\n compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled',\n platform: process.platform,\n arch: process.arch,\n nodePreGyp:\n 'node-v' +\n process.versions.modules +\n '-' +\n process.platform +\n '-' +\n process.arch,\n version: process.versions.node,\n bindings: 'bindings.node',\n try: [\n // node-gyp's linked version in the \"build\" dir\n ['module_root', 'build', 'bindings'],\n // node-waf and gyp_addon (a.k.a node-gyp)\n ['module_root', 'build', 'Debug', 'bindings'],\n ['module_root', 'build', 'Release', 'bindings'],\n // Debug files, for development (legacy behavior, remove for node v0.9)\n ['module_root', 'out', 'Debug', 'bindings'],\n ['module_root', 'Debug', 'bindings'],\n // Release files, but manually compiled (legacy behavior, remove for node v0.9)\n ['module_root', 'out', 'Release', 'bindings'],\n ['module_root', 'Release', 'bindings'],\n // Legacy from node-waf, node <= 0.4.x\n ['module_root', 'build', 'default', 'bindings'],\n // Production \"Release\" buildtype binary (meh...)\n ['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'],\n // node-qbs builds\n ['module_root', 'addon-build', 'release', 'install-root', 'bindings'],\n ['module_root', 'addon-build', 'debug', 'install-root', 'bindings'],\n ['module_root', 'addon-build', 'default', 'install-root', 'bindings'],\n // node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch}\n ['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings']\n ]\n };\n\n/**\n * The main `bindings()` function loads the compiled bindings for a given module.\n * It uses V8's Error API to determine the parent filename that this function is\n * being invoked from, which is then used to find the root directory.\n */\n\nfunction bindings(opts) {\n // Argument surgery\n if (typeof opts == 'string') {\n opts = { bindings: opts };\n } else if (!opts) {\n opts = {};\n }\n\n // maps `defaults` onto `opts` object\n Object.keys(defaults).map(function(i) {\n if (!(i in opts)) opts[i] = defaults[i];\n });\n\n // Get the module root\n if (!opts.module_root) {\n opts.module_root = exports.getRoot(exports.getFileName());\n }\n\n // Ensure the given bindings name ends with .node\n if (path.extname(opts.bindings) != '.node') {\n opts.bindings += '.node';\n }\n\n // https://github.com/webpack/webpack/issues/4175#issuecomment-342931035\n var requireFunc =\n typeof __webpack_require__ === 'function'\n ? __non_webpack_require__\n : require;\n\n var tries = [],\n i = 0,\n l = opts.try.length,\n n,\n b,\n err;\n\n for (; i < l; i++) {\n n = join.apply(\n null,\n opts.try[i].map(function(p) {\n return opts[p] || p;\n })\n );\n tries.push(n);\n try {\n b = opts.path ? requireFunc.resolve(n) : requireFunc(n);\n if (!opts.path) {\n b.path = n;\n }\n return b;\n } catch (e) {\n if (e.code !== 'MODULE_NOT_FOUND' &&\n e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' &&\n !/not find/i.test(e.message)) {\n throw e;\n }\n }\n }\n\n err = new Error(\n 'Could not locate the bindings file. Tried:\\n' +\n tries\n .map(function(a) {\n return opts.arrow + a;\n })\n .join('\\n')\n );\n err.tries = tries;\n throw err;\n}\nmodule.exports = exports = bindings;\n\n/**\n * Gets the filename of the JavaScript file that invokes this function.\n * Used to help find the root directory of a module.\n * Optionally accepts an filename argument to skip when searching for the invoking filename\n */\n\nexports.getFileName = function getFileName(calling_file) {\n var origPST = Error.prepareStackTrace,\n origSTL = Error.stackTraceLimit,\n dummy = {},\n fileName;\n\n Error.stackTraceLimit = 10;\n\n Error.prepareStackTrace = function(e, st) {\n for (var i = 0, l = st.length; i < l; i++) {\n fileName = st[i].getFileName();\n if (fileName !== __filename) {\n if (calling_file) {\n if (fileName !== calling_file) {\n return;\n }\n } else {\n return;\n }\n }\n }\n };\n\n // run the 'prepareStackTrace' function above\n Error.captureStackTrace(dummy);\n dummy.stack;\n\n // cleanup\n Error.prepareStackTrace = origPST;\n Error.stackTraceLimit = origSTL;\n\n // handle filename that starts with \"file://\"\n var fileSchema = 'file://';\n if (fileName.indexOf(fileSchema) === 0) {\n fileName = fileURLToPath(fileName);\n }\n\n return fileName;\n};\n\n/**\n * Gets the root directory of a module, given an arbitrary filename\n * somewhere in the module tree. The \"root directory\" is the directory\n * containing the `package.json` file.\n *\n * In: /home/nate/node-native-module/lib/index.js\n * Out: /home/nate/node-native-module\n */\n\nexports.getRoot = function getRoot(file) {\n var dir = dirname(file),\n prev;\n while (true) {\n if (dir === '.') {\n // Avoids an infinite loop in rare cases, like the REPL\n dir = process.cwd();\n }\n if (\n exists(join(dir, 'package.json')) ||\n exists(join(dir, 'node_modules'))\n ) {\n // Found the 'package.json' file or 'node_modules' dir; we're done\n return dir;\n }\n if (prev === dir) {\n // Got to the top\n throw new Error(\n 'Could not find module root given file: \"' +\n file +\n '\". Do you have a `package.json` file? '\n );\n }\n // Try the parent dir next\n prev = dir;\n dir = join(dir, '..');\n }\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nexports.prepare = function prepare(sql) {\n\treturn this[cppdb].prepare(sql, this, false);\n};\n\nexports.exec = function exec(sql) {\n\tthis[cppdb].exec(sql);\n\treturn this;\n};\n\nexports.close = function close() {\n\tthis[cppdb].close();\n\treturn this;\n};\n\nexports.loadExtension = function loadExtension(...args) {\n\tthis[cppdb].loadExtension(...args);\n\treturn this;\n};\n\nexports.defaultSafeIntegers = function defaultSafeIntegers(...args) {\n\tthis[cppdb].defaultSafeIntegers(...args);\n\treturn this;\n};\n\nexports.unsafeMode = function unsafeMode(...args) {\n\tthis[cppdb].unsafeMode(...args);\n\treturn this;\n};\n\nexports.getters = {\n\tname: {\n\t\tget: function name() { return this[cppdb].name; },\n\t\tenumerable: true,\n\t},\n\topen: {\n\t\tget: function open() { return this[cppdb].open; },\n\t\tenumerable: true,\n\t},\n\tinTransaction: {\n\t\tget: function inTransaction() { return this[cppdb].inTransaction; },\n\t\tenumerable: true,\n\t},\n\treadonly: {\n\t\tget: function readonly() { return this[cppdb].readonly; },\n\t\tenumerable: true,\n\t},\n\tmemory: {\n\t\tget: function memory() { return this[cppdb].memory; },\n\t\tenumerable: true,\n\t},\n};\n","'use strict';\nconst { cppdb } = require('../util');\nconst controllers = new WeakMap();\n\nmodule.exports = function transaction(fn) {\n\tif (typeof fn !== 'function') throw new TypeError('Expected first argument to be a function');\n\n\tconst db = this[cppdb];\n\tconst controller = getController(db, this);\n\tconst { apply } = Function.prototype;\n\n\t// Each version of the transaction function has these same properties\n\tconst properties = {\n\t\tdefault: { value: wrapTransaction(apply, fn, db, controller.default) },\n\t\tdeferred: { value: wrapTransaction(apply, fn, db, controller.deferred) },\n\t\timmediate: { value: wrapTransaction(apply, fn, db, controller.immediate) },\n\t\texclusive: { value: wrapTransaction(apply, fn, db, controller.exclusive) },\n\t\tdatabase: { value: this, enumerable: true },\n\t};\n\n\tObject.defineProperties(properties.default.value, properties);\n\tObject.defineProperties(properties.deferred.value, properties);\n\tObject.defineProperties(properties.immediate.value, properties);\n\tObject.defineProperties(properties.exclusive.value, properties);\n\n\t// Return the default version of the transaction function\n\treturn properties.default.value;\n};\n\n// Return the database's cached transaction controller, or create a new one\nconst getController = (db, self) => {\n\tlet controller = controllers.get(db);\n\tif (!controller) {\n\t\tconst shared = {\n\t\t\tcommit: db.prepare('COMMIT', self, false),\n\t\t\trollback: db.prepare('ROLLBACK', self, false),\n\t\t\tsavepoint: db.prepare('SAVEPOINT `\\t_bs3.\\t`', self, false),\n\t\t\trelease: db.prepare('RELEASE `\\t_bs3.\\t`', self, false),\n\t\t\trollbackTo: db.prepare('ROLLBACK TO `\\t_bs3.\\t`', self, false),\n\t\t};\n\t\tcontrollers.set(db, controller = {\n\t\t\tdefault: Object.assign({ begin: db.prepare('BEGIN', self, false) }, shared),\n\t\t\tdeferred: Object.assign({ begin: db.prepare('BEGIN DEFERRED', self, false) }, shared),\n\t\t\timmediate: Object.assign({ begin: db.prepare('BEGIN IMMEDIATE', self, false) }, shared),\n\t\t\texclusive: Object.assign({ begin: db.prepare('BEGIN EXCLUSIVE', self, false) }, shared),\n\t\t});\n\t}\n\treturn controller;\n};\n\n// Return a new transaction function by wrapping the given function\nconst wrapTransaction = (apply, fn, db, { begin, commit, rollback, savepoint, release, rollbackTo }) => function sqliteTransaction() {\n\tlet before, after, undo;\n\tif (db.inTransaction) {\n\t\tbefore = savepoint;\n\t\tafter = release;\n\t\tundo = rollbackTo;\n\t} else {\n\t\tbefore = begin;\n\t\tafter = commit;\n\t\tundo = rollback;\n\t}\n\tbefore.run();\n\ttry {\n\t\tconst result = apply.call(fn, this, arguments);\n\t\tif (result && typeof result.then === 'function') {\n\t\t\tthrow new TypeError('Transaction function cannot return a promise');\n\t\t}\n\t\tafter.run();\n\t\treturn result;\n\t} catch (ex) {\n\t\tif (db.inTransaction) {\n\t\t\tundo.run();\n\t\t\tif (undo !== rollback) after.run();\n\t\t}\n\t\tthrow ex;\n\t}\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function pragma(source, options) {\n\tif (options == null) options = {};\n\tif (typeof source !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tconst simple = getBooleanOption(options, 'simple');\n\n\tconst stmt = this[cppdb].prepare(`PRAGMA ${source}`, this, true);\n\treturn simple ? stmt.pluck().get() : stmt.all();\n};\n","'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst { promisify } = require('util');\nconst { cppdb } = require('../util');\nconst fsAccess = promisify(fs.access);\n\nmodule.exports = async function backup(filename, options) {\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof filename !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\n\t// Interpret options\n\tfilename = filename.trim();\n\tconst attachedName = 'attached' in options ? options.attached : 'main';\n\tconst handler = 'progress' in options ? options.progress : null;\n\n\t// Validate interpreted options\n\tif (!filename) throw new TypeError('Backup filename cannot be an empty string');\n\tif (filename === ':memory:') throw new TypeError('Invalid backup filename \":memory:\"');\n\tif (typeof attachedName !== 'string') throw new TypeError('Expected the \"attached\" option to be a string');\n\tif (!attachedName) throw new TypeError('The \"attached\" option cannot be an empty string');\n\tif (handler != null && typeof handler !== 'function') throw new TypeError('Expected the \"progress\" option to be a function');\n\n\t// Make sure the specified directory exists\n\tawait fsAccess(path.dirname(filename)).catch(() => {\n\t\tthrow new TypeError('Cannot save backup because the directory does not exist');\n\t});\n\n\tconst isNewFile = await fsAccess(filename).then(() => false, () => true);\n\treturn runBackup(this[cppdb].backup(this, attachedName, filename, isNewFile), handler || null);\n};\n\nconst runBackup = (backup, handler) => {\n\tlet rate = 0;\n\tlet useDefault = true;\n\n\treturn new Promise((resolve, reject) => {\n\t\tsetImmediate(function step() {\n\t\t\ttry {\n\t\t\t\tconst progress = backup.transfer(rate);\n\t\t\t\tif (!progress.remainingPages) {\n\t\t\t\t\tbackup.close();\n\t\t\t\t\tresolve(progress);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (useDefault) {\n\t\t\t\t\tuseDefault = false;\n\t\t\t\t\trate = 100;\n\t\t\t\t}\n\t\t\t\tif (handler) {\n\t\t\t\t\tconst ret = handler(progress);\n\t\t\t\t\tif (ret !== undefined) {\n\t\t\t\t\t\tif (typeof ret === 'number' && ret === ret) rate = Math.max(0, Math.min(0x7fffffff, Math.round(ret)));\n\t\t\t\t\t\telse throw new TypeError('Expected progress callback to return a number or undefined');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetImmediate(step);\n\t\t\t} catch (err) {\n\t\t\t\tbackup.close();\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t});\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nmodule.exports = function serialize(options) {\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof options !== 'object') throw new TypeError('Expected first argument to be an options object');\n\n\t// Interpret and validate options\n\tconst attachedName = 'attached' in options ? options.attached : 'main';\n\tif (typeof attachedName !== 'string') throw new TypeError('Expected the \"attached\" option to be a string');\n\tif (!attachedName) throw new TypeError('The \"attached\" option cannot be an empty string');\n\n\treturn this[cppdb].serialize(attachedName);\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function defineFunction(name, options, fn) {\n\t// Apply defaults\n\tif (options == null) options = {};\n\tif (typeof options === 'function') { fn = options; options = {}; }\n\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof fn !== 'function') throw new TypeError('Expected last argument to be a function');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tif (!name) throw new TypeError('User-defined function name cannot be an empty string');\n\n\t// Interpret options\n\tconst safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;\n\tconst deterministic = getBooleanOption(options, 'deterministic');\n\tconst directOnly = getBooleanOption(options, 'directOnly');\n\tconst varargs = getBooleanOption(options, 'varargs');\n\tlet argCount = -1;\n\n\t// Determine argument count\n\tif (!varargs) {\n\t\targCount = fn.length;\n\t\tif (!Number.isInteger(argCount) || argCount < 0) throw new TypeError('Expected function.length to be a positive integer');\n\t\tif (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');\n\t}\n\n\tthis[cppdb].function(fn, name, argCount, safeIntegers, deterministic, directOnly);\n\treturn this;\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function defineAggregate(name, options) {\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object' || options === null) throw new TypeError('Expected second argument to be an options object');\n\tif (!name) throw new TypeError('User-defined function name cannot be an empty string');\n\n\t// Interpret options\n\tconst start = 'start' in options ? options.start : null;\n\tconst step = getFunctionOption(options, 'step', true);\n\tconst inverse = getFunctionOption(options, 'inverse', false);\n\tconst result = getFunctionOption(options, 'result', false);\n\tconst safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;\n\tconst deterministic = getBooleanOption(options, 'deterministic');\n\tconst directOnly = getBooleanOption(options, 'directOnly');\n\tconst varargs = getBooleanOption(options, 'varargs');\n\tlet argCount = -1;\n\n\t// Determine argument count\n\tif (!varargs) {\n\t\targCount = Math.max(getLength(step), inverse ? getLength(inverse) : 0);\n\t\tif (argCount > 0) argCount -= 1;\n\t\tif (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');\n\t}\n\n\tthis[cppdb].aggregate(start, step, inverse, result, name, argCount, safeIntegers, deterministic, directOnly);\n\treturn this;\n};\n\nconst getFunctionOption = (options, key, required) => {\n\tconst value = key in options ? options[key] : null;\n\tif (typeof value === 'function') return value;\n\tif (value != null) throw new TypeError(`Expected the \"${key}\" option to be a function`);\n\tif (required) throw new TypeError(`Missing required option \"${key}\"`);\n\treturn null;\n};\n\nconst getLength = ({ length }) => {\n\tif (Number.isInteger(length) && length >= 0) return length;\n\tthrow new TypeError('Expected function.length to be a positive integer');\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nmodule.exports = function defineTable(name, factory) {\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (!name) throw new TypeError('Virtual table module name cannot be an empty string');\n\n\t// Determine whether the module is eponymous-only or not\n\tlet eponymous = false;\n\tif (typeof factory === 'object' && factory !== null) {\n\t\teponymous = true;\n\t\tfactory = defer(parseTableDefinition(factory, 'used', name));\n\t} else {\n\t\tif (typeof factory !== 'function') throw new TypeError('Expected second argument to be a function or a table definition object');\n\t\tfactory = wrapFactory(factory);\n\t}\n\n\tthis[cppdb].table(factory, name, eponymous);\n\treturn this;\n};\n\nfunction wrapFactory(factory) {\n\treturn function virtualTableFactory(moduleName, databaseName, tableName, ...args) {\n\t\tconst thisObject = {\n\t\t\tmodule: moduleName,\n\t\t\tdatabase: databaseName,\n\t\t\ttable: tableName,\n\t\t};\n\n\t\t// Generate a new table definition by invoking the factory\n\t\tconst def = apply.call(factory, thisObject, args);\n\t\tif (typeof def !== 'object' || def === null) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" did not return a table definition object`);\n\t\t}\n\n\t\treturn parseTableDefinition(def, 'returned', moduleName);\n\t};\n}\n\nfunction parseTableDefinition(def, verb, moduleName) {\n\t// Validate required properties\n\tif (!hasOwnProperty.call(def, 'rows')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition without a \"rows\" property`);\n\t}\n\tif (!hasOwnProperty.call(def, 'columns')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition without a \"columns\" property`);\n\t}\n\n\t// Validate \"rows\" property\n\tconst rows = def.rows;\n\tif (typeof rows !== 'function' || Object.getPrototypeOf(rows) !== GeneratorFunctionPrototype) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"rows\" property (should be a generator function)`);\n\t}\n\n\t// Validate \"columns\" property\n\tlet columns = def.columns;\n\tif (!Array.isArray(columns) || !(columns = [...columns]).every(x => typeof x === 'string')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"columns\" property (should be an array of strings)`);\n\t}\n\tif (columns.length !== new Set(columns).size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with duplicate column names`);\n\t}\n\tif (!columns.length) {\n\t\tthrow new RangeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with zero columns`);\n\t}\n\n\t// Validate \"parameters\" property\n\tlet parameters;\n\tif (hasOwnProperty.call(def, 'parameters')) {\n\t\tparameters = def.parameters;\n\t\tif (!Array.isArray(parameters) || !(parameters = [...parameters]).every(x => typeof x === 'string')) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"parameters\" property (should be an array of strings)`);\n\t\t}\n\t} else {\n\t\tparameters = inferParameters(rows);\n\t}\n\tif (parameters.length !== new Set(parameters).size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with duplicate parameter names`);\n\t}\n\tif (parameters.length > 32) {\n\t\tthrow new RangeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with more than the maximum number of 32 parameters`);\n\t}\n\tfor (const parameter of parameters) {\n\t\tif (columns.includes(parameter)) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with column \"${parameter}\" which was ambiguously defined as both a column and parameter`);\n\t\t}\n\t}\n\n\t// Validate \"safeIntegers\" option\n\tlet safeIntegers = 2;\n\tif (hasOwnProperty.call(def, 'safeIntegers')) {\n\t\tconst bool = def.safeIntegers;\n\t\tif (typeof bool !== 'boolean') {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"safeIntegers\" property (should be a boolean)`);\n\t\t}\n\t\tsafeIntegers = +bool;\n\t}\n\n\t// Validate \"directOnly\" option\n\tlet directOnly = false;\n\tif (hasOwnProperty.call(def, 'directOnly')) {\n\t\tdirectOnly = def.directOnly;\n\t\tif (typeof directOnly !== 'boolean') {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"directOnly\" property (should be a boolean)`);\n\t\t}\n\t}\n\n\t// Generate SQL for the virtual table definition\n\tconst columnDefinitions = [\n\t\t...parameters.map(identifier).map(str => `${str} HIDDEN`),\n\t\t...columns.map(identifier),\n\t];\n\treturn [\n\t\t`CREATE TABLE x(${columnDefinitions.join(', ')});`,\n\t\twrapGenerator(rows, new Map(columns.map((x, i) => [x, parameters.length + i])), moduleName),\n\t\tparameters,\n\t\tsafeIntegers,\n\t\tdirectOnly,\n\t];\n}\n\nfunction wrapGenerator(generator, columnMap, moduleName) {\n\treturn function* virtualTable(...args) {\n\t\t/*\n\t\t\tWe must defensively clone any buffers in the arguments, because\n\t\t\totherwise the generator could mutate one of them, which would cause\n\t\t\tus to return incorrect values for hidden columns, potentially\n\t\t\tcorrupting the database.\n\t\t */\n\t\tconst output = args.map(x => Buffer.isBuffer(x) ? Buffer.from(x) : x);\n\t\tfor (let i = 0; i < columnMap.size; ++i) {\n\t\t\toutput.push(null); // Fill with nulls to prevent gaps in array (v8 optimization)\n\t\t}\n\t\tfor (const row of generator(...args)) {\n\t\t\tif (Array.isArray(row)) {\n\t\t\t\textractRowArray(row, output, columnMap.size, moduleName);\n\t\t\t\tyield output;\n\t\t\t} else if (typeof row === 'object' && row !== null) {\n\t\t\t\textractRowObject(row, output, columnMap, moduleName);\n\t\t\t\tyield output;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded something that isn't a valid row object`);\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction extractRowArray(row, output, columnCount, moduleName) {\n\tif (row.length !== columnCount) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with an incorrect number of columns`);\n\t}\n\tconst offset = output.length - columnCount;\n\tfor (let i = 0; i < columnCount; ++i) {\n\t\toutput[i + offset] = row[i];\n\t}\n}\n\nfunction extractRowObject(row, output, columnMap, moduleName) {\n\tlet count = 0;\n\tfor (const key of Object.keys(row)) {\n\t\tconst index = columnMap.get(key);\n\t\tif (index === undefined) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with an undeclared column \"${key}\"`);\n\t\t}\n\t\toutput[index] = row[key];\n\t\tcount += 1;\n\t}\n\tif (count !== columnMap.size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with missing columns`);\n\t}\n}\n\nfunction inferParameters({ length }) {\n\tif (!Number.isInteger(length) || length < 0) {\n\t\tthrow new TypeError('Expected function.length to be a positive integer');\n\t}\n\tconst params = [];\n\tfor (let i = 0; i < length; ++i) {\n\t\tparams.push(`$${i + 1}`);\n\t}\n\treturn params;\n}\n\nconst { hasOwnProperty } = Object.prototype;\nconst { apply } = Function.prototype;\nconst GeneratorFunctionPrototype = Object.getPrototypeOf(function*(){});\nconst identifier = str => `\"${str.replace(/\"/g, '\"\"')}\"`;\nconst defer = x => () => x;\n","'use strict';\nconst DatabaseInspection = function Database() {};\n\nmodule.exports = function inspect(depth, opts) {\n\treturn Object.assign(new DatabaseInspection(), this);\n};\n\n","'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst util = require('./util');\nconst SqliteError = require('./sqlite-error');\n\nlet DEFAULT_ADDON;\n\nfunction Database(filenameGiven, options) {\n\tif (new.target == null) {\n\t\treturn new Database(filenameGiven, options);\n\t}\n\n\t// Apply defaults\n\tlet buffer;\n\tif (Buffer.isBuffer(filenameGiven)) {\n\t\tbuffer = filenameGiven;\n\t\tfilenameGiven = ':memory:';\n\t}\n\tif (filenameGiven == null) filenameGiven = '';\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof filenameGiven !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tif ('readOnly' in options) throw new TypeError('Misspelled option \"readOnly\" should be \"readonly\"');\n\tif ('memory' in options) throw new TypeError('Option \"memory\" was removed in v7.0.0 (use \":memory:\" filename instead)');\n\n\t// Interpret options\n\tconst filename = filenameGiven.trim();\n\tconst anonymous = filename === '' || filename === ':memory:';\n\tconst readonly = util.getBooleanOption(options, 'readonly');\n\tconst fileMustExist = util.getBooleanOption(options, 'fileMustExist');\n\tconst timeout = 'timeout' in options ? options.timeout : 5000;\n\tconst verbose = 'verbose' in options ? options.verbose : null;\n\tconst nativeBinding = 'nativeBinding' in options ? options.nativeBinding : null;\n\n\t// Validate interpreted options\n\tif (readonly && anonymous && !buffer) throw new TypeError('In-memory/temporary databases cannot be readonly');\n\tif (!Number.isInteger(timeout) || timeout < 0) throw new TypeError('Expected the \"timeout\" option to be a positive integer');\n\tif (timeout > 0x7fffffff) throw new RangeError('Option \"timeout\" cannot be greater than 2147483647');\n\tif (verbose != null && typeof verbose !== 'function') throw new TypeError('Expected the \"verbose\" option to be a function');\n\tif (nativeBinding != null && typeof nativeBinding !== 'string' && typeof nativeBinding !== 'object') throw new TypeError('Expected the \"nativeBinding\" option to be a string or addon object');\n\n\t// Load the native addon\n\tlet addon;\n\tif (nativeBinding == null) {\n\t\taddon = DEFAULT_ADDON || (DEFAULT_ADDON = require('bindings')('better_sqlite3.node'));\n\t} else if (typeof nativeBinding === 'string') {\n\t\t// See <https://webpack.js.org/api/module-variables/#__non_webpack_require__-webpack-specific>\n\t\tconst requireFunc = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : require;\n\t\taddon = requireFunc(path.resolve(nativeBinding).replace(/(\\.node)?$/, '.node'));\n\t} else {\n\t\t// See <https://github.com/WiseLibs/better-sqlite3/issues/972>\n\t\taddon = nativeBinding;\n\t}\n\n\tif (!addon.isInitialized) {\n\t\taddon.setErrorConstructor(SqliteError);\n\t\taddon.isInitialized = true;\n\t}\n\n\t// Make sure the specified directory exists\n\tif (!anonymous && !filename.startsWith('file:') && !fs.existsSync(path.dirname(filename))) {\n\t\tthrow new TypeError('Cannot open database because the directory does not exist');\n\t}\n\n\tObject.defineProperties(this, {\n\t\t[util.cppdb]: { value: new addon.Database(filename, filenameGiven, anonymous, readonly, fileMustExist, timeout, verbose || null, buffer || null) },\n\t\t...wrappers.getters,\n\t});\n}\n\nconst wrappers = require('./methods/wrappers');\nDatabase.prototype.prepare = wrappers.prepare;\nDatabase.prototype.transaction = require('./methods/transaction');\nDatabase.prototype.pragma = require('./methods/pragma');\nDatabase.prototype.backup = require('./methods/backup');\nDatabase.prototype.serialize = require('./methods/serialize');\nDatabase.prototype.function = require('./methods/function');\nDatabase.prototype.aggregate = require('./methods/aggregate');\nDatabase.prototype.table = require('./methods/table');\nDatabase.prototype.loadExtension = wrappers.loadExtension;\nDatabase.prototype.exec = wrappers.exec;\nDatabase.prototype.close = wrappers.close;\nDatabase.prototype.defaultSafeIntegers = wrappers.defaultSafeIntegers;\nDatabase.prototype.unsafeMode = wrappers.unsafeMode;\nDatabase.prototype[util.inspect] = require('./methods/inspect');\n\nmodule.exports = Database;\n","'use strict';\nmodule.exports = require('./database');\nmodule.exports.SqliteError = require('./sqlite-error');\n","type Factory<T> = () => T\n\ninterface Binding<T> {\n factory: Factory<T>\n singleton: boolean\n instance?: T\n}\n\nexport class Container {\n private bindings = new Map<string, Binding<unknown>>()\n private resolving = new Set<string>()\n\n bind<T>(name: string, factory: Factory<T>): this {\n this.bindings.set(name, { factory, singleton: false })\n return this\n }\n\n singleton<T>(name: string, factory: Factory<T>): this {\n this.bindings.set(name, { factory, singleton: true })\n return this\n }\n\n instance<T>(name: string, instance: T): this {\n this.bindings.set(name, {\n factory: () => instance,\n singleton: true,\n instance,\n })\n return this\n }\n\n resolve<T>(name: string): T {\n const binding = this.bindings.get(name)\n if (binding === undefined) {\n throw new Error(`Binding not found: ${name}`)\n }\n\n if (binding.singleton && binding.instance !== undefined) {\n return binding.instance as T\n }\n\n if (this.resolving.has(name)) {\n throw new Error(\n `Circular dependency detected: ${name} is already being resolved`,\n )\n }\n\n this.resolving.add(name)\n\n try {\n const instance = binding.factory() as T\n if (binding.singleton) {\n binding.instance = instance\n }\n return instance\n } finally {\n this.resolving.delete(name)\n }\n }\n\n has(name: string): boolean {\n return this.bindings.has(name)\n }\n\n remove(name: string): void {\n this.bindings.delete(name)\n }\n\n clear(): void {\n this.bindings.clear()\n this.resolving.clear()\n }\n\n getBindings(): Map<string, Binding<unknown>> {\n return new Map(this.bindings)\n }\n}\n","export const HttpStatus = {\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n} as const\n\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus]\n\nconst statusTextMap: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n}\n\nexport function statusText(code: number): string {\n const text = statusTextMap[code]\n if (text !== undefined) return text\n if (code >= 100 && code < 200) return 'Informational'\n if (code >= 200 && code < 300) return 'Success'\n if (code >= 300 && code < 400) return 'Redirection'\n if (code >= 400 && code < 500) return 'Client Error'\n if (code >= 500 && code < 600) return 'Server Error'\n return 'Unknown'\n}\n","import type { RouteContext } from '../router'\nimport type { Container } from '../container'\nimport type { SuperRequest } from '../http/request'\nimport type { SuperResponse } from '../http/response'\nimport type { Schema } from '../http/request'\nimport { HttpStatus } from '../http/status'\n\nexport interface ControllerRouteDefinition {\n method: string\n path: string\n handler: string | symbol\n}\n\nconst controllerPrefixMap = new WeakMap<object, string>()\nconst controllerRoutesMap = new WeakMap<object, ControllerRouteDefinition[]>()\n\nexport abstract class Controller {\n declare protected __ctx: RouteContext\n declare protected __container: Container\n\n protected get request(): SuperRequest {\n return this.__ctx.request\n }\n\n protected get response(): SuperResponse {\n return this.__ctx.response\n }\n\n protected get container(): Container {\n return this.__container\n }\n\n protected async validate<T>(schema: Schema<T>): Promise<T> {\n return this.request.validate(schema)\n }\n\n protected ok<T>(data: T): void {\n this.response.json(data, HttpStatus.OK)\n }\n\n protected created<T>(data: T): void {\n this.response.json(data, HttpStatus.CREATED)\n }\n\n protected noContent(): void {\n this.response.status(HttpStatus.NO_CONTENT)\n }\n\n protected badRequest(message?: string): void {\n this.response.status(HttpStatus.BAD_REQUEST).json({\n error: 'Bad Request',\n message: message ?? 'The request could not be processed',\n })\n }\n\n protected notFound(message?: string): void {\n this.response.status(HttpStatus.NOT_FOUND).json({\n error: 'Not Found',\n message: message ?? 'The requested resource was not found',\n })\n }\n\n protected unauthorized(message?: string): void {\n this.response.status(HttpStatus.UNAUTHORIZED).json({\n error: 'Unauthorized',\n message: message ?? 'Authentication is required',\n })\n }\n\n protected forbidden(message?: string): void {\n this.response.status(HttpStatus.FORBIDDEN).json({\n error: 'Forbidden',\n message: message ?? 'You do not have permission to access this resource',\n })\n }\n\n protected error(status: number, message?: string): void {\n this.response.status(status).json({\n error: getStatusKey(status),\n message: message ?? 'An error occurred',\n })\n }\n}\n\nfunction getStatusKey(code: number): string {\n for (const [key, val] of Object.entries(HttpStatus)) {\n if (val === code) return key\n }\n return 'Error'\n}\n\nfunction createRouteDecorator(method: string) {\n return (path: string) => {\n return (target: unknown, context: ClassMethodDecoratorContext): void => {\n const classTarget = context.static\n ? (target as object)\n : ((target as { constructor: object }).constructor)\n\n const routes = controllerRoutesMap.get(classTarget) ?? []\n routes.push({ method, path, handler: context.name })\n controllerRoutesMap.set(classTarget, routes)\n }\n }\n}\n\nexport function controller(prefix?: string): ClassDecorator {\n return (target: unknown, _context?: ClassDecoratorContext): void => {\n controllerPrefixMap.set(target as object, prefix ?? '')\n }\n}\n\nexport const get = createRouteDecorator('GET')\nexport const post = createRouteDecorator('POST')\nexport const put = createRouteDecorator('PUT')\nexport const patch = createRouteDecorator('PATCH')\nexport const del = createRouteDecorator('DELETE')\n\nexport function getControllerPrefix(controllerClass: object): string {\n return controllerPrefixMap.get(controllerClass) ?? ''\n}\n\nexport function getControllerRoutes(\n controllerClass: object,\n): ControllerRouteDefinition[] {\n return controllerRoutesMap.get(controllerClass) ?? []\n}\n","import { createServer as createHttpServer } from 'node:http'\nimport type { Server } from 'node:http'\n\nimport { SuperRequest } from '../http/request'\nimport { SuperResponse } from '../http/response'\n\nexport interface ServerInstance {\n close: () => Promise<void>\n raw: Server\n}\n\nexport type RequestHandler = (\n req: SuperRequest,\n res: SuperResponse,\n) => void | Promise<void>\n\nexport interface ServerEngine {\n createServer(handler: RequestHandler): Promise<ServerInstance>\n getPort(server: ServerInstance): number\n close(server: ServerInstance): Promise<void>\n}\n\nexport class NodeEngine implements ServerEngine {\n async createServer(handler: RequestHandler): Promise<ServerInstance> {\n const server = createHttpServer(async (nodeReq, nodeRes) => {\n const req = new SuperRequest(nodeReq)\n const res = new SuperResponse(nodeRes)\n\n try {\n await handler(req, res)\n } catch (_err: unknown) {\n if (!res.headersSent) {\n const message =\n _err instanceof Error ? _err.message : 'Internal Server Error'\n res.status(500).json({ error: message })\n await res.flush()\n }\n }\n\n if (!res.headersSent) {\n await res.flush()\n }\n })\n\n return {\n raw: server,\n close: () => {\n return new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err !== undefined && err !== null) {\n reject(err)\n } else {\n resolve()\n }\n })\n })\n },\n }\n }\n\n getPort(server: ServerInstance): number {\n const addr = server.raw.address()\n if (addr !== null && typeof addr === 'object') {\n return addr.port\n }\n return 0\n }\n\n async close(server: ServerInstance): Promise<void> {\n await server.close()\n }\n}\n","export class HeadersMap {\n private data: Map<string, string[]>\n\n constructor(initial?: Record<string, string | string[]>) {\n this.data = new Map()\n if (initial) {\n for (const key of Object.keys(initial)) {\n const value = initial[key]\n if (value !== undefined) {\n this.set(key, Array.isArray(value) ? value.join(', ') : value)\n }\n }\n }\n }\n\n get(name: string): string | undefined {\n const values = this.data.get(name.toLowerCase())\n if (values !== undefined && values.length > 0) {\n return values[0]\n }\n return undefined\n }\n\n getAll(name: string): string[] {\n const values = this.data.get(name.toLowerCase())\n return values ?? []\n }\n\n set(name: string, value: string): void {\n this.data.set(name.toLowerCase(), [value])\n }\n\n append(name: string, value: string): void {\n const key = name.toLowerCase()\n const existing = this.data.get(key)\n if (existing !== undefined) {\n existing.push(value)\n } else {\n this.data.set(key, [value])\n }\n }\n\n has(name: string): boolean {\n return this.data.has(name.toLowerCase())\n }\n\n delete(name: string): void {\n this.data.delete(name.toLowerCase())\n }\n\n *entries(): IterableIterator<[string, string]> {\n for (const [key, values] of this.data) {\n for (const value of values) {\n yield [key, value]\n }\n }\n }\n\n *keys(): IterableIterator<string> {\n for (const key of this.data.keys()) {\n yield key\n }\n }\n\n *values(): IterableIterator<string> {\n for (const [, values] of this.data) {\n for (const value of values) {\n yield value\n }\n }\n }\n\n toJSON(): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {}\n for (const [key, values] of this.data) {\n result[key] = values.length === 1 ? (values[0] as string) : values\n }\n return result\n }\n\n toNodeHeaders(): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {}\n for (const [key, values] of this.data) {\n if (key === 'set-cookie') {\n result[key] = values\n } else {\n result[key] = values.join(', ')\n }\n }\n return result\n }\n\n get size(): number {\n return this.data.size\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries()\n }\n}\n","export interface CookieOptions {\n maxAge?: number\n expires?: Date\n path?: string\n domain?: string\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'strict' | 'lax' | 'none'\n signed?: boolean\n}\n\nexport function parseCookies(header: string): Record<string, string> {\n const result: Record<string, string> = {}\n\n if (!header) return result\n\n const pairs = header.split(';')\n\n for (const pair of pairs) {\n const trimmed = pair.trim()\n if (!trimmed) continue\n\n const eqIndex = trimmed.indexOf('=')\n if (eqIndex === -1) {\n result[trimmed] = ''\n continue\n }\n\n const name = trimmed.slice(0, eqIndex).trim()\n let value = trimmed.slice(eqIndex + 1).trim()\n\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1)\n }\n\n if (name) {\n result[decodeURIComponent(name)] = decodeURIComponent(value)\n }\n }\n\n return result\n}\n\nfunction serializeCookieValue(name: string, value: string): string {\n return `${encodeURIComponent(name)}=${encodeURIComponent(value)}`\n}\n\nexport function serializeCookie(\n name: string,\n value: string,\n options?: CookieOptions,\n): string {\n const parts: string[] = [serializeCookieValue(name, value)]\n\n if (options) {\n if (options.maxAge !== undefined) {\n parts.push(`Max-Age=${Math.floor(options.maxAge)}`)\n }\n\n if (options.expires !== undefined) {\n parts.push(`Expires=${options.expires.toUTCString()}`)\n }\n\n if (options.path !== undefined) {\n parts.push(`Path=${options.path}`)\n } else {\n parts.push('Path=/')\n }\n\n if (options.domain !== undefined) {\n parts.push(`Domain=${options.domain}`)\n }\n\n if (options.secure) {\n parts.push('Secure')\n }\n\n if (options.httpOnly) {\n parts.push('HttpOnly')\n }\n\n if (options.sameSite !== undefined) {\n parts.push(`SameSite=${options.sameSite}`)\n }\n }\n\n return parts.join('; ')\n}\n\nexport function clearCookie(name: string, options?: CookieOptions): string {\n return serializeCookie(name, '', {\n ...options,\n maxAge: 0,\n expires: new Date(0),\n })\n}\n","import { randomUUID } from 'node:crypto'\nimport { writeFile, readFile, unlink, mkdir } from 'node:fs/promises'\nimport { join, extname, basename, dirname } from 'node:path'\nimport { tmpdir } from 'node:os'\n\nexport interface UploadedFile {\n readonly fieldName: string\n readonly originalName: string\n readonly mimeType: string\n readonly size: number\n readonly path: string\n readonly extension: string\n move(destination: string, filename?: string): Promise<string>\n toBuffer(): Promise<Buffer>\n toBase64(): string\n isImage(): boolean\n isVideo(): boolean\n}\n\nconst IMAGE_MIME_TYPES = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'image/bmp',\n 'image/tiff',\n 'image/avif',\n])\n\nconst VIDEO_MIME_TYPES = new Set([\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/ogg',\n 'video/quicktime',\n 'video/x-msvideo',\n 'video/x-matroska',\n])\n\nexport class SuperUploadedFile implements UploadedFile {\n readonly fieldName: string\n readonly originalName: string\n readonly mimeType: string\n readonly size: number\n readonly path: string\n readonly extension: string\n private buffer: Buffer | null\n\n constructor(opts: {\n fieldName: string\n originalName: string\n mimeType: string\n size: number\n path: string\n buffer?: Buffer\n }) {\n this.fieldName = opts.fieldName\n this.originalName = opts.originalName\n this.mimeType = opts.mimeType\n this.size = opts.size\n this.path = opts.path\n this.extension = extname(opts.originalName).toLowerCase()\n this.buffer = opts.buffer ?? null\n }\n\n async move(destination: string, filename?: string): Promise<string> {\n const destName = filename ?? basename(this.path)\n const destPath = join(destination, destName)\n\n await mkdir(dirname(destPath), { recursive: true })\n\n const buf = await this.toBuffer()\n await writeFile(destPath, buf)\n\n return destPath\n }\n\n async toBuffer(): Promise<Buffer> {\n if (this.buffer !== null) return this.buffer\n this.buffer = await readFile(this.path)\n return this.buffer\n }\n\n toBase64(): string {\n if (this.buffer === null) {\n throw new Error(\n 'Buffer not loaded. Call toBuffer() first or read the file into memory.',\n )\n }\n return this.buffer.toString('base64')\n }\n\n isImage(): boolean {\n return IMAGE_MIME_TYPES.has(this.mimeType)\n }\n\n isVideo(): boolean {\n return VIDEO_MIME_TYPES.has(this.mimeType)\n }\n\n static async createFromBuffer(\n fieldName: string,\n originalName: string,\n mimeType: string,\n buffer: Buffer,\n tempDir?: string,\n ): Promise<SuperUploadedFile> {\n const tmp = tempDir ?? tmpdir()\n const fileName = `${randomUUID()}${extname(originalName)}`\n const filePath = join(tmp, fileName)\n\n await writeFile(filePath, buffer)\n\n return new SuperUploadedFile({\n fieldName,\n originalName,\n mimeType: mimeType || 'application/octet-stream',\n size: buffer.length,\n path: filePath,\n buffer,\n })\n }\n\n async cleanup(): Promise<void> {\n try {\n await unlink(this.path)\n } catch {\n // File may have been moved or already deleted\n }\n }\n}\n","import type { IncomingMessage } from 'node:http'\nimport { HeadersMap } from './headers'\nimport { parseCookies } from './cookie'\nimport { SuperUploadedFile } from './upload'\n\nexport interface Schema<T = unknown> {\n parse(input: unknown): T\n validate(\n input: unknown,\n ): { success: boolean; data?: T; errors?: { message: string; path?: string }[] }\n}\n\ninterface ParsedMultipartField {\n type: 'field'\n name: string\n value: string\n}\n\ninterface ParsedMultipartFile {\n type: 'file'\n name: string\n filename: string\n mimeType: string\n data: Buffer\n}\n\ntype MultipartPart = ParsedMultipartField | ParsedMultipartFile\n\ninterface BodyCache {\n raw: Buffer\n parsed: unknown\n text: string\n json: unknown\n formData: Record<string, string> | null\n files: Record<string, SuperUploadedFile> | null\n multipartParsed: MultipartPart[] | null\n}\n\nexport class SuperRequest {\n private raw: IncomingMessage\n private _headers: HeadersMap\n private _query: Record<string, string | string[]>\n private _cookies: Record<string, string> | null = null\n private _ip: string\n private _params: Record<string, string> = {}\n private bodyCache: BodyCache | null = null\n private _bodyReadPromise: Promise<BodyCache> | null = null\n\n constructor(raw: IncomingMessage) {\n this.raw = raw\n\n this._headers = new HeadersMap(\n raw.headers as Record<string, string | string[]>,\n )\n\n const parsedUrl = new URL(raw.url ?? '/', 'http://localhost')\n this._query = parseQueryParams(parsedUrl.searchParams)\n\n this._ip = parseIp(raw)\n\n this.path = parsedUrl.pathname\n this.url = raw.url ?? '/'\n this.method = (raw.method ?? 'GET').toUpperCase()\n }\n\n readonly method: string\n readonly url: string\n readonly path: string\n\n get headers(): HeadersMap {\n return this._headers\n }\n\n get query(): Record<string, string | string[]> {\n return this._query\n }\n\n get params(): Record<string, string> {\n return this._params\n }\n\n set params(value: Record<string, string>) {\n this._params = value\n }\n\n get ip(): string {\n return this._ip\n }\n\n private async ensureBody(): Promise<BodyCache> {\n if (this.bodyCache !== null) return this.bodyCache\n\n if (this._bodyReadPromise === null) {\n this._bodyReadPromise = this.readBodyFromStream()\n }\n\n this.bodyCache = await this._bodyReadPromise\n return this.bodyCache\n }\n\n private async readBodyFromStream(): Promise<BodyCache> {\n const chunks: Buffer[] = []\n const MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB default\n let totalSize = 0;\n for await (const chunk of this.raw) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n totalSize += buf.length;\n if (totalSize > MAX_BODY_SIZE) {\n throw new Error('Request body too large. Maximum size is 10MB.');\n }\n chunks.push(buf);\n }\n const raw = Buffer.concat(chunks)\n const text = raw.toString('utf-8')\n\n let json: unknown = undefined\n if (this.isContentType('application/json')) {\n try {\n json = JSON.parse(text)\n } catch {\n json = undefined\n }\n }\n\n let formData: Record<string, string> | null = null\n let multipartParsed: MultipartPart[] | null = null\n let files: Record<string, SuperUploadedFile> | null = null\n\n if (this.isContentType('application/x-www-form-urlencoded')) {\n formData = parseUrlEncoded(text)\n } else if (this.isContentType('multipart/form-data')) {\n const boundary = this.getMultipartBoundary()\n if (boundary !== undefined) {\n multipartParsed = parseMultipartBody(raw, boundary)\n formData = {}\n files = {}\n for (const part of multipartParsed) {\n if (part.type === 'field') {\n formData[part.name] = part.value\n } else if (part.type === 'file') {\n const uploadedFile = await SuperUploadedFile.createFromBuffer(\n part.name,\n part.filename,\n part.mimeType,\n part.data,\n )\n files[part.name] = uploadedFile\n }\n }\n }\n }\n\n return {\n raw,\n text,\n json,\n parsed: json ?? text,\n formData,\n files,\n multipartParsed,\n }\n }\n\n private isContentType(expected: string): boolean {\n const ct = this._headers.get('content-type')\n if (ct === undefined) return false\n return ct.toLowerCase().startsWith(expected)\n }\n\n private getMultipartBoundary(): string | undefined {\n const ct = this._headers.get('content-type')\n if (ct === undefined) return undefined\n const match = ct.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i)\n if (match !== null) {\n return match[1] ?? match[2]\n }\n return undefined\n }\n\n async body(): Promise<unknown> {\n const cache = await this.ensureBody()\n return cache.parsed\n }\n\n async json<T = unknown>(): Promise<T> {\n const cache = await this.ensureBody()\n if (cache.json !== undefined) return cache.json as T\n throw new Error('Request body is not valid JSON')\n }\n\n async text(): Promise<string> {\n const cache = await this.ensureBody()\n return cache.text\n }\n\n async formData(): Promise<Record<string, string>> {\n const cache = await this.ensureBody()\n if (cache.formData !== null) return cache.formData\n\n if (cache.multipartParsed !== null) {\n const result: Record<string, string> = {}\n for (const part of cache.multipartParsed) {\n if (part.type === 'field') {\n result[part.name] = part.value\n }\n }\n return result\n }\n\n return {}\n }\n\n async file(name: string): Promise<SuperUploadedFile | undefined> {\n const cache = await this.ensureBody()\n if (cache.files !== null) {\n return cache.files[name]\n }\n return undefined\n }\n\n async files(): Promise<Record<string, SuperUploadedFile>> {\n const cache = await this.ensureBody()\n return cache.files ?? {}\n }\n\n cookie(name: string): string | undefined {\n if (this._cookies === null) {\n const cookieHeader = this._headers.get('cookie')\n this._cookies = cookieHeader !== undefined\n ? parseCookies(cookieHeader)\n : {}\n }\n return this._cookies[name]\n }\n\n async validate<T>(schema: Schema<T>): Promise<T> {\n const data = await this.body()\n const result = schema.validate(data)\n if (!result.success) {\n const messages = (result.errors ?? [])\n .map((e) => {\n const path = e.path ?? ''\n return path ? `${path}: ${e.message}` : e.message\n })\n .join('; ')\n throw new ValidationError(messages, result.errors ?? [])\n }\n return result.data as T\n }\n\n isAjax(): boolean {\n const requestedWith = this._headers.get('x-requested-with')\n return requestedWith?.toLowerCase() === 'xmlhttprequest'\n }\n\n wantsJson(): boolean {\n const accept = this._headers.get('accept')\n if (accept !== undefined && accept.includes('application/json')) {\n return true\n }\n return this.isAjax()\n }\n\n bearerToken(): string | undefined {\n const auth = this._headers.get('authorization')\n if (auth === undefined) return undefined\n const match = auth.match(/^Bearer\\s+(.+)$/i)\n return match?.[1]\n }\n\n get rawRequest(): IncomingMessage {\n return this.raw\n }\n}\n\nexport class ValidationError extends Error {\n constructor(\n message: string,\n readonly errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\nfunction parseQueryParams(\n searchParams: URLSearchParams,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {}\n for (const key of searchParams.keys()) {\n const values = searchParams.getAll(key)\n result[key] = values.length === 1 ? (values[0] as string) : values\n }\n return result\n}\n\nfunction parseIp(req: IncomingMessage): string {\n const forwarded = req.headers['x-forwarded-for']\n if (forwarded !== undefined) {\n const first = Array.isArray(forwarded) ? forwarded[0] : forwarded.split(',')[0]\n if (first !== undefined) return first.trim()\n }\n\n const realIp = req.headers['x-real-ip']\n if (realIp !== undefined) {\n return Array.isArray(realIp) ? realIp[0] as string : realIp\n }\n\n const remote = req.socket.remoteAddress\n if (remote !== undefined) {\n if (remote.startsWith('::ffff:')) return remote.slice(7)\n return remote\n }\n\n return '127.0.0.1'\n}\n\nfunction parseUrlEncoded(text: string): Record<string, string> {\n const result: Record<string, string> = {}\n const pairs = text.split('&')\n for (const pair of pairs) {\n if (!pair) continue\n const eqIndex = pair.indexOf('=')\n if (eqIndex === -1) {\n result[decodeURIComponent(pair)] = ''\n } else {\n const key = decodeURIComponent(pair.slice(0, eqIndex))\n const value = decodeURIComponent(pair.slice(eqIndex + 1))\n result[key] = value\n }\n }\n return result\n}\n\nfunction parseMultipartBody(\n body: Buffer,\n boundary: string,\n): MultipartPart[] {\n const result: MultipartPart[] = []\n const boundaryBuffer = Buffer.from(`--${boundary}`)\n\n let start = 0\n let searchFrom = 0\n\n while (true) {\n const boundaryIndex = body.indexOf(boundaryBuffer, searchFrom)\n if (boundaryIndex === -1) break\n\n searchFrom = boundaryIndex + boundaryBuffer.length\n\n if (\n searchFrom < body.length &&\n body[searchFrom] === 45 &&\n body[searchFrom + 1] === 45\n ) {\n break\n }\n\n if (searchFrom >= body.length) break\n\n if (body[searchFrom] === 13) searchFrom++\n if (body[searchFrom] === 10) searchFrom++\n\n start = searchFrom\n\n const nextBoundaryIndex = body.indexOf(boundaryBuffer, searchFrom)\n if (nextBoundaryIndex === -1) break\n\n let partEnd = nextBoundaryIndex\n if (partEnd >= 2 && body[partEnd - 2] === 13 && body[partEnd - 1] === 10) {\n partEnd -= 2\n }\n\n const partData = body.slice(start, partEnd)\n\n const headerEndIndex = partData.indexOf(Buffer.from('\\r\\n\\r\\n'))\n if (headerEndIndex === -1) {\n searchFrom = nextBoundaryIndex\n continue\n }\n\n const headerSection = partData.slice(0, headerEndIndex).toString('utf-8')\n const contentData = partData.slice(headerEndIndex + 4)\n\n const disposition = parseDisposition(headerSection)\n if (disposition === undefined) {\n searchFrom = nextBoundaryIndex\n continue\n }\n\n if (disposition.filename !== undefined) {\n const contentType = parseContentType(headerSection)\n result.push({\n type: 'file',\n name: disposition.name,\n filename: disposition.filename,\n mimeType: contentType,\n data: Buffer.from(contentData),\n })\n } else {\n result.push({\n type: 'field',\n name: disposition.name,\n value: contentData.toString('utf-8').trim(),\n })\n }\n\n searchFrom = nextBoundaryIndex\n }\n\n return result\n}\n\ninterface DispositionInfo {\n name: string\n filename?: string\n}\n\nfunction parseDisposition(headerSection: string): DispositionInfo | undefined {\n const match = headerSection.match(\n /content-disposition:\\s*form-data;\\s*(.+)/i,\n )\n if (match === null) return undefined\n\n const params = match[1] as string\n const nameMatch = params.match(/name=\"([^\"]*)\"/i)\n const filenameMatch = params.match(/filename=\"([^\"]*)\"/i)\n\n if (nameMatch === null) return undefined\n\n return {\n name: nameMatch[1] as string,\n filename: filenameMatch?.[1],\n }\n}\n\nfunction parseContentType(headerSection: string): string {\n const match = headerSection.match(/content-type:\\s*([^\\s;]+)/i)\n return match?.[1] ?? 'application/octet-stream'\n}\n","import { createReadStream, stat } from \"node:fs\";\nimport type { ServerResponse } from \"node:http\";\nimport { basename, extname, resolve } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { promisify } from \"node:util\";\nimport { type CookieOptions, clearCookie, serializeCookie } from \"./cookie\";\nimport { HeadersMap } from \"./headers\";\nimport { HttpStatus } from \"./status\";\n\nconst statAsync = promisify(stat);\n\nconst MIME_TYPES: Record<string, string> = {\n\t\".html\": \"text/html\",\n\t\".css\": \"text/css\",\n\t\".js\": \"application/javascript\",\n\t\".mjs\": \"application/javascript\",\n\t\".json\": \"application/json\",\n\t\".png\": \"image/png\",\n\t\".jpg\": \"image/jpeg\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".gif\": \"image/gif\",\n\t\".svg\": \"image/svg+xml\",\n\t\".webp\": \"image/webp\",\n\t\".ico\": \"image/x-icon\",\n\t\".pdf\": \"application/pdf\",\n\t\".txt\": \"text/plain\",\n\t\".xml\": \"application/xml\",\n\t\".zip\": \"application/zip\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n\t\".ttf\": \"font/ttf\",\n\t\".eot\": \"application/vnd.ms-fontobject\",\n\t\".mp4\": \"video/mp4\",\n\t\".webm\": \"video/webm\",\n\t\".mp3\": \"audio/mpeg\",\n\t\".wav\": \"audio/wav\",\n};\n\nexport interface FileOptions {\n\troot?: string;\n\tmaxAge?: number;\n\tacceptRanges?: boolean;\n\tcacheControl?: boolean;\n\tetag?: boolean;\n\tlastModified?: boolean;\n\theaders?: Record<string, string>;\n}\n\nexport class SuperResponse {\n\tprivate raw: ServerResponse;\n\tprivate _statusCode: number = HttpStatus.OK;\n\tprivate _headers = new HeadersMap();\n\tprivate _cookies: string[] = [];\n\tprivate _body: string | Buffer | null = null;\n\tprivate _sent = false;\n\tprivate _contentTypeSet = false;\n\n\tconstructor(raw: ServerResponse) {\n\t\tthis.raw = raw;\n\t}\n\n\tstatus(code: number): this {\n\t\tthis._statusCode = code;\n\t\treturn this;\n\t}\n\n\theader(name: string, value: string): this {\n\t\tthis._headers.set(name, value);\n\t\treturn this;\n\t}\n\n\tsetHeader(name: string, value: string): this {\n\t\treturn this.header(name, value);\n\t}\n\n\tgetHeader(name: string): string | undefined {\n\t\treturn this._headers.get(name);\n\t}\n\n\tremoveHeader(name: string): this {\n\t\tthis._headers.delete(name);\n\t\treturn this;\n\t}\n\n\thasHeader(name: string): boolean {\n\t\treturn this._headers.has(name);\n\t}\n\n\ttype(contentType: string): this {\n\t\tthis._headers.set(\"content-type\", contentType);\n\t\tthis._contentTypeSet = true;\n\t\treturn this;\n\t}\n\n\tjson<T>(data: T, status?: number): this {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tconst body = JSON.stringify(data);\n\t\treturn this.send(body, undefined, \"application/json\");\n\t}\n\n\tsend(body: string | Buffer, status?: number, contentType?: string): this {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tthis._body = body;\n\t\tif (contentType !== undefined && !this._contentTypeSet) {\n\t\t\tthis._headers.set(\"content-type\", contentType);\n\t\t}\n\t\treturn this;\n\t}\n\n\thtml(html: string, status?: number): this {\n\t\treturn this.send(html, status, \"text/html; charset=utf-8\");\n\t}\n\n\tredirect(\n\t\turl: string,\n\t\tstatus: 301 | 302 | 307 | 308 = HttpStatus.FOUND as 302,\n\t): this {\n\t\t// Prevent open redirect / CRLF injection\n\t\tif (url.includes('\\r') || url.includes('\\n')) {\n\t\t\tthrow new Error('Invalid redirect URL');\n\t\t}\n\t\tthis._statusCode = status;\n\t\tthis._headers.set(\"location\", url);\n\t\tthis._body = null;\n\t\treturn this;\n\t}\n\n\tstream(stream: Readable, status?: number): this {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tthis.flushHeaders();\n\t\tthis.raw.statusCode = this._statusCode;\n\t\tstream.pipe(this.raw);\n\t\tstream.on(\"end\", () => {\n\t\t\tthis._sent = true;\n\t\t});\n\t\tstream.on(\"error\", (_err: Error) => {\n\t\t\tif (!this._sent) {\n\t\t\t\tthis._sent = true;\n\t\t\t\tthis.raw.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;\n\t\t\t\tthis.raw.end();\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\tasync file(filePath: string, options?: FileOptions): Promise<this> {\n\t\tconst fullPath = options?.root\n\t\t\t? joinPath(options.root, filePath)\n\t\t\t: filePath;\n\n\t\t// Path traversal protection\n\t\tconst resolved = resolve(fullPath);\n\t\tconst root = options?.root ? resolve(options.root) : null;\n\t\tif (root !== null && !resolved.startsWith(root)) {\n\t\t\tthis._statusCode = HttpStatus.FORBIDDEN;\n\t\t\tthis._body = null;\n\t\t\treturn this;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stats = await statAsync(fullPath);\n\n\t\t\tif (!stats.isFile()) {\n\t\t\t\tthis._statusCode = HttpStatus.NOT_FOUND;\n\t\t\t\tthis._body = null;\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tconst ext = extname(fullPath);\n\t\t\tconst mimeType = MIME_TYPES[ext] ?? \"application/octet-stream\";\n\n\t\t\tthis._headers.set(\"content-type\", mimeType);\n\t\t\tthis._headers.set(\"content-length\", String(stats.size));\n\n\t\t\tif (options?.cacheControl !== false) {\n\t\t\t\tconst maxAge = options?.maxAge ?? 0;\n\t\t\t\tthis._headers.set(\"cache-control\", `public, max-age=${maxAge}`);\n\t\t\t}\n\n\t\t\tif (options?.lastModified !== false) {\n\t\t\t\tthis._headers.set(\"last-modified\", stats.mtime.toUTCString());\n\t\t\t}\n\n\t\t\tif (options?.headers !== undefined) {\n\t\t\t\tfor (const [key, value] of Object.entries(options.headers)) {\n\t\t\t\t\tthis._headers.set(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.flushHeaders();\n\t\t\tthis.raw.statusCode = this._statusCode;\n\t\t\tconst readStream = createReadStream(fullPath);\n\t\t\treadStream.pipe(this.raw);\n\t\t\treadStream.on(\"end\", () => {\n\t\t\t\tthis._sent = true;\n\t\t\t});\n\t\t\treadStream.on(\"error\", () => {\n\t\t\t\tif (!this._sent) {\n\t\t\t\t\tthis._sent = true;\n\t\t\t\t\tthis.raw.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;\n\t\t\t\t\tthis.raw.end();\n\t\t\t\t}\n\t\t\t});\n\t\t} catch {\n\t\t\tthis._statusCode = HttpStatus.NOT_FOUND;\n\t\t\tthis._body = null;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tasync download(filePath: string, filename?: string): Promise<this> {\n\t\tconst downloadName = filename ?? basename(filePath);\n\n\t\tthis._headers.set(\n\t\t\t\"content-disposition\",\n\t\t\t`attachment; filename=\"${downloadName}\"`,\n\t\t);\n\n\t\tawait this.file(filePath);\n\t\treturn this;\n\t}\n\n\tattachment(filename?: string): this {\n\t\tif (filename !== undefined) {\n\t\t\tthis._headers.set(\n\t\t\t\t\"content-disposition\",\n\t\t\t\t`attachment; filename=\"${filename}\"`,\n\t\t\t);\n\t\t} else {\n\t\t\tthis._headers.set(\"content-disposition\", \"attachment\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tcookie(name: string, value: string, options?: CookieOptions): this {\n\t\tthis._cookies.push(serializeCookie(name, value, options));\n\t\treturn this;\n\t}\n\n\tclearCookie(name: string, options?: CookieOptions): this {\n\t\tthis._cookies.push(clearCookie(name, options));\n\t\treturn this;\n\t}\n\n\tget statusCode(): number {\n\t\treturn this._statusCode;\n\t}\n\n\tget headersSent(): boolean {\n\t\treturn this._sent;\n\t}\n\n\tget rawResponse(): ServerResponse {\n\t\treturn this.raw;\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tif (this._sent) return;\n\t\tthis._sent = true;\n\n\t\tthis.flushHeaders();\n\n\t\tthis.raw.statusCode = this._statusCode;\n\n\t\tif (this._body !== null) {\n\t\t\tthis.raw.end(this._body);\n\t\t} else {\n\t\t\tthis.raw.end();\n\t\t}\n\t}\n\n\tprivate flushHeaders(): void {\n\t\tif (this._cookies.length > 0) {\n\t\t\tthis.raw.setHeader(\"Set-Cookie\", this._cookies);\n\t\t}\n\n\t\tfor (const [name, value] of this._headers.entries()) {\n\t\t\tif (name.toLowerCase() !== \"set-cookie\") {\n\t\t\t\tthis.raw.setHeader(name, value);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction joinPath(root: string, filePath: string): string {\n\tconst normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/$/, \"\");\n\tconst normalizedPath = filePath.replace(/\\\\/g, \"/\").replace(/^\\//, \"\");\n\treturn `${normalizedRoot}/${normalizedPath}`;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { extname, join, resolve } from \"node:path\";\nimport { gzipSync } from \"node:zlib\";\nimport { HttpStatus } from \"../http/status\";\nimport type { RouteContext } from \"../router\";\n\nexport type Middleware = (\n\tctx: RouteContext,\n\tnext: () => Promise<void>,\n) => void | Promise<void>;\n\nexport interface CorsOptions {\n\torigin?: string | string[];\n\tmethods?: string[];\n\tallowedHeaders?: string[];\n\texposedHeaders?: string[];\n\tcredentials?: boolean;\n\tmaxAge?: number;\n}\n\nexport function cors(options?: CorsOptions): Middleware {\n\tconst opts: Required<CorsOptions> = {\n\t\torigin: \"*\",\n\t\tmethods: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"],\n\t\tallowedHeaders: [\"Content-Type\", \"Authorization\"],\n\t\texposedHeaders: [],\n\t\tcredentials: false,\n\t\tmaxAge: 86400,\n\t\t...options,\n\t};\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\t\tconst origin = request.headers.get(\"origin\");\n\n\t\tif (origin !== undefined) {\n\t\t\tif (opts.origin === \"*\") {\n\t\t\t\tresponse.header(\"access-control-allow-origin\", \"*\");\n\t\t\t} else if (typeof opts.origin === \"string\") {\n\t\t\t\tresponse.header(\"access-control-allow-origin\", opts.origin);\n\t\t\t} else if (opts.origin.includes(origin)) {\n\t\t\t\tresponse.header(\"access-control-allow-origin\", origin);\n\t\t\t}\n\n\t\t\tif (opts.credentials) {\n\t\t\t\tresponse.header(\"access-control-allow-credentials\", \"true\");\n\t\t\t}\n\n\t\t\tif (opts.exposedHeaders.length > 0) {\n\t\t\t\tresponse.header(\n\t\t\t\t\t\"access-control-expose-headers\",\n\t\t\t\t\topts.exposedHeaders.join(\", \"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (request.method === \"OPTIONS\") {\n\t\t\tresponse.header(\"access-control-allow-methods\", opts.methods.join(\", \"));\n\t\t\tresponse.header(\n\t\t\t\t\"access-control-allow-headers\",\n\t\t\t\topts.allowedHeaders.join(\", \"),\n\t\t\t);\n\t\t\tresponse.header(\"access-control-max-age\", String(opts.maxAge));\n\t\t\tresponse.status(HttpStatus.NO_CONTENT);\n\t\t\treturn;\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport function bodyParser(): Middleware {\n\treturn async (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request } = ctx;\n\t\tconst method = request.method;\n\n\t\tif ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {\n\t\t\tawait request.body();\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport interface SessionOptions {\n\tname?: string;\n\tsecret?: string;\n\tmaxAge?: number;\n\thttpOnly?: boolean;\n\tsecure?: boolean;\n\tsameSite?: \"strict\" | \"lax\" | \"none\";\n}\n\nexport function session(options?: SessionOptions): Middleware {\n\tconst opts = {\n\t\tname: \"speexjs_session\",\n\t\tsecret: options?.secret ?? (process.env.NODE_ENV === 'production' \n ? (() => { throw new Error('Session secret must be configured in production via secret option or SESSION_SECRET env var') })() \n : 'speexjs-dev-secret'),\n\t\tmaxAge: 7200,\n\t\thttpOnly: true,\n\t\tsecure: false,\n\t\tsameSite: \"lax\" as const,\n\t\t...options,\n\t};\n\n\tinterface SessionEntry {\n\t\tdata: Record<string, unknown>;\n\t\tcreatedAt: number;\n\t}\n\tconst sessions = new Map<string, SessionEntry>();\n\tconst SESSION_TTL = (opts.maxAge || 7200) * 1000;\n\n\tfunction generateSessionId(): string {\n\t\treturn randomUUID();\n\t}\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\t\tconst sessionId = request.cookie(opts.name) ?? generateSessionId();\n\t\tconst id = sessionId;\n\n\t\t// Clean expired sessions periodically (every 100 requests)\n\t\tif (Math.random() < 0.01) {\n\t\t\tconst now = Date.now();\n\t\t\tfor (const [key, entry] of sessions) {\n\t\t\t\tif (now - entry.createdAt > SESSION_TTL) {\n\t\t\t\t\tsessions.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if existing session is expired\n\t\tconst existing = sessions.get(id);\n\t\tif (existing && (Date.now() - existing.createdAt > SESSION_TTL)) {\n\t\t\tsessions.delete(id);\n\t\t}\n\n\t\tif (!sessions.has(id)) {\n\t\t\tsessions.set(id, { data: {}, createdAt: Date.now() });\n\t\t}\n\t\tconst sessionData = sessions.get(id)!.data;\n\n\t\t(ctx as unknown as Record<string, unknown>).session = sessionData;\n\n\t\tif (request.cookie(opts.name) === undefined) {\n\t\t\tresponse.cookie(opts.name, id, {\n\t\t\t\tmaxAge: opts.maxAge,\n\t\t\t\thttpOnly: opts.httpOnly,\n\t\t\t\tsecure: opts.secure,\n\t\t\t\tsameSite: opts.sameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t});\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport function auth(guard?: string): Middleware {\n\tconst guardName = guard ?? \"default\";\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst user = ctx.container.resolve(`auth.${guardName}`);\n\n\t\tif (user === undefined || user === null) {\n\t\t\tif (ctx.request.wantsJson()) {\n\t\t\t\tctx.response.status(HttpStatus.UNAUTHORIZED).json({\n\t\t\t\t\terror: \"Unauthenticated\",\n\t\t\t\t\tmessage: \"Authentication is required to access this resource\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.response.redirect(\"/login\", HttpStatus.FOUND as 302);\n\t\t\treturn;\n\t\t}\n\n\t\t(ctx as unknown as Record<string, unknown>).user = user;\n\n\t\treturn next();\n\t};\n}\n\nexport function throttle(limit?: number, window?: number): Middleware {\n\tconst maxRequests = limit ?? 60;\n\tconst timeWindow = (window ?? 60) * 1000;\n\tconst hits = new Map<string, { count: number; resetAt: number }>();\n\n\tconst cleanup = setInterval(() => {\n\t\tconst now = Date.now();\n\t\tfor (const [key, value] of hits) {\n\t\t\tif (value.resetAt < now) {\n\t\t\t\thits.delete(key);\n\t\t\t}\n\t\t}\n\t}, 60000);\n\n\tif (cleanup.unref !== undefined) {\n\t\tcleanup.unref();\n\t}\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst key = ctx.request.ip;\n\n\t\tconst now = Date.now();\n\t\tconst hit = hits.get(key);\n\n\t\tif (hit === undefined || hit.resetAt < now) {\n\t\t\thits.set(key, { count: 1, resetAt: now + timeWindow });\n\t\t\tctx.response.header(\"x-ratelimit-limit\", String(maxRequests));\n\t\t\tctx.response.header(\"x-ratelimit-remaining\", String(maxRequests - 1));\n\t\t\treturn next();\n\t\t}\n\n\t\thit.count++;\n\t\tconst remaining = Math.max(0, maxRequests - hit.count);\n\t\tctx.response.header(\"x-ratelimit-limit\", String(maxRequests));\n\t\tctx.response.header(\"x-ratelimit-remaining\", String(remaining));\n\n\t\tif (hit.count > maxRequests) {\n\t\t\tconst retryAfter = Math.ceil((hit.resetAt - now) / 1000);\n\t\t\tctx.response.header(\"retry-after\", String(retryAfter));\n\t\t\tctx.response.status(HttpStatus.TOO_MANY_REQUESTS).json({\n\t\t\t\terror: \"Too Many Requests\",\n\t\t\t\tmessage: `Rate limit exceeded. Try again in ${retryAfter} seconds.`,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport function logger(): Middleware {\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst start = Date.now();\n\t\tconst { method, path, ip } = ctx.request;\n\n\t\tconst result = next();\n\n\t\tif (result instanceof Promise) {\n\t\t\treturn result.then(() => {\n\t\t\t\tconst duration = Date.now() - start;\n\t\t\t\tconst status = ctx.response.statusCode;\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[${new Date().toISOString()}] ${method} ${path} ${status} ${duration}ms - ${ip}`,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tconst duration = Date.now() - start;\n\t\tconst status = ctx.response.statusCode;\n\t\tconsole.log(\n\t\t\t`[${new Date().toISOString()}] ${method} ${path} ${status} ${duration}ms - ${ip}`,\n\t\t);\n\t};\n}\n\nexport interface StaticOptions {\n\tmaxAge?: number;\n\tindex?: string;\n\tdotfiles?: \"allow\" | \"deny\";\n\textensions?: string[];\n}\n\nexport function staticFiles(root: string, options?: StaticOptions): Middleware {\n\tconst opts = {\n\t\tmaxAge: 0,\n\t\tindex: \"index.html\",\n\t\tdotfiles: \"deny\" as const,\n\t\textensions: [] as string[],\n\t\t...options,\n\t};\n\n\tconst MIME_TYPES: Record<string, string> = {\n\t\t\".html\": \"text/html\",\n\t\t\".css\": \"text/css\",\n\t\t\".js\": \"application/javascript\",\n\t\t\".json\": \"application/json\",\n\t\t\".png\": \"image/png\",\n\t\t\".jpg\": \"image/jpeg\",\n\t\t\".jpeg\": \"image/jpeg\",\n\t\t\".gif\": \"image/gif\",\n\t\t\".svg\": \"image/svg+xml\",\n\t\t\".webp\": \"image/webp\",\n\t\t\".ico\": \"image/x-icon\",\n\t\t\".txt\": \"text/plain\",\n\t\t\".pdf\": \"application/pdf\",\n\t\t\".woff\": \"font/woff\",\n\t\t\".woff2\": \"font/woff2\",\n\t\t\".ttf\": \"font/ttf\",\n\t};\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\t\tconst filePath = request.path;\n\n\t\tif (opts.dotfiles === \"deny\") {\n\t\t\tconst segments = filePath.split(\"/\");\n\t\t\tfor (const segment of segments) {\n\t\t\t\tif (segment.startsWith(\".\")) {\n\t\t\t\t\treturn next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet fullPath = join(root, filePath);\n\n\t\t// Path traversal protection\n\t\tconst resolvedRoot = resolve(root);\n\t\tconst resolvedPath = resolve(fullPath);\n\t\tif (!resolvedPath.startsWith(resolvedRoot)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (!existsSync(fullPath)) {\n\t\t\tlet found = false;\n\t\t\tfor (const ext of opts.extensions) {\n\t\t\t\tconst tryPath = fullPath + ext;\n\t\t\t\tif (existsSync(tryPath)) {\n\t\t\t\t\tfullPath = tryPath;\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found) return next();\n\t\t}\n\n\t\tconst stats = statSync(fullPath);\n\t\tif (!stats.isFile()) {\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\tconst indexPath = join(fullPath, opts.index);\n\t\t\t\tif (existsSync(indexPath) && statSync(indexPath).isFile()) {\n\t\t\t\t\tfullPath = indexPath;\n\t\t\t\t} else {\n\t\t\t\t\treturn next();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn next();\n\t\t\t}\n\t\t}\n\n\t\tconst ext = extname(fullPath);\n\t\tconst mimeType = MIME_TYPES[ext] ?? \"application/octet-stream\";\n\n\t\tresponse\n\t\t\t.header(\"content-type\", mimeType)\n\t\t\t.header(\"content-length\", String(stats.size))\n\t\t\t.header(\"cache-control\", `public, max-age=${opts.maxAge}`)\n\t\t\t.header(\"last-modified\", stats.mtime.toUTCString());\n\n\t\tconst readStream = createReadStream(fullPath);\n\t\treadStream.pipe(response.rawResponse);\n\t\tresponse.rawResponse.statusCode = HttpStatus.OK;\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\treadStream.on(\"end\", () => resolve());\n\t\t\treadStream.on(\"error\", (err: Error) => reject(err));\n\t\t});\n\t};\n}\n\nexport function csrf(): Middleware {\n\tconst tokens = new Map<string, number>(); // token → expiresAt\n\tconst MAX_TOKENS = 10000;\n\tconst TTL = 60 * 60 * 1000; // 1 hour\n\n\tfunction generateToken(): string {\n\t\t// Cleanup expired tokens\n\t\tconst now = Date.now();\n\t\tfor (const [token, expiresAt] of tokens) {\n\t\t\tif (expiresAt < now) tokens.delete(token);\n\t\t}\n\t\t// Enforce max size\n\t\tif (tokens.size >= MAX_TOKENS) {\n\t\t\tconst oldest = tokens.entries().next().value;\n\t\t\tif (oldest) tokens.delete(oldest[0]);\n\t\t}\n\t\tconst token = randomUUID();\n\t\ttokens.set(token, now + TTL);\n\t\treturn token;\n\t}\n\n\tfunction skipCsrf(method: string): boolean {\n\t\treturn [\"GET\", \"HEAD\", \"OPTIONS\"].includes(method.toUpperCase());\n\t}\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\n\t\tif (request.path === \"/csrf-token\") {\n\t\t\tconst token = generateToken();\n\t\t\tresponse.json({ token });\n\t\t\treturn;\n\t\t}\n\n\t\tif (skipCsrf(request.method)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst token =\n\t\t\trequest.headers.get(\"x-csrf-token\") ??\n\t\t\trequest.headers.get(\"x-xsrf-token\");\n\n\t\tif (token === undefined || !tokens.has(token)) {\n\t\t\tresponse.status(HttpStatus.FORBIDDEN).json({\n\t\t\t\terror: \"CSRF token mismatch\",\n\t\t\t\tmessage: \"Invalid or missing CSRF token\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttokens.delete(token);\n\n\t\treturn next();\n\t};\n}\n\nexport function compress(): Middleware {\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request } = ctx;\n\t\tconst acceptEncoding = request.headers.get(\"accept-encoding\") ?? \"\";\n\n\t\tif (acceptEncoding.includes(\"gzip\")) {\n\t\t\treturn compressWith(ctx, next, \"gzip\");\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nfunction compressWith(\n\tctx: RouteContext,\n\tnext: () => Promise<void>,\n\t_encoding: string,\n): Promise<void> {\n\t(ctx.response as any).send = function(body: string | Buffer, status?: number, contentType?: string) {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tthis._body = body;\n\t\tif (contentType !== undefined && !this._contentTypeSet) {\n\t\t\tthis._headers.set(\"content-type\", contentType);\n\t\t}\n\t\tconst input = Buffer.isBuffer(body) ? body : Buffer.from(String(body));\n\t\tconst compressed = gzipSync(input);\n\n\t\tthis._headers.set(\"content-encoding\", \"gzip\");\n\t\tthis._headers.set(\"content-length\", String(compressed.length));\n\t\tthis._body = compressed;\n\t\treturn this;\n\t};\n\n\treturn next();\n}\n\nexport function helmet(): Middleware {\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { response } = ctx;\n\n\t\tresponse\n\t\t\t.header(\"x-content-type-options\", \"nosniff\")\n\t\t\t.header(\"x-frame-options\", \"SAMEORIGIN\")\n\t\t\t.header(\"x-xss-protection\", \"1; mode=block\")\n\t\t\t.header(\n\t\t\t\t\"strict-transport-security\",\n\t\t\t\t\"max-age=15552000; includeSubDomains\",\n\t\t\t)\n\t\t\t.header(\"referrer-policy\", \"no-referrer-when-downgrade\")\n\t\t\t.header(\n\t\t\t\t\"content-security-policy\",\n\t\t\t\t\"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'\",\n\t\t\t)\n\t\t\t.header(\"permissions-policy\", \"camera=(), microphone=(), geolocation=()\");\n\n\t\treturn next();\n\t};\n}\n\nexport class MiddlewarePipeline {\n\tprivate middlewares: Middleware[] = [];\n\n\tuse(middleware: Middleware): this {\n\t\tthis.middlewares.push(middleware);\n\t\treturn this;\n\t}\n\n\tprepend(middleware: Middleware): this {\n\t\tthis.middlewares.unshift(middleware);\n\t\treturn this;\n\t}\n\n\tremove(name: string): void {\n\t\tthis.middlewares = this.middlewares.filter((mw) => mw.name !== name);\n\t}\n\n\tasync run(ctx: RouteContext, final: () => Promise<void>): Promise<void> {\n\t\tlet index = 0;\n\n\t\tconst next = async (): Promise<void> => {\n\t\t\tif (index >= this.middlewares.length) {\n\t\t\t\tawait final();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst middleware = this.middlewares[index] as Middleware;\n\t\t\tindex++;\n\t\t\tawait middleware(ctx, next);\n\t\t};\n\n\t\tawait next();\n\t}\n\n\tgetMiddlewares(): Middleware[] {\n\t\treturn [...this.middlewares];\n\t}\n}\n","import type { Container } from \"../container\";\nimport type { SuperRequest } from \"../http/request\";\nimport type { SuperResponse } from \"../http/response\";\nimport type { Middleware } from \"../middleware\";\nimport { createControllerInstance } from \"../index.js\";\n\nexport type RouteHandler = (ctx: RouteContext) => void | Promise<void>;\n\nexport interface RouteContext {\n\trequest: SuperRequest;\n\tresponse: SuperResponse;\n\tparams: Record<string, string>;\n\tquery: Record<string, string | string[]>;\n\tcontainer: Container;\n}\n\nexport interface ResolvedRoute {\n\thandler: RouteHandler;\n\tparams: Record<string, string>;\n\tmiddleware: Middleware[];\n}\n\ninterface RouteEntry {\n\tmethods: string[];\n\tpath: string;\n\thandler: RouteHandler;\n\tmiddleware: Middleware[];\n\tname?: string;\n\tregexp: RegExp;\n\tparamKeys: string[];\n}\n\nexport interface ControllerClass {\n\tnew (...args: unknown[]): object;\n}\n\ninterface ResourceActions {\n\tindex?: string;\n\tcreate?: string;\n\tstore?: string;\n\tshow?: string;\n\tedit?: string;\n\tupdate?: string;\n\tdestroy?: string;\n}\n\nexport class Router {\n\tprivate routes: RouteEntry[] = [];\n\tprivate groupMiddleware: Middleware[] = [];\n\tprivate groupPrefix = \"\";\n\tprivate namedRoutes = new Map<string, RouteEntry>();\n\n\tget(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"GET\"], path, handler);\n\t}\n\n\tpost(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"POST\"], path, handler);\n\t}\n\n\tput(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"PUT\"], path, handler);\n\t}\n\n\tpatch(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"PATCH\"], path, handler);\n\t}\n\n\tdelete(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"DELETE\"], path, handler);\n\t}\n\n\toptions(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"OPTIONS\"], path, handler);\n\t}\n\n\tany(path: string, handler: RouteHandler): this {\n\t\treturn this.match(\n\t\t\t[\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"],\n\t\t\tpath,\n\t\t\thandler,\n\t\t);\n\t}\n\n\tmatch(methods: string[], path: string, handler: RouteHandler): this {\n\t\tconst fullPath = this.groupPrefix + normalizePath(path);\n\t\tconst { regexp, keys } = pathToRegexp(fullPath);\n\n\t\tthis.routes.push({\n\t\t\tmethods: methods.map((m) => m.toUpperCase()),\n\t\t\tpath: fullPath,\n\t\t\thandler,\n\t\t\tmiddleware: [...this.groupMiddleware],\n\t\t\tregexp,\n\t\t\tparamKeys: keys,\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tgroup(prefix: string, callback: (router: Router) => void): this {\n\t\tconst previousPrefix = this.groupPrefix;\n\t\tconst previousMiddleware = [...this.groupMiddleware];\n\n\t\tthis.groupPrefix = previousPrefix + normalizePath(prefix);\n\n\t\tcallback(this);\n\n\t\tthis.groupPrefix = previousPrefix;\n\t\tthis.groupMiddleware = previousMiddleware;\n\n\t\treturn this;\n\t}\n\n\tresource(name: string, controller: ControllerClass): this {\n\t\tconst actions: ResourceActions = {\n\t\t\tindex: \"index\",\n\t\t\tcreate: \"create\",\n\t\t\tstore: \"store\",\n\t\t\tshow: \"show\",\n\t\t\tedit: \"edit\",\n\t\t\tupdate: \"update\",\n\t\t\tdestroy: \"destroy\",\n\t\t};\n\n\t\treturn this.registerResourceRoutes(name, controller, actions);\n\t}\n\n\tapiResource(name: string, controller: ControllerClass): this {\n\t\tconst actions: ResourceActions = {\n\t\t\tindex: \"index\",\n\t\t\tstore: \"store\",\n\t\t\tshow: \"show\",\n\t\t\tupdate: \"update\",\n\t\t\tdestroy: \"destroy\",\n\t\t};\n\n\t\treturn this.registerResourceRoutes(name, controller, actions);\n\t}\n\n\tprivate registerResourceRoutes(\n\t\tname: string,\n\t\tcontroller: ControllerClass,\n\t\tactions: ResourceActions,\n\t): this {\n\t\tconst basePath = normalizePath(name);\n\t\tconst paramName = singularize(name);\n\n\t\tif (actions.index !== undefined) {\n\t\t\tthis.get(\n\t\t\t\tbasePath,\n\t\t\t\tthis.createControllerHandler(controller, actions.index),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.create !== undefined) {\n\t\t\tthis.get(\n\t\t\t\t`${basePath}/create`,\n\t\t\t\tthis.createControllerHandler(controller, actions.create),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.store !== undefined) {\n\t\t\tthis.post(\n\t\t\t\tbasePath,\n\t\t\t\tthis.createControllerHandler(controller, actions.store),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.show !== undefined) {\n\t\t\tthis.get(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.show),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.edit !== undefined) {\n\t\t\tthis.get(\n\t\t\t\t`${basePath}/:${paramName}/edit`,\n\t\t\t\tthis.createControllerHandler(controller, actions.edit),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.update !== undefined) {\n\t\t\tthis.put(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.update),\n\t\t\t);\n\t\t\tthis.patch(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.update),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.destroy !== undefined) {\n\t\t\tthis.delete(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.destroy),\n\t\t\t);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprivate createControllerHandler(\n\t\tcontroller: ControllerClass,\n\t\taction: string,\n\t): RouteHandler {\n\t\treturn async (ctx: RouteContext) => {\n\t\t\tconst instance = createControllerInstance(controller, ctx);\n\t\t\tconst handler = (instance as Record<string, unknown>)[action];\n\t\t\tif (typeof handler === \"function\") {\n\t\t\t\tawait handler.call(instance, ctx);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Action ${action} not found on controller ${controller.name}`,\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t}\n\n\tmiddleware(middleware: Middleware | Middleware[]): this {\n\t\tconst mw = Array.isArray(middleware) ? middleware : [middleware];\n\t\tthis.groupMiddleware.push(...mw);\n\t\treturn this;\n\t}\n\n\tname(name: string): this {\n\t\tif (this.routes.length > 0) {\n\t\t\tconst lastRoute = this.routes[this.routes.length - 1];\n\t\t\tif (lastRoute !== undefined) {\n\t\t\t\tlastRoute.name = name;\n\t\t\t\tthis.namedRoutes.set(name, lastRoute);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\troute(name: string, params?: Record<string, string>): string {\n\t\tconst entry = this.namedRoutes.get(name);\n\t\tif (entry === undefined) {\n\t\t\tthrow new Error(`Route not found: ${name}`);\n\t\t}\n\n\t\tlet url = entry.path;\n\t\tif (params !== undefined) {\n\t\t\tfor (const [key, value] of Object.entries(params)) {\n\t\t\t\turl = url.replace(`:${key}`, encodeURIComponent(value));\n\t\t\t}\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tresolve(method: string, path: string): ResolvedRoute | null {\n\t\tconst normalizedPath = normalizePath(path);\n\t\tconst upperMethod = method.toUpperCase();\n\n\t\tfor (const route of this.routes) {\n\t\t\tif (!route.methods.includes(upperMethod)) continue;\n\n\t\t\tconst match = normalizedPath.match(route.regexp);\n\t\t\tif (match === null) continue;\n\n\t\t\tconst params: Record<string, string> = {};\n\t\t\tfor (let i = 0; i < route.paramKeys.length; i++) {\n\t\t\t\tconst key = route.paramKeys[i];\n\t\t\t\tconst value = match[i + 1];\n\t\t\t\tif (key !== undefined && value !== undefined) {\n\t\t\t\t\tparams[key] = decodeURIComponent(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\thandler: route.handler,\n\t\t\t\tparams,\n\t\t\t\tmiddleware: route.middleware,\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tgetRoutes(): RouteEntry[] {\n\t\treturn [...this.routes];\n\t}\n\n\tgetNamedRoutes(): Map<string, RouteEntry> {\n\t\treturn new Map(this.namedRoutes);\n\t}\n}\n\nfunction normalizePath(path: string): string {\n\tlet normalized = path.replace(/\\\\/g, \"/\");\n\n\tif (!normalized.startsWith(\"/\")) {\n\t\tnormalized = \"/\" + normalized;\n\t}\n\n\tif (normalized.length > 1 && normalized.endsWith(\"/\")) {\n\t\tnormalized = normalized.slice(0, -1);\n\t}\n\n\treturn normalized;\n}\n\nfunction pathToRegexp(pattern: string): { regexp: RegExp; keys: string[] } {\n\tconst keys: string[] = [];\n\n\tconst regexpStr = pattern\n\t\t.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match: string, key: string) => {\n\t\t\tkeys.push(key);\n\t\t\treturn \"([^/]+)\";\n\t\t})\n\t\t.replace(/\\*/g, \".*?\");\n\n\treturn { regexp: new RegExp(`^${regexpStr}$`), keys };\n}\n\nfunction singularize(word: string): string {\n\tconst lastChar = word[word.length - 1];\n\tif (lastChar === \"s\") return word.slice(0, -1);\n\tif (lastChar === \"S\") return word.slice(0, -1);\n\treturn word;\n}\n\n\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Middleware } from \"../middleware\";\n\nexport interface CacheConfig {\n\tstore?: \"memory\" | \"file\";\n\tpath?: string;\n\tttl?: number;\n\tprefix?: string;\n}\n\ninterface CacheEntry {\n\tvalue: unknown;\n\texpiresAt: number;\n}\n\nexport class Cache {\n\tprivate store: Map<string, CacheEntry>;\n\tprivate config: Required<CacheConfig>;\n\tprivate hits = 0;\n\tprivate misses = 0;\n\n\tconstructor(config?: CacheConfig) {\n\t\tthis.config = {\n\t\t\tstore: \"memory\",\n\t\t\tpath: path.join(process.cwd(), \"cache\"),\n\t\t\tttl: 3600,\n\t\t\tprefix: \"\",\n\t\t\t...config,\n\t\t};\n\t\tthis.store = new Map();\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t}\n\t}\n\n\tasync get<T>(key: string): Promise<T | null> {\n\t\tconst fullKey = this.config.prefix + key;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\treturn this.fileGet<T>(fullKey);\n\t\t}\n\n\t\tconst entry = this.store.get(fullKey);\n\t\tif (entry === undefined) {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.isExpired(entry)) {\n\t\t\tthis.store.delete(fullKey);\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.hits++;\n\t\treturn entry.value as T;\n\t}\n\n\tasync remember<T>(\n\t\tkey: string,\n\t\tttl: number | undefined,\n\t\tcallback: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cached = await this.get<T>(key);\n\t\tif (cached !== null) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst value = await callback();\n\t\tawait this.set(key, value, ttl);\n\t\treturn value;\n\t}\n\n\tasync set(key: string, value: unknown, ttl?: number): Promise<void> {\n\t\tconst fullKey = this.config.prefix + key;\n\t\tconst expiresAt =\n\t\t\tttl !== undefined\n\t\t\t\t? Date.now() + ttl * 1000\n\t\t\t\t: Date.now() + this.config.ttl * 1000;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tawait this.fileSet(fullKey, { value, expiresAt });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.set(fullKey, { value, expiresAt });\n\t}\n\n\tasync add(key: string, value: unknown, ttl?: number): Promise<boolean> {\n\t\tconst exists = await this.has(key);\n\t\tif (exists) {\n\t\t\treturn false;\n\t\t}\n\n\t\tawait this.set(key, value, ttl);\n\t\treturn true;\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\tconst fullKey = this.config.prefix + key;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\treturn this.fileDelete(fullKey);\n\t\t}\n\n\t\treturn this.store.delete(fullKey);\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\tfor (const file of fs.readdirSync(dir)) {\n\t\t\t\t\tfs.unlinkSync(path.join(dir, file));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.clear();\n\t}\n\n\tasync has(key: string): Promise<boolean> {\n\t\tconst value = await this.get(key);\n\t\treturn value !== null;\n\t}\n\n\tasync getMultiple(keys: string[]): Promise<Record<string, unknown>> {\n\t\tconst result: Record<string, unknown> = {};\n\t\tfor (const key of keys) {\n\t\t\tconst value = await this.get(key);\n\t\t\tif (value !== null) {\n\t\t\t\tresult[key] = value;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync setMultiple(\n\t\titems: Record<string, unknown>,\n\t\tttl?: number,\n\t): Promise<void> {\n\t\tfor (const [key, value] of Object.entries(items)) {\n\t\t\tawait this.set(key, value, ttl);\n\t\t}\n\t}\n\n\tasync increment(key: string, value: number = 1): Promise<number> {\n\t\tconst current = await this.get<number>(key);\n\t\tconst newValue = (current ?? 0) + value;\n\t\tawait this.set(key, newValue);\n\t\treturn newValue;\n\t}\n\n\tasync decrement(key: string, value: number = 1): Promise<number> {\n\t\tconst current = await this.get<number>(key);\n\t\tconst newValue = (current ?? 0) - value;\n\t\tawait this.set(key, newValue);\n\t\treturn newValue;\n\t}\n\n\tasync forever(key: string, value: unknown): Promise<void> {\n\t\tconst fullKey = this.config.prefix + key;\n\t\tconst expiresAt = Number.MAX_SAFE_INTEGER;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tawait this.fileSet(fullKey, { value, expiresAt });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.set(fullKey, { value, expiresAt });\n\t}\n\n\tstats(): { hits: number; misses: number; keys: number; size: string } {\n\t\tlet keyCount = 0;\n\t\tlet totalSize = 0;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\tconst files = fs.readdirSync(dir);\n\t\t\t\tkeyCount = files.length;\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst st = fs.statSync(path.join(dir, file));\n\t\t\t\t\t\ttotalSize += st.size;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tkeyCount = this.store.size;\n\t\t\tfor (const [, entry] of this.store) {\n\t\t\t\ttotalSize += JSON.stringify(entry).length;\n\t\t\t}\n\t\t}\n\n\t\tconst sizeStr =\n\t\t\ttotalSize > 1024 * 1024\n\t\t\t\t? `${(totalSize / (1024 * 1024)).toFixed(2)} MB`\n\t\t\t\t: totalSize > 1024\n\t\t\t\t\t? `${(totalSize / 1024).toFixed(2)} KB`\n\t\t\t\t\t: `${totalSize} B`;\n\n\t\treturn {\n\t\t\thits: this.hits,\n\t\t\tmisses: this.misses,\n\t\t\tkeys: keyCount,\n\t\t\tsize: sizeStr,\n\t\t};\n\t}\n\n\tprivate getFilePath(key: string): string {\n\t\tconst hashedKey = crypto.createHash(\"md5\").update(key).digest(\"hex\");\n\t\treturn path.join(this.config.path, `${hashedKey}.json`);\n\t}\n\n\tprivate isExpired(entry: CacheEntry): boolean {\n\t\treturn entry.expiresAt < Date.now();\n\t}\n\n\tprivate fileGet<T>(key: string): T | null {\n\t\tconst filePath = this.getFilePath(key);\n\t\tif (!fs.existsSync(filePath)) {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst raw = fs.readFileSync(filePath, \"utf-8\");\n\t\t\tconst entry: CacheEntry = JSON.parse(raw);\n\n\t\t\tif (this.isExpired(entry)) {\n\t\t\t\tfs.unlinkSync(filePath);\n\t\t\t\tthis.misses++;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthis.hits++;\n\t\t\treturn entry.value as T;\n\t\t} catch {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate fileSet(key: string, entry: CacheEntry): void {\n\t\tconst filePath = this.getFilePath(key);\n\t\tconst dir = path.dirname(filePath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(filePath, JSON.stringify(entry), \"utf-8\");\n\t}\n\n\tprivate fileDelete(key: string): boolean {\n\t\tconst filePath = this.getFilePath(key);\n\t\tif (!fs.existsSync(filePath)) {\n\t\t\treturn false;\n\t\t}\n\t\tfs.unlinkSync(filePath);\n\t\treturn true;\n\t}\n}\n\nconst responseCache = new Cache({ store: \"memory\" });\n\nexport function cacheResponse(ttl?: number): Middleware {\n\tconst cache = responseCache;\n\n\treturn async (ctx, next) => {\n\t\tconst key = `_cache:${ctx.request.method}:${ctx.request.path}`;\n\n\t\tif (ctx.request.method !== \"GET\") {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst cached = await cache.get<{\n\t\t\tbody: string;\n\t\t\tstatus: number;\n\t\t\tcontentType: string;\n\t\t}>(key);\n\n\t\tif (cached !== null) {\n\t\t\tctx.response\n\t\t\t\t.status(cached.status)\n\t\t\t\t.type(cached.contentType)\n\t\t\t\t.send(cached.body);\n\t\t\treturn;\n\t\t}\n\n\t\tawait next();\n\n\t\tconst resp = ctx.response as unknown as {\n\t\t\t_body: string | Buffer | null;\n\t\t\t_statusCode: number;\n\t\t};\n\t\tconst body = resp._body;\n\n\t\tif (body !== null && resp._statusCode >= 200 && resp._statusCode < 300) {\n\t\t\tconst contentType =\n\t\t\t\tctx.response.getHeader(\"content-type\") ?? \"text/plain\";\n\t\t\tawait cache.set(\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\tbody: typeof body === \"string\" ? body : body.toString(),\n\t\t\t\t\tstatus: resp._statusCode,\n\t\t\t\t\tcontentType,\n\t\t\t\t},\n\t\t\t\tttl,\n\t\t\t);\n\t\t}\n\t};\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createDriver, type Dialect, type Driver } from \"./driver.js\";\nimport { QueryBuilder } from \"./query.js\";\nimport type {\n\tConnectionConfig,\n\tDatabaseDriver,\n\tQueryResult,\n\tQueryRunner,\n} from \"./types.js\";\n\nexport type { ConnectionConfig, DatabaseDriver, QueryResult };\n\nexport class DatabaseConnection implements QueryRunner {\n\tprivate config: ConnectionConfig;\n\tprivate driver: Driver | null = null;\n\n\tconstructor(config: ConnectionConfig) {\n\t\tthis.config = {\n\t\t\tdriver: \"mysql\",\n\t\t\thost: \"127.0.0.1\",\n\t\t\tcharset: \"utf8mb4\",\n\t\t\tprefix: \"\",\n\t\t\t...config,\n\t\t};\n\n\t\tif (this.config.port === undefined) {\n\t\t\tif (this.config.driver === \"mysql\") this.config.port = 3306;\n\t\t\telse if (this.config.driver === \"postgresql\") this.config.port = 5432;\n\t\t}\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.driver !== null) return;\n\t\tthis.driver = await createDriver(this.config);\n\t\tawait this.driver.connect();\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.driver !== null) {\n\t\t\tawait this.driver.disconnect();\n\t\t\tthis.driver = null;\n\t\t}\n\t}\n\n\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\tthis.ensureConnected();\n\t\treturn this.driver!.raw(sql, bindings);\n\t}\n\n\ttable(tableName: string): QueryBuilder {\n\t\treturn new QueryBuilder(this, `${this.config.prefix ?? \"\"}${tableName}`);\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.driver !== null && this.driver.isConnected();\n\t}\n\n\tgetDriver(): DatabaseDriver {\n\t\treturn (this.config.driver ?? \"mysql\") as DatabaseDriver;\n\t}\n\n\tgetDialect(): Dialect {\n\t\tthis.ensureConnected();\n\t\treturn this.driver!.getDialect();\n\t}\n\n\tgetPrefix(): string {\n\t\treturn this.config.prefix ?? \"\";\n\t}\n\n\tgetConfig(): Readonly<ConnectionConfig> {\n\t\treturn { ...this.config };\n\t}\n\n\tasync transaction<T>(\n\t\tcallback: (trx: DatabaseConnection) => Promise<T>,\n\t): Promise<T> {\n\t\tthis.ensureConnected();\n\n\t\treturn this.driver!.transaction(async (_driver: Driver) => {\n\t\t\tconst trxConnection = new DatabaseConnection(this.config);\n\t\t\ttrxConnection[\"driver\"] = this.driver;\n\n\t\t\ttrxConnection.raw = async (\n\t\t\t\tsql: string,\n\t\t\t\tbindings?: any[],\n\t\t\t): Promise<QueryResult> => {\n\t\t\t\treturn this.driver!.raw(sql, bindings);\n\t\t\t};\n\n\t\t\treturn callback(trxConnection);\n\t\t});\n\t}\n\n\tstatic generateId(): string {\n\t\treturn randomUUID();\n\t}\n\n\tprivate ensureConnected(): void {\n\t\tif (this.driver === null || !this.driver.isConnected()) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Database not connected. Call connect() before performing operations.\",\n\t\t\t);\n\t\t}\n\t}\n}\n","export interface Dialect {\n\twrapIdentifier(identifier: string): string;\n\tmakeParameter(index: number): string;\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string;\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\tbindings: any[],\n\t\tidColumn?: string,\n\t): string;\n\tcompileTruncate(tableName: string): string;\n\tcompileCreateMigrationsTable(): string;\n\tcompileColumn(column: ColumnCompileOptions): string;\n\tcompileModifyColumn(column: ColumnCompileOptions): string;\n\tcompileTableBlueprint(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string;\n\tcompileAddColumns(tableName: string, columns: ColumnCompileOptions[]): string;\n\tcompileDropColumns(tableName: string, columns: string[]): string;\n\tcompileRenameColumn(tableName: string, from: string, to: string): string;\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string;\n\tcompileRenameTable(from: string, to: string): string;\n\tcompileDropTable(tableName: string): string;\n\tcompileDropTableIfExists(tableName: string): string;\n\tcompileHasTable(tableName: string): string;\n\tcompileHasColumn(tableName: string, columnName: string): string;\n\tcompileInsert(sql: string): string;\n}\n\nexport interface ColumnCompileOptions {\n\tname: string;\n\ttype: string;\n\tnullable: boolean;\n\tdefaultValue: any;\n\tunsigned: boolean;\n\tunique: boolean;\n\tprimary: boolean;\n\tindex: boolean;\n\tcomment: string | null;\n\tafter: string | null;\n\tfirst: boolean;\n\tautoIncrement: boolean;\n\tprecision: number | null;\n\tscale: number | null;\n\tlength: number | null;\n\tvalues: string[] | null;\n\tisForeignId: boolean;\n}\n\nexport class MysqlDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\\`${identifier.replace(/`/g, \"``\")}\\``;\n\t}\n\n\tmakeParameter(_index: number): string {\n\t\treturn \"?\";\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn \" LIMIT ? OFFSET ?\";\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn \" LIMIT ?\";\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\t_idColumn?: string,\n\t): string {\n\t\treturn `${sql}; SELECT LAST_INSERT_ID() as id`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `TRUNCATE TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \\`migrations\\` (\n \\`id\\` INT AUTO_INCREMENT PRIMARY KEY,\n \\`name\\` VARCHAR(255) NOT NULL,\n \\`batch\\` INT NOT NULL,\n \\`executed_at\\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"INT AUTO_INCREMENT PRIMARY KEY\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"BIGINT AUTO_INCREMENT PRIMARY KEY\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INT\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"BIGINT\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"TINYINT\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"TINYINT(1)\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"FLOAT\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"DOUBLE\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn `DECIMAL(${options.precision ?? 10},${options.scale ?? 0})`;\n\t\t\tcase \"date\":\n\t\t\t\treturn \"DATE\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"DATETIME\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TIME\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"YEAR\";\n\t\t\tcase \"json\":\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"JSON\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BLOB\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"CHAR(36)\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INT UNSIGNED\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\toptions.unsigned &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\" &&\n\t\t\toptions.type !== \"foreignId\"\n\t\t)\n\t\t\tsql += \" UNSIGNED\";\n\t\tif (\n\t\t\toptions.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" AUTO_INCREMENT\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t} else if (\n\t\t\t!options.nullable &&\n\t\t\t!options.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t) {\n\t\t\tsql += \" NOT NULL\";\n\t\t}\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.primary) sql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\tif (options.comment !== null)\n\t\t\tsql += ` COMMENT '${options.comment.replace(/'/g, \"\\\\'\")}'`;\n\t\tif (options.after !== null)\n\t\t\tsql += ` AFTER ${this.wrapIdentifier(options.after)}`;\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn `MODIFY COLUMN ${this.compileColumn(options)}`;\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD ${columns.map((c) => this.compileColumn(c)).join(\", ADD \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `RENAME TABLE ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(tableName: string): string {\n\t\treturn `DROP TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*) as \\`count\\` FROM \\`information_schema\\`.\\`tables\\` WHERE \\`table_schema\\` = DATABASE() AND \\`table_name\\` = ?`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `SELECT COUNT(*) as \\`count\\` FROM \\`information_schema\\`.\\`columns\\` WHERE \\`table_schema\\` = DATABASE() AND \\`table_name\\` = ? AND \\`column_name\\` = ?`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"\\\\'\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n\t\treturn String(value);\n\t}\n}\n\nexport class SqliteDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tmakeParameter(_index: number): string {\n\t\treturn \"?\";\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn \" LIMIT ? OFFSET ?\";\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn \" LIMIT ?\";\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\t_idColumn?: string,\n\t): string {\n\t\treturn `${sql}; SELECT last_insert_rowid() as id`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `DELETE FROM ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \"migrations\" (\n \"id\" INTEGER PRIMARY KEY AUTOINCREMENT,\n \"name\" TEXT NOT NULL,\n \"batch\" INTEGER NOT NULL,\n \"executed_at\" TEXT DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"INTEGER PRIMARY KEY AUTOINCREMENT\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"INTEGER PRIMARY KEY AUTOINCREMENT\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"date\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"json\":\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BLOB\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\toptions.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" AUTOINCREMENT\";\n\t\tif (\n\t\t\t!options.nullable &&\n\t\t\toptions.defaultValue === undefined &&\n\t\t\t!options.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" NOT NULL\";\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t}\n\t\tif (options.primary) sql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn this.compileColumn(options);\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD COLUMN ${columns.map((c) => this.compileColumn(c)).join(\", ADD COLUMN \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `ALTER TABLE ${this.wrapIdentifier(from)} RENAME TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(tableName: string): string {\n\t\treturn `DROP TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*) as \"count\" FROM \"sqlite_master\" WHERE \"type\" = 'table' AND \"name\" = ?`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `PRAGMA table_info(${this.wrapIdentifier(_tableName)})`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"''\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n\t\treturn String(value);\n\t}\n}\n\nexport class PostgresqlDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tmakeParameter(index: number): string {\n\t\treturn `$${index + 1}`;\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tconst start = bindings.length;\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn ` LIMIT $${start + 1} OFFSET $${start + 2}`;\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn ` LIMIT $${start + 1}`;\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\tidColumn = \"id\",\n\t): string {\n\t\treturn `${sql} RETURNING ${this.wrapIdentifier(idColumn)}`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `TRUNCATE TABLE ${this.wrapIdentifier(tableName)} RESTART IDENTITY CASCADE`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \"migrations\" (\n \"id\" SERIAL PRIMARY KEY,\n \"name\" VARCHAR(255) NOT NULL,\n \"batch\" INTEGER NOT NULL,\n \"executed_at\" TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"SERIAL PRIMARY KEY\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"BIGSERIAL PRIMARY KEY\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"BIGINT\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"BOOLEAN\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"DOUBLE PRECISION\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn `DECIMAL(${options.precision ?? 10},${options.scale ?? 0})`;\n\t\t\tcase \"date\":\n\t\t\t\treturn \"DATE\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TIME\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"json\":\n\t\t\t\treturn \"JSON\";\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"JSONB\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BYTEA\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"UUID\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\t!options.nullable &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" NOT NULL\";\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t}\n\t\tif (\n\t\t\toptions.primary &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\tif (options.comment !== null)\n\t\t\tsql += ` -- ${options.comment.replace(/--/g, \"\")}`;\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn `ALTER COLUMN ${this.wrapIdentifier(options.name)} TYPE ${this.mapType(options.type, options)}`;\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD COLUMN ${columns.map((c) => this.compileColumn(c)).join(\", ADD COLUMN \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `ALTER TABLE ${this.wrapIdentifier(from)} RENAME TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(_tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(_tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*)::int as \"count\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = 'public' AND \"table_name\" = $1`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `SELECT COUNT(*)::int as \"count\" FROM \"information_schema\".\"columns\" WHERE \"table_schema\" = 'public' AND \"table_name\" = $1 AND \"column_name\" = $2`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"''\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n\t\treturn String(value);\n\t}\n}\n\nexport function createDialect(driver: string): Dialect {\n\tswitch (driver) {\n\t\tcase \"mysql\":\n\t\t\treturn new MysqlDialect();\n\t\tcase \"sqlite\":\n\t\t\treturn new SqliteDialect();\n\t\tcase \"postgresql\":\n\t\t\treturn new PostgresqlDialect();\n\t\tdefault:\n\t\t\treturn new MysqlDialect();\n\t}\n}\n","import {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresqlDialect,\n\tSqliteDialect,\n} from \"./dialect.js\";\nexport type { Dialect }\nimport type { ConnectionConfig, QueryResult } from \"./types.js\";\n\nexport interface Driver {\n\tconnect(): Promise<void>;\n\tdisconnect(): Promise<void>;\n\tisConnected(): boolean;\n\traw(sql: string, bindings?: any[]): Promise<QueryResult>;\n\ttransaction<T>(callback: (driver: Driver) => Promise<T>): Promise<T>;\n\tgetDialect(): Dialect;\n\tgetDriver(): string;\n}\n\nexport async function createDriver(config: ConnectionConfig): Promise<Driver> {\n\tconst driverType = config.driver ?? \"mysql\";\n\n\tswitch (driverType) {\n\t\tcase \"mysql\":\n\t\t\treturn createMysqlDriver(config);\n\t\tcase \"postgresql\":\n\t\t\treturn createPostgresqlDriver(config);\n\t\tcase \"sqlite\":\n\t\t\treturn createSqliteDriver(config);\n\t\tdefault:\n\t\t\treturn createMysqlDriver(config);\n\t}\n}\n\nasync function createMysqlDriver(config: ConnectionConfig): Promise<Driver> {\n\tlet mysqlPackage: any;\n\ttry {\n\t\t// @ts-expect-error - mysql2 is an optional runtime dependency\n\t\tmysqlPackage = await import(\"mysql2/promise\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"MySQL driver (mysql2) is not installed. Run: npm install mysql2\",\n\t\t);\n\t}\n\n\tlet pool: any = null;\n\tconst dialect = new MysqlDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tpool = mysqlPackage.createPool({\n\t\t\t\thost: config.host ?? \"127.0.0.1\",\n\t\t\t\tport: config.port ?? 3306,\n\t\t\t\tuser: config.username,\n\t\t\t\tpassword: config.password,\n\t\t\t\tdatabase: config.database,\n\t\t\t\tcharset: config.charset ?? \"utf8mb4\",\n\t\t\t\twaitForConnections: true,\n\t\t\t\tconnectionLimit: 10,\n\t\t\t\tqueueLimit: 0,\n\t\t\t});\n\t\t\t// Verify connection\n\t\t\tconst conn = await pool.getConnection();\n\t\t\tconn.release();\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (pool !== null) {\n\t\t\t\tawait pool.end();\n\t\t\t\tpool = null;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn pool !== null;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst [rows, fields] = await pool.execute(sql, bindings ?? []);\n\t\t\treturn { rows, fields };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (pool === null) throw new Error(\"Database not connected.\");\n\t\t\tconst conn = await pool.getConnection();\n\t\t\ttry {\n\t\t\t\tawait conn.beginTransaction();\n\t\t\t\tconst trxDriver: Driver = {\n\t\t\t\t\t...driver,\n\t\t\t\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\t\t\t\tconst [rows, fields] = await conn.execute(sql, bindings ?? []);\n\t\t\t\t\t\treturn { rows, fields };\n\t\t\t\t\t},\n\t\t\t\t\tgetDialect(): Dialect { return dialect; },\n\t\t\t\t\tgetDriver(): string { return \"mysql\"; },\n\t\t\t\t};\n\t\t\t\tconst result = await callback(trxDriver);\n\t\t\t\tawait conn.commit();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tawait conn.rollback();\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tconn.release();\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"mysql\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n\nasync function createPostgresqlDriver(\n\tconfig: ConnectionConfig,\n): Promise<Driver> {\n\tlet pgPackage: any;\n\ttry {\n\t\t// @ts-expect-error - pg is an optional runtime dependency\n\t\tpgPackage = await import(\"pg\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"PostgreSQL driver (pg) is not installed. Run: npm install pg\",\n\t\t);\n\t}\n\n\tlet pool: any = null;\n\tconst dialect = new PostgresqlDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tconst { Pool } = pgPackage;\n\t\t\tpool = new Pool({\n\t\t\t\thost: config.host ?? \"127.0.0.1\",\n\t\t\t\tport: config.port ?? 5432,\n\t\t\t\tuser: config.username,\n\t\t\t\tpassword: config.password,\n\t\t\t\tdatabase: config.database,\n\t\t\t});\n\t\t\tawait pool.query(\"SELECT 1\");\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (pool !== null) {\n\t\t\t\tawait pool.end();\n\t\t\t\tpool = null;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn pool !== null;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst result = await pool.query(sql, bindings ?? []);\n\t\t\treturn { rows: result.rows };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst client = await pool.connect();\n\t\t\ttry {\n\t\t\t\tawait client.query(\"BEGIN\");\n\t\t\t\tconst trxDriver: Driver = {\n\t\t\t\t\t...driver,\n\t\t\t\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\t\t\t\tconst result = await client.query(sql, bindings ?? []);\n\t\t\t\t\t\treturn { rows: result.rows };\n\t\t\t\t\t},\n\t\t\t\t\tgetDialect(): Dialect {\n\t\t\t\t\t\treturn dialect;\n\t\t\t\t\t},\n\t\t\t\t\tgetDriver(): string {\n\t\t\t\t\t\treturn \"postgresql\";\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst result = await callback(trxDriver);\n\t\t\t\tawait client.query(\"COMMIT\");\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tawait client.query(\"ROLLBACK\");\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"postgresql\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n\nasync function createSqliteDriver(config: ConnectionConfig): Promise<Driver> {\n\tlet sqlitePackage: any;\n\ttry {\n\t\t// @ts-expect-error - better-sqlite3 is an optional runtime dependency\n\t\tsqlitePackage = await import(\"better-sqlite3\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"SQLite driver (better-sqlite3) is not installed. Run: npm install better-sqlite3\",\n\t\t);\n\t}\n\n\tlet db: any = null;\n\tlet connected = false;\n\tconst dialect = new SqliteDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tdb = new sqlitePackage(config.database);\n\t\t\tdb.pragma(\"journal_mode = WAL\");\n\t\t\tconnected = true;\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (db !== null) {\n\t\t\t\tdb.close();\n\t\t\t\tdb = null;\n\t\t\t\tconnected = false;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn connected;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (db === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst trimmedSQL = sql.trim().toUpperCase();\n\t\t\tconst isQuery =\n\t\t\t\ttrimmedSQL.startsWith(\"SELECT\") ||\n\t\t\t\ttrimmedSQL.startsWith(\"WITH\") ||\n\t\t\t\ttrimmedSQL.startsWith(\"PRAGMA\");\n\t\t\tconst stmt = db.prepare(sql);\n\t\t\tif (isQuery) {\n\t\t\t\tconst rows =\n\t\t\t\t\tbindings !== undefined && bindings.length > 0\n\t\t\t\t\t\t? stmt.all(...bindings)\n\t\t\t\t\t\t: stmt.all();\n\t\t\t\treturn { rows };\n\t\t\t}\n\t\t\tif (bindings !== undefined && bindings.length > 0) {\n\t\t\t\tstmt.run(...bindings);\n\t\t\t} else {\n\t\t\t\tstmt.run();\n\t\t\t}\n\t\t\treturn { rows: [] };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (db === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tdb.exec(\"BEGIN\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(driver);\n\t\t\t\tdb.exec(\"COMMIT\");\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tdb.exec(\"ROLLBACK\");\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"sqlite\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n","import type { Dialect } from \"./dialect.js\";\nimport type { JoinType, OrderDirection, QueryRunner } from \"./types.js\";\n\ninterface WhereClause {\n\ttype:\n\t\t| \"basic\"\n\t\t| \"in\"\n\t\t| \"notIn\"\n\t\t| \"null\"\n\t\t| \"notNull\"\n\t\t| \"between\"\n\t\t| \"notBetween\"\n\t\t| \"like\"\n\t\t| \"nested\";\n\tcolumn?: string;\n\toperator?: string;\n\tvalue?: any;\n\tvalues?: any[];\n\tboolean: \"and\" | \"or\";\n\tnested?: WhereClause[];\n}\n\ninterface JoinClause {\n\ttable: string;\n\tfirst: string;\n\toperator: string;\n\tsecond: string;\n\ttype: JoinType;\n}\n\ninterface OrderByClause {\n\tcolumn: string;\n\tdirection: OrderDirection;\n}\n\ninterface HavingClause {\n\tcolumn: string;\n\toperator: string;\n\tvalue: any;\n}\n\nexport interface PaginatedResult<T = any> {\n\tdata: T[];\n\tcurrentPage: number;\n\tperPage: number;\n\ttotal: number;\n\tlastPage: number;\n\tfrom: number;\n\tto: number;\n\thasMore: boolean;\n\thasPrev: boolean;\n\tisEmpty: boolean;\n}\n\nexport class QueryBuilder {\n\tprivate connection: QueryRunner;\n\tprivate tableName: string;\n\tprivate columns: string[] = [\"*\"];\n\tprivate distinctEnabled = false;\n\tprivate wheres: WhereClause[] = [];\n\tprivate joins: JoinClause[] = [];\n\tprivate orderBys: OrderByClause[] = [];\n\tprivate havings: HavingClause[] = [];\n\tprivate groupBys: string[] = [];\n\tprivate limitValue: number | null = null;\n\tprivate offsetValue: number | null = null;\n\tprivate fromSubquery: string | null = null;\n\n\tconstructor(connection: QueryRunner, tableName: string) {\n\t\tthis.connection = connection;\n\t\tthis.tableName = tableName;\n\t}\n\n\tselect(...columns: string[]): this {\n\t\tthis.columns = columns.length > 0 ? columns : [\"*\"];\n\t\treturn this;\n\t}\n\n\taddSelect(...columns: string[]): this {\n\t\tif (this.columns[0] === \"*\") {\n\t\t\tthis.columns = columns;\n\t\t} else {\n\t\t\tthis.columns.push(...columns);\n\t\t}\n\t\treturn this;\n\t}\n\n\tdistinct(): this {\n\t\tthis.distinctEnabled = true;\n\t\treturn this;\n\t}\n\n\tfrom(table: string): this {\n\t\tthis.fromSubquery = table;\n\t\treturn this;\n\t}\n\n\twhere(column: string, operator: any, value?: any): this {\n\t\tif (value === undefined) {\n\t\t\tvalue = operator;\n\t\t\toperator = \"=\";\n\t\t}\n\t\tthis.wheres.push({\n\t\t\ttype: \"basic\",\n\t\t\tcolumn,\n\t\t\toperator: String(operator),\n\t\t\tvalue,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\torWhere(column: string, operator: any, value?: any): this {\n\t\tif (value === undefined) {\n\t\t\tvalue = operator;\n\t\t\toperator = \"=\";\n\t\t}\n\t\tthis.wheres.push({\n\t\t\ttype: \"basic\",\n\t\t\tcolumn,\n\t\t\toperator: String(operator),\n\t\t\tvalue,\n\t\t\tboolean: \"or\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereIn(column: string, values: any[]): this {\n\t\tthis.wheres.push({ type: \"in\", column, values, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNotIn(column: string, values: any[]): this {\n\t\tthis.wheres.push({ type: \"notIn\", column, values, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNull(column: string): this {\n\t\tthis.wheres.push({ type: \"null\", column, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNotNull(column: string): this {\n\t\tthis.wheres.push({ type: \"notNull\", column, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereBetween(column: string, range: [any, any]): this {\n\t\tthis.wheres.push({\n\t\t\ttype: \"between\",\n\t\t\tcolumn,\n\t\t\tvalues: range,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereNotBetween(column: string, range: [any, any]): this {\n\t\tthis.wheres.push({\n\t\t\ttype: \"notBetween\",\n\t\t\tcolumn,\n\t\t\tvalues: range,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereLike(column: string, pattern: string): this {\n\t\tthis.wheres.push({ type: \"like\", column, value: pattern, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\torWhereLike(column: string, pattern: string): this {\n\t\tthis.wheres.push({ type: \"like\", column, value: pattern, boolean: \"or\" });\n\t\treturn this;\n\t}\n\n\twhereGroup(callback: (query: QueryBuilder) => void): this {\n\t\tconst subQuery = new QueryBuilder(this.connection, this.tableName);\n\t\tcallback(subQuery);\n\t\tthis.wheres.push({\n\t\t\ttype: \"nested\",\n\t\t\tnested: subQuery.wheres,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\tjoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t\ttype: JoinType = \"inner\",\n\t): this {\n\t\tthis.joins.push({ table, first, operator, second, type });\n\t\treturn this;\n\t}\n\n\tleftJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"left\");\n\t}\n\n\trightJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"right\");\n\t}\n\n\tcrossJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"cross\");\n\t}\n\n\torderBy(column: string, direction: OrderDirection = \"asc\"): this {\n\t\tthis.orderBys.push({ column, direction });\n\t\treturn this;\n\t}\n\n\torderByDesc(column: string): this {\n\t\treturn this.orderBy(column, \"desc\");\n\t}\n\n\tlatest(column = \"created_at\"): this {\n\t\treturn this.orderBy(column, \"desc\");\n\t}\n\n\toldest(column = \"created_at\"): this {\n\t\treturn this.orderBy(column, \"asc\");\n\t}\n\n\tinRandomOrder(): this {\n\t\tthis.orderBys.push({ column: \"RANDOM()\", direction: \"asc\" });\n\t\treturn this;\n\t}\n\n\tlimit(limit: number): this {\n\t\tthis.limitValue = limit;\n\t\treturn this;\n\t}\n\n\toffset(offset: number): this {\n\t\tthis.offsetValue = offset;\n\t\treturn this;\n\t}\n\n\tskip(skip: number): this {\n\t\treturn this.offset(skip);\n\t}\n\n\ttake(take: number): this {\n\t\treturn this.limit(take);\n\t}\n\n\tgroupBy(...columns: string[]): this {\n\t\tthis.groupBys.push(...columns);\n\t\treturn this;\n\t}\n\n\thaving(column: string, operator: string, value: any): this {\n\t\tthis.havings.push({ column, operator, value });\n\t\treturn this;\n\t}\n\n\tasync get<T = any>(): Promise<T[]> {\n\t\tconst { sql, bindings } = this.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn result.rows as T[];\n\t}\n\n\tasync first<T = any>(): Promise<T | null> {\n\t\tconst qb = this.clone();\n\t\tqb.limitValue = 1;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn (result.rows.length > 0 ? result.rows[0] : null) as T | null;\n\t}\n\n\tasync find<T = any>(id: number | string): Promise<T | null> {\n\t\treturn this.where(\"id\", id).first<T>();\n\t}\n\n\tasync pluck(column: string): Promise<any[]> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [column];\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn result.rows.map((row: any) => row[column]);\n\t}\n\n\tasync count(column = \"*\"): Promise<number> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [\n\t\t\t`COUNT(${column === \"*\" ? \"*\" : this.wrap(column)}) as aggregate`,\n\t\t];\n\t\tqb.orderBys = [];\n\t\tqb.limitValue = null;\n\t\tqb.offsetValue = null;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst row = result.rows[0];\n\t\tif (!row) return 0;\n\t\treturn Number(row.aggregate ?? row.count ?? row[\"COUNT(*)\"] ?? 0);\n\t}\n\n\tasync exists(): Promise<boolean> {\n\t\tconst count = await this.count();\n\t\treturn count > 0;\n\t}\n\n\tasync doesntExist(): Promise<boolean> {\n\t\treturn !(await this.exists());\n\t}\n\n\tasync max(column: string): Promise<number | null> {\n\t\treturn this.aggregate(\"MAX\", column);\n\t}\n\n\tasync min(column: string): Promise<number | null> {\n\t\treturn this.aggregate(\"MIN\", column);\n\t}\n\n\tasync sum(column: string): Promise<number> {\n\t\tconst result = await this.aggregate(\"SUM\", column);\n\t\treturn result ?? 0;\n\t}\n\n\tasync avg(column: string): Promise<number> {\n\t\tconst result = await this.aggregate(\"AVG\", column);\n\t\treturn result ?? 0;\n\t}\n\n\tasync paginate(perPage = 15, page = 1): Promise<PaginatedResult> {\n\t\tconst countQb = this.clone();\n\t\tconst total = await countQb.count();\n\n\t\tconst lastPage = Math.max(1, Math.ceil(total / perPage));\n\t\tconst currentPage = Math.max(1, Math.min(page, lastPage));\n\t\tconst fromVal = (currentPage - 1) * perPage + 1;\n\t\tconst toVal = Math.min(currentPage * perPage, total);\n\n\t\tconst qb = this.clone();\n\t\tqb.limitValue = perPage;\n\t\tqb.offsetValue = (currentPage - 1) * perPage;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\n\t\treturn {\n\t\t\tdata: result.rows,\n\t\t\tcurrentPage,\n\t\t\tperPage,\n\t\t\ttotal,\n\t\t\tlastPage,\n\t\t\tfrom: total > 0 ? fromVal : 0,\n\t\t\tto: total > 0 ? toVal : 0,\n\t\t\thasMore: currentPage < lastPage,\n\t\t\thasPrev: currentPage > 1,\n\t\t\tisEmpty: total === 0,\n\t\t};\n\t}\n\n\tasync insert(data: Record<string, any>): Promise<number | string> {\n\t\tconst { sql, bindings } = this.compileInsert(data);\n\t\tconst driverType = this.connection.getDriver();\n\t\tconst dialect = this.connection.getDialect();\n\n\t\t// PostgreSQL: use RETURNING clause\n\t\tif (driverType === \"postgresql\") {\n\t\t\tconst returningSQL = dialect.compileInsertReturning(sql, bindings);\n\t\t\tconst result = await this.connection.raw(returningSQL, bindings);\n\t\t\treturn result.rows.length > 0 ? (Number(result.rows[0].id) ?? 0) : 0;\n\t\t}\n\n\t\tconst result = await this.connection.raw(sql, bindings);\n\n\t\t// MySQL: mysql2 returns [ResultSetHeader] with insertId\n\t\tif (driverType === \"mysql\") {\n\t\t\tconst header = result.rows;\n\t\t\t// mysql2 ResultSetHeader has insertId directly\n\t\t\tif (header && typeof header === 'object' && 'insertId' in header) {\n\t\t\t\treturn Number((header as any).insertId) ?? 0;\n\t\t\t}\n\t\t\t// Fallback: check rows[0]\n\t\t\tif (Array.isArray(result.rows) && result.rows.length > 0) {\n\t\t\t\tconst row = result.rows[0];\n\t\t\t\treturn Number(row?.insertId ?? row?.id ?? 0);\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\t// SQLite: last_insert_rowid()\n\t\tif (driverType === \"sqlite\") {\n\t\t\tconst lastIdResult = await this.connection.raw(\"SELECT last_insert_rowid() as id\");\n\t\t\tif (lastIdResult.rows.length > 0) {\n\t\t\t\treturn Number(lastIdResult.rows[0].id) ?? 0;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Fallback: return 0\n\t\treturn 0;\n\t}\n\n\tasync insertGetId(data: Record<string, any>): Promise<number | string> {\n\t\treturn this.insert(data);\n\t}\n\n\tasync insertReturning(data: Record<string, any>): Promise<any> {\n\t\tconst { sql, bindings } = this.compileInsert(data);\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst returningSQL = dialect.compileInsertReturning(sql, bindings);\n\t\tconst result = await this.connection.raw(returningSQL, bindings);\n\t\treturn result.rows.length > 0 ? result.rows[0] : null;\n\t}\n\n\tasync update(data: Record<string, any>): Promise<number> {\n\t\tconst { sql, bindings } = this.compileUpdate(data);\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst rows = result.rows;\n\t\tif (rows.length > 0) {\n\t\t\tconst info = rows[0];\n\t\t\treturn info.affectedRows ?? info.changes ?? rows.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tasync delete(): Promise<number> {\n\t\tconst { sql, bindings } = this.compileDelete();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst rows = result.rows;\n\t\tif (rows.length > 0) {\n\t\t\tconst info = rows[0];\n\t\t\treturn info.affectedRows ?? info.changes ?? rows.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tasync truncate(): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileTruncate(this.tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync chunk(\n\t\tsize: number,\n\t\tcallback: (rows: any[]) => Promise<void>,\n\t): Promise<void> {\n\t\tlet page = 1;\n\t\tlet hasMore = true;\n\n\t\twhile (hasMore) {\n\t\t\tconst qb = this.clone();\n\t\t\tqb.limitValue = size;\n\t\t\tqb.offsetValue = (page - 1) * size;\n\t\t\tconst rows = await qb.get();\n\n\t\t\tif (rows.length === 0) {\n\t\t\t\thasMore = false;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tawait callback(rows);\n\n\t\t\tif (rows.length < size) {\n\t\t\t\thasMore = false;\n\t\t\t}\n\n\t\t\tpage++;\n\t\t}\n\t}\n\n\tclone(): QueryBuilder {\n\t\tconst qb = new QueryBuilder(this.connection, this.tableName);\n\t\tqb.columns = [...this.columns];\n\t\tqb.distinctEnabled = this.distinctEnabled;\n\t\tqb.wheres = this.cloneWheres(this.wheres);\n\t\tqb.joins = [...this.joins];\n\t\tqb.orderBys = [...this.orderBys];\n\t\tqb.havings = [...this.havings];\n\t\tqb.groupBys = [...this.groupBys];\n\t\tqb.limitValue = this.limitValue;\n\t\tqb.offsetValue = this.offsetValue;\n\t\tqb.fromSubquery = this.fromSubquery;\n\t\treturn qb;\n\t}\n\n\ttoSQL(): { sql: string; bindings: any[] } {\n\t\tconst bindings: any[] = [];\n\t\tconst dialect = this.connection.getDialect();\n\n\t\tconst wrappedColumns = this.columns\n\t\t\t.map((c) =>\n\t\t\t\tc.includes(\"(\") || c === \"*\" || c.includes(\" as \") || c.includes(\" AS \")\n\t\t\t\t\t? c\n\t\t\t\t\t: dialect.wrapIdentifier(c),\n\t\t\t)\n\t\t\t.join(\", \");\n\n\t\tconst from = this.fromSubquery ?? this.tableName;\n\t\tconst wrappedFrom = this.fromSubquery ?? dialect.wrapIdentifier(from);\n\n\t\tlet sql = this.distinctEnabled\n\t\t\t? `SELECT DISTINCT ${wrappedColumns} FROM ${wrappedFrom}`\n\t\t\t: `SELECT ${wrappedColumns} FROM ${wrappedFrom}`;\n\n\t\tconst joinSQL = this.compileJoins(dialect);\n\t\tif (joinSQL) sql += joinSQL;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.groupBys.length > 0) {\n\t\t\tsql += ` GROUP BY ${this.groupBys.map((c) => dialect.wrapIdentifier(c)).join(\", \")}`;\n\t\t}\n\n\t\tconst havingSQL = this.compileHavings(dialect, bindings);\n\t\tif (havingSQL) sql += havingSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tdd(): string {\n\t\tconst { sql, bindings } = this.toSQL();\n\t\tconst output = `SQL: ${sql}\\nBindings: ${JSON.stringify(bindings)}`;\n\t\tconsole.error(output);\n\t\treturn output;\n\t}\n\n\tprivate compileJoins(dialect: Dialect): string {\n\t\tif (this.joins.length === 0) return \"\";\n\n\t\treturn (\n\t\t\t\" \" +\n\t\t\tthis.joins\n\t\t\t\t.map((j) => {\n\t\t\t\t\tconst type = j.type.toUpperCase();\n\t\t\t\t\treturn `${type} JOIN ${dialect.wrapIdentifier(j.table)} ON ${dialect.wrapIdentifier(j.first)} ${j.operator} ${this.wrap(j.second)}`;\n\t\t\t\t})\n\t\t\t\t.join(\" \")\n\t\t);\n\t}\n\n\tprivate compileWheres(dialect: Dialect, bindings: any[]): string {\n\t\tif (this.wheres.length === 0) return \"\";\n\n\t\tconst sql = this.compileWhereArray(this.wheres, dialect, bindings);\n\t\treturn sql ? ` WHERE ${sql}` : \"\";\n\t}\n\n\tprivate compileWhereArray(\n\t\twheres: WhereClause[],\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string {\n\t\tif (wheres.length === 0) return \"\";\n\t\tconst parts: string[] = [];\n\t\tfor (const w of wheres) {\n\t\t\tconst sql = this.compileSingleWhere(w, dialect, bindings);\n\t\t\tif (sql !== null) parts.push(sql);\n\t\t}\n\t\tif (parts.length === 0) return \"\";\n\t\t// Join with the boolean from each WHERE clause (respecting \"and\"/\"or\")\n\t\treturn parts.reduce((acc, part, i) => {\n\t\t\tif (i === 0) return part;\n\t\t\tconst bool = wheres[i]?.boolean ?? \"and\";\n\t\t\treturn `${acc} ${bool.toUpperCase()} ${part}`;\n\t\t}, \"\");\n\t}\n\n\tprivate compileSingleWhere(\n\t\tw: WhereClause,\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string | null {\n\t\tconst col = w.column ? dialect.wrapIdentifier(w.column) : \"\";\n\n\t\tswitch (w.type) {\n\t\t\tcase \"basic\": {\n\t\t\t\tbindings.push(w.value);\n\t\t\t\tconst operator = w.operator === \"=\" ? \"=\" : w.operator;\n\t\t\t\treturn `${col} ${operator} ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"in\": {\n\t\t\t\tconst placeholders = w\n\t\t\t\t\t.values!.map((v: any) => {\n\t\t\t\t\t\tbindings.push(v);\n\t\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t\t})\n\t\t\t\t\t.join(\", \");\n\t\t\t\treturn `${col} IN (${placeholders})`;\n\t\t\t}\n\t\t\tcase \"notIn\": {\n\t\t\t\tconst placeholders = w\n\t\t\t\t\t.values!.map((v: any) => {\n\t\t\t\t\t\tbindings.push(v);\n\t\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t\t})\n\t\t\t\t\t.join(\", \");\n\t\t\t\treturn `${col} NOT IN (${placeholders})`;\n\t\t\t}\n\t\t\tcase \"null\":\n\t\t\t\treturn `${col} IS NULL`;\n\t\t\tcase \"notNull\":\n\t\t\t\treturn `${col} IS NOT NULL`;\n\t\t\tcase \"between\": {\n\t\t\t\tbindings.push(w.values![0], w.values![1]);\n\t\t\t\treturn `${col} BETWEEN ${dialect.makeParameter(bindings.length - 2)} AND ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"notBetween\": {\n\t\t\t\tbindings.push(w.values![0], w.values![1]);\n\t\t\t\treturn `${col} NOT BETWEEN ${dialect.makeParameter(bindings.length - 2)} AND ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"like\": {\n\t\t\t\tbindings.push(w.value);\n\t\t\t\treturn `${col} LIKE ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"nested\": {\n\t\t\t\tconst nestedSQL = this.compileNestedWhere(w.nested!, dialect, bindings);\n\t\t\t\treturn nestedSQL ? `(${nestedSQL})` : null;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate compileNestedWhere(\n\t\twheres: WhereClause[],\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string {\n\t\tif (wheres.length === 0) return \"\";\n\t\tconst parts: string[] = [];\n\t\tfor (const w of wheres) {\n\t\t\tconst sql = this.compileSingleWhere(w, dialect, bindings);\n\t\t\tif (sql !== null) parts.push(sql);\n\t\t}\n\t\tif (parts.length === 0) return \"\";\n\t\treturn parts.reduce((acc, part, i) => {\n\t\t\tif (i === 0) return part;\n\t\t\tconst bool = wheres[i]?.boolean ?? \"and\";\n\t\t\treturn `${acc} ${bool.toUpperCase()} ${part}`;\n\t\t}, \"\");\n\t}\n\n\tprivate compileHavings(dialect: Dialect, bindings: any[]): string {\n\t\tif (this.havings.length === 0) return \"\";\n\n\t\tconst parts = this.havings.map((h) => {\n\t\t\tbindings.push(h.value);\n\t\t\treturn `${dialect.wrapIdentifier(h.column)} ${h.operator} ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t});\n\n\t\treturn ` HAVING ${parts.join(\" AND \")}`;\n\t}\n\n\tprivate compileInsert(data: Record<string, any>): {\n\t\tsql: string;\n\t\tbindings: any[];\n\t} {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst columns = Object.keys(data);\n\t\tconst values = Object.values(data);\n\t\tconst bindings: any[] = [];\n\n\t\tconst placeholders = values\n\t\t\t.map((v: any) => {\n\t\t\t\tbindings.push(v);\n\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t})\n\t\t\t.join(\", \");\n\n\t\tconst sql = `INSERT INTO ${dialect.wrapIdentifier(this.tableName)} (${columns.map((c) => dialect.wrapIdentifier(c)).join(\", \")}) VALUES (${placeholders})`;\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate compileUpdate(data: Record<string, any>): {\n\t\tsql: string;\n\t\tbindings: any[];\n\t} {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst bindings: any[] = [];\n\n\t\tconst sets = Object.entries(data).map(([key, value]) => {\n\t\t\tbindings.push(value);\n\t\t\treturn `${dialect.wrapIdentifier(key)} = ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t});\n\n\t\tlet sql = `UPDATE ${dialect.wrapIdentifier(this.tableName)} SET ${sets.join(\", \")}`;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate compileDelete(): { sql: string; bindings: any[] } {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst bindings: any[] = [];\n\n\t\tlet sql = `DELETE FROM ${dialect.wrapIdentifier(this.tableName)}`;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate async aggregate(fn: string, column: string): Promise<number | null> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [`${fn}(${this.wrap(column)}) as aggregate`];\n\t\tqb.orderBys = [];\n\t\tqb.limitValue = null;\n\t\tqb.offsetValue = null;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst row = result.rows[0];\n\t\tif (!row) return null;\n\t\tconst val = row.aggregate ?? row[`${fn}(${column})`];\n\t\treturn val !== null && val !== undefined ? Number(val) : null;\n\t}\n\n\tprivate cloneWheres(wheres: WhereClause[]): WhereClause[] {\n\t\treturn wheres.map((w) => ({\n\t\t\t...w,\n\t\t\tvalues: w.values ? [...w.values] : undefined,\n\t\t\tnested: w.nested ? this.cloneWheres(w.nested) : undefined,\n\t\t}));\n\t}\n\n\tprivate wrap(identifier: string): string {\n\t\tif (identifier === \"*\" || identifier.includes(\"(\")) return identifier;\n\t\tconst dialect = this.connection.getDialect();\n\t\treturn dialect.wrapIdentifier(identifier);\n\t}\n}\n","import type { DatabaseConnection } from \"./connection.js\";\nimport type { ColumnCompileOptions, Dialect } from \"./dialect.js\";\nimport type { QueryResult } from \"./types.js\";\n\nexport interface MigrationDefinition {\n\tname: string;\n\tup: (schema: SchemaBuilder) => Promise<void>;\n\tdown: (schema: SchemaBuilder) => Promise<void>;\n}\n\nexport interface MigrationStatusRow {\n\tname: string;\n\tbatch: number;\n\texecutedAt: string;\n}\n\nexport class SchemaBuilder {\n\tprivate connection: DatabaseConnection;\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\tasync createTable(\n\t\ttableName: string,\n\t\tcallback: (table: TableBlueprint) => void,\n\t): Promise<void> {\n\t\tconst blueprint = new TableBlueprint(this.connection, \"create\");\n\t\tcallback(blueprint);\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst columns = blueprint.compileColumns();\n\t\tconst constraints = blueprint.compileConstraints(dialect);\n\t\tconst sql = dialect.compileCreateTable(tableName, columns, constraints);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync dropTable(tableName: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileDropTable(tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync dropTableIfExists(tableName: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileDropTableIfExists(tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync renameTable(from: string, to: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileRenameTable(from, to);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync alterTable(\n\t\ttableName: string,\n\t\tcallback: (table: TableBlueprint) => void,\n\t): Promise<void> {\n\t\tconst blueprint = new TableBlueprint(this.connection, \"alter\");\n\t\tcallback(blueprint);\n\t\tconst dialect = this.connection.getDialect();\n\n\t\tif (blueprint.droppedColumns.length > 0) {\n\t\t\tconst dropSQL = dialect.compileDropColumns(\n\t\t\t\ttableName,\n\t\t\t\tblueprint.droppedColumns,\n\t\t\t);\n\t\t\tawait this.connection.raw(\n\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${dropSQL}`,\n\t\t\t);\n\t\t}\n\n\t\tif (blueprint.renamedColumns.length > 0) {\n\t\t\tfor (const { from, to } of blueprint.renamedColumns) {\n\t\t\t\tconst renameSQL = dialect.compileRenameColumn(tableName, from, to);\n\t\t\t\tawait this.connection.raw(\n\t\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${renameSQL}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst compiledColumns = blueprint.compileColumnDefinitions(dialect);\n\t\tif (compiledColumns.length > 0) {\n\t\t\tfor (const colSQL of compiledColumns) {\n\t\t\t\tawait this.connection.raw(\n\t\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${colSQL}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync hasTable(tableName: string): Promise<boolean> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileHasTable(tableName);\n\t\tconst result = await this.connection.raw(sql, [tableName]);\n\t\treturn this.parseCount(result) > 0;\n\t}\n\n\tasync hasColumn(tableName: string, columnName: string): Promise<boolean> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst driver = this.connection.getDriver();\n\n\t\tif (driver === \"sqlite\") {\n\t\t\tconst sql = dialect.compileHasColumn(tableName, columnName);\n\t\t\tconst result = await this.connection.raw(sql);\n\t\t\treturn result.rows.some((row: any) => row.name === columnName);\n\t\t}\n\n\t\tconst sql = dialect.compileHasColumn(tableName, columnName);\n\t\tconst result = await this.connection.raw(sql, [tableName, columnName]);\n\t\treturn this.parseCount(result) > 0;\n\t}\n\n\tprivate parseCount(result: QueryResult): number {\n\t\tif (result.rows.length === 0) return 0;\n\t\tconst row = result.rows[0];\n\t\treturn Number(row.count ?? row.Count ?? 0);\n\t}\n}\n\nexport type BlueprintMode = \"create\" | \"alter\";\n\nexport class TableBlueprint {\n\tprivate mode: BlueprintMode;\n\tprivate columns: ColumnDefinition[] = [];\n\tprivate primaryKeys: string[] = [];\n\tprivate uniqueKeys: string[][] = [];\n\tprivate indexKeys: string[][] = [];\n\tprivate foreignKeys: ForeignKeyDef[] = [];\n\tdroppedColumns: string[] = [];\n\trenamedColumns: { from: string; to: string }[] = [];\n\n\tconstructor(_connection: DatabaseConnection, mode: BlueprintMode) {\n\t\tthis.mode = mode;\n\t}\n\n\tid(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"id\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tincrements(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"increments\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tbigIncrements(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"bigIncrements\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tstring(name: string, length = 255): ColumnDefinition {\n\t\tconst col = this.addColumn(\"string\", name);\n\t\tcol.setLength(length);\n\t\treturn col;\n\t}\n\n\ttext(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"text\", name);\n\t}\n\n\tinteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"integer\", name);\n\t}\n\n\tbigInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"bigInteger\", name);\n\t}\n\n\ttinyInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"tinyInteger\", name);\n\t}\n\n\tsmallInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"smallInteger\", name);\n\t}\n\n\tboolean(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"boolean\", name);\n\t}\n\n\tfloat(name: string, _precision?: number): ColumnDefinition {\n\t\tconst col = this.addColumn(\"float\", name);\n\t\tif (_precision !== undefined) col.setPrecision(_precision);\n\t\treturn col;\n\t}\n\n\tdouble(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"double\", name);\n\t}\n\n\tdecimal(name: string, precision = 10, scale = 0): ColumnDefinition {\n\t\tconst col = this.addColumn(\"decimal\", name);\n\t\tcol.setPrecision(precision);\n\t\tcol.setScale(scale);\n\t\treturn col;\n\t}\n\n\tdate(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"date\", name);\n\t}\n\n\tdatetime(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"datetime\", name);\n\t}\n\n\ttimestamp(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"timestamp\", name);\n\t}\n\n\ttime(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"time\", name);\n\t}\n\n\tyear(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"year\", name);\n\t}\n\n\tjson(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"json\", name);\n\t}\n\n\tjsonb(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"jsonb\", name);\n\t}\n\n\tbinary(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"binary\", name);\n\t}\n\n\tuuid(name = \"uuid\"): ColumnDefinition {\n\t\treturn this.addColumn(\"uuid\", name);\n\t}\n\n\tenum(name: string, values: string[]): ColumnDefinition {\n\t\tconst col = this.addColumn(\"enum\", name);\n\t\tcol.setValues(values);\n\t\treturn col;\n\t}\n\n\tforeignId(name: string): ColumnDefinition {\n\t\tconst col = this.addColumn(\"foreignId\", name);\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tprimary(...columns: string[]): void {\n\t\tthis.primaryKeys.push(...columns);\n\t}\n\n\tunique(...columns: string[]): void {\n\t\tthis.uniqueKeys.push(columns);\n\t}\n\n\tindex(...columns: string[]): void {\n\t\tthis.indexKeys.push(columns);\n\t}\n\n\tforeign(column: string): ForeignKeyDefinition {\n\t\tconst fk: ForeignKeyDef = {\n\t\t\tcolumn,\n\t\t\treferences: \"\",\n\t\t\ton: \"\",\n\t\t\tonDelete: null,\n\t\t\tonUpdate: null,\n\t\t};\n\t\tthis.foreignKeys.push(fk);\n\t\treturn new ForeignKeyDefinition(fk);\n\t}\n\n\ttimestamps(): void {\n\t\tthis.timestamp(\"created_at\").nullable();\n\t\tthis.timestamp(\"updated_at\").nullable();\n\t}\n\n\tsoftDeletes(): void {\n\t\tthis.timestamp(\"deleted_at\").nullable();\n\t}\n\n\trememberToken(): void {\n\t\tthis.string(\"remember_token\", 100).nullable();\n\t}\n\n\tdropColumn(column: string): void {\n\t\tthis.droppedColumns.push(column);\n\t}\n\n\trenameColumn(from: string, to: string): void {\n\t\tthis.renamedColumns.push({ from, to });\n\t}\n\n\tdropPrimary(): void {\n\t\tthis.primaryKeys = [];\n\t}\n\n\tdropUnique(_indexName?: string): void {\n\t\tthis.uniqueKeys = [];\n\t}\n\n\tdropIndex(_indexName?: string): void {\n\t\tthis.indexKeys = [];\n\t}\n\n\tdropForeign(_indexName?: string): void {\n\t\tthis.foreignKeys = [];\n\t}\n\n\tdropTimestamps(): void {\n\t\tthis.droppedColumns.push(\"created_at\", \"updated_at\");\n\t}\n\n\tdropSoftDeletes(): void {\n\t\tthis.droppedColumns.push(\"deleted_at\");\n\t}\n\n\tdropRememberToken(): void {\n\t\tthis.droppedColumns.push(\"remember_token\");\n\t}\n\n\tcompileColumns(): ColumnCompileOptions[] {\n\t\treturn this.columns\n\t\t\t.filter((c) => this.mode === \"create\" || c.isNew)\n\t\t\t.map((c) => c.compile());\n\t}\n\n\tcompileConstraints(dialect: Dialect): string[] {\n\t\tconst constraints: string[] = [];\n\t\tconst wrap = (name: string) => dialect.wrapIdentifier(name);\n\n\t\tfor (const pk of this.primaryKeys) {\n\t\t\tconstraints.push(`PRIMARY KEY (${wrap(pk)})`);\n\t\t}\n\n\t\tfor (const uk of this.uniqueKeys) {\n\t\t\tconstraints.push(`UNIQUE (${uk.map((c) => wrap(c)).join(\", \")})`);\n\t\t}\n\n\t\tfor (const ik of this.indexKeys) {\n\t\t\tconstraints.push(`INDEX (${ik.map((c) => wrap(c)).join(\", \")})`);\n\t\t}\n\n\t\tfor (const fk of this.foreignKeys) {\n\t\t\tlet fkSQL = `FOREIGN KEY (${wrap(fk.column)}) REFERENCES ${wrap(fk.on)} (${wrap(fk.references)})`;\n\t\t\tif (fk.onDelete) fkSQL += ` ON DELETE ${fk.onDelete}`;\n\t\t\tif (fk.onUpdate) fkSQL += ` ON UPDATE ${fk.onUpdate}`;\n\t\t\tconstraints.push(fkSQL);\n\t\t}\n\n\t\treturn constraints;\n\t}\n\n\tcompileColumnDefinitions(dialect: Dialect): string[] {\n\t\treturn this.columns\n\t\t\t.filter((c) => c.isNew && this.mode === \"alter\")\n\t\t\t.map((c) => dialect.compileAddColumns(\"\", [c.compile()]));\n\t}\n\n\tprivate addColumn(type: string, name: string): ColumnDefinition {\n\t\tconst col = new ColumnDefinition(type, name);\n\t\tthis.columns.push(col);\n\t\treturn col;\n\t}\n}\n\nexport class ColumnDefinition {\n\tprivate type: string;\n\tprivate name: string;\n\tprivate isNullable = false;\n\tprivate defaultValue: any = undefined;\n\tprivate isUnsigned = false;\n\tprivate isUnique = false;\n\tprivate isPrimary = false;\n\tprivate isIndex = false;\n\tprivate commentText: string | null = null;\n\tprivate afterColumn: string | null = null;\n\tprivate isFirst = false;\n\tprivate isAutoIncrement = false;\n\tprivate precisionValue: number | null = null;\n\tprivate scaleValue: number | null = null;\n\tprivate lengthValue: number | null = null;\n\tprivate enumValues: string[] | null = null;\n\tprivate isForeignId = false;\n\tisNew = true;\n\n\tconstructor(type: string, name: string) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\tnullable(): this {\n\t\tthis.isNullable = true;\n\t\treturn this;\n\t}\n\n\tdefault(value: any): this {\n\t\tthis.defaultValue = value;\n\t\treturn this;\n\t}\n\n\tunsigned(): this {\n\t\tthis.isUnsigned = true;\n\t\treturn this;\n\t}\n\n\tunique(): this {\n\t\tthis.isUnique = true;\n\t\treturn this;\n\t}\n\n\tprimary(): this {\n\t\tthis.isPrimary = true;\n\t\treturn this;\n\t}\n\n\tindex(): this {\n\t\tthis.isIndex = true;\n\t\treturn this;\n\t}\n\n\tcomment(text: string): this {\n\t\tthis.commentText = text;\n\t\treturn this;\n\t}\n\n\tafter(column: string): this {\n\t\tthis.afterColumn = column;\n\t\treturn this;\n\t}\n\n\tfirst(): this {\n\t\tthis.isFirst = true;\n\t\treturn this;\n\t}\n\n\tautoIncrement(): this {\n\t\tthis.isAutoIncrement = true;\n\t\treturn this;\n\t}\n\n\tsetValues(vals: string[]): this {\n\t\tthis.enumValues = vals;\n\t\treturn this;\n\t}\n\n\tsetLength(len: number): this {\n\t\tthis.lengthValue = len;\n\t\treturn this;\n\t}\n\n\tsetPrecision(precision: number): this {\n\t\tthis.precisionValue = precision;\n\t\treturn this;\n\t}\n\n\tsetScale(scale: number): this {\n\t\tthis.scaleValue = scale;\n\t\treturn this;\n\t}\n\n\tcompile(): ColumnCompileOptions {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tnullable: this.isNullable,\n\t\t\tdefaultValue: this.defaultValue,\n\t\t\tunsigned: this.isUnsigned,\n\t\t\tunique: this.isUnique,\n\t\t\tprimary: this.isPrimary,\n\t\t\tindex: this.isIndex,\n\t\t\tcomment: this.commentText,\n\t\t\tafter: this.afterColumn,\n\t\t\tfirst: this.isFirst,\n\t\t\tautoIncrement: this.isAutoIncrement,\n\t\t\tprecision: this.precisionValue,\n\t\t\tscale: this.scaleValue,\n\t\t\tlength: this.lengthValue,\n\t\t\tvalues: this.enumValues,\n\t\t\tisForeignId: this.isForeignId,\n\t\t};\n\t}\n}\n\ninterface ForeignKeyDef {\n\tcolumn: string;\n\treferences: string;\n\ton: string;\n\tonDelete: string | null;\n\tonUpdate: string | null;\n}\n\nexport class ForeignKeyDefinition {\n\tprivate def: ForeignKeyDef;\n\n\tconstructor(def: ForeignKeyDef) {\n\t\tthis.def = def;\n\t}\n\n\treferences(column: string): this {\n\t\tthis.def.references = column;\n\t\treturn this;\n\t}\n\n\ton(table: string): this {\n\t\tthis.def.on = table;\n\t\treturn this;\n\t}\n\n\tonDelete(action: string): this {\n\t\tthis.def.onDelete = action;\n\t\treturn this;\n\t}\n\n\tonUpdate(action: string): this {\n\t\tthis.def.onUpdate = action;\n\t\treturn this;\n\t}\n}\n\nexport class Migrator {\n\tprivate connection: DatabaseConnection;\n\tprivate migrations: MigrationDefinition[] = [];\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\taddMigrations(migrations: MigrationDefinition[]): void {\n\t\tthis.migrations.push(...migrations);\n\t}\n\n\tsetMigrations(migrations: MigrationDefinition[]): void {\n\t\tthis.migrations = migrations;\n\t}\n\n\tasync run(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst ran = await this.getRanMigrations();\n\t\tconst ranNames = new Set(ran.map((r) => r.name));\n\n\t\tconst pending = this.migrations.filter((m) => !ranNames.has(m.name));\n\t\tif (pending.length === 0) {\n\t\t\tconsole.log(\"Nothing to migrate.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextBatch = await this.getNextBatchNumber();\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of pending) {\n\t\t\tconsole.log(`Migrating: ${migration.name}`);\n\t\t\ttry {\n\t\t\t\tawait migration.up(schema);\n\t\t\t\tawait this.recordMigration(migration.name, nextBatch);\n\t\t\t\tconsole.log(`Migrated: ${migration.name}`);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(`Migration failed: ${migration.name}`, err);\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync rollback(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst lastBatch = await this.getLastBatchNumber();\n\t\tif (lastBatch === 0) {\n\t\t\tconsole.log(\"Nothing to rollback.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastBatchMigrations = await this.getMigrationsByBatch(lastBatch);\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of lastBatchMigrations.reverse()) {\n\t\t\tconst def = this.migrations.find((m) => m.name === migration.name);\n\t\t\tif (def) {\n\t\t\t\tconsole.log(`Rolling back: ${migration.name}`);\n\t\t\t\ttry {\n\t\t\t\t\tawait def.down(schema);\n\t\t\t\t\tawait this.removeMigration(migration.name);\n\t\t\t\t\tconsole.log(`Rolled back: ${migration.name}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`Rollback failed: ${migration.name}`, err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync reset(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst allRan = await this.getRanMigrations();\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of allRan.reverse()) {\n\t\t\tconst def = this.migrations.find((m) => m.name === migration.name);\n\t\t\tif (def) {\n\t\t\t\tconsole.log(`Resetting: ${migration.name}`);\n\t\t\t\ttry {\n\t\t\t\t\tawait def.down(schema);\n\t\t\t\t\tawait this.removeMigration(migration.name);\n\t\t\t\t\tconsole.log(`Reset: ${migration.name}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`Reset failed: ${migration.name}`, err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync refresh(): Promise<void> {\n\t\tawait this.reset();\n\t\tawait this.run();\n\t}\n\n\tasync status(): Promise<MigrationStatusRow[]> {\n\t\tawait this.ensureMigrationTable();\n\t\treturn this.getRanMigrations();\n\t}\n\n\tprivate async ensureMigrationTable(): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileCreateMigrationsTable();\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tprivate async getRanMigrations(): Promise<MigrationStatusRow[]> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT name, batch, executed_at as executedAt FROM migrations ORDER BY batch ASC, name ASC\",\n\t\t);\n\t\treturn result.rows.map((row: any) => ({\n\t\t\tname: String(row.name),\n\t\t\tbatch: Number(row.batch),\n\t\t\texecutedAt: String(row.executedAt ?? \"\"),\n\t\t}));\n\t}\n\n\tprivate async getNextBatchNumber(): Promise<number> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT COALESCE(MAX(batch), 0) + 1 as next_batch FROM migrations\",\n\t\t);\n\t\treturn Number(result.rows[0]?.next_batch ?? 1);\n\t}\n\n\tprivate async getLastBatchNumber(): Promise<number> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT COALESCE(MAX(batch), 0) as last_batch FROM migrations\",\n\t\t);\n\t\treturn Number(result.rows[0]?.last_batch ?? 0);\n\t}\n\n\tprivate async getMigrationsByBatch(\n\t\tbatch: number,\n\t): Promise<MigrationStatusRow[]> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT name, batch, executed_at as executedAt FROM migrations WHERE batch = ? ORDER BY name ASC\",\n\t\t\t[batch],\n\t\t);\n\t\treturn result.rows.map((row: any) => ({\n\t\t\tname: String(row.name),\n\t\t\tbatch: Number(row.batch),\n\t\t\texecutedAt: String(row.executedAt ?? \"\"),\n\t\t}));\n\t}\n\n\tprivate async recordMigration(name: string, batch: number): Promise<void> {\n\t\tawait this.connection.raw(\n\t\t\t\"INSERT INTO migrations (name, batch) VALUES (?, ?)\",\n\t\t\t[name, batch],\n\t\t);\n\t}\n\n\tprivate async removeMigration(name: string): Promise<void> {\n\t\tawait this.connection.raw(\"DELETE FROM migrations WHERE name = ?\", [name]);\n\t}\n}\n","export interface PaginatedResult<T = any> {\n\tdata: T[];\n\tcurrentPage: number;\n\tperPage: number;\n\ttotal: number;\n\tlastPage: number;\n\tfrom: number;\n\tto: number;\n\thasMore: boolean;\n\thasPrev: boolean;\n\tisEmpty: boolean;\n}\n\nexport class Pagination<T = any> {\n\treadonly data: T[];\n\treadonly currentPage: number;\n\treadonly perPage: number;\n\treadonly total: number;\n\treadonly lastPage: number;\n\treadonly from: number;\n\treadonly to: number;\n\n\tconstructor(result: PaginatedResult<T>) {\n\t\tthis.data = result.data;\n\t\tthis.currentPage = result.currentPage;\n\t\tthis.perPage = result.perPage;\n\t\tthis.total = result.total;\n\t\tthis.lastPage = result.lastPage;\n\t\tthis.from = result.from;\n\t\tthis.to = result.to;\n\t}\n\n\tget hasMore(): boolean {\n\t\treturn this.currentPage < this.lastPage;\n\t}\n\n\tget hasPrev(): boolean {\n\t\treturn this.currentPage > 1;\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.data.length === 0;\n\t}\n\n\tnextPage(): PaginationUrl | null {\n\t\tif (!this.hasMore) return null;\n\t\treturn {\n\t\t\tpage: this.currentPage + 1,\n\t\t\tperPage: this.perPage,\n\t\t\turl: null,\n\t\t};\n\t}\n\n\tprevPage(): PaginationUrl | null {\n\t\tif (!this.hasPrev) return null;\n\t\treturn {\n\t\t\tpage: this.currentPage - 1,\n\t\t\tperPage: this.perPage,\n\t\t\turl: null,\n\t\t};\n\t}\n\n\ttoJSON(): Record<string, any> {\n\t\treturn {\n\t\t\tdata: this.data,\n\t\t\tpagination: {\n\t\t\t\tcurrentPage: this.currentPage,\n\t\t\t\tperPage: this.perPage,\n\t\t\t\ttotal: this.total,\n\t\t\t\tlastPage: this.lastPage,\n\t\t\t\tfrom: this.from,\n\t\t\t\tto: this.to,\n\t\t\t\thasMore: this.hasMore,\n\t\t\t\thasPrev: this.hasPrev,\n\t\t\t\tisEmpty: this.isEmpty,\n\t\t\t},\n\t\t};\n\t}\n\n\tmap<U>(fn: (item: T, index: number) => U): Pagination<U> {\n\t\treturn new Pagination<U>({\n\t\t\t...this,\n\t\t\tdata: this.data.map(fn),\n\t\t});\n\t}\n\n\titems(): T[] {\n\t\treturn this.data;\n\t}\n\n\tstatic from<T>(result: PaginatedResult<T>): Pagination<T> {\n\t\treturn new Pagination(result);\n\t}\n}\n\nexport interface PaginationUrl {\n\tpage: number;\n\tperPage: number;\n\turl: string | null;\n}\n","import type { DatabaseConnection } from \"./connection.js\";\n\nexport interface SeederClass {\n\trun(connection: DatabaseConnection): Promise<void>;\n}\n\nexport class Seeder {\n\tprivate connection: DatabaseConnection;\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\tasync call(seederClass: SeederClass): Promise<void> {\n\t\tawait seederClass.run(this.connection);\n\t}\n\n\tasync insert(table: string, data: Record<string, any>[]): Promise<void> {\n\t\tif (data.length === 0) return;\n\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst firstRow = data[0];\n\t\tif (!firstRow) return;\n\n\t\tconst columns = Object.keys(firstRow);\n\t\tconst wrappedColumns = columns\n\t\t\t.map((c) => dialect.wrapIdentifier(c))\n\t\t\t.join(\", \");\n\n\t\tconst batchSize = 100;\n\t\tfor (let i = 0; i < data.length; i += batchSize) {\n\t\t\tconst batch = data.slice(i, i + batchSize);\n\t\t\tconst placeholders: string[] = [];\n\t\t\tconst bindings: any[] = [];\n\n\t\t\tfor (const row of batch) {\n\t\t\t\tconst rowPlaceholders = columns.map((col) => {\n\t\t\t\t\tbindings.push(row[col]);\n\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t});\n\t\t\t\tplaceholders.push(`(${rowPlaceholders.join(\", \")})`);\n\t\t\t}\n\n\t\t\tconst sql = `INSERT INTO ${dialect.wrapIdentifier(table)} (${wrappedColumns}) VALUES ${placeholders.join(\", \")}`;\n\t\t\tawait this.connection.raw(sql, bindings);\n\t\t}\n\t}\n\n\tasync truncate(table: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst driver = this.connection.getDriver();\n\n\t\tif (driver === \"sqlite\") {\n\t\t\tawait this.connection.raw(`DELETE FROM ${dialect.wrapIdentifier(table)}`);\n\t\t} else if (driver === \"postgresql\") {\n\t\t\tawait this.connection.raw(dialect.compileTruncate(table));\n\t\t} else {\n\t\t\tawait this.connection.raw(\"SET FOREIGN_KEY_CHECKS = 0\");\n\t\t\tawait this.connection.raw(dialect.compileTruncate(table));\n\t\t\tawait this.connection.raw(\"SET FOREIGN_KEY_CHECKS = 1\");\n\t\t}\n\t}\n\n\tasync run(): Promise<void> {\n\t\tthrow new Error(\"Seeder.run() must be overridden by subclasses\");\n\t}\n}\n","import { QueryBuilder } from './query.js'\nimport type { QueryRunner } from './types.js'\n\nexport class Model {\n id?: number | string\n static table: string = ''\n static connection: QueryRunner | null = null\n protected static queryRunner: QueryRunner | null = null\n\n static setConnection(conn: QueryRunner): void {\n this.connection = conn\n this.queryRunner = conn\n }\n\n static query<T extends typeof Model>(this: T): QueryBuilder {\n if (!this.queryRunner) {\n throw new Error('Database connection not set. Call Model.setConnection() first.')\n }\n return new QueryBuilder(this.queryRunner, this.table)\n }\n\n static async all<T extends typeof Model>(this: T): Promise<InstanceType<T>[]> {\n const rows = await this.query().get()\n return rows.map((row: Record<string, any>) => this.hydrate(row)) as any\n }\n\n static async find<T extends typeof Model>(this: T, id: number | string): Promise<InstanceType<T> | null> {\n const row = await this.query().find(id)\n if (!row) return null\n return this.hydrate(row) as any\n }\n\n static async where<T extends typeof Model>(this: T, column: string, value: any): Promise<QueryBuilder> {\n return this.query().where(column, value)\n }\n\n static async create<T extends typeof Model>(this: T, data: Record<string, any>): Promise<InstanceType<T>> {\n const id = await this.query().insert(data)\n return this.find(id) as any\n }\n\n static async updateOrCreate<T extends typeof Model>(\n this: T,\n attributes: Record<string, any>,\n values?: Record<string, any>,\n ): Promise<InstanceType<T>> {\n const qb = this.query()\n for (const [key, value] of Object.entries(attributes)) {\n qb.where(key, value)\n }\n const existing = await qb.first()\n if (existing) {\n const mergeValues = values ?? attributes\n const id = (existing as any).id\n const updateQb = new QueryBuilder(this.queryRunner!, this.table)\n for (const [key, value] of Object.entries(attributes)) {\n updateQb.where(key, value)\n }\n await updateQb.update(mergeValues)\n return this.find(id) as any\n }\n return this.create({ ...attributes, ...values }) as any\n }\n\n async save(): Promise<void> {\n const ModelClass = this.constructor as typeof Model\n const id = this.id\n if (id !== undefined && id !== null) {\n await ModelClass.query().where('id', id).update(this.getData())\n } else {\n const newId = await ModelClass.query().insert(this.getData())\n this.id = newId\n }\n }\n\n async delete(): Promise<void> {\n const ModelClass = this.constructor as typeof Model\n const id = this.id\n if (id !== undefined && id !== null) {\n await ModelClass.query().where('id', id).delete()\n }\n }\n\n static belongsTo<T extends typeof Model>(\n this: T,\n relatedModel: typeof Model,\n foreignKey?: string,\n ownerKey?: string,\n ): any {\n const related = relatedModel.table\n const fk = foreignKey ?? `${related}_id`\n const ok = ownerKey ?? 'id'\n return this.query().where(fk, ok)\n }\n\n static hasMany<T extends typeof Model>(\n this: T,\n relatedModel: typeof Model,\n foreignKey?: string,\n localKey?: string,\n ): any {\n const related = relatedModel.table\n const fk = foreignKey ?? `${this.table}_id`\n const lk = localKey ?? 'id'\n return this.query().join(related, fk, '=', lk)\n }\n\n private static hydrate<T extends typeof Model>(this: T, data: Record<string, any>): InstanceType<T> {\n const instance = new this() as InstanceType<T>\n for (const [key, value] of Object.entries(data)) {\n ;(instance as any)[key] = value\n }\n return instance\n }\n\n private getData(): Record<string, any> {\n const data: Record<string, any> = {}\n const instance = this as Record<string, any>\n const prototype = Object.getPrototypeOf(this)\n const ownKeys = [\n ...Object.getOwnPropertyNames(instance),\n ...Object.keys(instance),\n ]\n const classKeys = new Set([\n ...Object.getOwnPropertyNames(prototype),\n 'save', 'delete', 'getData',\n ])\n for (const key of ownKeys) {\n if (typeof key === 'string' && !classKeys.has(key) && key !== 'constructor') {\n data[key] = instance[key]\n }\n }\n return data\n }\n}\n","import { EventEmitter } from \"node:events\";\n\nexport type EventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface EventConfig {\n\twildcard?: boolean;\n\tmaxListeners?: number;\n}\n\ninterface PatternEntry {\n\tpattern: string;\n\tregex: RegExp;\n\thandler: EventHandler;\n}\n\nexport class Event {\n\tprivate emitter: EventEmitter;\n\tprivate wildcardMode: boolean;\n\tprivate patterns: PatternEntry[] = [];\n\n\tconstructor(config?: EventConfig) {\n\t\tthis.emitter = new EventEmitter();\n\t\tthis.wildcardMode = config?.wildcard ?? false;\n\n\t\tif (config?.maxListeners !== undefined) {\n\t\t\tthis.emitter.setMaxListeners(config.maxListeners);\n\t\t}\n\t}\n\n\ton(event: string, handler: EventHandler): this {\n\t\tthis.emitter.on(event, handler);\n\t\treturn this;\n\t}\n\n\taddListener(event: string, handler: EventHandler): this {\n\t\treturn this.on(event, handler);\n\t}\n\n\tonce(event: string, handler: EventHandler): this {\n\t\tthis.emitter.once(event, handler);\n\t\treturn this;\n\t}\n\n\tasync emit(event: string, ...args: any[]): Promise<void> {\n\t\tconst listeners = this.emitter.listeners(event);\n\n\t\tfor (const listener of listeners) {\n\t\t\tconst result = listener(...args) as unknown;\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\tconst result = entry.handler(event, ...args) as unknown;\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tawait result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toff(event: string, handler: EventHandler): this {\n\t\tthis.emitter.off(event, handler);\n\t\treturn this;\n\t}\n\n\tremoveListener(event: string, handler: EventHandler): this {\n\t\treturn this.off(event, handler);\n\t}\n\n\tremoveAllListeners(event?: string): this {\n\t\tif (event !== undefined) {\n\t\t\tthis.emitter.removeAllListeners(event);\n\t\t\tthis.patterns = this.patterns.filter((p) => p.pattern !== event);\n\t\t} else {\n\t\t\tthis.emitter.removeAllListeners();\n\t\t\tthis.patterns = [];\n\t\t}\n\t\treturn this;\n\t}\n\n\tlisteners(event: string): EventHandler[] {\n\t\treturn this.emitter.listeners(event) as EventHandler[];\n\t}\n\n\thasListeners(event: string): boolean {\n\t\tif (this.emitter.listenerCount(event) > 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tonPattern(pattern: string, handler: EventHandler): this {\n\t\tif (!this.wildcardMode) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Pattern matching is not enabled. Set wildcard: true in EventConfig.\",\n\t\t\t);\n\t\t}\n\n\t\tconst regex = this.patternToRegex(pattern);\n\t\tthis.patterns.push({ pattern, regex, handler });\n\t\treturn this;\n\t}\n\n\tasync ask<T>(event: string, ...args: any[]): Promise<T[]> {\n\t\tconst handlers = this.emitter.listeners(event) as EventHandler[];\n\t\tconst results: T[] = [];\n\n\t\tfor (const handler of handlers) {\n\t\t\tconst result = handler(...args) as unknown;\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tconst resolved = await result;\n\t\t\t\tif (resolved !== undefined) {\n\t\t\t\t\tresults.push(resolved as T);\n\t\t\t\t}\n\t\t\t} else if (result !== undefined) {\n\t\t\t\tresults.push(result as T);\n\t\t\t}\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\tconst result = entry.handler(event, ...args) as unknown;\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tconst resolved = await result;\n\t\t\t\t\t\tif (resolved !== undefined) {\n\t\t\t\t\t\t\tresults.push(resolved as T);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (result !== undefined) {\n\t\t\t\t\t\tresults.push(result as T);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tlistenerCount(event?: string): number {\n\t\tif (event !== undefined) {\n\t\t\tlet count = this.emitter.listenerCount(event);\n\n\t\t\tif (this.wildcardMode) {\n\t\t\t\tfor (const entry of this.patterns) {\n\t\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn count;\n\t\t}\n\n\t\treturn (\n\t\t\tthis.emitter\n\t\t\t\t.eventNames()\n\t\t\t\t.reduce((sum, name) => sum + this.emitter.listenerCount(name), 0) +\n\t\t\tthis.patterns.length\n\t\t);\n\t}\n\n\teventNames(): string[] {\n\t\tconst nativeNames = this.emitter.eventNames() as string[];\n\t\tconst patternNames = this.patterns.map((p) => p.pattern);\n\t\treturn [...new Set([...nativeNames, ...patternNames])];\n\t}\n\n\tprivate patternToRegex(pattern: string): RegExp {\n\t\tconst escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\tconst regexStr = escaped.replace(/\\*/g, \"[^.]*\");\n\t\treturn new RegExp(`^${regexStr}$`);\n\t}\n}\n\nlet defaultEvent: Event | null = null;\n\nexport function createEvent(config?: EventConfig): Event {\n\tdefaultEvent = new Event(config);\n\treturn defaultEvent;\n}\n\nexport function event(): Event {\n\tif (defaultEvent === null) {\n\t\tdefaultEvent = new Event();\n\t}\n\treturn defaultEvent;\n}\n","import type { SuperResponse } from \"./http/response\";\n\nlet defaultBuilder: URLBuilder | null = null;\n\nexport class URLBuilder {\n\tprivate baseUrl: string;\n\n\tconstructor(baseUrl?: string) {\n\t\tthis.baseUrl = baseUrl ?? \"http://localhost:3000\";\n\t}\n\n\troute(_name: string, _params?: Record<string, string | number>): string {\n\t\tthrow new Error(\n\t\t\t\"URLBuilder.route() requires a Router reference. \" +\n\t\t\t\t\"Set the router via URLBuilder.setRouter() before calling route().\",\n\t\t);\n\t}\n\n\tto(path: string): string {\n\t\tconst normalized = path.replace(/\\\\/g, \"/\");\n\t\tconst base = this.baseUrl.replace(/\\/$/, \"\");\n\t\tconst cleanPath = normalized.startsWith(\"/\")\n\t\t\t? normalized\n\t\t\t: `/${normalized}`;\n\t\treturn `${base}${cleanPath}`;\n\t}\n\n\tasset(path: string): string {\n\t\treturn this.to(path);\n\t}\n\n\tsecure(path: string): string {\n\t\tconst base = this.baseUrl.replace(/^http:/, \"https:\");\n\t\tconst normalized = path.replace(/\\\\/g, \"/\");\n\t\tconst cleanPath = normalized.startsWith(\"/\")\n\t\t\t? normalized\n\t\t\t: `/${normalized}`;\n\t\treturn `${base}${cleanPath}`;\n\t}\n\n\tsetBaseUrl(url: string): void {\n\t\tthis.baseUrl = url;\n\t}\n\n\tgetBaseUrl(): string {\n\t\treturn this.baseUrl;\n\t}\n}\n\nexport function url(): URLBuilder {\n\tif (defaultBuilder === null) {\n\t\tdefaultBuilder = new URLBuilder();\n\t}\n\treturn defaultBuilder;\n}\n\nconst macroFns: Record<\n\tstring,\n\t(this: SuperResponse, ...args: any[]) => SuperResponse\n> = {};\n\nexport function responseMacros(response: SuperResponse): void {\n\tfor (const [name, fn] of Object.entries(macroFns)) {\n\t\tconst bound = fn.bind(response);\n\t\t(response as unknown as Record<string, unknown>)[name] = bound;\n\t}\n}\n\nexport function registerMacro(\n\tname: string,\n\tfn: (this: SuperResponse, ...args: any[]) => SuperResponse,\n): void {\n\tmacroFns[name] = fn;\n}\n\nregisterMacro(\"success\", function <\n\tT,\n>(this: SuperResponse, data: T, message?: string) {\n\treturn this.json({\n\t\tsuccess: true,\n\t\tmessage: message ?? \"Success\",\n\t\tdata,\n\t});\n});\n\nregisterMacro(\n\t\"error\",\n\tfunction (this: SuperResponse, message: string, status: number = 400) {\n\t\treturn this.json({ success: false, message }, status);\n\t},\n);\n\nregisterMacro(\"created\", function <\n\tT,\n>(this: SuperResponse, data: T, message?: string) {\n\treturn this.status(201).json({\n\t\tsuccess: true,\n\t\tmessage: message ?? \"Created\",\n\t\tdata,\n\t});\n});\n\nregisterMacro(\"noContent\", function (this: SuperResponse) {\n\treturn this.status(204).send(\"\");\n});\n\nregisterMacro(\n\t\"accepted\",\n\tfunction (this: SuperResponse, data?: unknown, message?: string) {\n\t\treturn this.status(202).json({\n\t\t\tsuccess: true,\n\t\t\tmessage: message ?? \"Accepted\",\n\t\t\tdata,\n\t\t});\n\t},\n);\n\nregisterMacro(\n\t\"paginated\",\n\tfunction <T>(\n\t\tthis: SuperResponse,\n\t\tdata: T[],\n\t\tmeta: {\n\t\t\ttotal: number;\n\t\t\tpage: number;\n\t\t\tperPage: number;\n\t\t\tlastPage: number;\n\t\t},\n\t) {\n\t\treturn this.json({\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t\tmeta,\n\t\t});\n\t},\n);\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport interface StorageConfig {\n\tdefaultDisk?: string;\n\tdisks: {\n\t\t[name: string]: {\n\t\t\tdriver: \"local\";\n\t\t\troot: string;\n\t\t\turl?: string;\n\t\t\tpermissions?: number;\n\t\t};\n\t};\n}\n\nexport interface FileOptions {\n\tname?: string;\n\tdisk?: string;\n\toverwrite?: boolean;\n}\n\nexport class LocalDisk {\n\tprivate root: string;\n\tprivate baseUrl?: string;\n\n\tconstructor(root: string, baseUrl?: string) {\n\t\tthis.root = path.resolve(root);\n\t\tthis.baseUrl = baseUrl;\n\t}\n\n\tasync put(filePath: string, content: string | Buffer): Promise<string> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(fullPath, content);\n\t\treturn filePath;\n\t}\n\n\tasync get(filePath: string): Promise<Buffer> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.readFileSync(fullPath);\n\t}\n\n\tasync exists(filePath: string): Promise<boolean> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\treturn fs.existsSync(fullPath);\n\t}\n\n\tasync delete(filePath: string): Promise<boolean> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\treturn false;\n\t\t}\n\t\tfs.unlinkSync(fullPath);\n\t\treturn true;\n\t}\n\n\tasync copy(from: string, to: string): Promise<boolean> {\n\t\tconst fromPath = this.resolvePath(from);\n\t\tconst toPath = this.resolvePath(to);\n\t\tif (!fs.existsSync(fromPath)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst dir = path.dirname(toPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.copyFileSync(fromPath, toPath);\n\t\treturn true;\n\t}\n\n\tasync move(from: string, to: string): Promise<boolean> {\n\t\tconst fromPath = this.resolvePath(from);\n\t\tconst toPath = this.resolvePath(to);\n\t\tif (!fs.existsSync(fromPath)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst dir = path.dirname(toPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.renameSync(fromPath, toPath);\n\t\treturn true;\n\t}\n\n\turl(filePath: string): string {\n\t\tif (this.baseUrl === undefined) {\n\t\t\tthrow new Error(\"Base URL not configured for this disk\");\n\t\t}\n\t\tconst normalized = filePath.replace(/\\\\/g, \"/\");\n\t\treturn `${this.baseUrl.replace(/\\/$/, \"\")}/${normalized.replace(/^\\//, \"\")}`;\n\t}\n\n\tasync size(filePath: string): Promise<number> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.statSync(fullPath).size;\n\t}\n\n\tasync lastModified(filePath: string): Promise<Date> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.statSync(fullPath).mtime;\n\t}\n\n\tasync files(directory: string = \"\"): Promise<string[]> {\n\t\tconst fullPath = this.resolvePath(directory);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn fs\n\t\t\t.readdirSync(fullPath)\n\t\t\t.filter((name) => {\n\t\t\t\tconst stat = fs.statSync(path.join(fullPath, name));\n\t\t\t\treturn stat.isFile();\n\t\t\t})\n\t\t\t.map((name) => path.join(directory, name).replace(/\\\\/g, \"/\"));\n\t}\n\n\tasync directories(directory: string = \"\"): Promise<string[]> {\n\t\tconst fullPath = this.resolvePath(directory);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn fs\n\t\t\t.readdirSync(fullPath)\n\t\t\t.filter((name) => {\n\t\t\t\tconst stat = fs.statSync(path.join(fullPath, name));\n\t\t\t\treturn stat.isDirectory();\n\t\t\t})\n\t\t\t.map((name) => path.join(directory, name).replace(/\\\\/g, \"/\"));\n\t}\n\n\tasync makeDirectory(dirPath: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(dirPath);\n\t\tfs.mkdirSync(fullPath, { recursive: true });\n\t}\n\n\tasync deleteDirectory(dirPath: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(dirPath);\n\t\tif (fs.existsSync(fullPath)) {\n\t\t\tfs.rmSync(fullPath, { recursive: true, force: true });\n\t\t}\n\t}\n\n\tasync append(filePath: string, content: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.appendFileSync(fullPath, content, \"utf-8\");\n\t}\n\n\tasync prepend(filePath: string, content: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tconst existing = fs.existsSync(fullPath)\n\t\t\t? fs.readFileSync(fullPath, \"utf-8\")\n\t\t\t: \"\";\n\t\tfs.writeFileSync(fullPath, content + existing, \"utf-8\");\n\t}\n\n\treadStream(filePath: string): fs.ReadStream {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.createReadStream(fullPath);\n\t}\n\n\twriteStream(filePath: string): fs.WriteStream {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\treturn fs.createWriteStream(fullPath);\n\t}\n\n\tgetRoot(): string {\n\t\treturn this.root;\n\t}\n\n\tgetUrl(): string | undefined {\n\t\treturn this.baseUrl;\n\t}\n\n\tprivate resolvePath(filePath: string): string {\n\t\tconst normalized = filePath.replace(/\\\\/g, \"/\");\n\t\tconst resolved = path.resolve(this.root, normalized);\n\t\tconst resolvedRoot = path.resolve(this.root);\n\n\t\tif (!resolved.startsWith(resolvedRoot)) {\n\t\t\tthrow new Error(`Path traversal detected: ${filePath}`);\n\t\t}\n\n\t\treturn resolved;\n\t}\n}\n\nexport class Storage {\n\tprivate config: StorageConfig;\n\tprivate diskInstances: Map<string, LocalDisk>;\n\n\tconstructor(config: StorageConfig) {\n\t\tthis.config = config;\n\t\tthis.diskInstances = new Map();\n\t}\n\n\tdisk(name?: string): LocalDisk {\n\t\tconst diskName = name ?? this.config.defaultDisk ?? \"local\";\n\t\tconst existing = this.diskInstances.get(diskName);\n\t\tif (existing !== undefined) {\n\t\t\treturn existing;\n\t\t}\n\n\t\tconst diskConfig = this.config.disks[diskName];\n\t\tif (diskConfig === undefined) {\n\t\t\tthrow new Error(`Disk not configured: ${diskName}`);\n\t\t}\n\n\t\tconst instance = new LocalDisk(diskConfig.root, diskConfig.url);\n\t\tthis.diskInstances.set(diskName, instance);\n\t\treturn instance;\n\t}\n\n\tasync put(filePath: string, content: string | Buffer): Promise<string> {\n\t\treturn this.disk().put(filePath, content);\n\t}\n\n\tasync get(filePath: string): Promise<Buffer> {\n\t\treturn this.disk().get(filePath);\n\t}\n\n\tasync exists(filePath: string): Promise<boolean> {\n\t\treturn this.disk().exists(filePath);\n\t}\n\n\tasync delete(filePath: string): Promise<boolean> {\n\t\treturn this.disk().delete(filePath);\n\t}\n\n\tasync copy(from: string, to: string): Promise<boolean> {\n\t\treturn this.disk().copy(from, to);\n\t}\n\n\tasync move(from: string, to: string): Promise<boolean> {\n\t\treturn this.disk().move(from, to);\n\t}\n\n\tasync url(filePath: string): Promise<string> {\n\t\treturn this.disk().url(filePath);\n\t}\n\n\tasync size(filePath: string): Promise<number> {\n\t\treturn this.disk().size(filePath);\n\t}\n\n\tasync lastModified(filePath: string): Promise<Date> {\n\t\treturn this.disk().lastModified(filePath);\n\t}\n\n\tasync files(directory?: string): Promise<string[]> {\n\t\treturn this.disk().files(directory);\n\t}\n\n\tasync directories(directory?: string): Promise<string[]> {\n\t\treturn this.disk().directories(directory);\n\t}\n\n\tasync makeDirectory(dirPath: string): Promise<void> {\n\t\treturn this.disk().makeDirectory(dirPath);\n\t}\n\n\tasync deleteDirectory(dirPath: string): Promise<void> {\n\t\treturn this.disk().deleteDirectory(dirPath);\n\t}\n}\n\nlet defaultInstance: Storage | null = null;\n\nexport function createStorage(config: StorageConfig): Storage {\n\tdefaultInstance = new Storage(config);\n\treturn defaultInstance;\n}\n\nexport function storage(): Storage {\n\tif (defaultInstance === null) {\n\t\tthrow new Error(\n\t\t\t\"Storage not initialized. Call createStorage(config) first.\",\n\t\t);\n\t}\n\treturn defaultInstance;\n}\n","import { Container } from \"./container\";\nimport { getControllerPrefix, getControllerRoutes } from \"./controller\";\nimport { NodeEngine, type ServerEngine, type ServerInstance } from \"./engine\";\nimport type { SuperRequest } from \"./http/request\";\nimport type { SuperResponse } from \"./http/response\";\nimport { HttpStatus } from \"./http/status\";\nimport {\n\ttype Middleware,\n\tMiddlewarePipeline,\n\ttype StaticOptions,\n\tstaticFiles as staticFilesMiddleware,\n} from \"./middleware\";\nimport type { ControllerClass } from \"./router\";\nimport { type RouteContext, type RouteHandler, Router } from \"./router\";\n\nexport { Cache, type CacheConfig, cacheResponse } from \"./cache\";\nexport * from \"./database/index.js\";\nexport { createEvent, Event, type EventConfig, event } from \"./events\";\nexport { registerMacro, responseMacros, URLBuilder, url } from \"./helpers\";\nexport {\n\tcreateStorage,\n\tLocalDisk,\n\tStorage,\n\ttype StorageConfig,\n\tstorage,\n} from \"./storage\";\n\nexport interface ViewEngine {\n\trender(\n\t\ttemplate: string,\n\t\tdata: Record<string, unknown>,\n\t): string | Promise<string>;\n}\n\nexport interface AppOptions {\n\tengine?: ServerEngine;\n\tcontainer?: Container;\n}\n\nexport class SuperApp {\n\treadonly router: Router;\n\treadonly container: Container;\n\tprivate engine: ServerEngine;\n\tprivate serverInstance: ServerInstance | undefined;\n\tprivate globalPipeline: MiddlewarePipeline;\n\tprivate started = false;\n\tprivate serverPromise: Promise<void> | undefined;\n\n\tconstructor(options: AppOptions = {}) {\n\t\tthis.container = options.container ?? new Container();\n\t\tthis.router = new Router();\n\t\tthis.engine = options.engine ?? new NodeEngine();\n\t\tthis.globalPipeline = new MiddlewarePipeline();\n\n\t\tthis.container.instance(\"app\", this);\n\t\tthis.container.instance(\"router\", this.router);\n\t\tthis.container.instance(\"container\", this.container);\n\t}\n\n\tuse(middleware: Middleware): this {\n\t\tthis.globalPipeline.use(middleware);\n\t\treturn this;\n\t}\n\n\tget(path: string, handler: RouteHandler): this {\n\t\tthis.router.get(path, handler);\n\t\treturn this;\n\t}\n\n\tpost(path: string, handler: RouteHandler): this {\n\t\tthis.router.post(path, handler);\n\t\treturn this;\n\t}\n\n\tput(path: string, handler: RouteHandler): this {\n\t\tthis.router.put(path, handler);\n\t\treturn this;\n\t}\n\n\tpatch(path: string, handler: RouteHandler): this {\n\t\tthis.router.patch(path, handler);\n\t\treturn this;\n\t}\n\n\tdelete(path: string, handler: RouteHandler): this {\n\t\tthis.router.delete(path, handler);\n\t\treturn this;\n\t}\n\n\toptions(path: string, handler: RouteHandler): this {\n\t\tthis.router.options(path, handler);\n\t\treturn this;\n\t}\n\n\tany(path: string, handler: RouteHandler): this {\n\t\tthis.router.any(path, handler);\n\t\treturn this;\n\t}\n\n\tmatch(methods: string[], path: string, handler: RouteHandler): this {\n\t\tthis.router.match(methods, path, handler);\n\t\treturn this;\n\t}\n\n\tgroup(prefix: string, callback: (router: Router) => void): this {\n\t\tthis.router.group(prefix, callback);\n\t\treturn this;\n\t}\n\n\tresource(name: string, controller: ControllerClass): this {\n\t\tthis.router.resource(name, controller);\n\t\treturn this;\n\t}\n\n\tapiResource(name: string, controller: ControllerClass): this {\n\t\tthis.router.apiResource(name, controller);\n\t\treturn this;\n\t}\n\n\tcontroller(ctrl: ControllerClass): this {\n\t\tconst prefix = getControllerPrefix(ctrl as object);\n\t\tconst routes = getControllerRoutes(ctrl.prototype);\n\n\t\tfor (const route of routes) {\n\t\t\tconst handlerPath = `${prefix}${route.path}`;\n\t\t\tconst handlerName = String(route.handler);\n\n\t\t\tthis.router.match(\n\t\t\t\t[route.method],\n\t\t\t\thandlerPath,\n\t\t\t\tasync (ctx: RouteContext) => {\n\t\t\t\t\tconst instance = createControllerInstance(ctrl, ctx);\n\t\t\t\t\tconst handlerFn = (instance as Record<string, unknown>)[handlerName];\n\n\t\t\t\t\tif (typeof handlerFn === \"function\") {\n\t\t\t\t\t\tawait handlerFn.call(instance, ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Handler ${handlerName} not found on controller ${ctrl.name}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tmiddleware(middleware: Middleware | Middleware[]): this {\n\t\tthis.router.middleware(middleware);\n\t\treturn this;\n\t}\n\n\tsetEngine(engine: ServerEngine): this {\n\t\tif (this.started) {\n\t\t\tthrow new Error(\"Cannot change engine after server has started\");\n\t\t}\n\t\tthis.engine = engine;\n\t\treturn this;\n\t}\n\n\tstatic(path: string, options?: StaticOptions): this {\n\t\tthis.use(staticFilesMiddleware(path, options));\n\t\treturn this;\n\t}\n\n\tview(_engine: ViewEngine): this {\n\t\treturn this;\n\t}\n\n\tgetServer(): ServerInstance | undefined {\n\t\treturn this.serverInstance;\n\t}\n\n\tasync start(port?: number, host?: string): Promise<void> {\n\t\tif (this.started) {\n\t\t\tthrow new Error(\"Server has already been started\");\n\t\t}\n\t\tthis.started = true;\n\n\t\tthis.serverInstance = await this.engine.createServer(\n\t\t\tasync (req: SuperRequest, res: SuperResponse) => {\n\t\t\t\tawait this.handleRequest(req, res);\n\t\t\t},\n\t\t);\n\n\t\tconst listenPort = port ?? 3000;\n\t\tconst listenHost = host ?? \"0.0.0.0\";\n\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tconst raw = this.serverInstance!.raw;\n\t\t\traw.listen(listenPort, listenHost, () => {\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tlisten(port?: number, callback?: () => void): void {\n\t\tthis.serverPromise = this.start(port).then(() => {\n\t\t\tcallback?.();\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.serverInstance !== undefined) {\n\t\t\tawait this.engine.close(this.serverInstance);\n\t\t\tthis.serverInstance = undefined;\n\t\t\tthis.started = false;\n\t\t}\n\t}\n\n\tasync ready(): Promise<void> {\n\t\tif (this.serverPromise !== undefined) {\n\t\t\tawait this.serverPromise;\n\t\t}\n\t}\n\n\tprivate async handleRequest(\n\t\treq: SuperRequest,\n\t\tres: SuperResponse,\n\t): Promise<void> {\n\t\tconst resolvedRoute = this.router.resolve(req.method, req.path);\n\n\t\tif (resolvedRoute === null) {\n\t\t\tres.status(HttpStatus.NOT_FOUND).json({\n\t\t\t\terror: \"Not Found\",\n\t\t\t\tmessage: `Route ${req.method} ${req.path} not found`,\n\t\t\t});\n\t\t\tawait res.flush();\n\t\t\treturn;\n\t\t}\n\n\t\treq.params = resolvedRoute.params;\n\n\t\tconst ctx: RouteContext = {\n\t\t\trequest: req,\n\t\t\tresponse: res,\n\t\t\tparams: resolvedRoute.params,\n\t\t\tquery: req.query,\n\t\t\tcontainer: this.container,\n\t\t};\n\n\t\tawait this.globalPipeline.run(ctx, async () => {\n\t\t\tconst routePipeline = new MiddlewarePipeline();\n\t\t\tfor (const mw of resolvedRoute.middleware) {\n\t\t\t\troutePipeline.use(mw);\n\t\t\t}\n\n\t\t\tawait routePipeline.run(ctx, async () => {\n\t\t\t\tawait resolvedRoute.handler(ctx);\n\t\t\t});\n\t\t});\n\n\t\tif (!res.headersSent) {\n\t\t\tawait res.flush();\n\t\t}\n\t}\n}\n\nexport function speexjs(options?: AppOptions): SuperApp {\n\treturn new SuperApp(options);\n}\n\nexport function createControllerInstance(\n\tcontroller: ControllerClass,\n\tctx: RouteContext,\n): object {\n\tconst instance = new controller();\n\t(instance as Record<string, unknown>).__ctx = ctx;\n\t(instance as Record<string, unknown>).__container = ctx.container;\n\treturn instance;\n}\n"],"mappings":"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","names":["path","fs","path","join","dirname","i","fs","path","promisify","resolve","fs","path","path","path","basename","extname","url","extname","basename","resolve","randomUUID","createReadStream","extname","join","resolve","MIME_TYPES","join","resolve","ext","extname","createReadStream","path","url","randomUUID","result","result","randomUUID","sql","result","event","path","url","fs","path","stat","path","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/http/status.ts","../../src/server/http/headers.ts","../../src/server/http/cookie.ts","../../src/server/http/upload.ts","../../src/server/http/request.ts","../../src/server/http/response.ts","../../src/server/errors.ts","../../node_modules/better-sqlite3/lib/util.js","../../node_modules/better-sqlite3/lib/sqlite-error.js","../../node_modules/file-uri-to-path/index.js","../../node_modules/bindings/bindings.js","../../node_modules/better-sqlite3/lib/methods/wrappers.js","../../node_modules/better-sqlite3/lib/methods/transaction.js","../../node_modules/better-sqlite3/lib/methods/pragma.js","../../node_modules/better-sqlite3/lib/methods/backup.js","../../node_modules/better-sqlite3/lib/methods/serialize.js","../../node_modules/better-sqlite3/lib/methods/function.js","../../node_modules/better-sqlite3/lib/methods/aggregate.js","../../node_modules/better-sqlite3/lib/methods/table.js","../../node_modules/better-sqlite3/lib/methods/inspect.js","../../node_modules/better-sqlite3/lib/database.js","../../node_modules/better-sqlite3/lib/index.js","../../src/server/container/index.ts","../../src/server/controller/index.ts","../../src/server/engine/index.ts","../../src/server/index.ts","../../src/server/middleware/index.ts","../../src/server/router/index.ts","../../src/server/cache/index.ts","../../src/server/database/connection.ts","../../src/server/database/dialect.ts","../../src/server/database/driver.ts","../../src/server/database/query.ts","../../src/server/database/migration.ts","../../src/server/database/pagination.ts","../../src/server/database/seeder.ts","../../src/server/database/model.ts","../../src/server/events/index.ts","../../src/server/helpers.ts","../../src/server/storage/index.ts"],"sourcesContent":["export const HttpStatus = {\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n} as const\n\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus]\n\nconst statusTextMap: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n}\n\nexport function statusText(code: number): string {\n const text = statusTextMap[code]\n if (text !== undefined) return text\n if (code >= 100 && code < 200) return 'Informational'\n if (code >= 200 && code < 300) return 'Success'\n if (code >= 300 && code < 400) return 'Redirection'\n if (code >= 400 && code < 500) return 'Client Error'\n if (code >= 500 && code < 600) return 'Server Error'\n return 'Unknown'\n}\n","export class HeadersMap {\n private data: Map<string, string[]>\n\n constructor(initial?: Record<string, string | string[]>) {\n this.data = new Map()\n if (initial) {\n for (const key of Object.keys(initial)) {\n const value = initial[key]\n if (value !== undefined) {\n this.set(key, Array.isArray(value) ? value.join(', ') : value)\n }\n }\n }\n }\n\n get(name: string): string | undefined {\n const values = this.data.get(name.toLowerCase())\n if (values !== undefined && values.length > 0) {\n return values[0]\n }\n return undefined\n }\n\n getAll(name: string): string[] {\n const values = this.data.get(name.toLowerCase())\n return values ?? []\n }\n\n set(name: string, value: string): void {\n this.data.set(name.toLowerCase(), [value])\n }\n\n append(name: string, value: string): void {\n const key = name.toLowerCase()\n const existing = this.data.get(key)\n if (existing !== undefined) {\n existing.push(value)\n } else {\n this.data.set(key, [value])\n }\n }\n\n has(name: string): boolean {\n return this.data.has(name.toLowerCase())\n }\n\n delete(name: string): void {\n this.data.delete(name.toLowerCase())\n }\n\n *entries(): IterableIterator<[string, string]> {\n for (const [key, values] of this.data) {\n for (const value of values) {\n yield [key, value]\n }\n }\n }\n\n *keys(): IterableIterator<string> {\n for (const key of this.data.keys()) {\n yield key\n }\n }\n\n *values(): IterableIterator<string> {\n for (const [, values] of this.data) {\n for (const value of values) {\n yield value\n }\n }\n }\n\n toJSON(): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {}\n for (const [key, values] of this.data) {\n result[key] = values.length === 1 ? (values[0] as string) : values\n }\n return result\n }\n\n toNodeHeaders(): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {}\n for (const [key, values] of this.data) {\n if (key === 'set-cookie') {\n result[key] = values\n } else {\n result[key] = values.join(', ')\n }\n }\n return result\n }\n\n get size(): number {\n return this.data.size\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries()\n }\n}\n","export interface CookieOptions {\n maxAge?: number\n expires?: Date\n path?: string\n domain?: string\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'strict' | 'lax' | 'none'\n signed?: boolean\n}\n\nexport function parseCookies(header: string): Record<string, string> {\n const result: Record<string, string> = {}\n\n if (!header) return result\n\n const pairs = header.split(';')\n\n for (const pair of pairs) {\n const trimmed = pair.trim()\n if (!trimmed) continue\n\n const eqIndex = trimmed.indexOf('=')\n if (eqIndex === -1) {\n result[trimmed] = ''\n continue\n }\n\n const name = trimmed.slice(0, eqIndex).trim()\n let value = trimmed.slice(eqIndex + 1).trim()\n\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1)\n }\n\n if (name) {\n result[decodeURIComponent(name)] = decodeURIComponent(value)\n }\n }\n\n return result\n}\n\nfunction serializeCookieValue(name: string, value: string): string {\n return `${encodeURIComponent(name)}=${encodeURIComponent(value)}`\n}\n\nexport function serializeCookie(\n name: string,\n value: string,\n options?: CookieOptions,\n): string {\n const parts: string[] = [serializeCookieValue(name, value)]\n\n if (options) {\n if (options.maxAge !== undefined) {\n parts.push(`Max-Age=${Math.floor(options.maxAge)}`)\n }\n\n if (options.expires !== undefined) {\n parts.push(`Expires=${options.expires.toUTCString()}`)\n }\n\n if (options.path !== undefined) {\n parts.push(`Path=${options.path}`)\n } else {\n parts.push('Path=/')\n }\n\n if (options.domain !== undefined) {\n parts.push(`Domain=${options.domain}`)\n }\n\n if (options.secure) {\n parts.push('Secure')\n }\n\n if (options.httpOnly) {\n parts.push('HttpOnly')\n }\n\n if (options.sameSite !== undefined) {\n parts.push(`SameSite=${options.sameSite}`)\n }\n }\n\n return parts.join('; ')\n}\n\nexport function clearCookie(name: string, options?: CookieOptions): string {\n return serializeCookie(name, '', {\n ...options,\n maxAge: 0,\n expires: new Date(0),\n })\n}\n","import { randomUUID } from 'node:crypto'\nimport { writeFile, readFile, unlink, mkdir } from 'node:fs/promises'\nimport { join, extname, basename, dirname } from 'node:path'\nimport { tmpdir } from 'node:os'\n\nexport interface UploadedFile {\n readonly fieldName: string\n readonly originalName: string\n readonly mimeType: string\n readonly size: number\n readonly path: string\n readonly extension: string\n move(destination: string, filename?: string): Promise<string>\n toBuffer(): Promise<Buffer>\n toBase64(): string\n isImage(): boolean\n isVideo(): boolean\n}\n\nconst IMAGE_MIME_TYPES = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'image/bmp',\n 'image/tiff',\n 'image/avif',\n])\n\nconst VIDEO_MIME_TYPES = new Set([\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/ogg',\n 'video/quicktime',\n 'video/x-msvideo',\n 'video/x-matroska',\n])\n\nexport class SuperUploadedFile implements UploadedFile {\n readonly fieldName: string\n readonly originalName: string\n readonly mimeType: string\n readonly size: number\n readonly path: string\n readonly extension: string\n private buffer: Buffer | null\n\n constructor(opts: {\n fieldName: string\n originalName: string\n mimeType: string\n size: number\n path: string\n buffer?: Buffer\n }) {\n this.fieldName = opts.fieldName\n this.originalName = opts.originalName\n this.mimeType = opts.mimeType\n this.size = opts.size\n this.path = opts.path\n this.extension = extname(opts.originalName).toLowerCase()\n this.buffer = opts.buffer ?? null\n }\n\n async move(destination: string, filename?: string): Promise<string> {\n const destName = filename ?? basename(this.path)\n const destPath = join(destination, destName)\n\n await mkdir(dirname(destPath), { recursive: true })\n\n const buf = await this.toBuffer()\n await writeFile(destPath, buf)\n\n return destPath\n }\n\n async toBuffer(): Promise<Buffer> {\n if (this.buffer !== null) return this.buffer\n this.buffer = await readFile(this.path)\n return this.buffer\n }\n\n toBase64(): string {\n if (this.buffer === null) {\n throw new Error(\n 'Buffer not loaded. Call toBuffer() first or read the file into memory.',\n )\n }\n return this.buffer.toString('base64')\n }\n\n isImage(): boolean {\n return IMAGE_MIME_TYPES.has(this.mimeType)\n }\n\n isVideo(): boolean {\n return VIDEO_MIME_TYPES.has(this.mimeType)\n }\n\n static async createFromBuffer(\n fieldName: string,\n originalName: string,\n mimeType: string,\n buffer: Buffer,\n tempDir?: string,\n ): Promise<SuperUploadedFile> {\n const tmp = tempDir ?? tmpdir()\n const fileName = `${randomUUID()}${extname(originalName)}`\n const filePath = join(tmp, fileName)\n\n await writeFile(filePath, buffer)\n\n return new SuperUploadedFile({\n fieldName,\n originalName,\n mimeType: mimeType || 'application/octet-stream',\n size: buffer.length,\n path: filePath,\n buffer,\n })\n }\n\n async cleanup(): Promise<void> {\n try {\n await unlink(this.path)\n } catch {\n // File may have been moved or already deleted\n }\n }\n}\n","import type { IncomingMessage } from 'node:http'\nimport { HeadersMap } from './headers'\nimport { parseCookies } from './cookie'\nimport { SuperUploadedFile } from './upload'\n\nexport interface Schema<T = unknown> {\n parse(input: unknown): T\n validate(\n input: unknown,\n ): { success: boolean; data?: T; errors?: { message: string; path?: string }[] }\n}\n\ninterface ParsedMultipartField {\n type: 'field'\n name: string\n value: string\n}\n\ninterface ParsedMultipartFile {\n type: 'file'\n name: string\n filename: string\n mimeType: string\n data: Buffer\n}\n\ntype MultipartPart = ParsedMultipartField | ParsedMultipartFile\n\ninterface BodyCache {\n raw: Buffer\n parsed: unknown\n text: string\n json: unknown\n formData: Record<string, string> | null\n files: Record<string, SuperUploadedFile> | null\n multipartParsed: MultipartPart[] | null\n}\n\nexport class SuperRequest {\n private raw: IncomingMessage\n private _headers: HeadersMap\n private _query: Record<string, string | string[]>\n private _cookies: Record<string, string> | null = null\n private _ip: string\n private _params: Record<string, string> = {}\n private bodyCache: BodyCache | null = null\n private _bodyReadPromise: Promise<BodyCache> | null = null\n\n constructor(raw: IncomingMessage) {\n this.raw = raw\n\n this._headers = new HeadersMap(\n raw.headers as Record<string, string | string[]>,\n )\n\n const parsedUrl = new URL(raw.url ?? '/', 'http://localhost')\n this._query = parseQueryParams(parsedUrl.searchParams)\n\n this._ip = parseIp(raw)\n\n this.path = parsedUrl.pathname\n this.url = raw.url ?? '/'\n this.method = (raw.method ?? 'GET').toUpperCase()\n }\n\n readonly method: string\n readonly url: string\n readonly path: string\n\n get headers(): HeadersMap {\n return this._headers\n }\n\n get query(): Record<string, string | string[]> {\n return this._query\n }\n\n get params(): Record<string, string> {\n return this._params\n }\n\n set params(value: Record<string, string>) {\n this._params = value\n }\n\n get ip(): string {\n return this._ip\n }\n\n private async ensureBody(): Promise<BodyCache> {\n if (this.bodyCache !== null) return this.bodyCache\n\n if (this._bodyReadPromise === null) {\n this._bodyReadPromise = this.readBodyFromStream()\n }\n\n this.bodyCache = await this._bodyReadPromise\n return this.bodyCache\n }\n\n private async readBodyFromStream(): Promise<BodyCache> {\n const chunks: Buffer[] = []\n const MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB default\n let totalSize = 0;\n for await (const chunk of this.raw) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n totalSize += buf.length;\n if (totalSize > MAX_BODY_SIZE) {\n throw new Error('Request body too large. Maximum size is 10MB.');\n }\n chunks.push(buf);\n }\n const raw = Buffer.concat(chunks)\n const text = raw.toString('utf-8')\n\n let json: unknown = undefined\n if (this.isContentType('application/json')) {\n try {\n json = JSON.parse(text)\n } catch {\n json = undefined\n }\n }\n\n let formData: Record<string, string> | null = null\n let multipartParsed: MultipartPart[] | null = null\n let files: Record<string, SuperUploadedFile> | null = null\n\n if (this.isContentType('application/x-www-form-urlencoded')) {\n formData = parseUrlEncoded(text)\n } else if (this.isContentType('multipart/form-data')) {\n const boundary = this.getMultipartBoundary()\n if (boundary !== undefined) {\n multipartParsed = parseMultipartBody(raw, boundary)\n formData = {}\n files = {}\n for (const part of multipartParsed) {\n if (part.type === 'field') {\n formData[part.name] = part.value\n } else if (part.type === 'file') {\n const uploadedFile = await SuperUploadedFile.createFromBuffer(\n part.name,\n part.filename,\n part.mimeType,\n part.data,\n )\n files[part.name] = uploadedFile\n }\n }\n }\n }\n\n return {\n raw,\n text,\n json,\n parsed: json ?? text,\n formData,\n files,\n multipartParsed,\n }\n }\n\n private isContentType(expected: string): boolean {\n const ct = this._headers.get('content-type')\n if (ct === undefined) return false\n return ct.toLowerCase().startsWith(expected)\n }\n\n private getMultipartBoundary(): string | undefined {\n const ct = this._headers.get('content-type')\n if (ct === undefined) return undefined\n const match = ct.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i)\n if (match !== null) {\n return match[1] ?? match[2]\n }\n return undefined\n }\n\n async body(): Promise<unknown> {\n const cache = await this.ensureBody()\n return cache.parsed\n }\n\n async json<T = unknown>(): Promise<T> {\n const cache = await this.ensureBody()\n if (cache.json !== undefined) return cache.json as T\n throw new Error('Request body is not valid JSON')\n }\n\n async text(): Promise<string> {\n const cache = await this.ensureBody()\n return cache.text\n }\n\n async formData(): Promise<Record<string, string>> {\n const cache = await this.ensureBody()\n if (cache.formData !== null) return cache.formData\n\n if (cache.multipartParsed !== null) {\n const result: Record<string, string> = {}\n for (const part of cache.multipartParsed) {\n if (part.type === 'field') {\n result[part.name] = part.value\n }\n }\n return result\n }\n\n return {}\n }\n\n async file(name: string): Promise<SuperUploadedFile | undefined> {\n const cache = await this.ensureBody()\n if (cache.files !== null) {\n return cache.files[name]\n }\n return undefined\n }\n\n async files(): Promise<Record<string, SuperUploadedFile>> {\n const cache = await this.ensureBody()\n return cache.files ?? {}\n }\n\n cookie(name: string): string | undefined {\n if (this._cookies === null) {\n const cookieHeader = this._headers.get('cookie')\n this._cookies = cookieHeader !== undefined\n ? parseCookies(cookieHeader)\n : {}\n }\n return this._cookies[name]\n }\n\n async validate<T>(schema: Schema<T>): Promise<T> {\n const data = await this.body()\n const result = schema.validate(data)\n if (!result.success) {\n const messages = (result.errors ?? [])\n .map((e) => {\n const path = e.path ?? ''\n return path ? `${path}: ${e.message}` : e.message\n })\n .join('; ')\n throw new ValidationError(messages, result.errors ?? [])\n }\n return result.data as T\n }\n\n isAjax(): boolean {\n const requestedWith = this._headers.get('x-requested-with')\n return requestedWith?.toLowerCase() === 'xmlhttprequest'\n }\n\n wantsJson(): boolean {\n const accept = this._headers.get('accept')\n if (accept !== undefined && accept.includes('application/json')) {\n return true\n }\n return this.isAjax()\n }\n\n bearerToken(): string | undefined {\n const auth = this._headers.get('authorization')\n if (auth === undefined) return undefined\n const match = auth.match(/^Bearer\\s+(.+)$/i)\n return match?.[1]\n }\n\n get rawRequest(): IncomingMessage {\n return this.raw\n }\n}\n\nexport class ValidationError extends Error {\n constructor(\n message: string,\n readonly errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\nfunction parseQueryParams(\n searchParams: URLSearchParams,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {}\n for (const key of searchParams.keys()) {\n const values = searchParams.getAll(key)\n result[key] = values.length === 1 ? (values[0] as string) : values\n }\n return result\n}\n\nfunction parseIp(req: IncomingMessage): string {\n const forwarded = req.headers['x-forwarded-for']\n if (forwarded !== undefined) {\n const first = Array.isArray(forwarded) ? forwarded[0] : forwarded.split(',')[0]\n if (first !== undefined) return first.trim()\n }\n\n const realIp = req.headers['x-real-ip']\n if (realIp !== undefined) {\n return Array.isArray(realIp) ? realIp[0] as string : realIp\n }\n\n const remote = req.socket.remoteAddress\n if (remote !== undefined) {\n if (remote.startsWith('::ffff:')) return remote.slice(7)\n return remote\n }\n\n return '127.0.0.1'\n}\n\nfunction parseUrlEncoded(text: string): Record<string, string> {\n const result: Record<string, string> = {}\n const pairs = text.split('&')\n for (const pair of pairs) {\n if (!pair) continue\n const eqIndex = pair.indexOf('=')\n if (eqIndex === -1) {\n result[decodeURIComponent(pair)] = ''\n } else {\n const key = decodeURIComponent(pair.slice(0, eqIndex))\n const value = decodeURIComponent(pair.slice(eqIndex + 1))\n result[key] = value\n }\n }\n return result\n}\n\nfunction parseMultipartBody(\n body: Buffer,\n boundary: string,\n): MultipartPart[] {\n const result: MultipartPart[] = []\n const boundaryBuffer = Buffer.from(`--${boundary}`)\n\n let start = 0\n let searchFrom = 0\n\n while (true) {\n const boundaryIndex = body.indexOf(boundaryBuffer, searchFrom)\n if (boundaryIndex === -1) break\n\n searchFrom = boundaryIndex + boundaryBuffer.length\n\n if (\n searchFrom < body.length &&\n body[searchFrom] === 45 &&\n body[searchFrom + 1] === 45\n ) {\n break\n }\n\n if (searchFrom >= body.length) break\n\n if (body[searchFrom] === 13) searchFrom++\n if (body[searchFrom] === 10) searchFrom++\n\n start = searchFrom\n\n const nextBoundaryIndex = body.indexOf(boundaryBuffer, searchFrom)\n if (nextBoundaryIndex === -1) break\n\n let partEnd = nextBoundaryIndex\n if (partEnd >= 2 && body[partEnd - 2] === 13 && body[partEnd - 1] === 10) {\n partEnd -= 2\n }\n\n const partData = body.slice(start, partEnd)\n\n const headerEndIndex = partData.indexOf(Buffer.from('\\r\\n\\r\\n'))\n if (headerEndIndex === -1) {\n searchFrom = nextBoundaryIndex\n continue\n }\n\n const headerSection = partData.slice(0, headerEndIndex).toString('utf-8')\n const contentData = partData.slice(headerEndIndex + 4)\n\n const disposition = parseDisposition(headerSection)\n if (disposition === undefined) {\n searchFrom = nextBoundaryIndex\n continue\n }\n\n if (disposition.filename !== undefined) {\n const contentType = parseContentType(headerSection)\n result.push({\n type: 'file',\n name: disposition.name,\n filename: disposition.filename,\n mimeType: contentType,\n data: Buffer.from(contentData),\n })\n } else {\n result.push({\n type: 'field',\n name: disposition.name,\n value: contentData.toString('utf-8').trim(),\n })\n }\n\n searchFrom = nextBoundaryIndex\n }\n\n return result\n}\n\ninterface DispositionInfo {\n name: string\n filename?: string\n}\n\nfunction parseDisposition(headerSection: string): DispositionInfo | undefined {\n const match = headerSection.match(\n /content-disposition:\\s*form-data;\\s*(.+)/i,\n )\n if (match === null) return undefined\n\n const params = match[1] as string\n const nameMatch = params.match(/name=\"([^\"]*)\"/i)\n const filenameMatch = params.match(/filename=\"([^\"]*)\"/i)\n\n if (nameMatch === null) return undefined\n\n return {\n name: nameMatch[1] as string,\n filename: filenameMatch?.[1],\n }\n}\n\nfunction parseContentType(headerSection: string): string {\n const match = headerSection.match(/content-type:\\s*([^\\s;]+)/i)\n return match?.[1] ?? 'application/octet-stream'\n}\n","import { createReadStream, stat } from \"node:fs\";\nimport type { ServerResponse } from \"node:http\";\nimport { basename, extname, resolve } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { promisify } from \"node:util\";\nimport { type CookieOptions, clearCookie, serializeCookie } from \"./cookie\";\nimport { HeadersMap } from \"./headers\";\nimport { HttpStatus } from \"./status\";\n\nconst statAsync = promisify(stat);\n\nconst MIME_TYPES: Record<string, string> = {\n\t\".html\": \"text/html\",\n\t\".css\": \"text/css\",\n\t\".js\": \"application/javascript\",\n\t\".mjs\": \"application/javascript\",\n\t\".json\": \"application/json\",\n\t\".png\": \"image/png\",\n\t\".jpg\": \"image/jpeg\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".gif\": \"image/gif\",\n\t\".svg\": \"image/svg+xml\",\n\t\".webp\": \"image/webp\",\n\t\".ico\": \"image/x-icon\",\n\t\".pdf\": \"application/pdf\",\n\t\".txt\": \"text/plain\",\n\t\".xml\": \"application/xml\",\n\t\".zip\": \"application/zip\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n\t\".ttf\": \"font/ttf\",\n\t\".eot\": \"application/vnd.ms-fontobject\",\n\t\".mp4\": \"video/mp4\",\n\t\".webm\": \"video/webm\",\n\t\".mp3\": \"audio/mpeg\",\n\t\".wav\": \"audio/wav\",\n};\n\nexport interface FileOptions {\n\troot?: string;\n\tmaxAge?: number;\n\tacceptRanges?: boolean;\n\tcacheControl?: boolean;\n\tetag?: boolean;\n\tlastModified?: boolean;\n\theaders?: Record<string, string>;\n}\n\nexport class SuperResponse {\n\tprivate raw: ServerResponse;\n\tprivate _statusCode: number = HttpStatus.OK;\n\tprivate _headers = new HeadersMap();\n\tprivate _cookies: string[] = [];\n\tprivate _body: string | Buffer | null = null;\n\tprivate _sent = false;\n\tprivate _contentTypeSet = false;\n\n\tconstructor(raw: ServerResponse) {\n\t\tthis.raw = raw;\n\t}\n\n\tstatus(code: number): this {\n\t\tthis._statusCode = code;\n\t\treturn this;\n\t}\n\n\theader(name: string, value: string): this {\n\t\tthis._headers.set(name, value);\n\t\treturn this;\n\t}\n\n\tsetHeader(name: string, value: string): this {\n\t\treturn this.header(name, value);\n\t}\n\n\tgetHeader(name: string): string | undefined {\n\t\treturn this._headers.get(name);\n\t}\n\n\tremoveHeader(name: string): this {\n\t\tthis._headers.delete(name);\n\t\treturn this;\n\t}\n\n\thasHeader(name: string): boolean {\n\t\treturn this._headers.has(name);\n\t}\n\n\ttype(contentType: string): this {\n\t\tthis._headers.set(\"content-type\", contentType);\n\t\tthis._contentTypeSet = true;\n\t\treturn this;\n\t}\n\n\tjson<T>(data: T, status?: number): this {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tconst body = JSON.stringify(data);\n\t\treturn this.send(body, undefined, \"application/json\");\n\t}\n\n\tsend(body: string | Buffer, status?: number, contentType?: string): this {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tthis._body = body;\n\t\tif (contentType !== undefined && !this._contentTypeSet) {\n\t\t\tthis._headers.set(\"content-type\", contentType);\n\t\t}\n\t\treturn this;\n\t}\n\n\thtml(html: string, status?: number): this {\n\t\treturn this.send(html, status, \"text/html; charset=utf-8\");\n\t}\n\n\tredirect(\n\t\turl: string,\n\t\tstatus: 301 | 302 | 307 | 308 = HttpStatus.FOUND as 302,\n\t): this {\n\t\t// Prevent open redirect / CRLF injection\n\t\tif (url.includes('\\r') || url.includes('\\n')) {\n\t\t\tthrow new Error('Invalid redirect URL');\n\t\t}\n\t\tthis._statusCode = status;\n\t\tthis._headers.set(\"location\", url);\n\t\tthis._body = null;\n\t\treturn this;\n\t}\n\n\tstream(stream: Readable, status?: number): this {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tthis.flushHeaders();\n\t\tthis.raw.statusCode = this._statusCode;\n\t\tstream.pipe(this.raw);\n\t\tstream.on(\"end\", () => {\n\t\t\tthis._sent = true;\n\t\t});\n\t\tstream.on(\"error\", (_err: Error) => {\n\t\t\tif (!this._sent) {\n\t\t\t\tthis._sent = true;\n\t\t\t\tthis.raw.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;\n\t\t\t\tthis.raw.end();\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\tasync file(filePath: string, options?: FileOptions): Promise<this> {\n\t\tconst fullPath = options?.root\n\t\t\t? joinPath(options.root, filePath)\n\t\t\t: filePath;\n\n\t\t// Path traversal protection\n\t\tconst resolved = resolve(fullPath);\n\t\tconst root = options?.root ? resolve(options.root) : null;\n\t\tif (root !== null && !resolved.startsWith(root)) {\n\t\t\tthis._statusCode = HttpStatus.FORBIDDEN;\n\t\t\tthis._body = null;\n\t\t\treturn this;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stats = await statAsync(fullPath);\n\n\t\t\tif (!stats.isFile()) {\n\t\t\t\tthis._statusCode = HttpStatus.NOT_FOUND;\n\t\t\t\tthis._body = null;\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tconst ext = extname(fullPath);\n\t\t\tconst mimeType = MIME_TYPES[ext] ?? \"application/octet-stream\";\n\n\t\t\tthis._headers.set(\"content-type\", mimeType);\n\t\t\tthis._headers.set(\"content-length\", String(stats.size));\n\n\t\t\tif (options?.cacheControl !== false) {\n\t\t\t\tconst maxAge = options?.maxAge ?? 0;\n\t\t\t\tthis._headers.set(\"cache-control\", `public, max-age=${maxAge}`);\n\t\t\t}\n\n\t\t\tif (options?.lastModified !== false) {\n\t\t\t\tthis._headers.set(\"last-modified\", stats.mtime.toUTCString());\n\t\t\t}\n\n\t\t\tif (options?.headers !== undefined) {\n\t\t\t\tfor (const [key, value] of Object.entries(options.headers)) {\n\t\t\t\t\tthis._headers.set(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.flushHeaders();\n\t\t\tthis.raw.statusCode = this._statusCode;\n\t\t\tconst readStream = createReadStream(fullPath);\n\t\t\treadStream.pipe(this.raw);\n\t\t\treadStream.on(\"end\", () => {\n\t\t\t\tthis._sent = true;\n\t\t\t});\n\t\t\treadStream.on(\"error\", () => {\n\t\t\t\tif (!this._sent) {\n\t\t\t\t\tthis._sent = true;\n\t\t\t\t\tthis.raw.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;\n\t\t\t\t\tthis.raw.end();\n\t\t\t\t}\n\t\t\t});\n\t\t} catch {\n\t\t\tthis._statusCode = HttpStatus.NOT_FOUND;\n\t\t\tthis._body = null;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tasync download(filePath: string, filename?: string): Promise<this> {\n\t\tconst downloadName = filename ?? basename(filePath);\n\n\t\tthis._headers.set(\n\t\t\t\"content-disposition\",\n\t\t\t`attachment; filename=\"${downloadName}\"`,\n\t\t);\n\n\t\tawait this.file(filePath);\n\t\treturn this;\n\t}\n\n\tattachment(filename?: string): this {\n\t\tif (filename !== undefined) {\n\t\t\tthis._headers.set(\n\t\t\t\t\"content-disposition\",\n\t\t\t\t`attachment; filename=\"${filename}\"`,\n\t\t\t);\n\t\t} else {\n\t\t\tthis._headers.set(\"content-disposition\", \"attachment\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tcookie(name: string, value: string, options?: CookieOptions): this {\n\t\tthis._cookies.push(serializeCookie(name, value, options));\n\t\treturn this;\n\t}\n\n\tclearCookie(name: string, options?: CookieOptions): this {\n\t\tthis._cookies.push(clearCookie(name, options));\n\t\treturn this;\n\t}\n\n\tget statusCode(): number {\n\t\treturn this._statusCode;\n\t}\n\n\tget headersSent(): boolean {\n\t\treturn this._sent;\n\t}\n\n\tget rawResponse(): ServerResponse {\n\t\treturn this.raw;\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tif (this._sent) return;\n\t\tthis._sent = true;\n\n\t\tthis.flushHeaders();\n\n\t\tthis.raw.statusCode = this._statusCode;\n\n\t\tif (this._body !== null) {\n\t\t\tthis.raw.end(this._body);\n\t\t} else {\n\t\t\tthis.raw.end();\n\t\t}\n\t}\n\n\tprivate flushHeaders(): void {\n\t\tif (this._cookies.length > 0) {\n\t\t\tthis.raw.setHeader(\"Set-Cookie\", this._cookies);\n\t\t}\n\n\t\tfor (const [name, value] of this._headers.entries()) {\n\t\t\tif (name.toLowerCase() !== \"set-cookie\") {\n\t\t\t\tthis.raw.setHeader(name, value);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction joinPath(root: string, filePath: string): string {\n\tconst normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/$/, \"\");\n\tconst normalizedPath = filePath.replace(/\\\\/g, \"/\").replace(/^\\//, \"\");\n\treturn `${normalizedRoot}/${normalizedPath}`;\n}\n","export class HttpException extends Error {\n public readonly status: number\n public readonly error: string\n\n constructor(message: string, status: number = 500, error?: string) {\n super(message)\n this.name = 'HttpException'\n this.status = status\n this.error = error ?? getDefaultErrorName(status)\n }\n\n toJSON(): Record<string, unknown> {\n return {\n error: this.error,\n message: this.message,\n statusCode: this.status,\n }\n }\n}\n\nexport class BadRequestException extends HttpException {\n constructor(message = 'Bad Request') {\n super(message, 400, 'BAD_REQUEST')\n }\n}\n\nexport class UnauthorizedException extends HttpException {\n constructor(message = 'Unauthorized') {\n super(message, 401, 'UNAUTHORIZED')\n }\n}\n\nexport class ForbiddenException extends HttpException {\n constructor(message = 'Forbidden') {\n super(message, 403, 'FORBIDDEN')\n }\n}\n\nexport class NotFoundException extends HttpException {\n constructor(message = 'Not Found') {\n super(message, 404, 'NOT_FOUND')\n }\n}\n\nexport class MethodNotAllowedException extends HttpException {\n constructor(message = 'Method Not Allowed') {\n super(message, 405, 'METHOD_NOT_ALLOWED')\n }\n}\n\nexport class ConflictException extends HttpException {\n constructor(message = 'Conflict') {\n super(message, 409, 'CONFLICT')\n }\n}\n\nexport class UnprocessableEntityException extends HttpException {\n constructor(message = 'Unprocessable Entity') {\n super(message, 422, 'UNPROCESSABLE_ENTITY')\n }\n}\n\nexport class TooManyRequestsException extends HttpException {\n constructor(message = 'Too Many Requests') {\n super(message, 429, 'TOO_MANY_REQUESTS')\n }\n}\n\nexport class InternalServerErrorException extends HttpException {\n constructor(message = 'Internal Server Error') {\n super(message, 500, 'INTERNAL_SERVER_ERROR')\n }\n}\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message = 'Service Unavailable') {\n super(message, 503, 'SERVICE_UNAVAILABLE')\n }\n}\n\nexport class ValidationException extends HttpException {\n public readonly errors: Record<string, string[]>\n\n constructor(errors: Record<string, string[]>, message = 'Validation Failed') {\n super(message, 422, 'VALIDATION_ERROR')\n this.errors = errors\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n error: this.error,\n message: this.message,\n statusCode: this.status,\n errors: this.errors,\n }\n }\n}\n\nexport type ExceptionHandler = (err: HttpException) => HttpException | Promise<HttpException>\n\nconst exceptionHandlers: Map<new (...args: never[]) => HttpException, ExceptionHandler> = new Map()\n\nexport function registerExceptionHandler(\n exceptionType: new (...args: never[]) => HttpException,\n handler: ExceptionHandler,\n): void {\n exceptionHandlers.set(exceptionType, handler)\n}\n\nfunction getDefaultErrorName(status: number): string {\n const names: Record<number, string> = {\n 400: 'BAD_REQUEST',\n 401: 'UNAUTHORIZED',\n 403: 'FORBIDDEN',\n 404: 'NOT_FOUND',\n 405: 'METHOD_NOT_ALLOWED',\n 409: 'CONFLICT',\n 422: 'UNPROCESSABLE_ENTITY',\n 429: 'TOO_MANY_REQUESTS',\n 500: 'INTERNAL_SERVER_ERROR',\n 503: 'SERVICE_UNAVAILABLE',\n }\n return names[status] ?? 'UNKNOWN_ERROR'\n}\n\nexport function normalizeError(_err: unknown): HttpException {\n const err = _err instanceof Error ? _err : new Error(String(_err))\n\n if (err instanceof HttpException) {\n const handler = exceptionHandlers.get(err.constructor as new (...args: never[]) => HttpException)\n if (handler !== undefined) {\n const result = handler(err)\n if (result instanceof Promise) {\n return result as unknown as HttpException\n }\n return result\n }\n return err\n }\n\n if (process.env.NODE_ENV === 'production') {\n return new InternalServerErrorException()\n }\n\n return new InternalServerErrorException(err.message)\n}\n","'use strict';\n\nexports.getBooleanOption = (options, key) => {\n\tlet value = false;\n\tif (key in options && typeof (value = options[key]) !== 'boolean') {\n\t\tthrow new TypeError(`Expected the \"${key}\" option to be a boolean`);\n\t}\n\treturn value;\n};\n\nexports.cppdb = Symbol();\nexports.inspect = Symbol.for('nodejs.util.inspect.custom');\n","'use strict';\nconst descriptor = { value: 'SqliteError', writable: true, enumerable: false, configurable: true };\n\nfunction SqliteError(message, code) {\n\tif (new.target !== SqliteError) {\n\t\treturn new SqliteError(message, code);\n\t}\n\tif (typeof code !== 'string') {\n\t\tthrow new TypeError('Expected second argument to be a string');\n\t}\n\tError.call(this, message);\n\tdescriptor.value = '' + message;\n\tObject.defineProperty(this, 'message', descriptor);\n\tError.captureStackTrace(this, SqliteError);\n\tthis.code = code;\n}\nObject.setPrototypeOf(SqliteError, Error);\nObject.setPrototypeOf(SqliteError.prototype, Error.prototype);\nObject.defineProperty(SqliteError.prototype, 'name', descriptor);\nmodule.exports = SqliteError;\n","\n/**\n * Module dependencies.\n */\n\nvar sep = require('path').sep || '/';\n\n/**\n * Module exports.\n */\n\nmodule.exports = fileUriToPath;\n\n/**\n * File URI to Path function.\n *\n * @param {String} uri\n * @return {String} path\n * @api public\n */\n\nfunction fileUriToPath (uri) {\n if ('string' != typeof uri ||\n uri.length <= 7 ||\n 'file://' != uri.substring(0, 7)) {\n throw new TypeError('must pass in a file:// URI to convert to a file path');\n }\n\n var rest = decodeURI(uri.substring(7));\n var firstSlash = rest.indexOf('/');\n var host = rest.substring(0, firstSlash);\n var path = rest.substring(firstSlash + 1);\n\n // 2. Scheme Definition\n // As a special case, <host> can be the string \"localhost\" or the empty\n // string; this is interpreted as \"the machine from which the URL is\n // being interpreted\".\n if ('localhost' == host) host = '';\n\n if (host) {\n host = sep + sep + host;\n }\n\n // 3.2 Drives, drive letters, mount points, file system root\n // Drive letters are mapped into the top of a file URI in various ways,\n // depending on the implementation; some applications substitute\n // vertical bar (\"|\") for the colon after the drive letter, yielding\n // \"file:///c|/tmp/test.txt\". In some cases, the colon is left\n // unchanged, as in \"file:///c:/tmp/test.txt\". In other cases, the\n // colon is simply omitted, as in \"file:///c/tmp/test.txt\".\n path = path.replace(/^(.+)\\|/, '$1:');\n\n // for Windows, we need to invert the path separators from what a URI uses\n if (sep == '\\\\') {\n path = path.replace(/\\//g, '\\\\');\n }\n\n if (/^.+\\:/.test(path)) {\n // has Windows drive at beginning of path\n } else {\n // unix path…\n path = sep + path;\n }\n\n return host + path;\n}\n","/**\n * Module dependencies.\n */\n\nvar fs = require('fs'),\n path = require('path'),\n fileURLToPath = require('file-uri-to-path'),\n join = path.join,\n dirname = path.dirname,\n exists =\n (fs.accessSync &&\n function(path) {\n try {\n fs.accessSync(path);\n } catch (e) {\n return false;\n }\n return true;\n }) ||\n fs.existsSync ||\n path.existsSync,\n defaults = {\n arrow: process.env.NODE_BINDINGS_ARROW || ' → ',\n compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled',\n platform: process.platform,\n arch: process.arch,\n nodePreGyp:\n 'node-v' +\n process.versions.modules +\n '-' +\n process.platform +\n '-' +\n process.arch,\n version: process.versions.node,\n bindings: 'bindings.node',\n try: [\n // node-gyp's linked version in the \"build\" dir\n ['module_root', 'build', 'bindings'],\n // node-waf and gyp_addon (a.k.a node-gyp)\n ['module_root', 'build', 'Debug', 'bindings'],\n ['module_root', 'build', 'Release', 'bindings'],\n // Debug files, for development (legacy behavior, remove for node v0.9)\n ['module_root', 'out', 'Debug', 'bindings'],\n ['module_root', 'Debug', 'bindings'],\n // Release files, but manually compiled (legacy behavior, remove for node v0.9)\n ['module_root', 'out', 'Release', 'bindings'],\n ['module_root', 'Release', 'bindings'],\n // Legacy from node-waf, node <= 0.4.x\n ['module_root', 'build', 'default', 'bindings'],\n // Production \"Release\" buildtype binary (meh...)\n ['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'],\n // node-qbs builds\n ['module_root', 'addon-build', 'release', 'install-root', 'bindings'],\n ['module_root', 'addon-build', 'debug', 'install-root', 'bindings'],\n ['module_root', 'addon-build', 'default', 'install-root', 'bindings'],\n // node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch}\n ['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings']\n ]\n };\n\n/**\n * The main `bindings()` function loads the compiled bindings for a given module.\n * It uses V8's Error API to determine the parent filename that this function is\n * being invoked from, which is then used to find the root directory.\n */\n\nfunction bindings(opts) {\n // Argument surgery\n if (typeof opts == 'string') {\n opts = { bindings: opts };\n } else if (!opts) {\n opts = {};\n }\n\n // maps `defaults` onto `opts` object\n Object.keys(defaults).map(function(i) {\n if (!(i in opts)) opts[i] = defaults[i];\n });\n\n // Get the module root\n if (!opts.module_root) {\n opts.module_root = exports.getRoot(exports.getFileName());\n }\n\n // Ensure the given bindings name ends with .node\n if (path.extname(opts.bindings) != '.node') {\n opts.bindings += '.node';\n }\n\n // https://github.com/webpack/webpack/issues/4175#issuecomment-342931035\n var requireFunc =\n typeof __webpack_require__ === 'function'\n ? __non_webpack_require__\n : require;\n\n var tries = [],\n i = 0,\n l = opts.try.length,\n n,\n b,\n err;\n\n for (; i < l; i++) {\n n = join.apply(\n null,\n opts.try[i].map(function(p) {\n return opts[p] || p;\n })\n );\n tries.push(n);\n try {\n b = opts.path ? requireFunc.resolve(n) : requireFunc(n);\n if (!opts.path) {\n b.path = n;\n }\n return b;\n } catch (e) {\n if (e.code !== 'MODULE_NOT_FOUND' &&\n e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' &&\n !/not find/i.test(e.message)) {\n throw e;\n }\n }\n }\n\n err = new Error(\n 'Could not locate the bindings file. Tried:\\n' +\n tries\n .map(function(a) {\n return opts.arrow + a;\n })\n .join('\\n')\n );\n err.tries = tries;\n throw err;\n}\nmodule.exports = exports = bindings;\n\n/**\n * Gets the filename of the JavaScript file that invokes this function.\n * Used to help find the root directory of a module.\n * Optionally accepts an filename argument to skip when searching for the invoking filename\n */\n\nexports.getFileName = function getFileName(calling_file) {\n var origPST = Error.prepareStackTrace,\n origSTL = Error.stackTraceLimit,\n dummy = {},\n fileName;\n\n Error.stackTraceLimit = 10;\n\n Error.prepareStackTrace = function(e, st) {\n for (var i = 0, l = st.length; i < l; i++) {\n fileName = st[i].getFileName();\n if (fileName !== __filename) {\n if (calling_file) {\n if (fileName !== calling_file) {\n return;\n }\n } else {\n return;\n }\n }\n }\n };\n\n // run the 'prepareStackTrace' function above\n Error.captureStackTrace(dummy);\n dummy.stack;\n\n // cleanup\n Error.prepareStackTrace = origPST;\n Error.stackTraceLimit = origSTL;\n\n // handle filename that starts with \"file://\"\n var fileSchema = 'file://';\n if (fileName.indexOf(fileSchema) === 0) {\n fileName = fileURLToPath(fileName);\n }\n\n return fileName;\n};\n\n/**\n * Gets the root directory of a module, given an arbitrary filename\n * somewhere in the module tree. The \"root directory\" is the directory\n * containing the `package.json` file.\n *\n * In: /home/nate/node-native-module/lib/index.js\n * Out: /home/nate/node-native-module\n */\n\nexports.getRoot = function getRoot(file) {\n var dir = dirname(file),\n prev;\n while (true) {\n if (dir === '.') {\n // Avoids an infinite loop in rare cases, like the REPL\n dir = process.cwd();\n }\n if (\n exists(join(dir, 'package.json')) ||\n exists(join(dir, 'node_modules'))\n ) {\n // Found the 'package.json' file or 'node_modules' dir; we're done\n return dir;\n }\n if (prev === dir) {\n // Got to the top\n throw new Error(\n 'Could not find module root given file: \"' +\n file +\n '\". Do you have a `package.json` file? '\n );\n }\n // Try the parent dir next\n prev = dir;\n dir = join(dir, '..');\n }\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nexports.prepare = function prepare(sql) {\n\treturn this[cppdb].prepare(sql, this, false);\n};\n\nexports.exec = function exec(sql) {\n\tthis[cppdb].exec(sql);\n\treturn this;\n};\n\nexports.close = function close() {\n\tthis[cppdb].close();\n\treturn this;\n};\n\nexports.loadExtension = function loadExtension(...args) {\n\tthis[cppdb].loadExtension(...args);\n\treturn this;\n};\n\nexports.defaultSafeIntegers = function defaultSafeIntegers(...args) {\n\tthis[cppdb].defaultSafeIntegers(...args);\n\treturn this;\n};\n\nexports.unsafeMode = function unsafeMode(...args) {\n\tthis[cppdb].unsafeMode(...args);\n\treturn this;\n};\n\nexports.getters = {\n\tname: {\n\t\tget: function name() { return this[cppdb].name; },\n\t\tenumerable: true,\n\t},\n\topen: {\n\t\tget: function open() { return this[cppdb].open; },\n\t\tenumerable: true,\n\t},\n\tinTransaction: {\n\t\tget: function inTransaction() { return this[cppdb].inTransaction; },\n\t\tenumerable: true,\n\t},\n\treadonly: {\n\t\tget: function readonly() { return this[cppdb].readonly; },\n\t\tenumerable: true,\n\t},\n\tmemory: {\n\t\tget: function memory() { return this[cppdb].memory; },\n\t\tenumerable: true,\n\t},\n};\n","'use strict';\nconst { cppdb } = require('../util');\nconst controllers = new WeakMap();\n\nmodule.exports = function transaction(fn) {\n\tif (typeof fn !== 'function') throw new TypeError('Expected first argument to be a function');\n\n\tconst db = this[cppdb];\n\tconst controller = getController(db, this);\n\tconst { apply } = Function.prototype;\n\n\t// Each version of the transaction function has these same properties\n\tconst properties = {\n\t\tdefault: { value: wrapTransaction(apply, fn, db, controller.default) },\n\t\tdeferred: { value: wrapTransaction(apply, fn, db, controller.deferred) },\n\t\timmediate: { value: wrapTransaction(apply, fn, db, controller.immediate) },\n\t\texclusive: { value: wrapTransaction(apply, fn, db, controller.exclusive) },\n\t\tdatabase: { value: this, enumerable: true },\n\t};\n\n\tObject.defineProperties(properties.default.value, properties);\n\tObject.defineProperties(properties.deferred.value, properties);\n\tObject.defineProperties(properties.immediate.value, properties);\n\tObject.defineProperties(properties.exclusive.value, properties);\n\n\t// Return the default version of the transaction function\n\treturn properties.default.value;\n};\n\n// Return the database's cached transaction controller, or create a new one\nconst getController = (db, self) => {\n\tlet controller = controllers.get(db);\n\tif (!controller) {\n\t\tconst shared = {\n\t\t\tcommit: db.prepare('COMMIT', self, false),\n\t\t\trollback: db.prepare('ROLLBACK', self, false),\n\t\t\tsavepoint: db.prepare('SAVEPOINT `\\t_bs3.\\t`', self, false),\n\t\t\trelease: db.prepare('RELEASE `\\t_bs3.\\t`', self, false),\n\t\t\trollbackTo: db.prepare('ROLLBACK TO `\\t_bs3.\\t`', self, false),\n\t\t};\n\t\tcontrollers.set(db, controller = {\n\t\t\tdefault: Object.assign({ begin: db.prepare('BEGIN', self, false) }, shared),\n\t\t\tdeferred: Object.assign({ begin: db.prepare('BEGIN DEFERRED', self, false) }, shared),\n\t\t\timmediate: Object.assign({ begin: db.prepare('BEGIN IMMEDIATE', self, false) }, shared),\n\t\t\texclusive: Object.assign({ begin: db.prepare('BEGIN EXCLUSIVE', self, false) }, shared),\n\t\t});\n\t}\n\treturn controller;\n};\n\n// Return a new transaction function by wrapping the given function\nconst wrapTransaction = (apply, fn, db, { begin, commit, rollback, savepoint, release, rollbackTo }) => function sqliteTransaction() {\n\tlet before, after, undo;\n\tif (db.inTransaction) {\n\t\tbefore = savepoint;\n\t\tafter = release;\n\t\tundo = rollbackTo;\n\t} else {\n\t\tbefore = begin;\n\t\tafter = commit;\n\t\tundo = rollback;\n\t}\n\tbefore.run();\n\ttry {\n\t\tconst result = apply.call(fn, this, arguments);\n\t\tif (result && typeof result.then === 'function') {\n\t\t\tthrow new TypeError('Transaction function cannot return a promise');\n\t\t}\n\t\tafter.run();\n\t\treturn result;\n\t} catch (ex) {\n\t\tif (db.inTransaction) {\n\t\t\tundo.run();\n\t\t\tif (undo !== rollback) after.run();\n\t\t}\n\t\tthrow ex;\n\t}\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function pragma(source, options) {\n\tif (options == null) options = {};\n\tif (typeof source !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tconst simple = getBooleanOption(options, 'simple');\n\n\tconst stmt = this[cppdb].prepare(`PRAGMA ${source}`, this, true);\n\treturn simple ? stmt.pluck().get() : stmt.all();\n};\n","'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst { promisify } = require('util');\nconst { cppdb } = require('../util');\nconst fsAccess = promisify(fs.access);\n\nmodule.exports = async function backup(filename, options) {\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof filename !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\n\t// Interpret options\n\tfilename = filename.trim();\n\tconst attachedName = 'attached' in options ? options.attached : 'main';\n\tconst handler = 'progress' in options ? options.progress : null;\n\n\t// Validate interpreted options\n\tif (!filename) throw new TypeError('Backup filename cannot be an empty string');\n\tif (filename === ':memory:') throw new TypeError('Invalid backup filename \":memory:\"');\n\tif (typeof attachedName !== 'string') throw new TypeError('Expected the \"attached\" option to be a string');\n\tif (!attachedName) throw new TypeError('The \"attached\" option cannot be an empty string');\n\tif (handler != null && typeof handler !== 'function') throw new TypeError('Expected the \"progress\" option to be a function');\n\n\t// Make sure the specified directory exists\n\tawait fsAccess(path.dirname(filename)).catch(() => {\n\t\tthrow new TypeError('Cannot save backup because the directory does not exist');\n\t});\n\n\tconst isNewFile = await fsAccess(filename).then(() => false, () => true);\n\treturn runBackup(this[cppdb].backup(this, attachedName, filename, isNewFile), handler || null);\n};\n\nconst runBackup = (backup, handler) => {\n\tlet rate = 0;\n\tlet useDefault = true;\n\n\treturn new Promise((resolve, reject) => {\n\t\tsetImmediate(function step() {\n\t\t\ttry {\n\t\t\t\tconst progress = backup.transfer(rate);\n\t\t\t\tif (!progress.remainingPages) {\n\t\t\t\t\tbackup.close();\n\t\t\t\t\tresolve(progress);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (useDefault) {\n\t\t\t\t\tuseDefault = false;\n\t\t\t\t\trate = 100;\n\t\t\t\t}\n\t\t\t\tif (handler) {\n\t\t\t\t\tconst ret = handler(progress);\n\t\t\t\t\tif (ret !== undefined) {\n\t\t\t\t\t\tif (typeof ret === 'number' && ret === ret) rate = Math.max(0, Math.min(0x7fffffff, Math.round(ret)));\n\t\t\t\t\t\telse throw new TypeError('Expected progress callback to return a number or undefined');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetImmediate(step);\n\t\t\t} catch (err) {\n\t\t\t\tbackup.close();\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t});\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nmodule.exports = function serialize(options) {\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof options !== 'object') throw new TypeError('Expected first argument to be an options object');\n\n\t// Interpret and validate options\n\tconst attachedName = 'attached' in options ? options.attached : 'main';\n\tif (typeof attachedName !== 'string') throw new TypeError('Expected the \"attached\" option to be a string');\n\tif (!attachedName) throw new TypeError('The \"attached\" option cannot be an empty string');\n\n\treturn this[cppdb].serialize(attachedName);\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function defineFunction(name, options, fn) {\n\t// Apply defaults\n\tif (options == null) options = {};\n\tif (typeof options === 'function') { fn = options; options = {}; }\n\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof fn !== 'function') throw new TypeError('Expected last argument to be a function');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tif (!name) throw new TypeError('User-defined function name cannot be an empty string');\n\n\t// Interpret options\n\tconst safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;\n\tconst deterministic = getBooleanOption(options, 'deterministic');\n\tconst directOnly = getBooleanOption(options, 'directOnly');\n\tconst varargs = getBooleanOption(options, 'varargs');\n\tlet argCount = -1;\n\n\t// Determine argument count\n\tif (!varargs) {\n\t\targCount = fn.length;\n\t\tif (!Number.isInteger(argCount) || argCount < 0) throw new TypeError('Expected function.length to be a positive integer');\n\t\tif (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');\n\t}\n\n\tthis[cppdb].function(fn, name, argCount, safeIntegers, deterministic, directOnly);\n\treturn this;\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function defineAggregate(name, options) {\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object' || options === null) throw new TypeError('Expected second argument to be an options object');\n\tif (!name) throw new TypeError('User-defined function name cannot be an empty string');\n\n\t// Interpret options\n\tconst start = 'start' in options ? options.start : null;\n\tconst step = getFunctionOption(options, 'step', true);\n\tconst inverse = getFunctionOption(options, 'inverse', false);\n\tconst result = getFunctionOption(options, 'result', false);\n\tconst safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;\n\tconst deterministic = getBooleanOption(options, 'deterministic');\n\tconst directOnly = getBooleanOption(options, 'directOnly');\n\tconst varargs = getBooleanOption(options, 'varargs');\n\tlet argCount = -1;\n\n\t// Determine argument count\n\tif (!varargs) {\n\t\targCount = Math.max(getLength(step), inverse ? getLength(inverse) : 0);\n\t\tif (argCount > 0) argCount -= 1;\n\t\tif (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');\n\t}\n\n\tthis[cppdb].aggregate(start, step, inverse, result, name, argCount, safeIntegers, deterministic, directOnly);\n\treturn this;\n};\n\nconst getFunctionOption = (options, key, required) => {\n\tconst value = key in options ? options[key] : null;\n\tif (typeof value === 'function') return value;\n\tif (value != null) throw new TypeError(`Expected the \"${key}\" option to be a function`);\n\tif (required) throw new TypeError(`Missing required option \"${key}\"`);\n\treturn null;\n};\n\nconst getLength = ({ length }) => {\n\tif (Number.isInteger(length) && length >= 0) return length;\n\tthrow new TypeError('Expected function.length to be a positive integer');\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nmodule.exports = function defineTable(name, factory) {\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (!name) throw new TypeError('Virtual table module name cannot be an empty string');\n\n\t// Determine whether the module is eponymous-only or not\n\tlet eponymous = false;\n\tif (typeof factory === 'object' && factory !== null) {\n\t\teponymous = true;\n\t\tfactory = defer(parseTableDefinition(factory, 'used', name));\n\t} else {\n\t\tif (typeof factory !== 'function') throw new TypeError('Expected second argument to be a function or a table definition object');\n\t\tfactory = wrapFactory(factory);\n\t}\n\n\tthis[cppdb].table(factory, name, eponymous);\n\treturn this;\n};\n\nfunction wrapFactory(factory) {\n\treturn function virtualTableFactory(moduleName, databaseName, tableName, ...args) {\n\t\tconst thisObject = {\n\t\t\tmodule: moduleName,\n\t\t\tdatabase: databaseName,\n\t\t\ttable: tableName,\n\t\t};\n\n\t\t// Generate a new table definition by invoking the factory\n\t\tconst def = apply.call(factory, thisObject, args);\n\t\tif (typeof def !== 'object' || def === null) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" did not return a table definition object`);\n\t\t}\n\n\t\treturn parseTableDefinition(def, 'returned', moduleName);\n\t};\n}\n\nfunction parseTableDefinition(def, verb, moduleName) {\n\t// Validate required properties\n\tif (!hasOwnProperty.call(def, 'rows')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition without a \"rows\" property`);\n\t}\n\tif (!hasOwnProperty.call(def, 'columns')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition without a \"columns\" property`);\n\t}\n\n\t// Validate \"rows\" property\n\tconst rows = def.rows;\n\tif (typeof rows !== 'function' || Object.getPrototypeOf(rows) !== GeneratorFunctionPrototype) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"rows\" property (should be a generator function)`);\n\t}\n\n\t// Validate \"columns\" property\n\tlet columns = def.columns;\n\tif (!Array.isArray(columns) || !(columns = [...columns]).every(x => typeof x === 'string')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"columns\" property (should be an array of strings)`);\n\t}\n\tif (columns.length !== new Set(columns).size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with duplicate column names`);\n\t}\n\tif (!columns.length) {\n\t\tthrow new RangeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with zero columns`);\n\t}\n\n\t// Validate \"parameters\" property\n\tlet parameters;\n\tif (hasOwnProperty.call(def, 'parameters')) {\n\t\tparameters = def.parameters;\n\t\tif (!Array.isArray(parameters) || !(parameters = [...parameters]).every(x => typeof x === 'string')) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"parameters\" property (should be an array of strings)`);\n\t\t}\n\t} else {\n\t\tparameters = inferParameters(rows);\n\t}\n\tif (parameters.length !== new Set(parameters).size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with duplicate parameter names`);\n\t}\n\tif (parameters.length > 32) {\n\t\tthrow new RangeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with more than the maximum number of 32 parameters`);\n\t}\n\tfor (const parameter of parameters) {\n\t\tif (columns.includes(parameter)) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with column \"${parameter}\" which was ambiguously defined as both a column and parameter`);\n\t\t}\n\t}\n\n\t// Validate \"safeIntegers\" option\n\tlet safeIntegers = 2;\n\tif (hasOwnProperty.call(def, 'safeIntegers')) {\n\t\tconst bool = def.safeIntegers;\n\t\tif (typeof bool !== 'boolean') {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"safeIntegers\" property (should be a boolean)`);\n\t\t}\n\t\tsafeIntegers = +bool;\n\t}\n\n\t// Validate \"directOnly\" option\n\tlet directOnly = false;\n\tif (hasOwnProperty.call(def, 'directOnly')) {\n\t\tdirectOnly = def.directOnly;\n\t\tif (typeof directOnly !== 'boolean') {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"directOnly\" property (should be a boolean)`);\n\t\t}\n\t}\n\n\t// Generate SQL for the virtual table definition\n\tconst columnDefinitions = [\n\t\t...parameters.map(identifier).map(str => `${str} HIDDEN`),\n\t\t...columns.map(identifier),\n\t];\n\treturn [\n\t\t`CREATE TABLE x(${columnDefinitions.join(', ')});`,\n\t\twrapGenerator(rows, new Map(columns.map((x, i) => [x, parameters.length + i])), moduleName),\n\t\tparameters,\n\t\tsafeIntegers,\n\t\tdirectOnly,\n\t];\n}\n\nfunction wrapGenerator(generator, columnMap, moduleName) {\n\treturn function* virtualTable(...args) {\n\t\t/*\n\t\t\tWe must defensively clone any buffers in the arguments, because\n\t\t\totherwise the generator could mutate one of them, which would cause\n\t\t\tus to return incorrect values for hidden columns, potentially\n\t\t\tcorrupting the database.\n\t\t */\n\t\tconst output = args.map(x => Buffer.isBuffer(x) ? Buffer.from(x) : x);\n\t\tfor (let i = 0; i < columnMap.size; ++i) {\n\t\t\toutput.push(null); // Fill with nulls to prevent gaps in array (v8 optimization)\n\t\t}\n\t\tfor (const row of generator(...args)) {\n\t\t\tif (Array.isArray(row)) {\n\t\t\t\textractRowArray(row, output, columnMap.size, moduleName);\n\t\t\t\tyield output;\n\t\t\t} else if (typeof row === 'object' && row !== null) {\n\t\t\t\textractRowObject(row, output, columnMap, moduleName);\n\t\t\t\tyield output;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded something that isn't a valid row object`);\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction extractRowArray(row, output, columnCount, moduleName) {\n\tif (row.length !== columnCount) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with an incorrect number of columns`);\n\t}\n\tconst offset = output.length - columnCount;\n\tfor (let i = 0; i < columnCount; ++i) {\n\t\toutput[i + offset] = row[i];\n\t}\n}\n\nfunction extractRowObject(row, output, columnMap, moduleName) {\n\tlet count = 0;\n\tfor (const key of Object.keys(row)) {\n\t\tconst index = columnMap.get(key);\n\t\tif (index === undefined) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with an undeclared column \"${key}\"`);\n\t\t}\n\t\toutput[index] = row[key];\n\t\tcount += 1;\n\t}\n\tif (count !== columnMap.size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with missing columns`);\n\t}\n}\n\nfunction inferParameters({ length }) {\n\tif (!Number.isInteger(length) || length < 0) {\n\t\tthrow new TypeError('Expected function.length to be a positive integer');\n\t}\n\tconst params = [];\n\tfor (let i = 0; i < length; ++i) {\n\t\tparams.push(`$${i + 1}`);\n\t}\n\treturn params;\n}\n\nconst { hasOwnProperty } = Object.prototype;\nconst { apply } = Function.prototype;\nconst GeneratorFunctionPrototype = Object.getPrototypeOf(function*(){});\nconst identifier = str => `\"${str.replace(/\"/g, '\"\"')}\"`;\nconst defer = x => () => x;\n","'use strict';\nconst DatabaseInspection = function Database() {};\n\nmodule.exports = function inspect(depth, opts) {\n\treturn Object.assign(new DatabaseInspection(), this);\n};\n\n","'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst util = require('./util');\nconst SqliteError = require('./sqlite-error');\n\nlet DEFAULT_ADDON;\n\nfunction Database(filenameGiven, options) {\n\tif (new.target == null) {\n\t\treturn new Database(filenameGiven, options);\n\t}\n\n\t// Apply defaults\n\tlet buffer;\n\tif (Buffer.isBuffer(filenameGiven)) {\n\t\tbuffer = filenameGiven;\n\t\tfilenameGiven = ':memory:';\n\t}\n\tif (filenameGiven == null) filenameGiven = '';\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof filenameGiven !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tif ('readOnly' in options) throw new TypeError('Misspelled option \"readOnly\" should be \"readonly\"');\n\tif ('memory' in options) throw new TypeError('Option \"memory\" was removed in v7.0.0 (use \":memory:\" filename instead)');\n\n\t// Interpret options\n\tconst filename = filenameGiven.trim();\n\tconst anonymous = filename === '' || filename === ':memory:';\n\tconst readonly = util.getBooleanOption(options, 'readonly');\n\tconst fileMustExist = util.getBooleanOption(options, 'fileMustExist');\n\tconst timeout = 'timeout' in options ? options.timeout : 5000;\n\tconst verbose = 'verbose' in options ? options.verbose : null;\n\tconst nativeBinding = 'nativeBinding' in options ? options.nativeBinding : null;\n\n\t// Validate interpreted options\n\tif (readonly && anonymous && !buffer) throw new TypeError('In-memory/temporary databases cannot be readonly');\n\tif (!Number.isInteger(timeout) || timeout < 0) throw new TypeError('Expected the \"timeout\" option to be a positive integer');\n\tif (timeout > 0x7fffffff) throw new RangeError('Option \"timeout\" cannot be greater than 2147483647');\n\tif (verbose != null && typeof verbose !== 'function') throw new TypeError('Expected the \"verbose\" option to be a function');\n\tif (nativeBinding != null && typeof nativeBinding !== 'string' && typeof nativeBinding !== 'object') throw new TypeError('Expected the \"nativeBinding\" option to be a string or addon object');\n\n\t// Load the native addon\n\tlet addon;\n\tif (nativeBinding == null) {\n\t\taddon = DEFAULT_ADDON || (DEFAULT_ADDON = require('bindings')('better_sqlite3.node'));\n\t} else if (typeof nativeBinding === 'string') {\n\t\t// See <https://webpack.js.org/api/module-variables/#__non_webpack_require__-webpack-specific>\n\t\tconst requireFunc = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : require;\n\t\taddon = requireFunc(path.resolve(nativeBinding).replace(/(\\.node)?$/, '.node'));\n\t} else {\n\t\t// See <https://github.com/WiseLibs/better-sqlite3/issues/972>\n\t\taddon = nativeBinding;\n\t}\n\n\tif (!addon.isInitialized) {\n\t\taddon.setErrorConstructor(SqliteError);\n\t\taddon.isInitialized = true;\n\t}\n\n\t// Make sure the specified directory exists\n\tif (!anonymous && !filename.startsWith('file:') && !fs.existsSync(path.dirname(filename))) {\n\t\tthrow new TypeError('Cannot open database because the directory does not exist');\n\t}\n\n\tObject.defineProperties(this, {\n\t\t[util.cppdb]: { value: new addon.Database(filename, filenameGiven, anonymous, readonly, fileMustExist, timeout, verbose || null, buffer || null) },\n\t\t...wrappers.getters,\n\t});\n}\n\nconst wrappers = require('./methods/wrappers');\nDatabase.prototype.prepare = wrappers.prepare;\nDatabase.prototype.transaction = require('./methods/transaction');\nDatabase.prototype.pragma = require('./methods/pragma');\nDatabase.prototype.backup = require('./methods/backup');\nDatabase.prototype.serialize = require('./methods/serialize');\nDatabase.prototype.function = require('./methods/function');\nDatabase.prototype.aggregate = require('./methods/aggregate');\nDatabase.prototype.table = require('./methods/table');\nDatabase.prototype.loadExtension = wrappers.loadExtension;\nDatabase.prototype.exec = wrappers.exec;\nDatabase.prototype.close = wrappers.close;\nDatabase.prototype.defaultSafeIntegers = wrappers.defaultSafeIntegers;\nDatabase.prototype.unsafeMode = wrappers.unsafeMode;\nDatabase.prototype[util.inspect] = require('./methods/inspect');\n\nmodule.exports = Database;\n","'use strict';\nmodule.exports = require('./database');\nmodule.exports.SqliteError = require('./sqlite-error');\n","type Factory<T> = () => T\n\ninterface Binding<T> {\n factory: Factory<T>\n singleton: boolean\n instance?: T\n}\n\nexport class Container {\n private bindings = new Map<string, Binding<unknown>>()\n private resolving = new Set<string>()\n\n bind<T>(name: string, factory: Factory<T>): this {\n this.bindings.set(name, { factory, singleton: false })\n return this\n }\n\n singleton<T>(name: string, factory: Factory<T>): this {\n this.bindings.set(name, { factory, singleton: true })\n return this\n }\n\n instance<T>(name: string, instance: T): this {\n this.bindings.set(name, {\n factory: () => instance,\n singleton: true,\n instance,\n })\n return this\n }\n\n resolve<T>(name: string): T {\n const binding = this.bindings.get(name)\n if (binding === undefined) {\n throw new Error(`Binding not found: ${name}`)\n }\n\n if (binding.singleton && binding.instance !== undefined) {\n return binding.instance as T\n }\n\n if (this.resolving.has(name)) {\n throw new Error(\n `Circular dependency detected: ${name} is already being resolved`,\n )\n }\n\n this.resolving.add(name)\n\n try {\n const instance = binding.factory() as T\n if (binding.singleton) {\n binding.instance = instance\n }\n return instance\n } finally {\n this.resolving.delete(name)\n }\n }\n\n has(name: string): boolean {\n return this.bindings.has(name)\n }\n\n remove(name: string): void {\n this.bindings.delete(name)\n }\n\n clear(): void {\n this.bindings.clear()\n this.resolving.clear()\n }\n\n getBindings(): Map<string, Binding<unknown>> {\n return new Map(this.bindings)\n }\n}\n","import type { RouteContext } from '../router'\nimport type { Container } from '../container'\nimport type { SuperRequest } from '../http/request'\nimport type { SuperResponse } from '../http/response'\nimport type { Schema } from '../http/request'\nimport { HttpStatus } from '../http/status'\n\nexport interface ControllerRouteDefinition {\n method: string\n path: string\n handler: string | symbol\n}\n\nconst controllerPrefixMap = new WeakMap<object, string>()\nconst controllerRoutesMap = new WeakMap<object, ControllerRouteDefinition[]>()\n\nexport abstract class Controller {\n declare protected __ctx: RouteContext\n declare protected __container: Container\n\n protected get request(): SuperRequest {\n return this.__ctx.request\n }\n\n protected get response(): SuperResponse {\n return this.__ctx.response\n }\n\n protected get container(): Container {\n return this.__container\n }\n\n protected async validate<T>(schema: Schema<T>): Promise<T> {\n return this.request.validate(schema)\n }\n\n protected ok<T>(data: T): void {\n this.response.json(data, HttpStatus.OK)\n }\n\n protected created<T>(data: T): void {\n this.response.json(data, HttpStatus.CREATED)\n }\n\n protected noContent(): void {\n this.response.status(HttpStatus.NO_CONTENT)\n }\n\n protected badRequest(message?: string): void {\n this.response.status(HttpStatus.BAD_REQUEST).json({\n error: 'Bad Request',\n message: message ?? 'The request could not be processed',\n })\n }\n\n protected notFound(message?: string): void {\n this.response.status(HttpStatus.NOT_FOUND).json({\n error: 'Not Found',\n message: message ?? 'The requested resource was not found',\n })\n }\n\n protected unauthorized(message?: string): void {\n this.response.status(HttpStatus.UNAUTHORIZED).json({\n error: 'Unauthorized',\n message: message ?? 'Authentication is required',\n })\n }\n\n protected forbidden(message?: string): void {\n this.response.status(HttpStatus.FORBIDDEN).json({\n error: 'Forbidden',\n message: message ?? 'You do not have permission to access this resource',\n })\n }\n\n protected error(status: number, message?: string): void {\n this.response.status(status).json({\n error: getStatusKey(status),\n message: message ?? 'An error occurred',\n })\n }\n}\n\nfunction getStatusKey(code: number): string {\n for (const [key, val] of Object.entries(HttpStatus)) {\n if (val === code) return key\n }\n return 'Error'\n}\n\nfunction createRouteDecorator(method: string) {\n return (path: string) => {\n return (target: unknown, context: ClassMethodDecoratorContext): void => {\n const classTarget = context.static\n ? (target as object)\n : ((target as { constructor: object }).constructor)\n\n const routes = controllerRoutesMap.get(classTarget) ?? []\n routes.push({ method, path, handler: context.name })\n controllerRoutesMap.set(classTarget, routes)\n }\n }\n}\n\nexport function controller(prefix?: string): ClassDecorator {\n return (target: unknown, _context?: ClassDecoratorContext): void => {\n controllerPrefixMap.set(target as object, prefix ?? '')\n }\n}\n\nexport const get = createRouteDecorator('GET')\nexport const post = createRouteDecorator('POST')\nexport const put = createRouteDecorator('PUT')\nexport const patch = createRouteDecorator('PATCH')\nexport const del = createRouteDecorator('DELETE')\n\nexport function getControllerPrefix(controllerClass: object): string {\n return controllerPrefixMap.get(controllerClass) ?? ''\n}\n\nexport function getControllerRoutes(\n controllerClass: object,\n): ControllerRouteDefinition[] {\n return controllerRoutesMap.get(controllerClass) ?? []\n}\n","import { createServer as createHttpServer } from 'node:http'\nimport { createServer as createHttpsServer } from 'node:https'\nimport type { Server } from 'node:http'\nimport { readFileSync } from 'node:fs'\nimport { SuperRequest } from '../http/request.js'\nimport { SuperResponse } from '../http/response.js'\nimport { normalizeError } from '../errors.js'\n\nexport interface ServerInstance {\n close: () => Promise<void>\n raw: Server\n}\n\nexport type RequestHandler = (\n req: SuperRequest,\n res: SuperResponse,\n) => void | Promise<void>\n\nexport interface ServerEngine {\n createServer(handler: RequestHandler): Promise<ServerInstance>\n getPort(server: ServerInstance): number\n close(server: ServerInstance): Promise<void>\n}\n\nexport class NodeEngine implements ServerEngine {\n async createServer(handler: RequestHandler): Promise<ServerInstance> {\n const server = createHttpServer(async (nodeReq, nodeRes) => {\n const req = new SuperRequest(nodeReq)\n const res = new SuperResponse(nodeRes)\n\n try {\n await handler(req, res)\n } catch (_err: unknown) {\n if (!res.headersSent) {\n const error = _err instanceof Error ? _err : new Error(String(_err))\n const httpError = normalizeError(error)\n res.status(httpError.status).json(httpError.toJSON())\n await res.flush()\n }\n }\n\n if (!res.headersSent) {\n await res.flush()\n }\n })\n\n return {\n raw: server,\n close: () => {\n return new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err !== undefined && err !== null) {\n reject(err)\n } else {\n resolve()\n }\n })\n })\n },\n }\n }\n\n getPort(server: ServerInstance): number {\n const addr = server.raw.address()\n if (addr !== null && typeof addr === 'object') {\n return addr.port\n }\n return 0\n }\n\n async close(server: ServerInstance): Promise<void> {\n await server.close()\n }\n}\n\nexport class HttpsEngine extends NodeEngine {\n private options: { key: string; cert: string }\n\n constructor(keyPath: string, certPath: string) {\n super()\n this.options = {\n key: readFileSync(keyPath, 'utf-8'),\n cert: readFileSync(certPath, 'utf-8'),\n }\n }\n\n async createServer(handler: RequestHandler): Promise<ServerInstance> {\n const server = createHttpsServer(this.options, async (nodeReq, nodeRes) => {\n const req = new (require('../http/request.js').SuperRequest)(nodeReq)\n const res = new (require('../http/response.js').SuperResponse)(nodeRes)\n try { await handler(req, res) }\n catch (_err: unknown) {\n if (!res.headersSent) {\n const { normalizeError } = require('../errors.js')\n const error = _err instanceof Error ? _err : new Error(String(_err))\n const httpError = normalizeError(error)\n res.status(httpError.status).json(httpError.toJSON())\n await res.flush()\n }\n }\n if (!res.headersSent) await res.flush()\n })\n return {\n raw: server,\n close: () => new Promise((resolve, reject) => server.close((err) => err ? reject(err) : resolve())),\n }\n }\n}\n","import { Container } from \"./container\";\nimport { getControllerPrefix, getControllerRoutes } from \"./controller\";\nimport { NodeEngine, type ServerEngine, type ServerInstance } from \"./engine\";\nimport type { SuperRequest } from \"./http/request\";\nimport type { SuperResponse } from \"./http/response\";\nimport { HttpStatus } from \"./http/status\";\nimport {\n\ttype Middleware,\n\tMiddlewarePipeline,\n\ttype StaticOptions,\n\tstaticFiles as staticFilesMiddleware,\n} from \"./middleware\";\nimport type { ControllerClass } from \"./router\";\nimport { type RouteContext, type RouteHandler, Router } from \"./router\";\n\nexport { Cache, type CacheConfig, cacheResponse } from \"./cache\";\nexport * from \"./database/index.js\";\nexport { createEvent, Event, type EventConfig, event } from \"./events\";\nexport { registerMacro, responseMacros, URLBuilder, url } from \"./helpers\";\nexport {\n\tcreateStorage,\n\tLocalDisk,\n\tStorage,\n\ttype StorageConfig,\n\tstorage,\n} from \"./storage\";\nexport {\n\tHttpException,\n\tBadRequestException,\n\tUnauthorizedException,\n\tForbiddenException,\n\tNotFoundException,\n\tMethodNotAllowedException,\n\tConflictException,\n\tUnprocessableEntityException,\n\tTooManyRequestsException,\n\tInternalServerErrorException,\n\tServiceUnavailableException,\n\tValidationException,\n\tregisterExceptionHandler,\n\tnormalizeError,\n} from \"./errors\";\n\nexport interface ViewEngine {\n\trender(\n\t\ttemplate: string,\n\t\tdata: Record<string, unknown>,\n\t): string | Promise<string>;\n}\n\nexport interface AppOptions {\n\tengine?: ServerEngine;\n\tcontainer?: Container;\n}\n\nexport class SuperApp {\n\treadonly router: Router;\n\treadonly container: Container;\n\tprivate engine: ServerEngine;\n\tprivate serverInstance: ServerInstance | undefined;\n\tprivate globalPipeline: MiddlewarePipeline;\n\tprivate started = false;\n\tprivate serverPromise: Promise<void> | undefined;\n\tprivate onErrorHandler: ((err: Error, ctx: RouteContext) => void | Promise<void>) | null = null;\n\tprivate onNotFoundHandler: ((ctx: RouteContext) => void | Promise<void>) | null = null;\n\tprivate shutdownHandlers: (() => void | Promise<void>)[] = [];\n\tprivate shuttingDown = false;\n\n\tconstructor(options: AppOptions = {}) {\n\t\tthis.container = options.container ?? new Container();\n\t\tthis.router = new Router();\n\t\tthis.engine = options.engine ?? new NodeEngine();\n\t\tthis.globalPipeline = new MiddlewarePipeline();\n\n\t\tthis.container.instance(\"app\", this);\n\t\tthis.container.instance(\"router\", this.router);\n\t\tthis.container.instance(\"container\", this.container);\n\t}\n\n\tuse(middleware: Middleware): this {\n\t\tthis.globalPipeline.use(middleware);\n\t\treturn this;\n\t}\n\n\tget(path: string, handler: RouteHandler): this {\n\t\tthis.router.get(path, handler);\n\t\treturn this;\n\t}\n\n\tpost(path: string, handler: RouteHandler): this {\n\t\tthis.router.post(path, handler);\n\t\treturn this;\n\t}\n\n\tput(path: string, handler: RouteHandler): this {\n\t\tthis.router.put(path, handler);\n\t\treturn this;\n\t}\n\n\tpatch(path: string, handler: RouteHandler): this {\n\t\tthis.router.patch(path, handler);\n\t\treturn this;\n\t}\n\n\tdelete(path: string, handler: RouteHandler): this {\n\t\tthis.router.delete(path, handler);\n\t\treturn this;\n\t}\n\n\toptions(path: string, handler: RouteHandler): this {\n\t\tthis.router.options(path, handler);\n\t\treturn this;\n\t}\n\n\tany(path: string, handler: RouteHandler): this {\n\t\tthis.router.any(path, handler);\n\t\treturn this;\n\t}\n\n\tmatch(methods: string[], path: string, handler: RouteHandler): this {\n\t\tthis.router.match(methods, path, handler);\n\t\treturn this;\n\t}\n\n\tgroup(prefix: string, callback: (router: Router) => void): this {\n\t\tthis.router.group(prefix, callback);\n\t\treturn this;\n\t}\n\n\tresource(name: string, controller: ControllerClass): this {\n\t\tthis.router.resource(name, controller);\n\t\treturn this;\n\t}\n\n\tapiResource(name: string, controller: ControllerClass): this {\n\t\tthis.router.apiResource(name, controller);\n\t\treturn this;\n\t}\n\n\tcontroller(ctrl: ControllerClass): this {\n\t\tconst prefix = getControllerPrefix(ctrl as object);\n\t\tconst routes = getControllerRoutes(ctrl.prototype);\n\n\t\tfor (const route of routes) {\n\t\t\tconst handlerPath = `${prefix}${route.path}`;\n\t\t\tconst handlerName = String(route.handler);\n\n\t\t\tthis.router.match(\n\t\t\t\t[route.method],\n\t\t\t\thandlerPath,\n\t\t\t\tasync (ctx: RouteContext) => {\n\t\t\t\t\tconst instance = createControllerInstance(ctrl, ctx);\n\t\t\t\t\tconst handlerFn = (instance as Record<string, unknown>)[handlerName];\n\n\t\t\t\t\tif (typeof handlerFn === \"function\") {\n\t\t\t\t\t\tawait handlerFn.call(instance, ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Handler ${handlerName} not found on controller ${ctrl.name}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tmiddleware(middleware: Middleware | Middleware[]): this {\n\t\tthis.router.middleware(middleware);\n\t\treturn this;\n\t}\n\n\tsetEngine(engine: ServerEngine): this {\n\t\tif (this.started) {\n\t\t\tthrow new Error(\"Cannot change engine after server has started\");\n\t\t}\n\t\tthis.engine = engine;\n\t\treturn this;\n\t}\n\n\tstatic(path: string, options?: StaticOptions): this {\n\t\tthis.use(staticFilesMiddleware(path, options));\n\t\treturn this;\n\t}\n\n\tview(_engine: ViewEngine): this {\n\t\treturn this;\n\t}\n\n\tonError(handler: (err: Error, ctx: RouteContext) => void | Promise<void>): this {\n\t\tthis.onErrorHandler = handler;\n\t\treturn this;\n\t}\n\n\tnotFound(handler: (ctx: RouteContext) => void | Promise<void>): this {\n\t\tthis.onNotFoundHandler = handler;\n\t\treturn this;\n\t}\n\n\tonShutdown(handler: () => void | Promise<void>): this {\n\t\tthis.shutdownHandlers.push(handler);\n\t\treturn this;\n\t}\n\n\tgetServer(): ServerInstance | undefined {\n\t\treturn this.serverInstance;\n\t}\n\n\tasync start(port?: number, host?: string): Promise<void> {\n\t\tif (this.started) {\n\t\t\tthrow new Error(\"Server has already been started\");\n\t\t}\n\t\tthis.started = true;\n\n\t\tthis.serverInstance = await this.engine.createServer(\n\t\t\tasync (req: SuperRequest, res: SuperResponse) => {\n\t\t\t\tawait this.handleRequest(req, res);\n\t\t\t},\n\t\t);\n\n\t\tconst listenPort = port ?? 3000;\n\t\tconst listenHost = host ?? \"0.0.0.0\";\n\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tconst raw = this.serverInstance!.raw;\n\t\t\traw.listen(listenPort, listenHost, () => {\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tlisten(port?: number, callback?: () => void): this {\n\t\tthis.serverPromise = this.start(port).then(() => {\n\t\t\tconst shutdown = async (signal: string) => {\n\t\t\t\tif (this.shuttingDown) return;\n\t\t\t\tthis.shuttingDown = true;\n\n\t\t\t\tconsole.log(`\\n⚠️ Received ${signal}. Starting graceful shutdown...`);\n\n\t\t\t\tfor (const handler of this.shutdownHandlers) {\n\t\t\t\t\ttry { await handler(); } catch { /* ignore shutdown errors */ }\n\t\t\t\t}\n\n\t\t\t\tawait this.close();\n\t\t\t\tconsole.log('✓ Server shut down gracefully');\n\t\t\t\tprocess.exit(0);\n\t\t\t};\n\n\t\t\tprocess.on('SIGINT', () => shutdown('SIGINT'));\n\t\t\tprocess.on('SIGTERM', () => shutdown('SIGTERM'));\n\n\t\t\tif (process.stdin && process.stdin.isTTY) {\n\t\t\t\tprocess.stdin.on('end', () => shutdown('stdin end'));\n\t\t\t}\n\n\t\t\tcallback?.();\n\t\t});\n\t\treturn this;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.serverInstance !== undefined) {\n\t\t\tawait this.engine.close(this.serverInstance);\n\t\t\tthis.serverInstance = undefined;\n\t\t\tthis.started = false;\n\t\t}\n\t}\n\n\tasync ready(): Promise<void> {\n\t\tif (this.serverPromise !== undefined) {\n\t\t\tawait this.serverPromise;\n\t\t}\n\t}\n\n\tprivate async handleRequest(\n\t\treq: SuperRequest,\n\t\tres: SuperResponse,\n\t): Promise<void> {\n\t\tconst resolvedRoute = this.router.resolve(req.method, req.path);\n\n\t\tif (resolvedRoute === null) {\n\t\t\tif (this.onNotFoundHandler !== null) {\n\t\t\t\tconst ctx: RouteContext = {\n\t\t\t\t\trequest: req,\n\t\t\t\t\tresponse: res,\n\t\t\t\t\tparams: {},\n\t\t\t\t\tquery: req.query,\n\t\t\t\t\tcontainer: this.container,\n\t\t\t\t};\n\t\t\t\tawait this.onNotFoundHandler(ctx);\n\t\t\t\tif (!res.headersSent) await res.flush();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tres.status(HttpStatus.NOT_FOUND).json({\n\t\t\t\terror: 'NOT_FOUND',\n\t\t\t\tmessage: `Route ${req.method} ${req.path} not found`,\n\t\t\t});\n\t\t\tawait res.flush();\n\t\t\treturn;\n\t\t}\n\n\t\treq.params = resolvedRoute.params;\n\n\t\tconst ctx: RouteContext = {\n\t\t\trequest: req,\n\t\t\tresponse: res,\n\t\t\tparams: resolvedRoute.params,\n\t\t\tquery: req.query,\n\t\t\tcontainer: this.container,\n\t\t};\n\n\t\ttry {\n\t\t\tawait this.globalPipeline.run(ctx, async () => {\n\t\t\t\tconst routePipeline = new MiddlewarePipeline();\n\t\t\t\tfor (const mw of resolvedRoute.middleware) {\n\t\t\t\t\troutePipeline.use(mw);\n\t\t\t\t}\n\t\t\t\tawait routePipeline.run(ctx, async () => {\n\t\t\t\t\tawait resolvedRoute.handler(ctx);\n\t\t\t\t});\n\t\t\t});\n\t\t} catch (err: unknown) {\n\t\t\tif (this.onErrorHandler !== null) {\n\t\t\t\tawait this.onErrorHandler(\n\t\t\t\t\terr instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\tctx,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\tif (!res.headersSent) {\n\t\t\tawait res.flush();\n\t\t}\n\t}\n}\n\nexport function speexjs(options?: AppOptions): SuperApp {\n\treturn new SuperApp(options);\n}\n\nexport function createControllerInstance(\n\tcontroller: ControllerClass,\n\tctx: RouteContext,\n): object {\n\tconst instance = new controller();\n\t(instance as Record<string, unknown>).__ctx = ctx;\n\t(instance as Record<string, unknown>).__container = ctx.container;\n\treturn instance;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { extname, join, resolve } from \"node:path\";\nimport { gzipSync } from \"node:zlib\";\nimport { HttpStatus } from \"../http/status\";\nimport type { RouteContext } from \"../router\";\nimport type { Schema } from \"../../schema/types.js\";\nexport type Middleware = (\n\tctx: RouteContext,\n\tnext: () => Promise<void>,\n) => void | Promise<void>;\n\nexport interface CorsOptions {\n\torigin?: string | string[];\n\tmethods?: string[];\n\tallowedHeaders?: string[];\n\texposedHeaders?: string[];\n\tcredentials?: boolean;\n\tmaxAge?: number;\n}\n\nexport function cors(options?: CorsOptions): Middleware {\n\tconst opts: Required<CorsOptions> = {\n\t\torigin: \"*\",\n\t\tmethods: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"],\n\t\tallowedHeaders: [\"Content-Type\", \"Authorization\"],\n\t\texposedHeaders: [],\n\t\tcredentials: false,\n\t\tmaxAge: 86400,\n\t\t...options,\n\t};\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\t\tconst origin = request.headers.get(\"origin\");\n\n\t\tif (origin !== undefined) {\n\t\t\tif (opts.origin === \"*\") {\n\t\t\t\tresponse.header(\"access-control-allow-origin\", \"*\");\n\t\t\t} else if (typeof opts.origin === \"string\") {\n\t\t\t\tresponse.header(\"access-control-allow-origin\", opts.origin);\n\t\t\t} else if (opts.origin.includes(origin)) {\n\t\t\t\tresponse.header(\"access-control-allow-origin\", origin);\n\t\t\t}\n\n\t\t\tif (opts.credentials) {\n\t\t\t\tresponse.header(\"access-control-allow-credentials\", \"true\");\n\t\t\t}\n\n\t\t\tif (opts.exposedHeaders.length > 0) {\n\t\t\t\tresponse.header(\n\t\t\t\t\t\"access-control-expose-headers\",\n\t\t\t\t\topts.exposedHeaders.join(\", \"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (request.method === \"OPTIONS\") {\n\t\t\tresponse.header(\"access-control-allow-methods\", opts.methods.join(\", \"));\n\t\t\tresponse.header(\n\t\t\t\t\"access-control-allow-headers\",\n\t\t\t\topts.allowedHeaders.join(\", \"),\n\t\t\t);\n\t\t\tresponse.header(\"access-control-max-age\", String(opts.maxAge));\n\t\t\tresponse.status(HttpStatus.NO_CONTENT);\n\t\t\treturn;\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport function bodyParser(): Middleware {\n\treturn async (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request } = ctx;\n\t\tconst method = request.method;\n\n\t\tif ([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {\n\t\t\tawait request.body();\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport interface SessionOptions {\n\tname?: string;\n\tsecret?: string;\n\tmaxAge?: number;\n\thttpOnly?: boolean;\n\tsecure?: boolean;\n\tsameSite?: \"strict\" | \"lax\" | \"none\";\n}\n\nexport function session(options?: SessionOptions): Middleware {\n\tconst opts = {\n\t\tname: \"speexjs_session\",\n\t\tsecret: options?.secret ?? (process.env.NODE_ENV === 'production' \n ? (() => { throw new Error('Session secret must be configured in production via secret option or SESSION_SECRET env var') })() \n : 'speexjs-dev-secret'),\n\t\tmaxAge: 7200,\n\t\thttpOnly: true,\n\t\tsecure: false,\n\t\tsameSite: \"lax\" as const,\n\t\t...options,\n\t};\n\n\tinterface SessionEntry {\n\t\tdata: Record<string, unknown>;\n\t\tcreatedAt: number;\n\t}\n\tconst sessions = new Map<string, SessionEntry>();\n\tconst SESSION_TTL = (opts.maxAge || 7200) * 1000;\n\n\tfunction generateSessionId(): string {\n\t\treturn randomUUID();\n\t}\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\t\tconst sessionId = request.cookie(opts.name) ?? generateSessionId();\n\t\tconst id = sessionId;\n\n\t\t// Clean expired sessions periodically (every 100 requests)\n\t\tif (Math.random() < 0.01) {\n\t\t\tconst now = Date.now();\n\t\t\tfor (const [key, entry] of sessions) {\n\t\t\t\tif (now - entry.createdAt > SESSION_TTL) {\n\t\t\t\t\tsessions.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if existing session is expired\n\t\tconst existing = sessions.get(id);\n\t\tif (existing && (Date.now() - existing.createdAt > SESSION_TTL)) {\n\t\t\tsessions.delete(id);\n\t\t}\n\n\t\tif (!sessions.has(id)) {\n\t\t\tsessions.set(id, { data: {}, createdAt: Date.now() });\n\t\t}\n\t\tconst sessionData = sessions.get(id)!.data;\n\n\t\t(ctx as unknown as Record<string, unknown>).session = sessionData;\n\n\t\tif (request.cookie(opts.name) === undefined) {\n\t\t\tresponse.cookie(opts.name, id, {\n\t\t\t\tmaxAge: opts.maxAge,\n\t\t\t\thttpOnly: opts.httpOnly,\n\t\t\t\tsecure: opts.secure,\n\t\t\t\tsameSite: opts.sameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t});\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport function auth(guard?: string): Middleware {\n\tconst guardName = guard ?? \"default\";\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst user = ctx.container.resolve(`auth.${guardName}`);\n\n\t\tif (user === undefined || user === null) {\n\t\t\tif (ctx.request.wantsJson()) {\n\t\t\t\tctx.response.status(HttpStatus.UNAUTHORIZED).json({\n\t\t\t\t\terror: \"Unauthenticated\",\n\t\t\t\t\tmessage: \"Authentication is required to access this resource\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.response.redirect(\"/login\", HttpStatus.FOUND as 302);\n\t\t\treturn;\n\t\t}\n\n\t\t(ctx as unknown as Record<string, unknown>).user = user;\n\n\t\treturn next();\n\t};\n}\n\nexport function throttle(limit?: number, window?: number): Middleware {\n\tconst maxRequests = limit ?? 60;\n\tconst timeWindow = (window ?? 60) * 1000;\n\tconst hits = new Map<string, { count: number; resetAt: number }>();\n\n\tconst cleanup = setInterval(() => {\n\t\tconst now = Date.now();\n\t\tfor (const [key, value] of hits) {\n\t\t\tif (value.resetAt < now) {\n\t\t\t\thits.delete(key);\n\t\t\t}\n\t\t}\n\t}, 60000);\n\n\tif (cleanup.unref !== undefined) {\n\t\tcleanup.unref();\n\t}\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst key = ctx.request.ip;\n\n\t\tconst now = Date.now();\n\t\tconst hit = hits.get(key);\n\n\t\tif (hit === undefined || hit.resetAt < now) {\n\t\t\thits.set(key, { count: 1, resetAt: now + timeWindow });\n\t\t\tctx.response.header(\"x-ratelimit-limit\", String(maxRequests));\n\t\t\tctx.response.header(\"x-ratelimit-remaining\", String(maxRequests - 1));\n\t\t\treturn next();\n\t\t}\n\n\t\thit.count++;\n\t\tconst remaining = Math.max(0, maxRequests - hit.count);\n\t\tctx.response.header(\"x-ratelimit-limit\", String(maxRequests));\n\t\tctx.response.header(\"x-ratelimit-remaining\", String(remaining));\n\n\t\tif (hit.count > maxRequests) {\n\t\t\tconst retryAfter = Math.ceil((hit.resetAt - now) / 1000);\n\t\t\tctx.response.header(\"retry-after\", String(retryAfter));\n\t\t\tctx.response.status(HttpStatus.TOO_MANY_REQUESTS).json({\n\t\t\t\terror: \"Too Many Requests\",\n\t\t\t\tmessage: `Rate limit exceeded. Try again in ${retryAfter} seconds.`,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nexport function logger(): Middleware {\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst start = Date.now();\n\t\tconst { method, path, ip } = ctx.request;\n\n\t\tconst result = next();\n\n\t\tif (result instanceof Promise) {\n\t\t\treturn result.then(() => {\n\t\t\t\tconst duration = Date.now() - start;\n\t\t\t\tconst status = ctx.response.statusCode;\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[${new Date().toISOString()}] ${method} ${path} ${status} ${duration}ms - ${ip}`,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tconst duration = Date.now() - start;\n\t\tconst status = ctx.response.statusCode;\n\t\tconsole.log(\n\t\t\t`[${new Date().toISOString()}] ${method} ${path} ${status} ${duration}ms - ${ip}`,\n\t\t);\n\t};\n}\n\nexport interface StaticOptions {\n\tmaxAge?: number;\n\tindex?: string;\n\tdotfiles?: \"allow\" | \"deny\";\n\textensions?: string[];\n}\n\nexport function staticFiles(root: string, options?: StaticOptions): Middleware {\n\tconst opts = {\n\t\tmaxAge: 0,\n\t\tindex: \"index.html\",\n\t\tdotfiles: \"deny\" as const,\n\t\textensions: [] as string[],\n\t\t...options,\n\t};\n\n\tconst MIME_TYPES: Record<string, string> = {\n\t\t\".html\": \"text/html\",\n\t\t\".css\": \"text/css\",\n\t\t\".js\": \"application/javascript\",\n\t\t\".json\": \"application/json\",\n\t\t\".png\": \"image/png\",\n\t\t\".jpg\": \"image/jpeg\",\n\t\t\".jpeg\": \"image/jpeg\",\n\t\t\".gif\": \"image/gif\",\n\t\t\".svg\": \"image/svg+xml\",\n\t\t\".webp\": \"image/webp\",\n\t\t\".ico\": \"image/x-icon\",\n\t\t\".txt\": \"text/plain\",\n\t\t\".pdf\": \"application/pdf\",\n\t\t\".woff\": \"font/woff\",\n\t\t\".woff2\": \"font/woff2\",\n\t\t\".ttf\": \"font/ttf\",\n\t};\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\t\tconst filePath = request.path;\n\n\t\tif (opts.dotfiles === \"deny\") {\n\t\t\tconst segments = filePath.split(\"/\");\n\t\t\tfor (const segment of segments) {\n\t\t\t\tif (segment.startsWith(\".\")) {\n\t\t\t\t\treturn next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet fullPath = join(root, filePath);\n\n\t\t// Path traversal protection\n\t\tconst resolvedRoot = resolve(root);\n\t\tconst resolvedPath = resolve(fullPath);\n\t\tif (!resolvedPath.startsWith(resolvedRoot)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (!existsSync(fullPath)) {\n\t\t\tlet found = false;\n\t\t\tfor (const ext of opts.extensions) {\n\t\t\t\tconst tryPath = fullPath + ext;\n\t\t\t\tif (existsSync(tryPath)) {\n\t\t\t\t\tfullPath = tryPath;\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found) return next();\n\t\t}\n\n\t\tconst stats = statSync(fullPath);\n\t\tif (!stats.isFile()) {\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\tconst indexPath = join(fullPath, opts.index);\n\t\t\t\tif (existsSync(indexPath) && statSync(indexPath).isFile()) {\n\t\t\t\t\tfullPath = indexPath;\n\t\t\t\t} else {\n\t\t\t\t\treturn next();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn next();\n\t\t\t}\n\t\t}\n\n\t\tconst ext = extname(fullPath);\n\t\tconst mimeType = MIME_TYPES[ext] ?? \"application/octet-stream\";\n\n\t\tresponse\n\t\t\t.header(\"content-type\", mimeType)\n\t\t\t.header(\"content-length\", String(stats.size))\n\t\t\t.header(\"cache-control\", `public, max-age=${opts.maxAge}`)\n\t\t\t.header(\"last-modified\", stats.mtime.toUTCString());\n\n\t\tconst readStream = createReadStream(fullPath);\n\t\treadStream.pipe(response.rawResponse);\n\t\tresponse.rawResponse.statusCode = HttpStatus.OK;\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\treadStream.on(\"end\", () => resolve());\n\t\t\treadStream.on(\"error\", (err: Error) => reject(err));\n\t\t});\n\t};\n}\n\nexport function csrf(): Middleware {\n\tconst tokens = new Map<string, number>(); // token → expiresAt\n\tconst MAX_TOKENS = 10000;\n\tconst TTL = 60 * 60 * 1000; // 1 hour\n\n\tfunction generateToken(): string {\n\t\t// Cleanup expired tokens\n\t\tconst now = Date.now();\n\t\tfor (const [token, expiresAt] of tokens) {\n\t\t\tif (expiresAt < now) tokens.delete(token);\n\t\t}\n\t\t// Enforce max size\n\t\tif (tokens.size >= MAX_TOKENS) {\n\t\t\tconst oldest = tokens.entries().next().value;\n\t\t\tif (oldest) tokens.delete(oldest[0]);\n\t\t}\n\t\tconst token = randomUUID();\n\t\ttokens.set(token, now + TTL);\n\t\treturn token;\n\t}\n\n\tfunction skipCsrf(method: string): boolean {\n\t\treturn [\"GET\", \"HEAD\", \"OPTIONS\"].includes(method.toUpperCase());\n\t}\n\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request, response } = ctx;\n\n\t\tif (request.path === \"/csrf-token\") {\n\t\t\tconst token = generateToken();\n\t\t\tresponse.json({ token });\n\t\t\treturn;\n\t\t}\n\n\t\tif (skipCsrf(request.method)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst token =\n\t\t\trequest.headers.get(\"x-csrf-token\") ??\n\t\t\trequest.headers.get(\"x-xsrf-token\");\n\n\t\tif (token === undefined || !tokens.has(token)) {\n\t\t\tresponse.status(HttpStatus.FORBIDDEN).json({\n\t\t\t\terror: \"CSRF token mismatch\",\n\t\t\t\tmessage: \"Invalid or missing CSRF token\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttokens.delete(token);\n\n\t\treturn next();\n\t};\n}\n\nexport function compress(): Middleware {\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { request } = ctx;\n\t\tconst acceptEncoding = request.headers.get(\"accept-encoding\") ?? \"\";\n\n\t\tif (acceptEncoding.includes(\"gzip\")) {\n\t\t\treturn compressWith(ctx, next, \"gzip\");\n\t\t}\n\n\t\treturn next();\n\t};\n}\n\nfunction compressWith(\n\tctx: RouteContext,\n\tnext: () => Promise<void>,\n\t_encoding: string,\n): Promise<void> {\n\t(ctx.response as any).send = function(body: string | Buffer, status?: number, contentType?: string) {\n\t\tif (status !== undefined) this._statusCode = status;\n\t\tthis._body = body;\n\t\tif (contentType !== undefined && !this._contentTypeSet) {\n\t\t\tthis._headers.set(\"content-type\", contentType);\n\t\t}\n\t\tconst input = Buffer.isBuffer(body) ? body : Buffer.from(String(body));\n\t\tconst compressed = gzipSync(input);\n\n\t\tthis._headers.set(\"content-encoding\", \"gzip\");\n\t\tthis._headers.set(\"content-length\", String(compressed.length));\n\t\tthis._body = compressed;\n\t\treturn this;\n\t};\n\n\treturn next();\n}\n\nexport function helmet(): Middleware {\n\treturn (ctx: RouteContext, next: () => Promise<void>) => {\n\t\tconst { response } = ctx;\n\n\t\tresponse\n\t\t\t.header(\"x-content-type-options\", \"nosniff\")\n\t\t\t.header(\"x-frame-options\", \"SAMEORIGIN\")\n\t\t\t.header(\"x-xss-protection\", \"1; mode=block\")\n\t\t\t.header(\n\t\t\t\t\"strict-transport-security\",\n\t\t\t\t\"max-age=15552000; includeSubDomains\",\n\t\t\t)\n\t\t\t.header(\"referrer-policy\", \"no-referrer-when-downgrade\")\n\t\t\t.header(\n\t\t\t\t\"content-security-policy\",\n\t\t\t\t\"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'\",\n\t\t\t)\n\t\t\t.header(\"permissions-policy\", \"camera=(), microphone=(), geolocation=()\");\n\n\t\treturn next();\n\t};\n}\n\n// ─── Request Validation Middleware ───────────────────────────\n\nexport function validate(schema: Schema<unknown>): Middleware {\n return async (ctx: RouteContext, next: () => Promise<void>) => {\n const data = await ctx.request.body()\n const result = schema.safeParse(data)\n if (!result.success) {\n ctx.response.status(422).json({\n error: 'VALIDATION_ERROR',\n message: result.error,\n })\n return\n }\n (ctx as any).validated = result.data\n return next()\n }\n}\n\nexport function validateQuery(schema: Schema<unknown>): Middleware {\n return async (ctx: RouteContext, next: () => Promise<void>) => {\n const result = schema.safeParse(ctx.request.query)\n if (!result.success) {\n ctx.response.status(422).json({\n error: 'VALIDATION_ERROR',\n message: result.error,\n })\n return\n }\n (ctx as any).validatedQuery = result.data\n return next()\n }\n}\n\nexport class MiddlewarePipeline {\n\tprivate middlewares: Middleware[] = [];\n\n\tuse(middleware: Middleware): this {\n\t\tthis.middlewares.push(middleware);\n\t\treturn this;\n\t}\n\n\tprepend(middleware: Middleware): this {\n\t\tthis.middlewares.unshift(middleware);\n\t\treturn this;\n\t}\n\n\tremove(name: string): void {\n\t\tthis.middlewares = this.middlewares.filter((mw) => mw.name !== name);\n\t}\n\n\tasync run(ctx: RouteContext, final: () => Promise<void>): Promise<void> {\n\t\tlet index = 0;\n\n\t\tconst next = async (): Promise<void> => {\n\t\t\tif (index >= this.middlewares.length) {\n\t\t\t\tawait final();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst middleware = this.middlewares[index] as Middleware;\n\t\t\tindex++;\n\t\t\tawait middleware(ctx, next);\n\t\t};\n\n\t\tawait next();\n\t}\n\n\tgetMiddlewares(): Middleware[] {\n\t\treturn [...this.middlewares];\n\t}\n}\n","import type { Container } from \"../container\";\nimport type { SuperRequest } from \"../http/request\";\nimport type { SuperResponse } from \"../http/response\";\nimport type { Middleware } from \"../middleware\";\nimport { createControllerInstance } from \"../index.js\";\n\nexport type RouteHandler = (ctx: RouteContext) => void | Promise<void>;\n\nexport interface RouteContext {\n\trequest: SuperRequest;\n\tresponse: SuperResponse;\n\tparams: Record<string, string>;\n\tquery: Record<string, string | string[]>;\n\tcontainer: Container;\n}\n\nexport interface ResolvedRoute {\n\thandler: RouteHandler;\n\tparams: Record<string, string>;\n\tmiddleware: Middleware[];\n}\n\ninterface RouteEntry {\n\tmethods: string[];\n\tpath: string;\n\thandler: RouteHandler;\n\tmiddleware: Middleware[];\n\tname?: string;\n\tregexp: RegExp;\n\tparamKeys: string[];\n}\n\nexport interface ControllerClass {\n\tnew (...args: unknown[]): object;\n}\n\ninterface ResourceActions {\n\tindex?: string;\n\tcreate?: string;\n\tstore?: string;\n\tshow?: string;\n\tedit?: string;\n\tupdate?: string;\n\tdestroy?: string;\n}\n\nexport class Router {\n\tprivate routes: RouteEntry[] = [];\n\tprivate groupMiddleware: Middleware[] = [];\n\tprivate groupPrefix = \"\";\n\tprivate namedRoutes = new Map<string, RouteEntry>();\n\n\tget(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"GET\"], path, handler);\n\t}\n\n\tpost(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"POST\"], path, handler);\n\t}\n\n\tput(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"PUT\"], path, handler);\n\t}\n\n\tpatch(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"PATCH\"], path, handler);\n\t}\n\n\tdelete(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"DELETE\"], path, handler);\n\t}\n\n\toptions(path: string, handler: RouteHandler): this {\n\t\treturn this.match([\"OPTIONS\"], path, handler);\n\t}\n\n\tany(path: string, handler: RouteHandler): this {\n\t\treturn this.match(\n\t\t\t[\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"],\n\t\t\tpath,\n\t\t\thandler,\n\t\t);\n\t}\n\n\tmatch(methods: string[], path: string, handler: RouteHandler): this {\n\t\tconst fullPath = this.groupPrefix + normalizePath(path);\n\t\tconst { regexp, keys } = pathToRegexp(fullPath);\n\n\t\tthis.routes.push({\n\t\t\tmethods: methods.map((m) => m.toUpperCase()),\n\t\t\tpath: fullPath,\n\t\t\thandler,\n\t\t\tmiddleware: [...this.groupMiddleware],\n\t\t\tregexp,\n\t\t\tparamKeys: keys,\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tgroup(prefix: string, callback: (router: Router) => void): this {\n\t\tconst previousPrefix = this.groupPrefix;\n\t\tconst previousMiddleware = [...this.groupMiddleware];\n\n\t\tthis.groupPrefix = previousPrefix + normalizePath(prefix);\n\n\t\tcallback(this);\n\n\t\tthis.groupPrefix = previousPrefix;\n\t\tthis.groupMiddleware = previousMiddleware;\n\n\t\treturn this;\n\t}\n\n\tresource(name: string, controller: ControllerClass): this {\n\t\tconst actions: ResourceActions = {\n\t\t\tindex: \"index\",\n\t\t\tcreate: \"create\",\n\t\t\tstore: \"store\",\n\t\t\tshow: \"show\",\n\t\t\tedit: \"edit\",\n\t\t\tupdate: \"update\",\n\t\t\tdestroy: \"destroy\",\n\t\t};\n\n\t\treturn this.registerResourceRoutes(name, controller, actions);\n\t}\n\n\tapiResource(name: string, controller: ControllerClass): this {\n\t\tconst actions: ResourceActions = {\n\t\t\tindex: \"index\",\n\t\t\tstore: \"store\",\n\t\t\tshow: \"show\",\n\t\t\tupdate: \"update\",\n\t\t\tdestroy: \"destroy\",\n\t\t};\n\n\t\treturn this.registerResourceRoutes(name, controller, actions);\n\t}\n\n\tprivate registerResourceRoutes(\n\t\tname: string,\n\t\tcontroller: ControllerClass,\n\t\tactions: ResourceActions,\n\t): this {\n\t\tconst basePath = normalizePath(name);\n\t\tconst paramName = singularize(name);\n\n\t\tif (actions.index !== undefined) {\n\t\t\tthis.get(\n\t\t\t\tbasePath,\n\t\t\t\tthis.createControllerHandler(controller, actions.index),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.create !== undefined) {\n\t\t\tthis.get(\n\t\t\t\t`${basePath}/create`,\n\t\t\t\tthis.createControllerHandler(controller, actions.create),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.store !== undefined) {\n\t\t\tthis.post(\n\t\t\t\tbasePath,\n\t\t\t\tthis.createControllerHandler(controller, actions.store),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.show !== undefined) {\n\t\t\tthis.get(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.show),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.edit !== undefined) {\n\t\t\tthis.get(\n\t\t\t\t`${basePath}/:${paramName}/edit`,\n\t\t\t\tthis.createControllerHandler(controller, actions.edit),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.update !== undefined) {\n\t\t\tthis.put(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.update),\n\t\t\t);\n\t\t\tthis.patch(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.update),\n\t\t\t);\n\t\t}\n\n\t\tif (actions.destroy !== undefined) {\n\t\t\tthis.delete(\n\t\t\t\t`${basePath}/:${paramName}`,\n\t\t\t\tthis.createControllerHandler(controller, actions.destroy),\n\t\t\t);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprivate createControllerHandler(\n\t\tcontroller: ControllerClass,\n\t\taction: string,\n\t): RouteHandler {\n\t\treturn async (ctx: RouteContext) => {\n\t\t\tconst instance = createControllerInstance(controller, ctx);\n\t\t\tconst handler = (instance as Record<string, unknown>)[action];\n\t\t\tif (typeof handler === \"function\") {\n\t\t\t\tawait handler.call(instance, ctx);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Action ${action} not found on controller ${controller.name}`,\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t}\n\n\tmiddleware(middleware: Middleware | Middleware[]): this {\n\t\tconst mw = Array.isArray(middleware) ? middleware : [middleware];\n\t\tthis.groupMiddleware.push(...mw);\n\t\treturn this;\n\t}\n\n\tname(name: string): this {\n\t\tif (this.routes.length > 0) {\n\t\t\tconst lastRoute = this.routes[this.routes.length - 1];\n\t\t\tif (lastRoute !== undefined) {\n\t\t\t\tlastRoute.name = name;\n\t\t\t\tthis.namedRoutes.set(name, lastRoute);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\troute(name: string, params?: Record<string, string>): string {\n\t\tconst entry = this.namedRoutes.get(name);\n\t\tif (entry === undefined) {\n\t\t\tthrow new Error(`Route not found: ${name}`);\n\t\t}\n\n\t\tlet url = entry.path;\n\t\tif (params !== undefined) {\n\t\t\tfor (const [key, value] of Object.entries(params)) {\n\t\t\t\turl = url.replace(`:${key}`, encodeURIComponent(value));\n\t\t\t}\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tresolve(method: string, path: string): ResolvedRoute | null {\n\t\tconst normalizedPath = normalizePath(path);\n\t\tconst upperMethod = method.toUpperCase();\n\n\t\tfor (const route of this.routes) {\n\t\t\tif (!route.methods.includes(upperMethod)) continue;\n\n\t\t\tconst match = normalizedPath.match(route.regexp);\n\t\t\tif (match === null) continue;\n\n\t\t\tconst params: Record<string, string> = {};\n\t\t\tfor (let i = 0; i < route.paramKeys.length; i++) {\n\t\t\t\tconst key = route.paramKeys[i];\n\t\t\t\tconst value = match[i + 1];\n\t\t\t\tif (key !== undefined && value !== undefined) {\n\t\t\t\t\tparams[key] = decodeURIComponent(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\thandler: route.handler,\n\t\t\t\tparams,\n\t\t\t\tmiddleware: route.middleware,\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tgetRoutes(): RouteEntry[] {\n\t\treturn [...this.routes];\n\t}\n\n\tgetNamedRoutes(): Map<string, RouteEntry> {\n\t\treturn new Map(this.namedRoutes);\n\t}\n}\n\nfunction normalizePath(path: string): string {\n\tlet normalized = path.replace(/\\\\/g, \"/\");\n\n\tif (!normalized.startsWith(\"/\")) {\n\t\tnormalized = \"/\" + normalized;\n\t}\n\n\tif (normalized.length > 1 && normalized.endsWith(\"/\")) {\n\t\tnormalized = normalized.slice(0, -1);\n\t}\n\n\treturn normalized;\n}\n\nfunction pathToRegexp(pattern: string): { regexp: RegExp; keys: string[] } {\n\tconst keys: string[] = [];\n\n\tconst regexpStr = pattern\n\t\t.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match: string, key: string) => {\n\t\t\tkeys.push(key);\n\t\t\treturn \"([^/]+)\";\n\t\t})\n\t\t.replace(/\\*/g, \".*?\");\n\n\treturn { regexp: new RegExp(`^${regexpStr}$`), keys };\n}\n\nfunction singularize(word: string): string {\n\tconst lastChar = word[word.length - 1];\n\tif (lastChar === \"s\") return word.slice(0, -1);\n\tif (lastChar === \"S\") return word.slice(0, -1);\n\treturn word;\n}\n\n\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Middleware } from \"../middleware\";\n\nexport interface CacheConfig {\n\tstore?: \"memory\" | \"file\";\n\tpath?: string;\n\tttl?: number;\n\tprefix?: string;\n}\n\ninterface CacheEntry {\n\tvalue: unknown;\n\texpiresAt: number;\n}\n\nexport class Cache {\n\tprivate store: Map<string, CacheEntry>;\n\tprivate config: Required<CacheConfig>;\n\tprivate hits = 0;\n\tprivate misses = 0;\n\n\tconstructor(config?: CacheConfig) {\n\t\tthis.config = {\n\t\t\tstore: \"memory\",\n\t\t\tpath: path.join(process.cwd(), \"cache\"),\n\t\t\tttl: 3600,\n\t\t\tprefix: \"\",\n\t\t\t...config,\n\t\t};\n\t\tthis.store = new Map();\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t}\n\t}\n\n\tasync get<T>(key: string): Promise<T | null> {\n\t\tconst fullKey = this.config.prefix + key;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\treturn this.fileGet<T>(fullKey);\n\t\t}\n\n\t\tconst entry = this.store.get(fullKey);\n\t\tif (entry === undefined) {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.isExpired(entry)) {\n\t\t\tthis.store.delete(fullKey);\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.hits++;\n\t\treturn entry.value as T;\n\t}\n\n\tasync remember<T>(\n\t\tkey: string,\n\t\tttl: number | undefined,\n\t\tcallback: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cached = await this.get<T>(key);\n\t\tif (cached !== null) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst value = await callback();\n\t\tawait this.set(key, value, ttl);\n\t\treturn value;\n\t}\n\n\tasync set(key: string, value: unknown, ttl?: number): Promise<void> {\n\t\tconst fullKey = this.config.prefix + key;\n\t\tconst expiresAt =\n\t\t\tttl !== undefined\n\t\t\t\t? Date.now() + ttl * 1000\n\t\t\t\t: Date.now() + this.config.ttl * 1000;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tawait this.fileSet(fullKey, { value, expiresAt });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.set(fullKey, { value, expiresAt });\n\t}\n\n\tasync add(key: string, value: unknown, ttl?: number): Promise<boolean> {\n\t\tconst exists = await this.has(key);\n\t\tif (exists) {\n\t\t\treturn false;\n\t\t}\n\n\t\tawait this.set(key, value, ttl);\n\t\treturn true;\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\tconst fullKey = this.config.prefix + key;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\treturn this.fileDelete(fullKey);\n\t\t}\n\n\t\treturn this.store.delete(fullKey);\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\tfor (const file of fs.readdirSync(dir)) {\n\t\t\t\t\tfs.unlinkSync(path.join(dir, file));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.clear();\n\t}\n\n\tasync has(key: string): Promise<boolean> {\n\t\tconst value = await this.get(key);\n\t\treturn value !== null;\n\t}\n\n\tasync getMultiple(keys: string[]): Promise<Record<string, unknown>> {\n\t\tconst result: Record<string, unknown> = {};\n\t\tfor (const key of keys) {\n\t\t\tconst value = await this.get(key);\n\t\t\tif (value !== null) {\n\t\t\t\tresult[key] = value;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync setMultiple(\n\t\titems: Record<string, unknown>,\n\t\tttl?: number,\n\t): Promise<void> {\n\t\tfor (const [key, value] of Object.entries(items)) {\n\t\t\tawait this.set(key, value, ttl);\n\t\t}\n\t}\n\n\tasync increment(key: string, value: number = 1): Promise<number> {\n\t\tconst current = await this.get<number>(key);\n\t\tconst newValue = (current ?? 0) + value;\n\t\tawait this.set(key, newValue);\n\t\treturn newValue;\n\t}\n\n\tasync decrement(key: string, value: number = 1): Promise<number> {\n\t\tconst current = await this.get<number>(key);\n\t\tconst newValue = (current ?? 0) - value;\n\t\tawait this.set(key, newValue);\n\t\treturn newValue;\n\t}\n\n\tasync forever(key: string, value: unknown): Promise<void> {\n\t\tconst fullKey = this.config.prefix + key;\n\t\tconst expiresAt = Number.MAX_SAFE_INTEGER;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tawait this.fileSet(fullKey, { value, expiresAt });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.set(fullKey, { value, expiresAt });\n\t}\n\n\tstats(): { hits: number; misses: number; keys: number; size: string } {\n\t\tlet keyCount = 0;\n\t\tlet totalSize = 0;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\tconst files = fs.readdirSync(dir);\n\t\t\t\tkeyCount = files.length;\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst st = fs.statSync(path.join(dir, file));\n\t\t\t\t\t\ttotalSize += st.size;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tkeyCount = this.store.size;\n\t\t\tfor (const [, entry] of this.store) {\n\t\t\t\ttotalSize += JSON.stringify(entry).length;\n\t\t\t}\n\t\t}\n\n\t\tconst sizeStr =\n\t\t\ttotalSize > 1024 * 1024\n\t\t\t\t? `${(totalSize / (1024 * 1024)).toFixed(2)} MB`\n\t\t\t\t: totalSize > 1024\n\t\t\t\t\t? `${(totalSize / 1024).toFixed(2)} KB`\n\t\t\t\t\t: `${totalSize} B`;\n\n\t\treturn {\n\t\t\thits: this.hits,\n\t\t\tmisses: this.misses,\n\t\t\tkeys: keyCount,\n\t\t\tsize: sizeStr,\n\t\t};\n\t}\n\n\tprivate getFilePath(key: string): string {\n\t\tconst hashedKey = crypto.createHash(\"md5\").update(key).digest(\"hex\");\n\t\treturn path.join(this.config.path, `${hashedKey}.json`);\n\t}\n\n\tprivate isExpired(entry: CacheEntry): boolean {\n\t\treturn entry.expiresAt < Date.now();\n\t}\n\n\tprivate fileGet<T>(key: string): T | null {\n\t\tconst filePath = this.getFilePath(key);\n\t\tif (!fs.existsSync(filePath)) {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst raw = fs.readFileSync(filePath, \"utf-8\");\n\t\t\tconst entry: CacheEntry = JSON.parse(raw);\n\n\t\t\tif (this.isExpired(entry)) {\n\t\t\t\tfs.unlinkSync(filePath);\n\t\t\t\tthis.misses++;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthis.hits++;\n\t\t\treturn entry.value as T;\n\t\t} catch {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate fileSet(key: string, entry: CacheEntry): void {\n\t\tconst filePath = this.getFilePath(key);\n\t\tconst dir = path.dirname(filePath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(filePath, JSON.stringify(entry), \"utf-8\");\n\t}\n\n\tprivate fileDelete(key: string): boolean {\n\t\tconst filePath = this.getFilePath(key);\n\t\tif (!fs.existsSync(filePath)) {\n\t\t\treturn false;\n\t\t}\n\t\tfs.unlinkSync(filePath);\n\t\treturn true;\n\t}\n}\n\nconst responseCache = new Cache({ store: \"memory\" });\n\nexport function cacheResponse(ttl?: number): Middleware {\n\tconst cache = responseCache;\n\n\treturn async (ctx, next) => {\n\t\tconst key = `_cache:${ctx.request.method}:${ctx.request.path}`;\n\n\t\tif (ctx.request.method !== \"GET\") {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst cached = await cache.get<{\n\t\t\tbody: string;\n\t\t\tstatus: number;\n\t\t\tcontentType: string;\n\t\t}>(key);\n\n\t\tif (cached !== null) {\n\t\t\tctx.response\n\t\t\t\t.status(cached.status)\n\t\t\t\t.type(cached.contentType)\n\t\t\t\t.send(cached.body);\n\t\t\treturn;\n\t\t}\n\n\t\tawait next();\n\n\t\tconst resp = ctx.response as unknown as {\n\t\t\t_body: string | Buffer | null;\n\t\t\t_statusCode: number;\n\t\t};\n\t\tconst body = resp._body;\n\n\t\tif (body !== null && resp._statusCode >= 200 && resp._statusCode < 300) {\n\t\t\tconst contentType =\n\t\t\t\tctx.response.getHeader(\"content-type\") ?? \"text/plain\";\n\t\t\tawait cache.set(\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\tbody: typeof body === \"string\" ? body : body.toString(),\n\t\t\t\t\tstatus: resp._statusCode,\n\t\t\t\t\tcontentType,\n\t\t\t\t},\n\t\t\t\tttl,\n\t\t\t);\n\t\t}\n\t};\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createDriver, type Dialect, type Driver } from \"./driver.js\";\nimport { QueryBuilder } from \"./query.js\";\nimport type {\n\tConnectionConfig,\n\tDatabaseDriver,\n\tQueryResult,\n\tQueryRunner,\n} from \"./types.js\";\n\nexport type { ConnectionConfig, DatabaseDriver, QueryResult };\n\nexport class DatabaseConnection implements QueryRunner {\n\tprivate config: ConnectionConfig;\n\tprivate driver: Driver | null = null;\n\n\tconstructor(config: ConnectionConfig) {\n\t\tthis.config = {\n\t\t\tdriver: \"mysql\",\n\t\t\thost: \"127.0.0.1\",\n\t\t\tcharset: \"utf8mb4\",\n\t\t\tprefix: \"\",\n\t\t\t...config,\n\t\t};\n\n\t\tif (this.config.port === undefined) {\n\t\t\tif (this.config.driver === \"mysql\") this.config.port = 3306;\n\t\t\telse if (this.config.driver === \"postgresql\") this.config.port = 5432;\n\t\t}\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.driver !== null) return;\n\t\tthis.driver = await createDriver(this.config);\n\t\tawait this.driver.connect();\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.driver !== null) {\n\t\t\tawait this.driver.disconnect();\n\t\t\tthis.driver = null;\n\t\t}\n\t}\n\n\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\tthis.ensureConnected();\n\t\treturn this.driver!.raw(sql, bindings);\n\t}\n\n\ttable(tableName: string): QueryBuilder {\n\t\treturn new QueryBuilder(this, `${this.config.prefix ?? \"\"}${tableName}`);\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.driver !== null && this.driver.isConnected();\n\t}\n\n\tgetDriver(): DatabaseDriver {\n\t\treturn (this.config.driver ?? \"mysql\") as DatabaseDriver;\n\t}\n\n\tgetDialect(): Dialect {\n\t\tthis.ensureConnected();\n\t\treturn this.driver!.getDialect();\n\t}\n\n\tgetPrefix(): string {\n\t\treturn this.config.prefix ?? \"\";\n\t}\n\n\tgetConfig(): Readonly<ConnectionConfig> {\n\t\treturn { ...this.config };\n\t}\n\n\tasync transaction<T>(\n\t\tcallback: (trx: DatabaseConnection) => Promise<T>,\n\t): Promise<T> {\n\t\tthis.ensureConnected();\n\n\t\treturn this.driver!.transaction(async (_driver: Driver) => {\n\t\t\tconst trxConnection = new DatabaseConnection(this.config);\n\t\t\ttrxConnection[\"driver\"] = this.driver;\n\n\t\t\ttrxConnection.raw = async (\n\t\t\t\tsql: string,\n\t\t\t\tbindings?: any[],\n\t\t\t): Promise<QueryResult> => {\n\t\t\t\treturn this.driver!.raw(sql, bindings);\n\t\t\t};\n\n\t\t\treturn callback(trxConnection);\n\t\t});\n\t}\n\n\tstatic generateId(): string {\n\t\treturn randomUUID();\n\t}\n\n\tprivate ensureConnected(): void {\n\t\tif (this.driver === null || !this.driver.isConnected()) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Database not connected. Call connect() before performing operations.\",\n\t\t\t);\n\t\t}\n\t}\n}\n","export interface Dialect {\n\twrapIdentifier(identifier: string): string;\n\tmakeParameter(index: number): string;\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string;\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\tbindings: any[],\n\t\tidColumn?: string,\n\t): string;\n\tcompileTruncate(tableName: string): string;\n\tcompileCreateMigrationsTable(): string;\n\tcompileColumn(column: ColumnCompileOptions): string;\n\tcompileModifyColumn(column: ColumnCompileOptions): string;\n\tcompileTableBlueprint(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string;\n\tcompileAddColumns(tableName: string, columns: ColumnCompileOptions[]): string;\n\tcompileDropColumns(tableName: string, columns: string[]): string;\n\tcompileRenameColumn(tableName: string, from: string, to: string): string;\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string;\n\tcompileRenameTable(from: string, to: string): string;\n\tcompileDropTable(tableName: string): string;\n\tcompileDropTableIfExists(tableName: string): string;\n\tcompileHasTable(tableName: string): string;\n\tcompileHasColumn(tableName: string, columnName: string): string;\n\tcompileInsert(sql: string): string;\n}\n\nexport interface ColumnCompileOptions {\n\tname: string;\n\ttype: string;\n\tnullable: boolean;\n\tdefaultValue: any;\n\tunsigned: boolean;\n\tunique: boolean;\n\tprimary: boolean;\n\tindex: boolean;\n\tcomment: string | null;\n\tafter: string | null;\n\tfirst: boolean;\n\tautoIncrement: boolean;\n\tprecision: number | null;\n\tscale: number | null;\n\tlength: number | null;\n\tvalues: string[] | null;\n\tisForeignId: boolean;\n}\n\nexport class MysqlDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\\`${identifier.replace(/`/g, \"``\")}\\``;\n\t}\n\n\tmakeParameter(_index: number): string {\n\t\treturn \"?\";\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn \" LIMIT ? OFFSET ?\";\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn \" LIMIT ?\";\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\t_idColumn?: string,\n\t): string {\n\t\treturn `${sql}; SELECT LAST_INSERT_ID() as id`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `TRUNCATE TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \\`migrations\\` (\n \\`id\\` INT AUTO_INCREMENT PRIMARY KEY,\n \\`name\\` VARCHAR(255) NOT NULL,\n \\`batch\\` INT NOT NULL,\n \\`executed_at\\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"INT AUTO_INCREMENT PRIMARY KEY\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"BIGINT AUTO_INCREMENT PRIMARY KEY\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INT\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"BIGINT\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"TINYINT\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"TINYINT(1)\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"FLOAT\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"DOUBLE\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn `DECIMAL(${options.precision ?? 10},${options.scale ?? 0})`;\n\t\t\tcase \"date\":\n\t\t\t\treturn \"DATE\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"DATETIME\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TIME\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"YEAR\";\n\t\t\tcase \"json\":\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"JSON\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BLOB\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"CHAR(36)\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INT UNSIGNED\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\toptions.unsigned &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\" &&\n\t\t\toptions.type !== \"foreignId\"\n\t\t)\n\t\t\tsql += \" UNSIGNED\";\n\t\tif (\n\t\t\toptions.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" AUTO_INCREMENT\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t} else if (\n\t\t\t!options.nullable &&\n\t\t\t!options.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t) {\n\t\t\tsql += \" NOT NULL\";\n\t\t}\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.primary) sql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\tif (options.comment !== null)\n\t\t\tsql += ` COMMENT '${options.comment.replace(/'/g, \"\\\\'\")}'`;\n\t\tif (options.after !== null)\n\t\t\tsql += ` AFTER ${this.wrapIdentifier(options.after)}`;\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn `MODIFY COLUMN ${this.compileColumn(options)}`;\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD ${columns.map((c) => this.compileColumn(c)).join(\", ADD \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `RENAME TABLE ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(tableName: string): string {\n\t\treturn `DROP TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*) as \\`count\\` FROM \\`information_schema\\`.\\`tables\\` WHERE \\`table_schema\\` = DATABASE() AND \\`table_name\\` = ?`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `SELECT COUNT(*) as \\`count\\` FROM \\`information_schema\\`.\\`columns\\` WHERE \\`table_schema\\` = DATABASE() AND \\`table_name\\` = ? AND \\`column_name\\` = ?`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"\\\\'\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n\t\treturn String(value);\n\t}\n}\n\nexport class SqliteDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tmakeParameter(_index: number): string {\n\t\treturn \"?\";\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn \" LIMIT ? OFFSET ?\";\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn \" LIMIT ?\";\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\t_idColumn?: string,\n\t): string {\n\t\treturn `${sql}; SELECT last_insert_rowid() as id`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `DELETE FROM ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \"migrations\" (\n \"id\" INTEGER PRIMARY KEY AUTOINCREMENT,\n \"name\" TEXT NOT NULL,\n \"batch\" INTEGER NOT NULL,\n \"executed_at\" TEXT DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"INTEGER PRIMARY KEY AUTOINCREMENT\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"INTEGER PRIMARY KEY AUTOINCREMENT\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"date\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"json\":\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BLOB\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\toptions.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" AUTOINCREMENT\";\n\t\tif (\n\t\t\t!options.nullable &&\n\t\t\toptions.defaultValue === undefined &&\n\t\t\t!options.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" NOT NULL\";\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t}\n\t\tif (options.primary) sql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn this.compileColumn(options);\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD COLUMN ${columns.map((c) => this.compileColumn(c)).join(\", ADD COLUMN \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `ALTER TABLE ${this.wrapIdentifier(from)} RENAME TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(tableName: string): string {\n\t\treturn `DROP TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*) as \"count\" FROM \"sqlite_master\" WHERE \"type\" = 'table' AND \"name\" = ?`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `PRAGMA table_info(${this.wrapIdentifier(_tableName)})`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"''\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n\t\treturn String(value);\n\t}\n}\n\nexport class PostgresqlDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tmakeParameter(index: number): string {\n\t\treturn `$${index + 1}`;\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tconst start = bindings.length;\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn ` LIMIT $${start + 1} OFFSET $${start + 2}`;\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn ` LIMIT $${start + 1}`;\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\tidColumn = \"id\",\n\t): string {\n\t\treturn `${sql} RETURNING ${this.wrapIdentifier(idColumn)}`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `TRUNCATE TABLE ${this.wrapIdentifier(tableName)} RESTART IDENTITY CASCADE`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \"migrations\" (\n \"id\" SERIAL PRIMARY KEY,\n \"name\" VARCHAR(255) NOT NULL,\n \"batch\" INTEGER NOT NULL,\n \"executed_at\" TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"SERIAL PRIMARY KEY\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"BIGSERIAL PRIMARY KEY\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"BIGINT\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"BOOLEAN\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"DOUBLE PRECISION\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn `DECIMAL(${options.precision ?? 10},${options.scale ?? 0})`;\n\t\t\tcase \"date\":\n\t\t\t\treturn \"DATE\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TIME\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"json\":\n\t\t\t\treturn \"JSON\";\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"JSONB\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BYTEA\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"UUID\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\t!options.nullable &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" NOT NULL\";\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t}\n\t\tif (\n\t\t\toptions.primary &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\tif (options.comment !== null)\n\t\t\tsql += ` -- ${options.comment.replace(/--/g, \"\")}`;\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn `ALTER COLUMN ${this.wrapIdentifier(options.name)} TYPE ${this.mapType(options.type, options)}`;\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD COLUMN ${columns.map((c) => this.compileColumn(c)).join(\", ADD COLUMN \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `ALTER TABLE ${this.wrapIdentifier(from)} RENAME TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(_tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(_tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*)::int as \"count\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = 'public' AND \"table_name\" = $1`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `SELECT COUNT(*)::int as \"count\" FROM \"information_schema\".\"columns\" WHERE \"table_schema\" = 'public' AND \"table_name\" = $1 AND \"column_name\" = $2`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"''\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n\t\treturn String(value);\n\t}\n}\n\nexport function createDialect(driver: string): Dialect {\n\tswitch (driver) {\n\t\tcase \"mysql\":\n\t\t\treturn new MysqlDialect();\n\t\tcase \"sqlite\":\n\t\t\treturn new SqliteDialect();\n\t\tcase \"postgresql\":\n\t\t\treturn new PostgresqlDialect();\n\t\tdefault:\n\t\t\treturn new MysqlDialect();\n\t}\n}\n","import {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresqlDialect,\n\tSqliteDialect,\n} from \"./dialect.js\";\nexport type { Dialect }\nimport type { ConnectionConfig, QueryResult } from \"./types.js\";\n\nexport interface Driver {\n\tconnect(): Promise<void>;\n\tdisconnect(): Promise<void>;\n\tisConnected(): boolean;\n\traw(sql: string, bindings?: any[]): Promise<QueryResult>;\n\ttransaction<T>(callback: (driver: Driver) => Promise<T>): Promise<T>;\n\tgetDialect(): Dialect;\n\tgetDriver(): string;\n}\n\nexport async function createDriver(config: ConnectionConfig): Promise<Driver> {\n\tconst driverType = config.driver ?? \"mysql\";\n\n\tswitch (driverType) {\n\t\tcase \"mysql\":\n\t\t\treturn createMysqlDriver(config);\n\t\tcase \"postgresql\":\n\t\t\treturn createPostgresqlDriver(config);\n\t\tcase \"sqlite\":\n\t\t\treturn createSqliteDriver(config);\n\t\tdefault:\n\t\t\treturn createMysqlDriver(config);\n\t}\n}\n\nasync function createMysqlDriver(config: ConnectionConfig): Promise<Driver> {\n\tlet mysqlPackage: any;\n\ttry {\n\t\t// @ts-expect-error - mysql2 is an optional runtime dependency\n\t\tmysqlPackage = await import(\"mysql2/promise\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"MySQL driver (mysql2) is not installed. Run: npm install mysql2\",\n\t\t);\n\t}\n\n\tlet pool: any = null;\n\tconst dialect = new MysqlDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tpool = mysqlPackage.createPool({\n\t\t\t\thost: config.host ?? \"127.0.0.1\",\n\t\t\t\tport: config.port ?? 3306,\n\t\t\t\tuser: config.username,\n\t\t\t\tpassword: config.password,\n\t\t\t\tdatabase: config.database,\n\t\t\t\tcharset: config.charset ?? \"utf8mb4\",\n\t\t\t\twaitForConnections: true,\n\t\t\t\tconnectionLimit: 10,\n\t\t\t\tqueueLimit: 0,\n\t\t\t});\n\t\t\t// Verify connection\n\t\t\tconst conn = await pool.getConnection();\n\t\t\tconn.release();\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (pool !== null) {\n\t\t\t\tawait pool.end();\n\t\t\t\tpool = null;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn pool !== null;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst [rows, fields] = await pool.execute(sql, bindings ?? []);\n\t\t\treturn { rows, fields };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (pool === null) throw new Error(\"Database not connected.\");\n\t\t\tconst conn = await pool.getConnection();\n\t\t\ttry {\n\t\t\t\tawait conn.beginTransaction();\n\t\t\t\tconst trxDriver: Driver = {\n\t\t\t\t\t...driver,\n\t\t\t\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\t\t\t\tconst [rows, fields] = await conn.execute(sql, bindings ?? []);\n\t\t\t\t\t\treturn { rows, fields };\n\t\t\t\t\t},\n\t\t\t\t\tgetDialect(): Dialect { return dialect; },\n\t\t\t\t\tgetDriver(): string { return \"mysql\"; },\n\t\t\t\t};\n\t\t\t\tconst result = await callback(trxDriver);\n\t\t\t\tawait conn.commit();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tawait conn.rollback();\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tconn.release();\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"mysql\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n\nasync function createPostgresqlDriver(\n\tconfig: ConnectionConfig,\n): Promise<Driver> {\n\tlet pgPackage: any;\n\ttry {\n\t\t// @ts-expect-error - pg is an optional runtime dependency\n\t\tpgPackage = await import(\"pg\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"PostgreSQL driver (pg) is not installed. Run: npm install pg\",\n\t\t);\n\t}\n\n\tlet pool: any = null;\n\tconst dialect = new PostgresqlDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tconst { Pool } = pgPackage;\n\t\t\tpool = new Pool({\n\t\t\t\thost: config.host ?? \"127.0.0.1\",\n\t\t\t\tport: config.port ?? 5432,\n\t\t\t\tuser: config.username,\n\t\t\t\tpassword: config.password,\n\t\t\t\tdatabase: config.database,\n\t\t\t});\n\t\t\tawait pool.query(\"SELECT 1\");\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (pool !== null) {\n\t\t\t\tawait pool.end();\n\t\t\t\tpool = null;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn pool !== null;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst result = await pool.query(sql, bindings ?? []);\n\t\t\treturn { rows: result.rows };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst client = await pool.connect();\n\t\t\ttry {\n\t\t\t\tawait client.query(\"BEGIN\");\n\t\t\t\tconst trxDriver: Driver = {\n\t\t\t\t\t...driver,\n\t\t\t\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\t\t\t\tconst result = await client.query(sql, bindings ?? []);\n\t\t\t\t\t\treturn { rows: result.rows };\n\t\t\t\t\t},\n\t\t\t\t\tgetDialect(): Dialect {\n\t\t\t\t\t\treturn dialect;\n\t\t\t\t\t},\n\t\t\t\t\tgetDriver(): string {\n\t\t\t\t\t\treturn \"postgresql\";\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst result = await callback(trxDriver);\n\t\t\t\tawait client.query(\"COMMIT\");\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tawait client.query(\"ROLLBACK\");\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"postgresql\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n\nasync function createSqliteDriver(config: ConnectionConfig): Promise<Driver> {\n\tlet sqlitePackage: any;\n\ttry {\n\t\t// @ts-expect-error - better-sqlite3 is an optional runtime dependency\n\t\tsqlitePackage = await import(\"better-sqlite3\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"SQLite driver (better-sqlite3) is not installed. Run: npm install better-sqlite3\",\n\t\t);\n\t}\n\n\tlet db: any = null;\n\tlet connected = false;\n\tconst dialect = new SqliteDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tdb = new sqlitePackage(config.database);\n\t\t\tdb.pragma(\"journal_mode = WAL\");\n\t\t\tconnected = true;\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (db !== null) {\n\t\t\t\tdb.close();\n\t\t\t\tdb = null;\n\t\t\t\tconnected = false;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn connected;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (db === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst trimmedSQL = sql.trim().toUpperCase();\n\t\t\tconst isQuery =\n\t\t\t\ttrimmedSQL.startsWith(\"SELECT\") ||\n\t\t\t\ttrimmedSQL.startsWith(\"WITH\") ||\n\t\t\t\ttrimmedSQL.startsWith(\"PRAGMA\");\n\t\t\tconst stmt = db.prepare(sql);\n\t\t\tif (isQuery) {\n\t\t\t\tconst rows =\n\t\t\t\t\tbindings !== undefined && bindings.length > 0\n\t\t\t\t\t\t? stmt.all(...bindings)\n\t\t\t\t\t\t: stmt.all();\n\t\t\t\treturn { rows };\n\t\t\t}\n\t\t\tif (bindings !== undefined && bindings.length > 0) {\n\t\t\t\tstmt.run(...bindings);\n\t\t\t} else {\n\t\t\t\tstmt.run();\n\t\t\t}\n\t\t\treturn { rows: [] };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (db === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tdb.exec(\"BEGIN\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(driver);\n\t\t\t\tdb.exec(\"COMMIT\");\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tdb.exec(\"ROLLBACK\");\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"sqlite\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n","import type { Dialect } from \"./dialect.js\";\nimport type { JoinType, OrderDirection, QueryRunner } from \"./types.js\";\n\ninterface WhereClause {\n\ttype:\n\t\t| \"basic\"\n\t\t| \"in\"\n\t\t| \"notIn\"\n\t\t| \"null\"\n\t\t| \"notNull\"\n\t\t| \"between\"\n\t\t| \"notBetween\"\n\t\t| \"like\"\n\t\t| \"nested\";\n\tcolumn?: string;\n\toperator?: string;\n\tvalue?: any;\n\tvalues?: any[];\n\tboolean: \"and\" | \"or\";\n\tnested?: WhereClause[];\n}\n\ninterface JoinClause {\n\ttable: string;\n\tfirst: string;\n\toperator: string;\n\tsecond: string;\n\ttype: JoinType;\n}\n\ninterface OrderByClause {\n\tcolumn: string;\n\tdirection: OrderDirection;\n}\n\ninterface HavingClause {\n\tcolumn: string;\n\toperator: string;\n\tvalue: any;\n}\n\nexport interface PaginatedResult<T = any> {\n\tdata: T[];\n\tcurrentPage: number;\n\tperPage: number;\n\ttotal: number;\n\tlastPage: number;\n\tfrom: number;\n\tto: number;\n\thasMore: boolean;\n\thasPrev: boolean;\n\tisEmpty: boolean;\n}\n\nexport class QueryBuilder {\n\tprivate connection: QueryRunner;\n\tprivate tableName: string;\n\tprivate columns: string[] = [\"*\"];\n\tprivate distinctEnabled = false;\n\tprivate wheres: WhereClause[] = [];\n\tprivate joins: JoinClause[] = [];\n\tprivate orderBys: OrderByClause[] = [];\n\tprivate havings: HavingClause[] = [];\n\tprivate groupBys: string[] = [];\n\tprivate limitValue: number | null = null;\n\tprivate offsetValue: number | null = null;\n\tprivate fromSubquery: string | null = null;\n\n\tconstructor(connection: QueryRunner, tableName: string) {\n\t\tthis.connection = connection;\n\t\tthis.tableName = tableName;\n\t}\n\n\tselect(...columns: string[]): this {\n\t\tthis.columns = columns.length > 0 ? columns : [\"*\"];\n\t\treturn this;\n\t}\n\n\taddSelect(...columns: string[]): this {\n\t\tif (this.columns[0] === \"*\") {\n\t\t\tthis.columns = columns;\n\t\t} else {\n\t\t\tthis.columns.push(...columns);\n\t\t}\n\t\treturn this;\n\t}\n\n\tdistinct(): this {\n\t\tthis.distinctEnabled = true;\n\t\treturn this;\n\t}\n\n\tfrom(table: string): this {\n\t\tthis.fromSubquery = table;\n\t\treturn this;\n\t}\n\n\twhere(column: string, operator: any, value?: any): this {\n\t\tif (value === undefined) {\n\t\t\tvalue = operator;\n\t\t\toperator = \"=\";\n\t\t}\n\t\tthis.wheres.push({\n\t\t\ttype: \"basic\",\n\t\t\tcolumn,\n\t\t\toperator: String(operator),\n\t\t\tvalue,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\torWhere(column: string, operator: any, value?: any): this {\n\t\tif (value === undefined) {\n\t\t\tvalue = operator;\n\t\t\toperator = \"=\";\n\t\t}\n\t\tthis.wheres.push({\n\t\t\ttype: \"basic\",\n\t\t\tcolumn,\n\t\t\toperator: String(operator),\n\t\t\tvalue,\n\t\t\tboolean: \"or\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereIn(column: string, values: any[]): this {\n\t\tthis.wheres.push({ type: \"in\", column, values, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNotIn(column: string, values: any[]): this {\n\t\tthis.wheres.push({ type: \"notIn\", column, values, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNull(column: string): this {\n\t\tthis.wheres.push({ type: \"null\", column, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNotNull(column: string): this {\n\t\tthis.wheres.push({ type: \"notNull\", column, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereBetween(column: string, range: [any, any]): this {\n\t\tthis.wheres.push({\n\t\t\ttype: \"between\",\n\t\t\tcolumn,\n\t\t\tvalues: range,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereNotBetween(column: string, range: [any, any]): this {\n\t\tthis.wheres.push({\n\t\t\ttype: \"notBetween\",\n\t\t\tcolumn,\n\t\t\tvalues: range,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereLike(column: string, pattern: string): this {\n\t\tthis.wheres.push({ type: \"like\", column, value: pattern, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\torWhereLike(column: string, pattern: string): this {\n\t\tthis.wheres.push({ type: \"like\", column, value: pattern, boolean: \"or\" });\n\t\treturn this;\n\t}\n\n\twhereGroup(callback: (query: QueryBuilder) => void): this {\n\t\tconst subQuery = new QueryBuilder(this.connection, this.tableName);\n\t\tcallback(subQuery);\n\t\tthis.wheres.push({\n\t\t\ttype: \"nested\",\n\t\t\tnested: subQuery.wheres,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\tjoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t\ttype: JoinType = \"inner\",\n\t): this {\n\t\tthis.joins.push({ table, first, operator, second, type });\n\t\treturn this;\n\t}\n\n\tleftJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"left\");\n\t}\n\n\trightJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"right\");\n\t}\n\n\tcrossJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"cross\");\n\t}\n\n\torderBy(column: string, direction: OrderDirection = \"asc\"): this {\n\t\tthis.orderBys.push({ column, direction });\n\t\treturn this;\n\t}\n\n\torderByDesc(column: string): this {\n\t\treturn this.orderBy(column, \"desc\");\n\t}\n\n\tlatest(column = \"created_at\"): this {\n\t\treturn this.orderBy(column, \"desc\");\n\t}\n\n\toldest(column = \"created_at\"): this {\n\t\treturn this.orderBy(column, \"asc\");\n\t}\n\n\tinRandomOrder(): this {\n\t\tthis.orderBys.push({ column: \"RANDOM()\", direction: \"asc\" });\n\t\treturn this;\n\t}\n\n\tlimit(limit: number): this {\n\t\tthis.limitValue = limit;\n\t\treturn this;\n\t}\n\n\toffset(offset: number): this {\n\t\tthis.offsetValue = offset;\n\t\treturn this;\n\t}\n\n\tskip(skip: number): this {\n\t\treturn this.offset(skip);\n\t}\n\n\ttake(take: number): this {\n\t\treturn this.limit(take);\n\t}\n\n\tgroupBy(...columns: string[]): this {\n\t\tthis.groupBys.push(...columns);\n\t\treturn this;\n\t}\n\n\thaving(column: string, operator: string, value: any): this {\n\t\tthis.havings.push({ column, operator, value });\n\t\treturn this;\n\t}\n\n\tasync get<T = any>(): Promise<T[]> {\n\t\tconst { sql, bindings } = this.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn result.rows as T[];\n\t}\n\n\tasync first<T = any>(): Promise<T | null> {\n\t\tconst qb = this.clone();\n\t\tqb.limitValue = 1;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn (result.rows.length > 0 ? result.rows[0] : null) as T | null;\n\t}\n\n\tasync find<T = any>(id: number | string): Promise<T | null> {\n\t\treturn this.where(\"id\", id).first<T>();\n\t}\n\n\tasync pluck(column: string): Promise<any[]> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [column];\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn result.rows.map((row: any) => row[column]);\n\t}\n\n\tasync count(column = \"*\"): Promise<number> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [\n\t\t\t`COUNT(${column === \"*\" ? \"*\" : this.wrap(column)}) as aggregate`,\n\t\t];\n\t\tqb.orderBys = [];\n\t\tqb.limitValue = null;\n\t\tqb.offsetValue = null;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst row = result.rows[0];\n\t\tif (!row) return 0;\n\t\treturn Number(row.aggregate ?? row.count ?? row[\"COUNT(*)\"] ?? 0);\n\t}\n\n\tasync exists(): Promise<boolean> {\n\t\tconst count = await this.count();\n\t\treturn count > 0;\n\t}\n\n\tasync doesntExist(): Promise<boolean> {\n\t\treturn !(await this.exists());\n\t}\n\n\tasync max(column: string): Promise<number | null> {\n\t\treturn this.aggregate(\"MAX\", column);\n\t}\n\n\tasync min(column: string): Promise<number | null> {\n\t\treturn this.aggregate(\"MIN\", column);\n\t}\n\n\tasync sum(column: string): Promise<number> {\n\t\tconst result = await this.aggregate(\"SUM\", column);\n\t\treturn result ?? 0;\n\t}\n\n\tasync avg(column: string): Promise<number> {\n\t\tconst result = await this.aggregate(\"AVG\", column);\n\t\treturn result ?? 0;\n\t}\n\n\tasync paginate(perPage = 15, page = 1): Promise<PaginatedResult> {\n\t\tconst countQb = this.clone();\n\t\tconst total = await countQb.count();\n\n\t\tconst lastPage = Math.max(1, Math.ceil(total / perPage));\n\t\tconst currentPage = Math.max(1, Math.min(page, lastPage));\n\t\tconst fromVal = (currentPage - 1) * perPage + 1;\n\t\tconst toVal = Math.min(currentPage * perPage, total);\n\n\t\tconst qb = this.clone();\n\t\tqb.limitValue = perPage;\n\t\tqb.offsetValue = (currentPage - 1) * perPage;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\n\t\treturn {\n\t\t\tdata: result.rows,\n\t\t\tcurrentPage,\n\t\t\tperPage,\n\t\t\ttotal,\n\t\t\tlastPage,\n\t\t\tfrom: total > 0 ? fromVal : 0,\n\t\t\tto: total > 0 ? toVal : 0,\n\t\t\thasMore: currentPage < lastPage,\n\t\t\thasPrev: currentPage > 1,\n\t\t\tisEmpty: total === 0,\n\t\t};\n\t}\n\n\tasync insert(data: Record<string, any>): Promise<number | string> {\n\t\tconst { sql, bindings } = this.compileInsert(data);\n\t\tconst driverType = this.connection.getDriver();\n\t\tconst dialect = this.connection.getDialect();\n\n\t\t// PostgreSQL: use RETURNING clause\n\t\tif (driverType === \"postgresql\") {\n\t\t\tconst returningSQL = dialect.compileInsertReturning(sql, bindings);\n\t\t\tconst result = await this.connection.raw(returningSQL, bindings);\n\t\t\treturn result.rows.length > 0 ? (Number(result.rows[0].id) ?? 0) : 0;\n\t\t}\n\n\t\tconst result = await this.connection.raw(sql, bindings);\n\n\t\t// MySQL: mysql2 returns [ResultSetHeader] with insertId\n\t\tif (driverType === \"mysql\") {\n\t\t\tconst header = result.rows;\n\t\t\t// mysql2 ResultSetHeader has insertId directly\n\t\t\tif (header && typeof header === 'object' && 'insertId' in header) {\n\t\t\t\treturn Number((header as any).insertId) ?? 0;\n\t\t\t}\n\t\t\t// Fallback: check rows[0]\n\t\t\tif (Array.isArray(result.rows) && result.rows.length > 0) {\n\t\t\t\tconst row = result.rows[0];\n\t\t\t\treturn Number(row?.insertId ?? row?.id ?? 0);\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\t// SQLite: last_insert_rowid()\n\t\tif (driverType === \"sqlite\") {\n\t\t\tconst lastIdResult = await this.connection.raw(\"SELECT last_insert_rowid() as id\");\n\t\t\tif (lastIdResult.rows.length > 0) {\n\t\t\t\treturn Number(lastIdResult.rows[0].id) ?? 0;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Fallback: return 0\n\t\treturn 0;\n\t}\n\n\tasync insertGetId(data: Record<string, any>): Promise<number | string> {\n\t\treturn this.insert(data);\n\t}\n\n\tasync insertReturning(data: Record<string, any>): Promise<any> {\n\t\tconst { sql, bindings } = this.compileInsert(data);\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst returningSQL = dialect.compileInsertReturning(sql, bindings);\n\t\tconst result = await this.connection.raw(returningSQL, bindings);\n\t\treturn result.rows.length > 0 ? result.rows[0] : null;\n\t}\n\n\tasync update(data: Record<string, any>): Promise<number> {\n\t\tconst { sql, bindings } = this.compileUpdate(data);\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst rows = result.rows;\n\t\tif (rows.length > 0) {\n\t\t\tconst info = rows[0];\n\t\t\treturn info.affectedRows ?? info.changes ?? rows.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tasync delete(): Promise<number> {\n\t\tconst { sql, bindings } = this.compileDelete();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst rows = result.rows;\n\t\tif (rows.length > 0) {\n\t\t\tconst info = rows[0];\n\t\t\treturn info.affectedRows ?? info.changes ?? rows.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tasync truncate(): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileTruncate(this.tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync chunk(\n\t\tsize: number,\n\t\tcallback: (rows: any[]) => Promise<void>,\n\t): Promise<void> {\n\t\tlet page = 1;\n\t\tlet hasMore = true;\n\n\t\twhile (hasMore) {\n\t\t\tconst qb = this.clone();\n\t\t\tqb.limitValue = size;\n\t\t\tqb.offsetValue = (page - 1) * size;\n\t\t\tconst rows = await qb.get();\n\n\t\t\tif (rows.length === 0) {\n\t\t\t\thasMore = false;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tawait callback(rows);\n\n\t\t\tif (rows.length < size) {\n\t\t\t\thasMore = false;\n\t\t\t}\n\n\t\t\tpage++;\n\t\t}\n\t}\n\n\tclone(): QueryBuilder {\n\t\tconst qb = new QueryBuilder(this.connection, this.tableName);\n\t\tqb.columns = [...this.columns];\n\t\tqb.distinctEnabled = this.distinctEnabled;\n\t\tqb.wheres = this.cloneWheres(this.wheres);\n\t\tqb.joins = [...this.joins];\n\t\tqb.orderBys = [...this.orderBys];\n\t\tqb.havings = [...this.havings];\n\t\tqb.groupBys = [...this.groupBys];\n\t\tqb.limitValue = this.limitValue;\n\t\tqb.offsetValue = this.offsetValue;\n\t\tqb.fromSubquery = this.fromSubquery;\n\t\treturn qb;\n\t}\n\n\ttoSQL(): { sql: string; bindings: any[] } {\n\t\tconst bindings: any[] = [];\n\t\tconst dialect = this.connection.getDialect();\n\n\t\tconst wrappedColumns = this.columns\n\t\t\t.map((c) =>\n\t\t\t\tc.includes(\"(\") || c === \"*\" || c.includes(\" as \") || c.includes(\" AS \")\n\t\t\t\t\t? c\n\t\t\t\t\t: dialect.wrapIdentifier(c),\n\t\t\t)\n\t\t\t.join(\", \");\n\n\t\tconst from = this.fromSubquery ?? this.tableName;\n\t\tconst wrappedFrom = this.fromSubquery ?? dialect.wrapIdentifier(from);\n\n\t\tlet sql = this.distinctEnabled\n\t\t\t? `SELECT DISTINCT ${wrappedColumns} FROM ${wrappedFrom}`\n\t\t\t: `SELECT ${wrappedColumns} FROM ${wrappedFrom}`;\n\n\t\tconst joinSQL = this.compileJoins(dialect);\n\t\tif (joinSQL) sql += joinSQL;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.groupBys.length > 0) {\n\t\t\tsql += ` GROUP BY ${this.groupBys.map((c) => dialect.wrapIdentifier(c)).join(\", \")}`;\n\t\t}\n\n\t\tconst havingSQL = this.compileHavings(dialect, bindings);\n\t\tif (havingSQL) sql += havingSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tdd(): string {\n\t\tconst { sql, bindings } = this.toSQL();\n\t\tconst output = `SQL: ${sql}\\nBindings: ${JSON.stringify(bindings)}`;\n\t\tconsole.error(output);\n\t\treturn output;\n\t}\n\n\tprivate compileJoins(dialect: Dialect): string {\n\t\tif (this.joins.length === 0) return \"\";\n\n\t\treturn (\n\t\t\t\" \" +\n\t\t\tthis.joins\n\t\t\t\t.map((j) => {\n\t\t\t\t\tconst type = j.type.toUpperCase();\n\t\t\t\t\treturn `${type} JOIN ${dialect.wrapIdentifier(j.table)} ON ${dialect.wrapIdentifier(j.first)} ${j.operator} ${this.wrap(j.second)}`;\n\t\t\t\t})\n\t\t\t\t.join(\" \")\n\t\t);\n\t}\n\n\tprivate compileWheres(dialect: Dialect, bindings: any[]): string {\n\t\tif (this.wheres.length === 0) return \"\";\n\n\t\tconst sql = this.compileWhereArray(this.wheres, dialect, bindings);\n\t\treturn sql ? ` WHERE ${sql}` : \"\";\n\t}\n\n\tprivate compileWhereArray(\n\t\twheres: WhereClause[],\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string {\n\t\tif (wheres.length === 0) return \"\";\n\t\tconst parts: string[] = [];\n\t\tfor (const w of wheres) {\n\t\t\tconst sql = this.compileSingleWhere(w, dialect, bindings);\n\t\t\tif (sql !== null) parts.push(sql);\n\t\t}\n\t\tif (parts.length === 0) return \"\";\n\t\t// Join with the boolean from each WHERE clause (respecting \"and\"/\"or\")\n\t\treturn parts.reduce((acc, part, i) => {\n\t\t\tif (i === 0) return part;\n\t\t\tconst bool = wheres[i]?.boolean ?? \"and\";\n\t\t\treturn `${acc} ${bool.toUpperCase()} ${part}`;\n\t\t}, \"\");\n\t}\n\n\tprivate compileSingleWhere(\n\t\tw: WhereClause,\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string | null {\n\t\tconst col = w.column ? dialect.wrapIdentifier(w.column) : \"\";\n\n\t\tswitch (w.type) {\n\t\t\tcase \"basic\": {\n\t\t\t\tbindings.push(w.value);\n\t\t\t\tconst operator = w.operator === \"=\" ? \"=\" : w.operator;\n\t\t\t\treturn `${col} ${operator} ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"in\": {\n\t\t\t\tconst placeholders = w\n\t\t\t\t\t.values!.map((v: any) => {\n\t\t\t\t\t\tbindings.push(v);\n\t\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t\t})\n\t\t\t\t\t.join(\", \");\n\t\t\t\treturn `${col} IN (${placeholders})`;\n\t\t\t}\n\t\t\tcase \"notIn\": {\n\t\t\t\tconst placeholders = w\n\t\t\t\t\t.values!.map((v: any) => {\n\t\t\t\t\t\tbindings.push(v);\n\t\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t\t})\n\t\t\t\t\t.join(\", \");\n\t\t\t\treturn `${col} NOT IN (${placeholders})`;\n\t\t\t}\n\t\t\tcase \"null\":\n\t\t\t\treturn `${col} IS NULL`;\n\t\t\tcase \"notNull\":\n\t\t\t\treturn `${col} IS NOT NULL`;\n\t\t\tcase \"between\": {\n\t\t\t\tbindings.push(w.values![0], w.values![1]);\n\t\t\t\treturn `${col} BETWEEN ${dialect.makeParameter(bindings.length - 2)} AND ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"notBetween\": {\n\t\t\t\tbindings.push(w.values![0], w.values![1]);\n\t\t\t\treturn `${col} NOT BETWEEN ${dialect.makeParameter(bindings.length - 2)} AND ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"like\": {\n\t\t\t\tbindings.push(w.value);\n\t\t\t\treturn `${col} LIKE ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"nested\": {\n\t\t\t\tconst nestedSQL = this.compileNestedWhere(w.nested!, dialect, bindings);\n\t\t\t\treturn nestedSQL ? `(${nestedSQL})` : null;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate compileNestedWhere(\n\t\twheres: WhereClause[],\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string {\n\t\tif (wheres.length === 0) return \"\";\n\t\tconst parts: string[] = [];\n\t\tfor (const w of wheres) {\n\t\t\tconst sql = this.compileSingleWhere(w, dialect, bindings);\n\t\t\tif (sql !== null) parts.push(sql);\n\t\t}\n\t\tif (parts.length === 0) return \"\";\n\t\treturn parts.reduce((acc, part, i) => {\n\t\t\tif (i === 0) return part;\n\t\t\tconst bool = wheres[i]?.boolean ?? \"and\";\n\t\t\treturn `${acc} ${bool.toUpperCase()} ${part}`;\n\t\t}, \"\");\n\t}\n\n\tprivate compileHavings(dialect: Dialect, bindings: any[]): string {\n\t\tif (this.havings.length === 0) return \"\";\n\n\t\tconst parts = this.havings.map((h) => {\n\t\t\tbindings.push(h.value);\n\t\t\treturn `${dialect.wrapIdentifier(h.column)} ${h.operator} ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t});\n\n\t\treturn ` HAVING ${parts.join(\" AND \")}`;\n\t}\n\n\tprivate compileInsert(data: Record<string, any>): {\n\t\tsql: string;\n\t\tbindings: any[];\n\t} {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst columns = Object.keys(data);\n\t\tconst values = Object.values(data);\n\t\tconst bindings: any[] = [];\n\n\t\tconst placeholders = values\n\t\t\t.map((v: any) => {\n\t\t\t\tbindings.push(v);\n\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t})\n\t\t\t.join(\", \");\n\n\t\tconst sql = `INSERT INTO ${dialect.wrapIdentifier(this.tableName)} (${columns.map((c) => dialect.wrapIdentifier(c)).join(\", \")}) VALUES (${placeholders})`;\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate compileUpdate(data: Record<string, any>): {\n\t\tsql: string;\n\t\tbindings: any[];\n\t} {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst bindings: any[] = [];\n\n\t\tconst sets = Object.entries(data).map(([key, value]) => {\n\t\t\tbindings.push(value);\n\t\t\treturn `${dialect.wrapIdentifier(key)} = ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t});\n\n\t\tlet sql = `UPDATE ${dialect.wrapIdentifier(this.tableName)} SET ${sets.join(\", \")}`;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate compileDelete(): { sql: string; bindings: any[] } {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst bindings: any[] = [];\n\n\t\tlet sql = `DELETE FROM ${dialect.wrapIdentifier(this.tableName)}`;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate async aggregate(fn: string, column: string): Promise<number | null> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [`${fn}(${this.wrap(column)}) as aggregate`];\n\t\tqb.orderBys = [];\n\t\tqb.limitValue = null;\n\t\tqb.offsetValue = null;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst row = result.rows[0];\n\t\tif (!row) return null;\n\t\tconst val = row.aggregate ?? row[`${fn}(${column})`];\n\t\treturn val !== null && val !== undefined ? Number(val) : null;\n\t}\n\n\tprivate cloneWheres(wheres: WhereClause[]): WhereClause[] {\n\t\treturn wheres.map((w) => ({\n\t\t\t...w,\n\t\t\tvalues: w.values ? [...w.values] : undefined,\n\t\t\tnested: w.nested ? this.cloneWheres(w.nested) : undefined,\n\t\t}));\n\t}\n\n\tprivate wrap(identifier: string): string {\n\t\tif (identifier === \"*\" || identifier.includes(\"(\")) return identifier;\n\t\tconst dialect = this.connection.getDialect();\n\t\treturn dialect.wrapIdentifier(identifier);\n\t}\n}\n","import type { DatabaseConnection } from \"./connection.js\";\nimport type { ColumnCompileOptions, Dialect } from \"./dialect.js\";\nimport type { QueryResult } from \"./types.js\";\n\nexport interface MigrationDefinition {\n\tname: string;\n\tup: (schema: SchemaBuilder) => Promise<void>;\n\tdown: (schema: SchemaBuilder) => Promise<void>;\n}\n\nexport interface MigrationStatusRow {\n\tname: string;\n\tbatch: number;\n\texecutedAt: string;\n}\n\nexport class SchemaBuilder {\n\tprivate connection: DatabaseConnection;\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\tasync createTable(\n\t\ttableName: string,\n\t\tcallback: (table: TableBlueprint) => void,\n\t): Promise<void> {\n\t\tconst blueprint = new TableBlueprint(this.connection, \"create\");\n\t\tcallback(blueprint);\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst columns = blueprint.compileColumns();\n\t\tconst constraints = blueprint.compileConstraints(dialect);\n\t\tconst sql = dialect.compileCreateTable(tableName, columns, constraints);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync dropTable(tableName: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileDropTable(tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync dropTableIfExists(tableName: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileDropTableIfExists(tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync renameTable(from: string, to: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileRenameTable(from, to);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync alterTable(\n\t\ttableName: string,\n\t\tcallback: (table: TableBlueprint) => void,\n\t): Promise<void> {\n\t\tconst blueprint = new TableBlueprint(this.connection, \"alter\");\n\t\tcallback(blueprint);\n\t\tconst dialect = this.connection.getDialect();\n\n\t\tif (blueprint.droppedColumns.length > 0) {\n\t\t\tconst dropSQL = dialect.compileDropColumns(\n\t\t\t\ttableName,\n\t\t\t\tblueprint.droppedColumns,\n\t\t\t);\n\t\t\tawait this.connection.raw(\n\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${dropSQL}`,\n\t\t\t);\n\t\t}\n\n\t\tif (blueprint.renamedColumns.length > 0) {\n\t\t\tfor (const { from, to } of blueprint.renamedColumns) {\n\t\t\t\tconst renameSQL = dialect.compileRenameColumn(tableName, from, to);\n\t\t\t\tawait this.connection.raw(\n\t\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${renameSQL}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst compiledColumns = blueprint.compileColumnDefinitions(dialect);\n\t\tif (compiledColumns.length > 0) {\n\t\t\tfor (const colSQL of compiledColumns) {\n\t\t\t\tawait this.connection.raw(\n\t\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${colSQL}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync hasTable(tableName: string): Promise<boolean> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileHasTable(tableName);\n\t\tconst result = await this.connection.raw(sql, [tableName]);\n\t\treturn this.parseCount(result) > 0;\n\t}\n\n\tasync hasColumn(tableName: string, columnName: string): Promise<boolean> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst driver = this.connection.getDriver();\n\n\t\tif (driver === \"sqlite\") {\n\t\t\tconst sql = dialect.compileHasColumn(tableName, columnName);\n\t\t\tconst result = await this.connection.raw(sql);\n\t\t\treturn result.rows.some((row: any) => row.name === columnName);\n\t\t}\n\n\t\tconst sql = dialect.compileHasColumn(tableName, columnName);\n\t\tconst result = await this.connection.raw(sql, [tableName, columnName]);\n\t\treturn this.parseCount(result) > 0;\n\t}\n\n\tprivate parseCount(result: QueryResult): number {\n\t\tif (result.rows.length === 0) return 0;\n\t\tconst row = result.rows[0];\n\t\treturn Number(row.count ?? row.Count ?? 0);\n\t}\n}\n\nexport type BlueprintMode = \"create\" | \"alter\";\n\nexport class TableBlueprint {\n\tprivate mode: BlueprintMode;\n\tprivate columns: ColumnDefinition[] = [];\n\tprivate primaryKeys: string[] = [];\n\tprivate uniqueKeys: string[][] = [];\n\tprivate indexKeys: string[][] = [];\n\tprivate foreignKeys: ForeignKeyDef[] = [];\n\tdroppedColumns: string[] = [];\n\trenamedColumns: { from: string; to: string }[] = [];\n\n\tconstructor(_connection: DatabaseConnection, mode: BlueprintMode) {\n\t\tthis.mode = mode;\n\t}\n\n\tid(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"id\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tincrements(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"increments\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tbigIncrements(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"bigIncrements\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tstring(name: string, length = 255): ColumnDefinition {\n\t\tconst col = this.addColumn(\"string\", name);\n\t\tcol.setLength(length);\n\t\treturn col;\n\t}\n\n\ttext(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"text\", name);\n\t}\n\n\tinteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"integer\", name);\n\t}\n\n\tbigInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"bigInteger\", name);\n\t}\n\n\ttinyInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"tinyInteger\", name);\n\t}\n\n\tsmallInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"smallInteger\", name);\n\t}\n\n\tboolean(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"boolean\", name);\n\t}\n\n\tfloat(name: string, _precision?: number): ColumnDefinition {\n\t\tconst col = this.addColumn(\"float\", name);\n\t\tif (_precision !== undefined) col.setPrecision(_precision);\n\t\treturn col;\n\t}\n\n\tdouble(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"double\", name);\n\t}\n\n\tdecimal(name: string, precision = 10, scale = 0): ColumnDefinition {\n\t\tconst col = this.addColumn(\"decimal\", name);\n\t\tcol.setPrecision(precision);\n\t\tcol.setScale(scale);\n\t\treturn col;\n\t}\n\n\tdate(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"date\", name);\n\t}\n\n\tdatetime(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"datetime\", name);\n\t}\n\n\ttimestamp(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"timestamp\", name);\n\t}\n\n\ttime(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"time\", name);\n\t}\n\n\tyear(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"year\", name);\n\t}\n\n\tjson(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"json\", name);\n\t}\n\n\tjsonb(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"jsonb\", name);\n\t}\n\n\tbinary(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"binary\", name);\n\t}\n\n\tuuid(name = \"uuid\"): ColumnDefinition {\n\t\treturn this.addColumn(\"uuid\", name);\n\t}\n\n\tenum(name: string, values: string[]): ColumnDefinition {\n\t\tconst col = this.addColumn(\"enum\", name);\n\t\tcol.setValues(values);\n\t\treturn col;\n\t}\n\n\tforeignId(name: string): ColumnDefinition {\n\t\tconst col = this.addColumn(\"foreignId\", name);\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tprimary(...columns: string[]): void {\n\t\tthis.primaryKeys.push(...columns);\n\t}\n\n\tunique(...columns: string[]): void {\n\t\tthis.uniqueKeys.push(columns);\n\t}\n\n\tindex(...columns: string[]): void {\n\t\tthis.indexKeys.push(columns);\n\t}\n\n\tforeign(column: string): ForeignKeyDefinition {\n\t\tconst fk: ForeignKeyDef = {\n\t\t\tcolumn,\n\t\t\treferences: \"\",\n\t\t\ton: \"\",\n\t\t\tonDelete: null,\n\t\t\tonUpdate: null,\n\t\t};\n\t\tthis.foreignKeys.push(fk);\n\t\treturn new ForeignKeyDefinition(fk);\n\t}\n\n\ttimestamps(): void {\n\t\tthis.timestamp(\"created_at\").nullable();\n\t\tthis.timestamp(\"updated_at\").nullable();\n\t}\n\n\tsoftDeletes(): void {\n\t\tthis.timestamp(\"deleted_at\").nullable();\n\t}\n\n\trememberToken(): void {\n\t\tthis.string(\"remember_token\", 100).nullable();\n\t}\n\n\tdropColumn(column: string): void {\n\t\tthis.droppedColumns.push(column);\n\t}\n\n\trenameColumn(from: string, to: string): void {\n\t\tthis.renamedColumns.push({ from, to });\n\t}\n\n\tdropPrimary(): void {\n\t\tthis.primaryKeys = [];\n\t}\n\n\tdropUnique(_indexName?: string): void {\n\t\tthis.uniqueKeys = [];\n\t}\n\n\tdropIndex(_indexName?: string): void {\n\t\tthis.indexKeys = [];\n\t}\n\n\tdropForeign(_indexName?: string): void {\n\t\tthis.foreignKeys = [];\n\t}\n\n\tdropTimestamps(): void {\n\t\tthis.droppedColumns.push(\"created_at\", \"updated_at\");\n\t}\n\n\tdropSoftDeletes(): void {\n\t\tthis.droppedColumns.push(\"deleted_at\");\n\t}\n\n\tdropRememberToken(): void {\n\t\tthis.droppedColumns.push(\"remember_token\");\n\t}\n\n\tcompileColumns(): ColumnCompileOptions[] {\n\t\treturn this.columns\n\t\t\t.filter((c) => this.mode === \"create\" || c.isNew)\n\t\t\t.map((c) => c.compile());\n\t}\n\n\tcompileConstraints(dialect: Dialect): string[] {\n\t\tconst constraints: string[] = [];\n\t\tconst wrap = (name: string) => dialect.wrapIdentifier(name);\n\n\t\tfor (const pk of this.primaryKeys) {\n\t\t\tconstraints.push(`PRIMARY KEY (${wrap(pk)})`);\n\t\t}\n\n\t\tfor (const uk of this.uniqueKeys) {\n\t\t\tconstraints.push(`UNIQUE (${uk.map((c) => wrap(c)).join(\", \")})`);\n\t\t}\n\n\t\tfor (const ik of this.indexKeys) {\n\t\t\tconstraints.push(`INDEX (${ik.map((c) => wrap(c)).join(\", \")})`);\n\t\t}\n\n\t\tfor (const fk of this.foreignKeys) {\n\t\t\tlet fkSQL = `FOREIGN KEY (${wrap(fk.column)}) REFERENCES ${wrap(fk.on)} (${wrap(fk.references)})`;\n\t\t\tif (fk.onDelete) fkSQL += ` ON DELETE ${fk.onDelete}`;\n\t\t\tif (fk.onUpdate) fkSQL += ` ON UPDATE ${fk.onUpdate}`;\n\t\t\tconstraints.push(fkSQL);\n\t\t}\n\n\t\treturn constraints;\n\t}\n\n\tcompileColumnDefinitions(dialect: Dialect): string[] {\n\t\treturn this.columns\n\t\t\t.filter((c) => c.isNew && this.mode === \"alter\")\n\t\t\t.map((c) => dialect.compileAddColumns(\"\", [c.compile()]));\n\t}\n\n\tprivate addColumn(type: string, name: string): ColumnDefinition {\n\t\tconst col = new ColumnDefinition(type, name);\n\t\tthis.columns.push(col);\n\t\treturn col;\n\t}\n}\n\nexport class ColumnDefinition {\n\tprivate type: string;\n\tprivate name: string;\n\tprivate isNullable = false;\n\tprivate defaultValue: any = undefined;\n\tprivate isUnsigned = false;\n\tprivate isUnique = false;\n\tprivate isPrimary = false;\n\tprivate isIndex = false;\n\tprivate commentText: string | null = null;\n\tprivate afterColumn: string | null = null;\n\tprivate isFirst = false;\n\tprivate isAutoIncrement = false;\n\tprivate precisionValue: number | null = null;\n\tprivate scaleValue: number | null = null;\n\tprivate lengthValue: number | null = null;\n\tprivate enumValues: string[] | null = null;\n\tprivate isForeignId = false;\n\tisNew = true;\n\n\tconstructor(type: string, name: string) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\tnullable(): this {\n\t\tthis.isNullable = true;\n\t\treturn this;\n\t}\n\n\tdefault(value: any): this {\n\t\tthis.defaultValue = value;\n\t\treturn this;\n\t}\n\n\tunsigned(): this {\n\t\tthis.isUnsigned = true;\n\t\treturn this;\n\t}\n\n\tunique(): this {\n\t\tthis.isUnique = true;\n\t\treturn this;\n\t}\n\n\tprimary(): this {\n\t\tthis.isPrimary = true;\n\t\treturn this;\n\t}\n\n\tindex(): this {\n\t\tthis.isIndex = true;\n\t\treturn this;\n\t}\n\n\tcomment(text: string): this {\n\t\tthis.commentText = text;\n\t\treturn this;\n\t}\n\n\tafter(column: string): this {\n\t\tthis.afterColumn = column;\n\t\treturn this;\n\t}\n\n\tfirst(): this {\n\t\tthis.isFirst = true;\n\t\treturn this;\n\t}\n\n\tautoIncrement(): this {\n\t\tthis.isAutoIncrement = true;\n\t\treturn this;\n\t}\n\n\tsetValues(vals: string[]): this {\n\t\tthis.enumValues = vals;\n\t\treturn this;\n\t}\n\n\tsetLength(len: number): this {\n\t\tthis.lengthValue = len;\n\t\treturn this;\n\t}\n\n\tsetPrecision(precision: number): this {\n\t\tthis.precisionValue = precision;\n\t\treturn this;\n\t}\n\n\tsetScale(scale: number): this {\n\t\tthis.scaleValue = scale;\n\t\treturn this;\n\t}\n\n\tcompile(): ColumnCompileOptions {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tnullable: this.isNullable,\n\t\t\tdefaultValue: this.defaultValue,\n\t\t\tunsigned: this.isUnsigned,\n\t\t\tunique: this.isUnique,\n\t\t\tprimary: this.isPrimary,\n\t\t\tindex: this.isIndex,\n\t\t\tcomment: this.commentText,\n\t\t\tafter: this.afterColumn,\n\t\t\tfirst: this.isFirst,\n\t\t\tautoIncrement: this.isAutoIncrement,\n\t\t\tprecision: this.precisionValue,\n\t\t\tscale: this.scaleValue,\n\t\t\tlength: this.lengthValue,\n\t\t\tvalues: this.enumValues,\n\t\t\tisForeignId: this.isForeignId,\n\t\t};\n\t}\n}\n\ninterface ForeignKeyDef {\n\tcolumn: string;\n\treferences: string;\n\ton: string;\n\tonDelete: string | null;\n\tonUpdate: string | null;\n}\n\nexport class ForeignKeyDefinition {\n\tprivate def: ForeignKeyDef;\n\n\tconstructor(def: ForeignKeyDef) {\n\t\tthis.def = def;\n\t}\n\n\treferences(column: string): this {\n\t\tthis.def.references = column;\n\t\treturn this;\n\t}\n\n\ton(table: string): this {\n\t\tthis.def.on = table;\n\t\treturn this;\n\t}\n\n\tonDelete(action: string): this {\n\t\tthis.def.onDelete = action;\n\t\treturn this;\n\t}\n\n\tonUpdate(action: string): this {\n\t\tthis.def.onUpdate = action;\n\t\treturn this;\n\t}\n}\n\nexport class Migrator {\n\tprivate connection: DatabaseConnection;\n\tprivate migrations: MigrationDefinition[] = [];\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\taddMigrations(migrations: MigrationDefinition[]): void {\n\t\tthis.migrations.push(...migrations);\n\t}\n\n\tsetMigrations(migrations: MigrationDefinition[]): void {\n\t\tthis.migrations = migrations;\n\t}\n\n\tasync run(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst ran = await this.getRanMigrations();\n\t\tconst ranNames = new Set(ran.map((r) => r.name));\n\n\t\tconst pending = this.migrations.filter((m) => !ranNames.has(m.name));\n\t\tif (pending.length === 0) {\n\t\t\tconsole.log(\"Nothing to migrate.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextBatch = await this.getNextBatchNumber();\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of pending) {\n\t\t\tconsole.log(`Migrating: ${migration.name}`);\n\t\t\ttry {\n\t\t\t\tawait migration.up(schema);\n\t\t\t\tawait this.recordMigration(migration.name, nextBatch);\n\t\t\t\tconsole.log(`Migrated: ${migration.name}`);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(`Migration failed: ${migration.name}`, err);\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync rollback(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst lastBatch = await this.getLastBatchNumber();\n\t\tif (lastBatch === 0) {\n\t\t\tconsole.log(\"Nothing to rollback.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastBatchMigrations = await this.getMigrationsByBatch(lastBatch);\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of lastBatchMigrations.reverse()) {\n\t\t\tconst def = this.migrations.find((m) => m.name === migration.name);\n\t\t\tif (def) {\n\t\t\t\tconsole.log(`Rolling back: ${migration.name}`);\n\t\t\t\ttry {\n\t\t\t\t\tawait def.down(schema);\n\t\t\t\t\tawait this.removeMigration(migration.name);\n\t\t\t\t\tconsole.log(`Rolled back: ${migration.name}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`Rollback failed: ${migration.name}`, err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync reset(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst allRan = await this.getRanMigrations();\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of allRan.reverse()) {\n\t\t\tconst def = this.migrations.find((m) => m.name === migration.name);\n\t\t\tif (def) {\n\t\t\t\tconsole.log(`Resetting: ${migration.name}`);\n\t\t\t\ttry {\n\t\t\t\t\tawait def.down(schema);\n\t\t\t\t\tawait this.removeMigration(migration.name);\n\t\t\t\t\tconsole.log(`Reset: ${migration.name}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`Reset failed: ${migration.name}`, err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync refresh(): Promise<void> {\n\t\tawait this.reset();\n\t\tawait this.run();\n\t}\n\n\tasync status(): Promise<MigrationStatusRow[]> {\n\t\tawait this.ensureMigrationTable();\n\t\treturn this.getRanMigrations();\n\t}\n\n\tprivate async ensureMigrationTable(): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileCreateMigrationsTable();\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tprivate async getRanMigrations(): Promise<MigrationStatusRow[]> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT name, batch, executed_at as executedAt FROM migrations ORDER BY batch ASC, name ASC\",\n\t\t);\n\t\treturn result.rows.map((row: any) => ({\n\t\t\tname: String(row.name),\n\t\t\tbatch: Number(row.batch),\n\t\t\texecutedAt: String(row.executedAt ?? \"\"),\n\t\t}));\n\t}\n\n\tprivate async getNextBatchNumber(): Promise<number> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT COALESCE(MAX(batch), 0) + 1 as next_batch FROM migrations\",\n\t\t);\n\t\treturn Number(result.rows[0]?.next_batch ?? 1);\n\t}\n\n\tprivate async getLastBatchNumber(): Promise<number> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT COALESCE(MAX(batch), 0) as last_batch FROM migrations\",\n\t\t);\n\t\treturn Number(result.rows[0]?.last_batch ?? 0);\n\t}\n\n\tprivate async getMigrationsByBatch(\n\t\tbatch: number,\n\t): Promise<MigrationStatusRow[]> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT name, batch, executed_at as executedAt FROM migrations WHERE batch = ? ORDER BY name ASC\",\n\t\t\t[batch],\n\t\t);\n\t\treturn result.rows.map((row: any) => ({\n\t\t\tname: String(row.name),\n\t\t\tbatch: Number(row.batch),\n\t\t\texecutedAt: String(row.executedAt ?? \"\"),\n\t\t}));\n\t}\n\n\tprivate async recordMigration(name: string, batch: number): Promise<void> {\n\t\tawait this.connection.raw(\n\t\t\t\"INSERT INTO migrations (name, batch) VALUES (?, ?)\",\n\t\t\t[name, batch],\n\t\t);\n\t}\n\n\tprivate async removeMigration(name: string): Promise<void> {\n\t\tawait this.connection.raw(\"DELETE FROM migrations WHERE name = ?\", [name]);\n\t}\n}\n","export interface PaginatedResult<T = any> {\n\tdata: T[];\n\tcurrentPage: number;\n\tperPage: number;\n\ttotal: number;\n\tlastPage: number;\n\tfrom: number;\n\tto: number;\n\thasMore: boolean;\n\thasPrev: boolean;\n\tisEmpty: boolean;\n}\n\nexport class Pagination<T = any> {\n\treadonly data: T[];\n\treadonly currentPage: number;\n\treadonly perPage: number;\n\treadonly total: number;\n\treadonly lastPage: number;\n\treadonly from: number;\n\treadonly to: number;\n\n\tconstructor(result: PaginatedResult<T>) {\n\t\tthis.data = result.data;\n\t\tthis.currentPage = result.currentPage;\n\t\tthis.perPage = result.perPage;\n\t\tthis.total = result.total;\n\t\tthis.lastPage = result.lastPage;\n\t\tthis.from = result.from;\n\t\tthis.to = result.to;\n\t}\n\n\tget hasMore(): boolean {\n\t\treturn this.currentPage < this.lastPage;\n\t}\n\n\tget hasPrev(): boolean {\n\t\treturn this.currentPage > 1;\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.data.length === 0;\n\t}\n\n\tnextPage(): PaginationUrl | null {\n\t\tif (!this.hasMore) return null;\n\t\treturn {\n\t\t\tpage: this.currentPage + 1,\n\t\t\tperPage: this.perPage,\n\t\t\turl: null,\n\t\t};\n\t}\n\n\tprevPage(): PaginationUrl | null {\n\t\tif (!this.hasPrev) return null;\n\t\treturn {\n\t\t\tpage: this.currentPage - 1,\n\t\t\tperPage: this.perPage,\n\t\t\turl: null,\n\t\t};\n\t}\n\n\ttoJSON(): Record<string, any> {\n\t\treturn {\n\t\t\tdata: this.data,\n\t\t\tpagination: {\n\t\t\t\tcurrentPage: this.currentPage,\n\t\t\t\tperPage: this.perPage,\n\t\t\t\ttotal: this.total,\n\t\t\t\tlastPage: this.lastPage,\n\t\t\t\tfrom: this.from,\n\t\t\t\tto: this.to,\n\t\t\t\thasMore: this.hasMore,\n\t\t\t\thasPrev: this.hasPrev,\n\t\t\t\tisEmpty: this.isEmpty,\n\t\t\t},\n\t\t};\n\t}\n\n\tmap<U>(fn: (item: T, index: number) => U): Pagination<U> {\n\t\treturn new Pagination<U>({\n\t\t\t...this,\n\t\t\tdata: this.data.map(fn),\n\t\t});\n\t}\n\n\titems(): T[] {\n\t\treturn this.data;\n\t}\n\n\tstatic from<T>(result: PaginatedResult<T>): Pagination<T> {\n\t\treturn new Pagination(result);\n\t}\n}\n\nexport interface PaginationUrl {\n\tpage: number;\n\tperPage: number;\n\turl: string | null;\n}\n","import type { DatabaseConnection } from \"./connection.js\";\n\nexport interface SeederClass {\n\trun(connection: DatabaseConnection): Promise<void>;\n}\n\nexport class Seeder {\n\tprivate connection: DatabaseConnection;\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\tasync call(seederClass: SeederClass): Promise<void> {\n\t\tawait seederClass.run(this.connection);\n\t}\n\n\tasync insert(table: string, data: Record<string, any>[]): Promise<void> {\n\t\tif (data.length === 0) return;\n\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst firstRow = data[0];\n\t\tif (!firstRow) return;\n\n\t\tconst columns = Object.keys(firstRow);\n\t\tconst wrappedColumns = columns\n\t\t\t.map((c) => dialect.wrapIdentifier(c))\n\t\t\t.join(\", \");\n\n\t\tconst batchSize = 100;\n\t\tfor (let i = 0; i < data.length; i += batchSize) {\n\t\t\tconst batch = data.slice(i, i + batchSize);\n\t\t\tconst placeholders: string[] = [];\n\t\t\tconst bindings: any[] = [];\n\n\t\t\tfor (const row of batch) {\n\t\t\t\tconst rowPlaceholders = columns.map((col) => {\n\t\t\t\t\tbindings.push(row[col]);\n\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t});\n\t\t\t\tplaceholders.push(`(${rowPlaceholders.join(\", \")})`);\n\t\t\t}\n\n\t\t\tconst sql = `INSERT INTO ${dialect.wrapIdentifier(table)} (${wrappedColumns}) VALUES ${placeholders.join(\", \")}`;\n\t\t\tawait this.connection.raw(sql, bindings);\n\t\t}\n\t}\n\n\tasync truncate(table: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst driver = this.connection.getDriver();\n\n\t\tif (driver === \"sqlite\") {\n\t\t\tawait this.connection.raw(`DELETE FROM ${dialect.wrapIdentifier(table)}`);\n\t\t} else if (driver === \"postgresql\") {\n\t\t\tawait this.connection.raw(dialect.compileTruncate(table));\n\t\t} else {\n\t\t\tawait this.connection.raw(\"SET FOREIGN_KEY_CHECKS = 0\");\n\t\t\tawait this.connection.raw(dialect.compileTruncate(table));\n\t\t\tawait this.connection.raw(\"SET FOREIGN_KEY_CHECKS = 1\");\n\t\t}\n\t}\n\n\tasync run(): Promise<void> {\n\t\tthrow new Error(\"Seeder.run() must be overridden by subclasses\");\n\t}\n}\n","import { QueryBuilder } from './query.js'\nimport type { QueryRunner } from './types.js'\n\nexport type RelationType = 'hasOne' | 'hasMany' | 'belongsTo' | 'belongsToMany' | 'morphMany' | 'morphTo'\n\ninterface RelationDefinition {\n type: RelationType\n relatedModel: typeof Model\n foreignKey: string\n localKey: string\n pivotTable?: string\n morphName?: string\n}\n\nexport class Model {\n /** Primary key */\n id?: number | string\n /** Dynamic properties from database */\n [key: string]: unknown\n\n static table: string = ''\n static connection: QueryRunner | null = null\n protected static queryRunner: QueryRunner | null = null\n private static relationDefs: Map<string, RelationDefinition> = new Map()\n private static eagerLoads: Map<string, boolean> = new Map()\n /** @internal cache for loaded relations on instances */\n _relations: Record<string, unknown> = {}\n\n static setConnection(conn: QueryRunner): void {\n this.connection = conn\n this.queryRunner = conn\n }\n\n static query<T extends typeof Model>(this: T): QueryBuilder {\n if (!this.queryRunner) {\n throw new Error('Database connection not set. Call Model.setConnection() first.')\n }\n return new QueryBuilder(this.queryRunner, this.table)\n }\n\n // ─── Relations Definition ──────────────────────────────────\n\n static hasOne(\n relatedModel: typeof Model,\n foreignKey?: string,\n localKey?: string,\n ): void {\n const key = `hasOne:${relatedModel.table}`\n this.relationDefs.set(key, {\n type: 'hasOne',\n relatedModel,\n foreignKey: foreignKey ?? `${this.table}_id`,\n localKey: localKey ?? 'id',\n })\n }\n\n static hasMany(\n relatedModel: typeof Model,\n foreignKey?: string,\n localKey?: string,\n ): void {\n const key = `hasMany:${relatedModel.table}`\n this.relationDefs.set(key, {\n type: 'hasMany',\n relatedModel,\n foreignKey: foreignKey ?? `${this.table}_id`,\n localKey: localKey ?? 'id',\n })\n }\n\n static belongsTo(\n relatedModel: typeof Model,\n foreignKey?: string,\n ownerKey?: string,\n ): void {\n const key = `belongsTo:${relatedModel.table}`\n this.relationDefs.set(key, {\n type: 'belongsTo',\n relatedModel,\n foreignKey: foreignKey ?? `${relatedModel.table}_id`,\n localKey: ownerKey ?? 'id',\n })\n }\n\n static belongsToMany(\n relatedModel: typeof Model,\n pivotTable?: string,\n foreignPivotKey?: string,\n relatedPivotKey?: string,\n ): void {\n const tables = [this.table, relatedModel.table].sort()\n const key = `belongsToMany:${relatedModel.table}`\n this.relationDefs.set(key, {\n type: 'belongsToMany',\n relatedModel,\n foreignKey: foreignPivotKey ?? `${this.table}_id`,\n localKey: relatedPivotKey ?? `${relatedModel.table}_id`,\n pivotTable: pivotTable ?? `${tables[0]}_${tables[1]}`,\n })\n }\n\n static morphMany(\n relatedModel: typeof Model,\n morphName: string,\n ): void {\n const key = `morphMany:${morphName}`\n this.relationDefs.set(key, {\n type: 'morphMany',\n relatedModel,\n foreignKey: `${morphName}_id`,\n localKey: 'id',\n morphName,\n })\n }\n\n // ─── Eager Loading ─────────────────────────────────────────\n\n static with(...relations: string[]): void {\n for (const rel of relations) {\n this.eagerLoads.set(rel, true)\n }\n }\n\n // ─── Query Shortcuts ───────────────────────────────────────\n\n static async all<T extends typeof Model>(this: T): Promise<InstanceType<T>[]> {\n const rows = await this.query().get()\n const instances = rows.map((row: any) => this.hydrate(row))\n await this.loadRelations(instances)\n return instances as any\n }\n\n static async find<T extends typeof Model>(this: T, id: number | string): Promise<InstanceType<T> | null> {\n const row = await this.query().find(id)\n if (!row) return null\n const instance = this.hydrate(row)\n await this.loadRelations([instance])\n return instance as any\n }\n\n static async where<T extends typeof Model>(this: T, column: string, value: any): Promise<QueryBuilder> {\n return this.query().where(column, value)\n }\n\n static async create<T extends typeof Model>(this: T, data: Record<string, any>): Promise<InstanceType<T>> {\n const id = await this.query().insert(data)\n return this.find(id) as any\n }\n\n static async updateOrCreate<T extends typeof Model>(\n this: T, attributes: Record<string, any>, values?: Record<string, any>,\n ): Promise<InstanceType<T>> {\n const qb = this.query()\n for (const [key, value] of Object.entries(attributes)) {\n qb.where(key, value)\n }\n const existing = await qb.first()\n if (existing) {\n const mergeValues = values ?? attributes\n const id = (existing as any).id\n const updateQb = new QueryBuilder(this.queryRunner!, this.table)\n for (const [key, value] of Object.entries(attributes)) {\n updateQb.where(key, value)\n }\n await updateQb.update(mergeValues)\n return this.find(id) as any\n }\n return this.create({ ...attributes, ...values }) as any\n }\n\n // ─── Instance Methods ──────────────────────────────────────\n\n async save(): Promise<void> {\n const ModelClass = this.constructor as typeof Model\n const id = this.id\n if (id !== undefined && id !== null) {\n await ModelClass.query().where('id', id).update(this.getData())\n } else {\n const newId = await ModelClass.query().insert(this.getData())\n this.id = newId\n }\n }\n\n async delete(): Promise<void> {\n const ModelClass = this.constructor as typeof Model\n const id = this.id\n if (id !== undefined && id !== null) {\n await ModelClass.query().where('id', id).delete()\n }\n }\n\n // ─── Relation Loader ───────────────────────────────────────\n\n private static async loadRelations(instances: any[]): Promise<void> {\n if (instances.length === 0) return\n\n for (const [key, def] of this.relationDefs) {\n const shouldLoad = this.eagerLoads.size === 0 || this.eagerLoads.has(key.split(':')[1] ?? key)\n if (!shouldLoad) continue\n\n const localIds = instances.map((i: any) => i[def.localKey]).filter(Boolean)\n\n if (def.type === 'belongsTo') {\n if (!def.relatedModel.queryRunner) def.relatedModel.setConnection(this.queryRunner!)\n const related = await def.relatedModel.query().whereIn(def.localKey, localIds).get()\n for (const inst of instances) {\n inst._relations[key] = related.find((r: any) => r[def.localKey] === inst[def.foreignKey]) ?? null\n }\n }\n\n if (def.type === 'hasMany') {\n if (!def.relatedModel.queryRunner) def.relatedModel.setConnection(this.queryRunner!)\n const related = await def.relatedModel.query().whereIn(def.foreignKey, localIds).get()\n for (const inst of instances) {\n inst._relations[key] = related.filter((r: any) => r[def.foreignKey] === inst[def.localKey])\n }\n }\n\n if (def.type === 'hasOne') {\n if (!def.relatedModel.queryRunner) def.relatedModel.setConnection(this.queryRunner!)\n const related = await def.relatedModel.query().whereIn(def.foreignKey, localIds).get()\n for (const inst of instances) {\n inst._relations[key] = related.find((r: any) => r[def.foreignKey] === inst[def.localKey]) ?? null\n }\n }\n\n if (def.type === 'belongsToMany' && def.pivotTable) {\n if (!def.relatedModel.queryRunner) def.relatedModel.setConnection(this.queryRunner!)\n const pivotQb = new QueryBuilder(this.queryRunner!, def.pivotTable)\n const pivotRows = await pivotQb.whereIn(def.foreignKey, localIds).get()\n const relatedIds = pivotRows.map((r: any) => r[def.localKey])\n if (relatedIds.length > 0) {\n const related = await def.relatedModel.query().whereIn('id', relatedIds).get()\n for (const inst of instances) {\n const pivots = pivotRows.filter((p: any) => p[def.foreignKey] === inst[def.localKey])\n inst._relations[key] = pivots\n .map((p: any) => related.find((r: any) => r.id === p[def.localKey]))\n .filter(Boolean)\n }\n } else {\n for (const inst of instances) { inst._relations[key] = [] }\n }\n }\n\n if (def.type === 'morphMany' && def.morphName) {\n if (!def.relatedModel.queryRunner) def.relatedModel.setConnection(this.queryRunner!)\n const related = await def.relatedModel.query()\n .where(`${def.morphName}_type`, this.name)\n .whereIn(`${def.morphName}_id`, localIds).get()\n for (const inst of instances) {\n inst._relations[key] = related.filter((r: any) => r[`${def.morphName}_id`] === inst[def.localKey])\n }\n }\n }\n }\n\n // ─── Internal Helpers ──────────────────────────────────────\n\n private static hydrate(data: Record<string, any>): any {\n const instance = new this()\n for (const [key, value] of Object.entries(data)) {\n instance[key] = value\n }\n return instance\n }\n\n private getData(): Record<string, any> {\n const data: Record<string, any> = {}\n const instance = this as Record<string, any>\n const prototype = Object.getPrototypeOf(this)\n const ownKeys = [\n ...Object.getOwnPropertyNames(instance),\n ...Object.keys(instance),\n ]\n const classKeys = new Set([\n ...Object.getOwnPropertyNames(prototype),\n 'save', 'delete', 'getData',\n ])\n for (const key of ownKeys) {\n if (typeof key === 'string' && !classKeys.has(key) && key !== 'constructor' && !key.startsWith('_')) {\n data[key] = instance[key]\n }\n }\n return data\n }\n}\n","import { EventEmitter } from \"node:events\";\n\nexport type EventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface EventConfig {\n\twildcard?: boolean;\n\tmaxListeners?: number;\n}\n\ninterface PatternEntry {\n\tpattern: string;\n\tregex: RegExp;\n\thandler: EventHandler;\n}\n\nexport class Event {\n\tprivate emitter: EventEmitter;\n\tprivate wildcardMode: boolean;\n\tprivate patterns: PatternEntry[] = [];\n\n\tconstructor(config?: EventConfig) {\n\t\tthis.emitter = new EventEmitter();\n\t\tthis.wildcardMode = config?.wildcard ?? false;\n\n\t\tif (config?.maxListeners !== undefined) {\n\t\t\tthis.emitter.setMaxListeners(config.maxListeners);\n\t\t}\n\t}\n\n\ton(event: string, handler: EventHandler): this {\n\t\tthis.emitter.on(event, handler);\n\t\treturn this;\n\t}\n\n\taddListener(event: string, handler: EventHandler): this {\n\t\treturn this.on(event, handler);\n\t}\n\n\tonce(event: string, handler: EventHandler): this {\n\t\tthis.emitter.once(event, handler);\n\t\treturn this;\n\t}\n\n\tasync emit(event: string, ...args: any[]): Promise<void> {\n\t\tconst listeners = this.emitter.listeners(event);\n\n\t\tfor (const listener of listeners) {\n\t\t\tconst result = listener(...args) as unknown;\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\tconst result = entry.handler(event, ...args) as unknown;\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tawait result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toff(event: string, handler: EventHandler): this {\n\t\tthis.emitter.off(event, handler);\n\t\treturn this;\n\t}\n\n\tremoveListener(event: string, handler: EventHandler): this {\n\t\treturn this.off(event, handler);\n\t}\n\n\tremoveAllListeners(event?: string): this {\n\t\tif (event !== undefined) {\n\t\t\tthis.emitter.removeAllListeners(event);\n\t\t\tthis.patterns = this.patterns.filter((p) => p.pattern !== event);\n\t\t} else {\n\t\t\tthis.emitter.removeAllListeners();\n\t\t\tthis.patterns = [];\n\t\t}\n\t\treturn this;\n\t}\n\n\tlisteners(event: string): EventHandler[] {\n\t\treturn this.emitter.listeners(event) as EventHandler[];\n\t}\n\n\thasListeners(event: string): boolean {\n\t\tif (this.emitter.listenerCount(event) > 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tonPattern(pattern: string, handler: EventHandler): this {\n\t\tif (!this.wildcardMode) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Pattern matching is not enabled. Set wildcard: true in EventConfig.\",\n\t\t\t);\n\t\t}\n\n\t\tconst regex = this.patternToRegex(pattern);\n\t\tthis.patterns.push({ pattern, regex, handler });\n\t\treturn this;\n\t}\n\n\tasync ask<T>(event: string, ...args: any[]): Promise<T[]> {\n\t\tconst handlers = this.emitter.listeners(event) as EventHandler[];\n\t\tconst results: T[] = [];\n\n\t\tfor (const handler of handlers) {\n\t\t\tconst result = handler(...args) as unknown;\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tconst resolved = await result;\n\t\t\t\tif (resolved !== undefined) {\n\t\t\t\t\tresults.push(resolved as T);\n\t\t\t\t}\n\t\t\t} else if (result !== undefined) {\n\t\t\t\tresults.push(result as T);\n\t\t\t}\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\tconst result = entry.handler(event, ...args) as unknown;\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tconst resolved = await result;\n\t\t\t\t\t\tif (resolved !== undefined) {\n\t\t\t\t\t\t\tresults.push(resolved as T);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (result !== undefined) {\n\t\t\t\t\t\tresults.push(result as T);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tlistenerCount(event?: string): number {\n\t\tif (event !== undefined) {\n\t\t\tlet count = this.emitter.listenerCount(event);\n\n\t\t\tif (this.wildcardMode) {\n\t\t\t\tfor (const entry of this.patterns) {\n\t\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn count;\n\t\t}\n\n\t\treturn (\n\t\t\tthis.emitter\n\t\t\t\t.eventNames()\n\t\t\t\t.reduce((sum, name) => sum + this.emitter.listenerCount(name), 0) +\n\t\t\tthis.patterns.length\n\t\t);\n\t}\n\n\teventNames(): string[] {\n\t\tconst nativeNames = this.emitter.eventNames() as string[];\n\t\tconst patternNames = this.patterns.map((p) => p.pattern);\n\t\treturn [...new Set([...nativeNames, ...patternNames])];\n\t}\n\n\tprivate patternToRegex(pattern: string): RegExp {\n\t\tconst escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\tconst regexStr = escaped.replace(/\\*/g, \"[^.]*\");\n\t\treturn new RegExp(`^${regexStr}$`);\n\t}\n}\n\nlet defaultEvent: Event | null = null;\n\nexport function createEvent(config?: EventConfig): Event {\n\tdefaultEvent = new Event(config);\n\treturn defaultEvent;\n}\n\nexport function event(): Event {\n\tif (defaultEvent === null) {\n\t\tdefaultEvent = new Event();\n\t}\n\treturn defaultEvent;\n}\n","import type { SuperResponse } from \"./http/response\";\n\nlet defaultBuilder: URLBuilder | null = null;\n\nexport class URLBuilder {\n\tprivate baseUrl: string;\n\n\tconstructor(baseUrl?: string) {\n\t\tthis.baseUrl = baseUrl ?? \"http://localhost:3000\";\n\t}\n\n\troute(_name: string, _params?: Record<string, string | number>): string {\n\t\tthrow new Error(\n\t\t\t\"URLBuilder.route() requires a Router reference. \" +\n\t\t\t\t\"Set the router via URLBuilder.setRouter() before calling route().\",\n\t\t);\n\t}\n\n\tto(path: string): string {\n\t\tconst normalized = path.replace(/\\\\/g, \"/\");\n\t\tconst base = this.baseUrl.replace(/\\/$/, \"\");\n\t\tconst cleanPath = normalized.startsWith(\"/\")\n\t\t\t? normalized\n\t\t\t: `/${normalized}`;\n\t\treturn `${base}${cleanPath}`;\n\t}\n\n\tasset(path: string): string {\n\t\treturn this.to(path);\n\t}\n\n\tsecure(path: string): string {\n\t\tconst base = this.baseUrl.replace(/^http:/, \"https:\");\n\t\tconst normalized = path.replace(/\\\\/g, \"/\");\n\t\tconst cleanPath = normalized.startsWith(\"/\")\n\t\t\t? normalized\n\t\t\t: `/${normalized}`;\n\t\treturn `${base}${cleanPath}`;\n\t}\n\n\tsetBaseUrl(url: string): void {\n\t\tthis.baseUrl = url;\n\t}\n\n\tgetBaseUrl(): string {\n\t\treturn this.baseUrl;\n\t}\n}\n\nexport function url(): URLBuilder {\n\tif (defaultBuilder === null) {\n\t\tdefaultBuilder = new URLBuilder();\n\t}\n\treturn defaultBuilder;\n}\n\nconst macroFns: Record<\n\tstring,\n\t(this: SuperResponse, ...args: any[]) => SuperResponse\n> = {};\n\nexport function responseMacros(response: SuperResponse): void {\n\tfor (const [name, fn] of Object.entries(macroFns)) {\n\t\tconst bound = fn.bind(response);\n\t\t(response as unknown as Record<string, unknown>)[name] = bound;\n\t}\n}\n\nexport function registerMacro(\n\tname: string,\n\tfn: (this: SuperResponse, ...args: any[]) => SuperResponse,\n): void {\n\tmacroFns[name] = fn;\n}\n\nregisterMacro(\"success\", function <\n\tT,\n>(this: SuperResponse, data: T, message?: string) {\n\treturn this.json({\n\t\tsuccess: true,\n\t\tmessage: message ?? \"Success\",\n\t\tdata,\n\t});\n});\n\nregisterMacro(\n\t\"error\",\n\tfunction (this: SuperResponse, message: string, status: number = 400) {\n\t\treturn this.json({ success: false, message }, status);\n\t},\n);\n\nregisterMacro(\"created\", function <\n\tT,\n>(this: SuperResponse, data: T, message?: string) {\n\treturn this.status(201).json({\n\t\tsuccess: true,\n\t\tmessage: message ?? \"Created\",\n\t\tdata,\n\t});\n});\n\nregisterMacro(\"noContent\", function (this: SuperResponse) {\n\treturn this.status(204).send(\"\");\n});\n\nregisterMacro(\n\t\"accepted\",\n\tfunction (this: SuperResponse, data?: unknown, message?: string) {\n\t\treturn this.status(202).json({\n\t\t\tsuccess: true,\n\t\t\tmessage: message ?? \"Accepted\",\n\t\t\tdata,\n\t\t});\n\t},\n);\n\nregisterMacro(\n\t\"paginated\",\n\tfunction <T>(\n\t\tthis: SuperResponse,\n\t\tdata: T[],\n\t\tmeta: {\n\t\t\ttotal: number;\n\t\t\tpage: number;\n\t\t\tperPage: number;\n\t\t\tlastPage: number;\n\t\t},\n\t) {\n\t\treturn this.json({\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t\tmeta,\n\t\t});\n\t},\n);\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport interface StorageConfig {\n\tdefaultDisk?: string;\n\tdisks: {\n\t\t[name: string]: {\n\t\t\tdriver: \"local\";\n\t\t\troot: string;\n\t\t\turl?: string;\n\t\t\tpermissions?: number;\n\t\t};\n\t};\n}\n\nexport interface FileOptions {\n\tname?: string;\n\tdisk?: string;\n\toverwrite?: boolean;\n}\n\nexport class LocalDisk {\n\tprivate root: string;\n\tprivate baseUrl?: string;\n\n\tconstructor(root: string, baseUrl?: string) {\n\t\tthis.root = path.resolve(root);\n\t\tthis.baseUrl = baseUrl;\n\t}\n\n\tasync put(filePath: string, content: string | Buffer): Promise<string> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(fullPath, content);\n\t\treturn filePath;\n\t}\n\n\tasync get(filePath: string): Promise<Buffer> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.readFileSync(fullPath);\n\t}\n\n\tasync exists(filePath: string): Promise<boolean> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\treturn fs.existsSync(fullPath);\n\t}\n\n\tasync delete(filePath: string): Promise<boolean> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\treturn false;\n\t\t}\n\t\tfs.unlinkSync(fullPath);\n\t\treturn true;\n\t}\n\n\tasync copy(from: string, to: string): Promise<boolean> {\n\t\tconst fromPath = this.resolvePath(from);\n\t\tconst toPath = this.resolvePath(to);\n\t\tif (!fs.existsSync(fromPath)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst dir = path.dirname(toPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.copyFileSync(fromPath, toPath);\n\t\treturn true;\n\t}\n\n\tasync move(from: string, to: string): Promise<boolean> {\n\t\tconst fromPath = this.resolvePath(from);\n\t\tconst toPath = this.resolvePath(to);\n\t\tif (!fs.existsSync(fromPath)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst dir = path.dirname(toPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.renameSync(fromPath, toPath);\n\t\treturn true;\n\t}\n\n\turl(filePath: string): string {\n\t\tif (this.baseUrl === undefined) {\n\t\t\tthrow new Error(\"Base URL not configured for this disk\");\n\t\t}\n\t\tconst normalized = filePath.replace(/\\\\/g, \"/\");\n\t\treturn `${this.baseUrl.replace(/\\/$/, \"\")}/${normalized.replace(/^\\//, \"\")}`;\n\t}\n\n\tasync size(filePath: string): Promise<number> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.statSync(fullPath).size;\n\t}\n\n\tasync lastModified(filePath: string): Promise<Date> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.statSync(fullPath).mtime;\n\t}\n\n\tasync files(directory: string = \"\"): Promise<string[]> {\n\t\tconst fullPath = this.resolvePath(directory);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn fs\n\t\t\t.readdirSync(fullPath)\n\t\t\t.filter((name) => {\n\t\t\t\tconst stat = fs.statSync(path.join(fullPath, name));\n\t\t\t\treturn stat.isFile();\n\t\t\t})\n\t\t\t.map((name) => path.join(directory, name).replace(/\\\\/g, \"/\"));\n\t}\n\n\tasync directories(directory: string = \"\"): Promise<string[]> {\n\t\tconst fullPath = this.resolvePath(directory);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn fs\n\t\t\t.readdirSync(fullPath)\n\t\t\t.filter((name) => {\n\t\t\t\tconst stat = fs.statSync(path.join(fullPath, name));\n\t\t\t\treturn stat.isDirectory();\n\t\t\t})\n\t\t\t.map((name) => path.join(directory, name).replace(/\\\\/g, \"/\"));\n\t}\n\n\tasync makeDirectory(dirPath: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(dirPath);\n\t\tfs.mkdirSync(fullPath, { recursive: true });\n\t}\n\n\tasync deleteDirectory(dirPath: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(dirPath);\n\t\tif (fs.existsSync(fullPath)) {\n\t\t\tfs.rmSync(fullPath, { recursive: true, force: true });\n\t\t}\n\t}\n\n\tasync append(filePath: string, content: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.appendFileSync(fullPath, content, \"utf-8\");\n\t}\n\n\tasync prepend(filePath: string, content: string): Promise<void> {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tconst existing = fs.existsSync(fullPath)\n\t\t\t? fs.readFileSync(fullPath, \"utf-8\")\n\t\t\t: \"\";\n\t\tfs.writeFileSync(fullPath, content + existing, \"utf-8\");\n\t}\n\n\treadStream(filePath: string): fs.ReadStream {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tif (!fs.existsSync(fullPath)) {\n\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t}\n\t\treturn fs.createReadStream(fullPath);\n\t}\n\n\twriteStream(filePath: string): fs.WriteStream {\n\t\tconst fullPath = this.resolvePath(filePath);\n\t\tconst dir = path.dirname(fullPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\treturn fs.createWriteStream(fullPath);\n\t}\n\n\tgetRoot(): string {\n\t\treturn this.root;\n\t}\n\n\tgetUrl(): string | undefined {\n\t\treturn this.baseUrl;\n\t}\n\n\tprivate resolvePath(filePath: string): string {\n\t\tconst normalized = filePath.replace(/\\\\/g, \"/\");\n\t\tconst resolved = path.resolve(this.root, normalized);\n\t\tconst resolvedRoot = path.resolve(this.root);\n\n\t\tif (!resolved.startsWith(resolvedRoot)) {\n\t\t\tthrow new Error(`Path traversal detected: ${filePath}`);\n\t\t}\n\n\t\treturn resolved;\n\t}\n}\n\nexport class Storage {\n\tprivate config: StorageConfig;\n\tprivate diskInstances: Map<string, LocalDisk>;\n\n\tconstructor(config: StorageConfig) {\n\t\tthis.config = config;\n\t\tthis.diskInstances = new Map();\n\t}\n\n\tdisk(name?: string): LocalDisk {\n\t\tconst diskName = name ?? this.config.defaultDisk ?? \"local\";\n\t\tconst existing = this.diskInstances.get(diskName);\n\t\tif (existing !== undefined) {\n\t\t\treturn existing;\n\t\t}\n\n\t\tconst diskConfig = this.config.disks[diskName];\n\t\tif (diskConfig === undefined) {\n\t\t\tthrow new Error(`Disk not configured: ${diskName}`);\n\t\t}\n\n\t\tconst instance = new LocalDisk(diskConfig.root, diskConfig.url);\n\t\tthis.diskInstances.set(diskName, instance);\n\t\treturn instance;\n\t}\n\n\tasync put(filePath: string, content: string | Buffer): Promise<string> {\n\t\treturn this.disk().put(filePath, content);\n\t}\n\n\tasync get(filePath: string): Promise<Buffer> {\n\t\treturn this.disk().get(filePath);\n\t}\n\n\tasync exists(filePath: string): Promise<boolean> {\n\t\treturn this.disk().exists(filePath);\n\t}\n\n\tasync delete(filePath: string): Promise<boolean> {\n\t\treturn this.disk().delete(filePath);\n\t}\n\n\tasync copy(from: string, to: string): Promise<boolean> {\n\t\treturn this.disk().copy(from, to);\n\t}\n\n\tasync move(from: string, to: string): Promise<boolean> {\n\t\treturn this.disk().move(from, to);\n\t}\n\n\tasync url(filePath: string): Promise<string> {\n\t\treturn this.disk().url(filePath);\n\t}\n\n\tasync size(filePath: string): Promise<number> {\n\t\treturn this.disk().size(filePath);\n\t}\n\n\tasync lastModified(filePath: string): Promise<Date> {\n\t\treturn this.disk().lastModified(filePath);\n\t}\n\n\tasync files(directory?: string): Promise<string[]> {\n\t\treturn this.disk().files(directory);\n\t}\n\n\tasync directories(directory?: string): Promise<string[]> {\n\t\treturn this.disk().directories(directory);\n\t}\n\n\tasync makeDirectory(dirPath: string): Promise<void> {\n\t\treturn this.disk().makeDirectory(dirPath);\n\t}\n\n\tasync deleteDirectory(dirPath: string): Promise<void> {\n\t\treturn this.disk().deleteDirectory(dirPath);\n\t}\n}\n\nlet defaultInstance: Storage | null = null;\n\nexport function createStorage(config: StorageConfig): Storage {\n\tdefaultInstance = new Storage(config);\n\treturn defaultInstance;\n}\n\nexport function storage(): Storage {\n\tif (defaultInstance === null) {\n\t\tthrow new Error(\n\t\t\t\"Storage not initialized. Call createStorage(config) first.\",\n\t\t);\n\t}\n\treturn defaultInstance;\n}\n"],"mappings":"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","names":["path","basename","extname","url","path","fs","path","join","dirname","i","fs","path","promisify","resolve","fs","path","path","resolve","randomUUID","createReadStream","extname","join","resolve","MIME_TYPES","join","resolve","ext","extname","createReadStream","path","url","randomUUID","result","result","randomUUID","sql","result","event","path","url","fs","path","stat","path","resolve","ctx"]}
|