@h3ravel/shared 0.20.12 → 0.21.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.cjs +35 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +51 -21
- package/dist/index.d.ts +51 -21
- package/dist/index.js +35 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -104,7 +104,7 @@ var FileSystem = class {
|
|
|
104
104
|
if (parts.length > 0 && parts[0][0] === "@") packageName += parts.shift() + "/";
|
|
105
105
|
packageName += parts.shift();
|
|
106
106
|
const packageJson = path.default.join(cwd ?? process.cwd(), "node_modules", packageName);
|
|
107
|
-
const resolved = this.
|
|
107
|
+
const resolved = this.resolveFileUp("package", ["json"], packageJson);
|
|
108
108
|
if (!resolved) return;
|
|
109
109
|
return path.default.join(path.default.dirname(resolved), parts.join("/"));
|
|
110
110
|
}
|
|
@@ -123,28 +123,29 @@ var FileSystem = class {
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
/**
|
|
126
|
-
* Recursively find files
|
|
126
|
+
* Recursively find files starting from given cwd
|
|
127
127
|
*
|
|
128
|
-
* @param cwd
|
|
129
128
|
* @param name
|
|
130
129
|
* @param extensions
|
|
130
|
+
* @param cwd
|
|
131
|
+
*
|
|
131
132
|
* @returns
|
|
132
133
|
*/
|
|
133
|
-
static
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
static resolveFileUp(name, extensions, cwd) {
|
|
135
|
+
cwd ??= process.cwd();
|
|
136
|
+
return (0, escalade_sync.default)(cwd, (dir, filesNames) => {
|
|
137
|
+
if (typeof extensions === "function") return extensions(dir, filesNames);
|
|
138
|
+
const candidates = new Set(extensions.map((ext) => `${name}.${ext}`));
|
|
139
|
+
for (const filename of filesNames) if (candidates.has(filename)) return filename;
|
|
139
140
|
return false;
|
|
140
|
-
});
|
|
141
|
+
}) ?? void 0;
|
|
141
142
|
}
|
|
142
143
|
};
|
|
143
144
|
|
|
144
145
|
//#endregion
|
|
145
146
|
//#region src/Utils/Logger.ts
|
|
146
147
|
var Logger = class Logger {
|
|
147
|
-
static
|
|
148
|
+
static twoColumnDetail(name, value, log = true, spacer = ".") {
|
|
148
149
|
const regex = /\x1b\[\d+m/g;
|
|
149
150
|
const width = Math.max(process.stdout.columns, 100);
|
|
150
151
|
const dots = Math.max(width - name.replace(regex, "").length - value.replace(regex, "").length - 10, 0);
|
|
@@ -181,7 +182,7 @@ var Logger = class Logger {
|
|
|
181
182
|
info: chalk.default.bgBlue,
|
|
182
183
|
error: chalk.default.bgRed
|
|
183
184
|
};
|
|
184
|
-
const [_name, dots, val] = this.
|
|
185
|
+
const [_name, dots, val] = this.twoColumnDetail(name, value, false);
|
|
185
186
|
console.log(this.textFormat(_name, color[status], preserveCol), dots, val);
|
|
186
187
|
if (exit) process.exit(0);
|
|
187
188
|
}
|
|
@@ -248,10 +249,12 @@ var Logger = class Logger {
|
|
|
248
249
|
return acc;
|
|
249
250
|
}, input);
|
|
250
251
|
}
|
|
251
|
-
static parse(config, joiner = " ", log = true) {
|
|
252
|
+
static parse(config, joiner = " ", log = true, sc) {
|
|
252
253
|
const string = config.map(([str, opt]) => {
|
|
253
254
|
if (Array.isArray(opt)) opt = Logger.chalker(opt);
|
|
254
|
-
|
|
255
|
+
const output = typeof opt === "string" && typeof chalk.default[opt] === "function" ? chalk.default[opt](str) : typeof opt === "function" ? opt(str) : str;
|
|
256
|
+
if (!sc) return output;
|
|
257
|
+
return this.textFormat(output, Logger.chalker(Array.isArray(sc) ? sc : [sc]));
|
|
255
258
|
}).join(joiner);
|
|
256
259
|
if (log) console.log(string);
|
|
257
260
|
else return string;
|
|
@@ -261,11 +264,11 @@ var Logger = class Logger {
|
|
|
261
264
|
*
|
|
262
265
|
* @returns
|
|
263
266
|
*/
|
|
264
|
-
static log = ((config, joiner, log = true) => {
|
|
267
|
+
static log = ((config, joiner, log = true, sc) => {
|
|
265
268
|
if (typeof config === "string") {
|
|
266
269
|
const conf = [[config, joiner]];
|
|
267
|
-
return this.parse(conf, "", log);
|
|
268
|
-
} else if (config) return this.parse(config, String(joiner), log);
|
|
270
|
+
return this.parse(conf, "", log, sc);
|
|
271
|
+
} else if (config) return this.parse(config, String(joiner), log, sc);
|
|
269
272
|
return this;
|
|
270
273
|
});
|
|
271
274
|
};
|
|
@@ -408,7 +411,21 @@ var TaskManager = class {
|
|
|
408
411
|
} finally {
|
|
409
412
|
const endTime = process.hrtime(startTime);
|
|
410
413
|
const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6;
|
|
411
|
-
Logger.
|
|
414
|
+
Logger.twoColumnDetail(Logger.parse([[description, "green"]], "", false), [Logger.parse([[`${Math.floor(duration)}ms`, "gray"]], "", false), Logger.parse([[result !== false ? "✔" : "✘", result !== false ? "green" : "red"]], "", false)].join(" "));
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
static async advancedTaskRunner(info, task) {
|
|
418
|
+
const startTime = process.hrtime();
|
|
419
|
+
const [startInfo, stopInfo] = info;
|
|
420
|
+
if (stopInfo) Logger.twoColumnDetail(startInfo[0], Logger.log(startInfo[1], ["yellow", "bold"], false));
|
|
421
|
+
try {
|
|
422
|
+
return await Promise.race([task()]);
|
|
423
|
+
} catch (e) {
|
|
424
|
+
Logger.error("ERROR: " + e.message);
|
|
425
|
+
} finally {
|
|
426
|
+
const endTime = process.hrtime(startTime);
|
|
427
|
+
const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6;
|
|
428
|
+
Logger.twoColumnDetail(stopInfo?.[0] ?? startInfo[0], [Logger.parse([[`${Math.floor(duration)}ms`, "gray"]], "", false), Logger.parse([[`✔ ${stopInfo?.[1] ?? startInfo[1]}`, ["green", "bold"]]], "", false)].join(" "));
|
|
412
429
|
}
|
|
413
430
|
}
|
|
414
431
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["app: IApplication","request: IRequest","response: IResponse","value: any","path","path: string","nodepath","path","result: any"],"sources":["../src/Contracts/IHttp.ts","../src/Utils/EnvParser.ts","../src/Utils/FileSystem.ts","../src/Utils/Logger.ts","../src/Utils/PathLoader.ts","../src/Utils/Resolver.ts","../src/Utils/scripts.ts","../src/Utils/TaskManager.ts"],"sourcesContent":["import type { Middleware, MiddlewareOptions } from 'h3'\n\nimport { IApplication } from './IApplication'\nimport { IRequest } from './IRequest'\nimport { IResponse } from './IResponse'\n\nexport type RouterEnd = 'get' | 'delete' | 'put' | 'post' | 'patch' | 'apiResource' | 'group' | 'route';\n\n/**\n * Interface for the Router contract, defining methods for HTTP routing.\n */\nexport interface IRouter {\n /**\n * Registers a GET route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n get (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a POST route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n post (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a PUT route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n put (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a DELETE route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n delete (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers an API resource with standard CRUD routes.\n * @param path - The base path for the resource.\n * @param controller - The controller class handling the resource.\n * @param middleware - Optional middleware array.\n */\n apiResource (\n path: string,\n controller: new (app: IApplication) => IController,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd | 'name'>;\n\n /**\n * Generates a URL for a named route.\n * @param name - The name of the route.\n * @param params - Optional parameters to replace in the route path.\n * @returns The generated URL or undefined if the route is not found.\n */\n route (name: string, params?: Record<string, string>): string | undefined;\n\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string): this\n\n /**\n * Groups routes with shared prefix or middleware.\n * @param options - Configuration for prefix or middleware.\n * @param callback - Callback function defining grouped routes.\n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: () => this): this;\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: Middleware, opts?: Middleware | MiddlewareOptions): this\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions): this;\n}\n\n/**\n * Represents the HTTP context for a single request lifecycle.\n * Encapsulates the application instance, request, and response objects.\n */\nexport class HttpContext {\n constructor(\n public app: IApplication,\n public request: IRequest,\n public response: IResponse\n ) { }\n\n /**\n * Factory method to create a new HttpContext instance from a context object.\n * @param ctx - Object containing app, request, and response\n * @returns A new HttpContext instance\n */\n static init (ctx: { app: IApplication; request: IRequest; response: IResponse }): HttpContext {\n /**\n * Return a new instance\n */\n return new HttpContext(ctx.app, ctx.request, ctx.response)\n }\n}\n\n\n/**\n * Type for EventHandler, representing a function that handles an H3 event.\n */\nexport type EventHandler = (ctx: HttpContext) => any\nexport type RouteEventHandler = (...args: any[]) => any\n\n/**\n * Defines the contract for all controllers.\n * Any controller implementing this must define these methods.\n */\nexport interface IController {\n show (...ctx: any[]): any\n index (...ctx: any[]): any\n store (...ctx: any[]): any\n update (...ctx: any[]): any\n destroy (...ctx: any[]): any\n}\n\n/**\n * Defines the contract for all middlewares.\n * Any middleware implementing this must define these methods.\n */\nexport interface IMiddleware {\n handle (context: HttpContext, next: () => Promise<any>): Promise<any>\n} \n","import { GenericWithNullableStringValues } from '../Contracts/ObjContract'\n\nexport class EnvParser {\n\n static parse (initial: GenericWithNullableStringValues) {\n const parsed = { ...initial }\n\n for (const key in parsed) {\n const value: any = parsed[key]\n parsed[key] = this.parseValue(value)\n }\n\n return parsed\n }\n\n static parseValue (value: any) {\n /**\n * Null/undefined stay untouched \n */\n if (value === null || value === undefined) return value\n\n /**\n * Convert string \"true\"/\"false\" to boolean \n */\n if (value === 'true') return true\n if (value === 'false') return false\n\n /**\n * Convert string numbers to number \n */\n if (!isNaN(value) && value.trim() !== '') {\n return Number(value)\n }\n\n /**\n * Convert string \"null\" and \"undefined\"\n */\n if (value === 'null') return null\n if (value === 'undefined') return undefined\n\n /**\n * Otherwise return as-is (string)\n */\n return value\n }\n}\n","import { access } from 'fs/promises'\nimport escalade from 'escalade/sync'\nimport path from 'path'\n\nexport class FileSystem {\n static findModulePkg (moduleId: string, cwd?: string) {\n const parts = moduleId.replace(/\\\\/g, '/').split('/')\n\n let packageName = ''\n // Handle scoped package name\n if (parts.length > 0 && parts[0][0] === '@') {\n packageName += parts.shift() + '/'\n }\n packageName += parts.shift()\n\n const packageJson = path.join(cwd ?? process.cwd(), 'node_modules', packageName)\n\n const resolved = this.findUpConfig(packageJson, 'package', ['json'])\n\n if (!resolved) {\n return\n }\n\n return path.join(path.dirname(resolved), parts.join('/'))\n }\n\n /**\n * Check if file exists\n * \n * @param path \n * @returns \n */\n static async fileExists (path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Recursively find files\n * \n * @param cwd \n * @param name \n * @param extensions \n * @returns \n */\n static findUpConfig (cwd: string, name: string, extensions: string[]) {\n return escalade(cwd, (_dir, names) => {\n for (const ext of extensions) {\n const filename = `${name}.${ext}`\n if (names.includes(filename)) {\n return filename\n }\n }\n return false\n })\n }\n} \n","import chalk, { type ChalkInstance } from 'chalk'\nimport { LoggerChalk, LoggerLog, LoggerParseSignature } from '../Contracts/Utils'\n\nexport class Logger {\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param value \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static twoColumnLog (name: string, value: string, log?: true, spacer?: string): void\n static twoColumnLog (name: string, value: string, log?: false, spacer?: string): [string, string, string]\n static twoColumnLog (name: string, value: string, log = true, spacer = '.'): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.max(process.stdout.columns, 100)\n const dots = Math.max(width - name.replace(regex, '').length - value.replace(regex, '').length - 10, 0)\n\n if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value)\n else return [name, chalk.gray(spacer.repeat(dots)), value]\n }\n\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param desc \n * @param width \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static describe (name: string, desc: string, width?: number, log?: true): void\n static describe (name: string, desc: string, width?: number, log?: false): [string, string, string]\n static describe (name: string, desc: string, width = 50, log = true): [string, string, string] | void {\n width = Math.min(width, 30)\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const dots = Math.max(width - name.replace(regex, '').length, 0)\n\n if (log) return console.log(name, ' '.repeat(dots), desc)\n else return [name, ' '.repeat(dots), desc]\n }\n\n /**\n * Logs the message in two columns but allways passing status\n * \n * @param name \n * @param value \n * @param status \n * @param exit \n * @param preserveCol \n */\n static split (name: string, value: string, status?: 'success' | 'info' | 'error', exit = false, preserveCol = false) {\n status ??= 'info'\n const color = { success: chalk.bgGreen, info: chalk.bgBlue, error: chalk.bgRed }\n\n const [_name, dots, val] = this.twoColumnLog(name, value, false)\n\n console.log(this.textFormat(_name, color[status], preserveCol), dots, val)\n\n if (exit) process.exit(0)\n }\n\n /**\n * Wraps text with chalk\n * \n * @param txt \n * @param color \n * @param preserveCol \n * @returns \n */\n static textFormat (\n txt: unknown,\n color: (txt: string) => string,\n preserveCol = false\n ): string {\n const str = String(txt)\n\n if (preserveCol) return str\n\n const [first, ...rest] = str.split(':')\n if (rest.length === 0) return str\n\n return color(` ${first} `) + rest.join(':')\n }\n\n\n /**\n * Logs a success message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static success (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.green('✓'), this.textFormat(msg, chalk.bgGreen, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an informational message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static info (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.blue('ℹ'), this.textFormat(msg, chalk.bgBlue, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an error message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static error (msg: string | string[] | Error & { detail?: string }, exit = true, preserveCol = false) {\n if (msg instanceof Error) {\n if (msg.message) {\n console.error(chalk.red('✖'), this.textFormat('ERROR:' + msg.message, chalk.bgRed, preserveCol))\n }\n console.error(chalk.red(`${msg.detail ? `${msg.detail}\\n` : ''}${msg.stack}`), '\\n')\n }\n else {\n console.error(chalk.red('✖'), this.textFormat(msg, chalk.bgRed, preserveCol), '\\n')\n }\n if (exit) process.exit(1)\n }\n\n /**\n * Terminates the process\n */\n static quiet () {\n process.exit(0)\n }\n\n static chalker (styles: LoggerChalk[]) {\n return (input: any): string =>\n styles.reduce((acc, style) => {\n if ((style as any) in chalk) {\n const fn = typeof style === 'function'\n ? style\n : chalk[style as never]\n return fn(acc)\n }\n return acc\n }, input)\n }\n\n /**\n * Parse an array formated message and logs it\n * \n * @param config \n * @param joiner \n * @param log If set to false, string output will be returned and not logged \n */\n static parse (config: LoggerParseSignature, joiner?: string, log?: true): void\n static parse (config: LoggerParseSignature, joiner?: string, log?: false): string\n static parse (config: LoggerParseSignature, joiner = ' ', log = true): string | void {\n const string = config.map(([str, opt]) => {\n if (Array.isArray(opt)) {\n opt = Logger.chalker(opt) as ChalkInstance\n }\n\n return typeof opt === 'string' && typeof chalk[opt] === 'function'\n ? (chalk as any)[opt](str)\n : typeof opt === 'function' ? opt(str) : str\n }).join(joiner)\n\n if (log) console.log(string)\n else return string\n }\n\n /**\n * Ouput formater object or format the output\n * \n * @returns \n */\n public static log: LoggerLog = ((config, joiner, log: boolean = true) => {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n return this.parse(conf, '', log as false)\n } else if (config) {\n return this.parse(config, String(joiner), log as false)\n }\n\n return this\n }) as LoggerLog\n}\n","import { IPathName } from '../Contracts/IApplication'\nimport nodepath from 'path'\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n database: '/src/database',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param prefix - The base path to prefix to the path\n * @returns \n */\n getPath (name: IPathName, prefix?: string): string {\n let path: string\n\n if (prefix && name !== 'base') {\n path = nodepath.join(prefix, this.paths[name])\n } else {\n path = this.paths[name]\n }\n\n\n if (name === 'public') {\n path = path.replace('/public', nodepath.join('/', process.env.DIST_DIR ?? '.h3ravel/serve'))\n } else {\n path = path.replace('/src/', `/${process.env.DIST_DIR ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, '$1'))\n }\n\n return nodepath.normalize(path)\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import crypto from 'crypto'\nimport preferredPM from 'preferred-pm'\n\nexport class Resolver {\n static async getPakageInstallCommand (pkg?: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install '\n\n if (!pkg) {\n if (pm === 'npm' || pm === 'pnpm' || pm === 'bun')\n cmd = 'install'\n else\n cmd = ''\n } else if (pm === 'yarn' || pm === 'pnpm' || pm === 'bun')\n cmd = 'add '\n\n return `${pm} ${cmd}${pkg ?? ''}`\n }\n\n static async getInstallCommand (pkg: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install'\n if (pm === 'yarn' || pm === 'pnpm')\n cmd = 'add'\n else if (pm === 'bun')\n cmd = 'create'\n\n return `${pm} ${cmd} ${pkg}`\n }\n\n\n /**\n * Create a hash for a function or an object\n * \n * @param provider \n * @returns \n */\n static hashObjectOrFunction (provider: object | ((..._: any[]) => any)): string {\n return crypto\n .createHash('sha1')\n .update(provider.toString())\n .digest('hex')\n }\n}\n","export const mainTsconfig = {\n extends: '@h3ravel/shared/tsconfig.json',\n compilerOptions: {\n baseUrl: '.',\n outDir: 'dist',\n paths: {\n 'src/*': ['./../src/*'],\n 'App/*': ['./../src/app/*'],\n 'root/*': ['./../*'],\n 'routes/*': ['./../src/routes/*'],\n 'config/*': ['./../src/config/*'],\n 'resources/*': ['./../src/resources/*']\n },\n target: 'es2022',\n module: 'es2022',\n moduleResolution: 'Node',\n esModuleInterop: true,\n strict: true,\n allowJs: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n noEmit: true,\n experimentalDecorators: true,\n emitDecoratorMetadata: true\n },\n include: ['./**/*.d.ts', './../**/*'],\n exclude: [\n '.',\n './../**/console/bin',\n './../dist',\n './../**/dist',\n './../**/node_modules',\n './../.node_modules',\n './../**/node_modules/*',\n './../**/public',\n './../public',\n './../**/storage',\n './../storage',\n './../**coverage**',\n './../eslint.config.js',\n './../jest.config.ts',\n './../arquebus.config.js'\n ]\n}\n\nexport const baseTsconfig = {\n extends: './.h3ravel/tsconfig.json'\n}\n\nexport const packageJsonScript = {\n build: 'NODE_ENV=production tsdown --config-loader unconfig -c tsdown.default.config.ts',\n dev: 'NODE_ENV=development pnpm tsdown --config-loader unconfig -c tsdown.default.config.ts',\n start: 'DIST_DIR=dist node -r source-map-support/register dist/server.js',\n lint: 'eslint . --ext .ts',\n test: 'NODE_NO_WARNINGS=1 NODE_ENV=testing jest --passWithNoTests',\n postinstall: 'pnpm spawn'\n}\n","import { Logger } from './Logger'\n\nexport class TaskManager {\n public static async taskRunner (\n description: string,\n task: (() => Promise<any>) | (() => any)\n ): Promise<void> {\n const startTime = process.hrtime()\n let result: any = false\n\n try {\n result = await Promise.all([(task || (() => true))()].flat())\n } finally {\n const endTime = process.hrtime(startTime)\n const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n Logger.twoColumnLog(\n Logger.parse([[description, 'green']], '', false),\n [\n Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n Logger.parse([[result !== false ? '✔' : '✘', result !== false ? 'green' : 'red']], '', false),\n ].join(' ')\n )\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["app: IApplication","request: IRequest","response: IResponse","value: any","path","path: string","nodepath","path","result: any","e: any"],"sources":["../src/Contracts/IHttp.ts","../src/Utils/EnvParser.ts","../src/Utils/FileSystem.ts","../src/Utils/Logger.ts","../src/Utils/PathLoader.ts","../src/Utils/Resolver.ts","../src/Utils/scripts.ts","../src/Utils/TaskManager.ts"],"sourcesContent":["import type { Middleware, MiddlewareOptions } from 'h3'\n\nimport { IApplication } from './IApplication'\nimport { IRequest } from './IRequest'\nimport { IResponse } from './IResponse'\n\nexport type RouterEnd = 'get' | 'delete' | 'put' | 'post' | 'patch' | 'apiResource' | 'group' | 'route';\n\nexport type ExtractControllerMethods<T> = {\n [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never\n}[keyof T];\n\n/**\n * Interface for the Router contract, defining methods for HTTP routing.\n */\nexport interface IRouter {\n /**\n * Registers a GET route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n get<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a POST route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n post<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a PUT route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n put<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a route that responds to HTTP PATCH requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n patch<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a DELETE route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n delete<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers an API resource with standard CRUD routes.\n * @param path - The base path for the resource.\n * @param controller - The controller class handling the resource.\n * @param middleware - Optional middleware array.\n */\n apiResource (\n path: string,\n controller: new (app: IApplication) => IController,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd | 'name'>;\n\n /**\n * Generates a URL for a named route.\n * @param name - The name of the route.\n * @param params - Optional parameters to replace in the route path.\n * @returns The generated URL or undefined if the route is not found.\n */\n route (name: string, params?: Record<string, string>): string | undefined;\n\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string): this\n\n /**\n * Groups routes with shared prefix or middleware.\n * @param options - Configuration for prefix or middleware.\n * @param callback - Callback function defining grouped routes.\n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: () => this): this;\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: Middleware, opts?: Middleware | MiddlewareOptions): this\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions): this;\n}\n\n/**\n * Represents the HTTP context for a single request lifecycle.\n * Encapsulates the application instance, request, and response objects.\n */\nexport class HttpContext {\n constructor(\n public app: IApplication,\n public request: IRequest,\n public response: IResponse\n ) { }\n\n /**\n * Factory method to create a new HttpContext instance from a context object.\n * @param ctx - Object containing app, request, and response\n * @returns A new HttpContext instance\n */\n static init (ctx: { app: IApplication; request: IRequest; response: IResponse }): HttpContext {\n /**\n * Return a new instance\n */\n return new HttpContext(ctx.app, ctx.request, ctx.response)\n }\n}\n\n\n/**\n * Type for EventHandler, representing a function that handles an H3 event.\n */\nexport type EventHandler = (ctx: HttpContext) => any\nexport type RouteEventHandler = (...args: any[]) => any\n\n/**\n * Defines the contract for all controllers.\n * Any controller implementing this must define these methods.\n */\nexport interface IController {\n show?(...ctx: any[]): any\n index?(...ctx: any[]): any\n store?(...ctx: any[]): any\n update?(...ctx: any[]): any\n destroy?(...ctx: any[]): any\n}\n\n/**\n * Defines the contract for all middlewares.\n * Any middleware implementing this must define these methods.\n */\nexport interface IMiddleware {\n handle (context: HttpContext, next: () => Promise<any>): Promise<any>\n} \n","import { GenericWithNullableStringValues } from '../Contracts/ObjContract'\n\nexport class EnvParser {\n\n static parse (initial: GenericWithNullableStringValues) {\n const parsed = { ...initial }\n\n for (const key in parsed) {\n const value: any = parsed[key]\n parsed[key] = this.parseValue(value)\n }\n\n return parsed\n }\n\n static parseValue (value: any) {\n /**\n * Null/undefined stay untouched \n */\n if (value === null || value === undefined) return value\n\n /**\n * Convert string \"true\"/\"false\" to boolean \n */\n if (value === 'true') return true\n if (value === 'false') return false\n\n /**\n * Convert string numbers to number \n */\n if (!isNaN(value) && value.trim() !== '') {\n return Number(value)\n }\n\n /**\n * Convert string \"null\" and \"undefined\"\n */\n if (value === 'null') return null\n if (value === 'undefined') return undefined\n\n /**\n * Otherwise return as-is (string)\n */\n return value\n }\n}\n","import { access } from 'fs/promises'\nimport escalade from 'escalade/sync'\nimport path from 'path'\n\nexport class FileSystem {\n static findModulePkg (moduleId: string, cwd?: string) {\n const parts = moduleId.replace(/\\\\/g, '/').split('/')\n\n let packageName = ''\n // Handle scoped package name\n if (parts.length > 0 && parts[0][0] === '@') {\n packageName += parts.shift() + '/'\n }\n packageName += parts.shift()\n\n const packageJson = path.join(cwd ?? process.cwd(), 'node_modules', packageName)\n\n const resolved = this.resolveFileUp('package', ['json'], packageJson)\n\n if (!resolved) {\n return\n }\n\n return path.join(path.dirname(resolved), parts.join('/'))\n }\n\n /**\n * Check if file exists\n * \n * @param path \n * @returns \n */\n static async fileExists (path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Recursively find files starting from given cwd\n * \n * @param name \n * @param extensions \n * @param cwd \n * \n * @returns \n */\n static resolveFileUp (\n name: string,\n extensions: string[] | ((dir: string, filesNames: string[]) => string | false),\n cwd?: string\n ) {\n cwd ??= process.cwd()\n\n return escalade(cwd, (dir, filesNames) => {\n if (typeof extensions === 'function') {\n return extensions(dir, filesNames)\n }\n\n const candidates = new Set(extensions.map(ext => `${name}.${ext}`))\n for (const filename of filesNames) {\n if (candidates.has(filename)) {\n return filename\n }\n }\n\n return false\n }) ?? undefined\n }\n} \n","import chalk, { type ChalkInstance } from 'chalk'\nimport { LoggerChalk, LoggerLog, LoggerParseSignature } from '../Contracts/Utils'\n\nexport class Logger {\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param value \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static twoColumnDetail (name: string, value: string, log?: true, spacer?: string): void\n static twoColumnDetail (name: string, value: string, log?: false, spacer?: string): [string, string, string]\n static twoColumnDetail (name: string, value: string, log = true, spacer = '.'): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.max(process.stdout.columns, 100)\n const dots = Math.max(width - name.replace(regex, '').length - value.replace(regex, '').length - 10, 0)\n\n if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value)\n else return [name, chalk.gray(spacer.repeat(dots)), value]\n }\n\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param desc \n * @param width \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static describe (name: string, desc: string, width?: number, log?: true): void\n static describe (name: string, desc: string, width?: number, log?: false): [string, string, string]\n static describe (name: string, desc: string, width = 50, log = true): [string, string, string] | void {\n width = Math.min(width, 30)\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const dots = Math.max(width - name.replace(regex, '').length, 0)\n\n if (log) return console.log(name, ' '.repeat(dots), desc)\n else return [name, ' '.repeat(dots), desc]\n }\n\n /**\n * Logs the message in two columns but allways passing status\n * \n * @param name \n * @param value \n * @param status \n * @param exit \n * @param preserveCol \n */\n static split (name: string, value: string, status?: 'success' | 'info' | 'error', exit = false, preserveCol = false) {\n status ??= 'info'\n const color = { success: chalk.bgGreen, info: chalk.bgBlue, error: chalk.bgRed }\n\n const [_name, dots, val] = this.twoColumnDetail(name, value, false)\n\n console.log(this.textFormat(_name, color[status], preserveCol), dots, val)\n\n if (exit) process.exit(0)\n }\n\n /**\n * Wraps text with chalk\n * \n * @param txt \n * @param color \n * @param preserveCol \n * @returns \n */\n static textFormat (\n txt: unknown,\n color: (txt: string) => string,\n preserveCol = false\n ): string {\n const str = String(txt)\n\n if (preserveCol) return str\n\n const [first, ...rest] = str.split(':')\n if (rest.length === 0) return str\n\n return color(` ${first} `) + rest.join(':')\n }\n\n\n /**\n * Logs a success message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static success (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.green('✓'), this.textFormat(msg, chalk.bgGreen, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an informational message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static info (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.blue('ℹ'), this.textFormat(msg, chalk.bgBlue, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an error message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static error (msg: string | string[] | Error & { detail?: string }, exit = true, preserveCol = false) {\n if (msg instanceof Error) {\n if (msg.message) {\n console.error(chalk.red('✖'), this.textFormat('ERROR:' + msg.message, chalk.bgRed, preserveCol))\n }\n console.error(chalk.red(`${msg.detail ? `${msg.detail}\\n` : ''}${msg.stack}`), '\\n')\n }\n else {\n console.error(chalk.red('✖'), this.textFormat(msg, chalk.bgRed, preserveCol), '\\n')\n }\n if (exit) process.exit(1)\n }\n\n /**\n * Terminates the process\n */\n static quiet () {\n process.exit(0)\n }\n\n static chalker (styles: LoggerChalk[]) {\n return (input: any): string =>\n styles.reduce((acc, style) => {\n if ((style as any) in chalk) {\n const fn = typeof style === 'function'\n ? style\n : chalk[style as never]\n return fn(acc)\n }\n return acc\n }, input)\n }\n\n /**\n * Parse an array formated message and logs it\n * \n * @param config \n * @param joiner \n * @param log If set to false, string output will be returned and not logged \n * @param sc color to use ue on split text if : is found \n */\n static parse (config: LoggerParseSignature, joiner?: string, log?: true, sc?: LoggerChalk): void\n static parse (config: LoggerParseSignature, joiner?: string, log?: false, sc?: LoggerChalk): string\n static parse (config: LoggerParseSignature, joiner = ' ', log = true, sc?: LoggerChalk): string | void {\n const string = config.map(([str, opt]) => {\n if (Array.isArray(opt)) {\n opt = Logger.chalker(opt) as ChalkInstance\n }\n\n const output = typeof opt === 'string' && typeof chalk[opt] === 'function'\n ? (chalk as any)[opt](str)\n : typeof opt === 'function' ? opt(str) : str\n\n if (!sc) {\n return output\n }\n\n return this.textFormat(output, Logger.chalker(Array.isArray(sc) ? sc : [sc]))\n }).join(joiner)\n\n if (log) console.log(string)\n else return string\n }\n\n /**\n * Ouput formater object or format the output\n * \n * @returns \n */\n public static log: LoggerLog = ((config, joiner, log: boolean = true, sc) => {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n return this.parse(conf, '', log as false, sc)\n } else if (config) {\n return this.parse(config, String(joiner), log as false, sc)\n }\n\n return this\n }) as LoggerLog\n}\n","import { IPathName } from '../Contracts/IApplication'\nimport nodepath from 'path'\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n database: '/src/database',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param prefix - The base path to prefix to the path\n * @returns \n */\n getPath (name: IPathName, prefix?: string): string {\n let path: string\n\n if (prefix && name !== 'base') {\n path = nodepath.join(prefix, this.paths[name])\n } else {\n path = this.paths[name]\n }\n\n\n if (name === 'public') {\n path = path.replace('/public', nodepath.join('/', process.env.DIST_DIR ?? '.h3ravel/serve'))\n } else {\n path = path.replace('/src/', `/${process.env.DIST_DIR ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, '$1'))\n }\n\n return nodepath.normalize(path)\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import crypto from 'crypto'\nimport preferredPM from 'preferred-pm'\n\nexport class Resolver {\n static async getPakageInstallCommand (pkg?: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install '\n\n if (!pkg) {\n if (pm === 'npm' || pm === 'pnpm' || pm === 'bun')\n cmd = 'install'\n else\n cmd = ''\n } else if (pm === 'yarn' || pm === 'pnpm' || pm === 'bun')\n cmd = 'add '\n\n return `${pm} ${cmd}${pkg ?? ''}`\n }\n\n static async getInstallCommand (pkg: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install'\n if (pm === 'yarn' || pm === 'pnpm')\n cmd = 'add'\n else if (pm === 'bun')\n cmd = 'create'\n\n return `${pm} ${cmd} ${pkg}`\n }\n\n\n /**\n * Create a hash for a function or an object\n * \n * @param provider \n * @returns \n */\n static hashObjectOrFunction (provider: object | ((..._: any[]) => any)): string {\n return crypto\n .createHash('sha1')\n .update(provider.toString())\n .digest('hex')\n }\n}\n","export const mainTsconfig = {\n extends: '@h3ravel/shared/tsconfig.json',\n compilerOptions: {\n baseUrl: '.',\n outDir: 'dist',\n paths: {\n 'src/*': ['./../src/*'],\n 'App/*': ['./../src/app/*'],\n 'root/*': ['./../*'],\n 'routes/*': ['./../src/routes/*'],\n 'config/*': ['./../src/config/*'],\n 'resources/*': ['./../src/resources/*']\n },\n target: 'es2022',\n module: 'es2022',\n moduleResolution: 'Node',\n esModuleInterop: true,\n strict: true,\n allowJs: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n noEmit: true,\n experimentalDecorators: true,\n emitDecoratorMetadata: true\n },\n include: ['./**/*.d.ts', './../**/*'],\n exclude: [\n '.',\n './../**/console/bin',\n './../dist',\n './../**/dist',\n './../**/node_modules',\n './../.node_modules',\n './../**/node_modules/*',\n './../**/public',\n './../public',\n './../**/storage',\n './../storage',\n './../**coverage**',\n './../eslint.config.js',\n './../jest.config.ts',\n './../arquebus.config.js'\n ]\n}\n\nexport const baseTsconfig = {\n extends: './.h3ravel/tsconfig.json'\n}\n\nexport const packageJsonScript = {\n build: 'NODE_ENV=production tsdown --config-loader unconfig -c tsdown.default.config.ts',\n dev: 'NODE_ENV=development pnpm tsdown --config-loader unconfig -c tsdown.default.config.ts',\n start: 'DIST_DIR=dist node -r source-map-support/register dist/server.js',\n lint: 'eslint . --ext .ts',\n test: 'NODE_NO_WARNINGS=1 NODE_ENV=testing jest --passWithNoTests',\n postinstall: 'pnpm spawn'\n}\n","import { Logger } from './Logger'\n\nexport class TaskManager {\n public static async taskRunner (\n description: string,\n task: (() => Promise<any>) | (() => any)\n ): Promise<void> {\n const startTime = process.hrtime()\n let result: any = false\n\n try {\n result = await Promise.all([(task || (() => true))()].flat())\n } finally {\n const endTime = process.hrtime(startTime)\n const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n Logger.twoColumnDetail(\n Logger.parse([[description, 'green']], '', false),\n [\n Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n Logger.parse([[result !== false ? '✔' : '✘', result !== false ? 'green' : 'red']], '', false),\n ].join(' ')\n )\n }\n }\n\n public static async advancedTaskRunner<R = any> (\n info: [[string, string], [string, string]] | [[string, string]],\n task: (() => Promise<R>) | (() => R)\n ): Promise<R | undefined> {\n const startTime = process.hrtime()\n const [startInfo, stopInfo] = info\n\n if (stopInfo) {\n Logger.twoColumnDetail(startInfo[0], Logger.log(startInfo[1], ['yellow', 'bold'], false))\n }\n\n try {\n return await Promise.race([task()])\n } catch (e: any) {\n Logger.error('ERROR: ' + e.message)\n } finally {\n const endTime = process.hrtime(startTime)\n const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n\n Logger.twoColumnDetail(\n stopInfo?.[0] ?? startInfo[0],\n [\n Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n Logger.parse([[`✔ ${stopInfo?.[1] ?? startInfo[1]}`, ['green', 'bold']]], '', false),\n ].join(' ')\n )\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -82,7 +82,7 @@ interface IServiceProvider {
|
|
|
82
82
|
/**
|
|
83
83
|
* Indicate that this service provider only runs in console
|
|
84
84
|
*/
|
|
85
|
-
|
|
85
|
+
runsInConsole?: boolean;
|
|
86
86
|
/**
|
|
87
87
|
* List of registered console commands
|
|
88
88
|
*/
|
|
@@ -253,6 +253,7 @@ interface IResponse {
|
|
|
253
253
|
//#endregion
|
|
254
254
|
//#region src/Contracts/IHttp.d.ts
|
|
255
255
|
type RouterEnd = 'get' | 'delete' | 'put' | 'post' | 'patch' | 'apiResource' | 'group' | 'route';
|
|
256
|
+
type ExtractControllerMethods<T> = { [K in keyof T]: T[K] extends ((...args: any[]) => any) ? K : never }[keyof T];
|
|
256
257
|
/**
|
|
257
258
|
* Interface for the Router contract, defining methods for HTTP routing.
|
|
258
259
|
*/
|
|
@@ -264,7 +265,7 @@ interface IRouter {
|
|
|
264
265
|
* @param name - Optional route name.
|
|
265
266
|
* @param middleware - Optional middleware array.
|
|
266
267
|
*/
|
|
267
|
-
get(path: string, definition: EventHandler | [
|
|
268
|
+
get<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
268
269
|
/**
|
|
269
270
|
* Registers a POST route.
|
|
270
271
|
* @param path - The route path.
|
|
@@ -272,7 +273,7 @@ interface IRouter {
|
|
|
272
273
|
* @param name - Optional route name.
|
|
273
274
|
* @param middleware - Optional middleware array.
|
|
274
275
|
*/
|
|
275
|
-
post(path: string, definition: EventHandler | [
|
|
276
|
+
post<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
276
277
|
/**
|
|
277
278
|
* Registers a PUT route.
|
|
278
279
|
* @param path - The route path.
|
|
@@ -280,7 +281,18 @@ interface IRouter {
|
|
|
280
281
|
* @param name - Optional route name.
|
|
281
282
|
* @param middleware - Optional middleware array.
|
|
282
283
|
*/
|
|
283
|
-
put(path: string, definition: EventHandler | [
|
|
284
|
+
put<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
285
|
+
/**
|
|
286
|
+
* Registers a route that responds to HTTP PATCH requests.
|
|
287
|
+
*
|
|
288
|
+
* @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
|
|
289
|
+
* @param definition Either:
|
|
290
|
+
* - An EventHandler function
|
|
291
|
+
* - A tuple: [ControllerClass, methodName]
|
|
292
|
+
* @param name Optional route name (for URL generation or referencing).
|
|
293
|
+
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
294
|
+
*/
|
|
295
|
+
patch<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
284
296
|
/**
|
|
285
297
|
* Registers a DELETE route.
|
|
286
298
|
* @param path - The route path.
|
|
@@ -288,7 +300,7 @@ interface IRouter {
|
|
|
288
300
|
* @param name - Optional route name.
|
|
289
301
|
* @param middleware - Optional middleware array.
|
|
290
302
|
*/
|
|
291
|
-
delete(path: string, definition: EventHandler | [
|
|
303
|
+
delete<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
292
304
|
/**
|
|
293
305
|
* Registers an API resource with standard CRUD routes.
|
|
294
306
|
* @param path - The base path for the resource.
|
|
@@ -357,11 +369,11 @@ type RouteEventHandler = (...args: any[]) => any;
|
|
|
357
369
|
* Any controller implementing this must define these methods.
|
|
358
370
|
*/
|
|
359
371
|
interface IController {
|
|
360
|
-
show(...ctx: any[]): any;
|
|
361
|
-
index(...ctx: any[]): any;
|
|
362
|
-
store(...ctx: any[]): any;
|
|
363
|
-
update(...ctx: any[]): any;
|
|
364
|
-
destroy(...ctx: any[]): any;
|
|
372
|
+
show?(...ctx: any[]): any;
|
|
373
|
+
index?(...ctx: any[]): any;
|
|
374
|
+
store?(...ctx: any[]): any;
|
|
375
|
+
update?(...ctx: any[]): any;
|
|
376
|
+
destroy?(...ctx: any[]): any;
|
|
365
377
|
}
|
|
366
378
|
/**
|
|
367
379
|
* Defines the contract for all middlewares.
|
|
@@ -419,6 +431,16 @@ type Bindings = {
|
|
|
419
431
|
};
|
|
420
432
|
type UseKey = keyof RemoveIndexSignature<Bindings>;
|
|
421
433
|
//#endregion
|
|
434
|
+
//#region src/Contracts/Router.d.ts
|
|
435
|
+
type RouteMethod = 'get' | 'head' | 'put' | 'patch' | 'post' | 'delete';
|
|
436
|
+
interface RouteDefinition {
|
|
437
|
+
method: RouteMethod;
|
|
438
|
+
path: string;
|
|
439
|
+
name?: string | undefined;
|
|
440
|
+
handler: EventHandler;
|
|
441
|
+
signature: [string, string | undefined];
|
|
442
|
+
}
|
|
443
|
+
//#endregion
|
|
422
444
|
//#region src/Utils/Logger.d.ts
|
|
423
445
|
declare class Logger {
|
|
424
446
|
/**
|
|
@@ -429,8 +451,8 @@ declare class Logger {
|
|
|
429
451
|
* @param log If set to false, array of [name, dots, value] output will be returned and not logged
|
|
430
452
|
* @returns
|
|
431
453
|
*/
|
|
432
|
-
static
|
|
433
|
-
static
|
|
454
|
+
static twoColumnDetail(name: string, value: string, log?: true, spacer?: string): void;
|
|
455
|
+
static twoColumnDetail(name: string, value: string, log?: false, spacer?: string): [string, string, string];
|
|
434
456
|
/**
|
|
435
457
|
* Logs the message in two columns
|
|
436
458
|
*
|
|
@@ -498,9 +520,10 @@ declare class Logger {
|
|
|
498
520
|
* @param config
|
|
499
521
|
* @param joiner
|
|
500
522
|
* @param log If set to false, string output will be returned and not logged
|
|
523
|
+
* @param sc color to use ue on split text if : is found
|
|
501
524
|
*/
|
|
502
|
-
static parse(config: LoggerParseSignature, joiner?: string, log?: true): void;
|
|
503
|
-
static parse(config: LoggerParseSignature, joiner?: string, log?: false): string;
|
|
525
|
+
static parse(config: LoggerParseSignature, joiner?: string, log?: true, sc?: LoggerChalk): void;
|
|
526
|
+
static parse(config: LoggerParseSignature, joiner?: string, log?: false, sc?: LoggerChalk): string;
|
|
504
527
|
/**
|
|
505
528
|
* Ouput formater object or format the output
|
|
506
529
|
*
|
|
@@ -515,13 +538,18 @@ type LoggerParseSignature = [string, LoggerChalk][];
|
|
|
515
538
|
/**
|
|
516
539
|
* Ouput formater object or format the output
|
|
517
540
|
*
|
|
541
|
+
* @param config
|
|
542
|
+
* @param joiner
|
|
543
|
+
* @param log If set to false, string output will be returned and not logged
|
|
544
|
+
* @param sc color to use ue on split text if : is found
|
|
545
|
+
*
|
|
518
546
|
* @returns
|
|
519
547
|
*/
|
|
520
548
|
interface LoggerLog {
|
|
521
549
|
(): typeof Logger;
|
|
522
|
-
<L extends boolean>(config: string, joiner: LoggerChalk, log?: L): L extends true ? void : string;
|
|
523
|
-
<L extends boolean>(config: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string;
|
|
524
|
-
<L extends boolean>(config?: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string | Logger;
|
|
550
|
+
<L extends boolean>(config: string, joiner: LoggerChalk, log?: L, sc?: LoggerChalk): L extends true ? void : string;
|
|
551
|
+
<L extends boolean>(config: LoggerParseSignature, joiner?: string, log?: L, sc?: LoggerChalk): L extends true ? void : string;
|
|
552
|
+
<L extends boolean>(config?: LoggerParseSignature, joiner?: string, log?: L, sc?: LoggerChalk): L extends true ? void : string | Logger;
|
|
525
553
|
}
|
|
526
554
|
//#endregion
|
|
527
555
|
//#region src/Utils/EnvParser.d.ts
|
|
@@ -543,14 +571,15 @@ declare class FileSystem {
|
|
|
543
571
|
*/
|
|
544
572
|
static fileExists(path: string): Promise<boolean>;
|
|
545
573
|
/**
|
|
546
|
-
* Recursively find files
|
|
574
|
+
* Recursively find files starting from given cwd
|
|
547
575
|
*
|
|
548
|
-
* @param cwd
|
|
549
576
|
* @param name
|
|
550
577
|
* @param extensions
|
|
578
|
+
* @param cwd
|
|
579
|
+
*
|
|
551
580
|
* @returns
|
|
552
581
|
*/
|
|
553
|
-
static
|
|
582
|
+
static resolveFileUp(name: string, extensions: string[] | ((dir: string, filesNames: string[]) => string | false), cwd?: string): string | undefined;
|
|
554
583
|
}
|
|
555
584
|
//#endregion
|
|
556
585
|
//#region src/Utils/Resolver.d.ts
|
|
@@ -610,7 +639,8 @@ declare const packageJsonScript: {
|
|
|
610
639
|
//#region src/Utils/TaskManager.d.ts
|
|
611
640
|
declare class TaskManager {
|
|
612
641
|
static taskRunner(description: string, task: (() => Promise<any>) | (() => any)): Promise<void>;
|
|
642
|
+
static advancedTaskRunner<R = any>(info: [[string, string], [string, string]] | [[string, string]], task: (() => Promise<R>) | (() => R)): Promise<R | undefined>;
|
|
613
643
|
}
|
|
614
644
|
//#endregion
|
|
615
|
-
export { Bindings, DotFlatten, DotNestedKeys, DotNestedValue, EnvParser, EventHandler, FileSystem, GenericWithNullableStringValues, HttpContext, IApplication, IContainer, IController, IMiddleware, IPathName, IRequest, IResponse, IRouter, IServiceProvider, Logger, LoggerChalk, LoggerLog, LoggerParseSignature, PathLoader, Resolver, RouteEventHandler, RouterEnd, TaskManager, UseKey, baseTsconfig, mainTsconfig, packageJsonScript };
|
|
645
|
+
export { Bindings, DotFlatten, DotNestedKeys, DotNestedValue, EnvParser, EventHandler, ExtractControllerMethods, FileSystem, GenericWithNullableStringValues, HttpContext, IApplication, IContainer, IController, IMiddleware, IPathName, IRequest, IResponse, IRouter, IServiceProvider, Logger, LoggerChalk, LoggerLog, LoggerParseSignature, PathLoader, Resolver, RouteDefinition, RouteEventHandler, RouteMethod, RouterEnd, TaskManager, UseKey, baseTsconfig, mainTsconfig, packageJsonScript };
|
|
616
646
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -82,7 +82,7 @@ interface IServiceProvider {
|
|
|
82
82
|
/**
|
|
83
83
|
* Indicate that this service provider only runs in console
|
|
84
84
|
*/
|
|
85
|
-
|
|
85
|
+
runsInConsole?: boolean;
|
|
86
86
|
/**
|
|
87
87
|
* List of registered console commands
|
|
88
88
|
*/
|
|
@@ -253,6 +253,7 @@ interface IResponse {
|
|
|
253
253
|
//#endregion
|
|
254
254
|
//#region src/Contracts/IHttp.d.ts
|
|
255
255
|
type RouterEnd = 'get' | 'delete' | 'put' | 'post' | 'patch' | 'apiResource' | 'group' | 'route';
|
|
256
|
+
type ExtractControllerMethods<T> = { [K in keyof T]: T[K] extends ((...args: any[]) => any) ? K : never }[keyof T];
|
|
256
257
|
/**
|
|
257
258
|
* Interface for the Router contract, defining methods for HTTP routing.
|
|
258
259
|
*/
|
|
@@ -264,7 +265,7 @@ interface IRouter {
|
|
|
264
265
|
* @param name - Optional route name.
|
|
265
266
|
* @param middleware - Optional middleware array.
|
|
266
267
|
*/
|
|
267
|
-
get(path: string, definition: EventHandler | [
|
|
268
|
+
get<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
268
269
|
/**
|
|
269
270
|
* Registers a POST route.
|
|
270
271
|
* @param path - The route path.
|
|
@@ -272,7 +273,7 @@ interface IRouter {
|
|
|
272
273
|
* @param name - Optional route name.
|
|
273
274
|
* @param middleware - Optional middleware array.
|
|
274
275
|
*/
|
|
275
|
-
post(path: string, definition: EventHandler | [
|
|
276
|
+
post<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
276
277
|
/**
|
|
277
278
|
* Registers a PUT route.
|
|
278
279
|
* @param path - The route path.
|
|
@@ -280,7 +281,18 @@ interface IRouter {
|
|
|
280
281
|
* @param name - Optional route name.
|
|
281
282
|
* @param middleware - Optional middleware array.
|
|
282
283
|
*/
|
|
283
|
-
put(path: string, definition: EventHandler | [
|
|
284
|
+
put<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
285
|
+
/**
|
|
286
|
+
* Registers a route that responds to HTTP PATCH requests.
|
|
287
|
+
*
|
|
288
|
+
* @param path The URL pattern to match (can include parameters, e.g., '/users/:id').
|
|
289
|
+
* @param definition Either:
|
|
290
|
+
* - An EventHandler function
|
|
291
|
+
* - A tuple: [ControllerClass, methodName]
|
|
292
|
+
* @param name Optional route name (for URL generation or referencing).
|
|
293
|
+
* @param middleware Optional array of middleware functions to execute before the handler.
|
|
294
|
+
*/
|
|
295
|
+
patch<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
284
296
|
/**
|
|
285
297
|
* Registers a DELETE route.
|
|
286
298
|
* @param path - The route path.
|
|
@@ -288,7 +300,7 @@ interface IRouter {
|
|
|
288
300
|
* @param name - Optional route name.
|
|
289
301
|
* @param middleware - Optional middleware array.
|
|
290
302
|
*/
|
|
291
|
-
delete(path: string, definition: EventHandler | [
|
|
303
|
+
delete<C extends new (...args: any) => any>(path: string, definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
|
|
292
304
|
/**
|
|
293
305
|
* Registers an API resource with standard CRUD routes.
|
|
294
306
|
* @param path - The base path for the resource.
|
|
@@ -357,11 +369,11 @@ type RouteEventHandler = (...args: any[]) => any;
|
|
|
357
369
|
* Any controller implementing this must define these methods.
|
|
358
370
|
*/
|
|
359
371
|
interface IController {
|
|
360
|
-
show(...ctx: any[]): any;
|
|
361
|
-
index(...ctx: any[]): any;
|
|
362
|
-
store(...ctx: any[]): any;
|
|
363
|
-
update(...ctx: any[]): any;
|
|
364
|
-
destroy(...ctx: any[]): any;
|
|
372
|
+
show?(...ctx: any[]): any;
|
|
373
|
+
index?(...ctx: any[]): any;
|
|
374
|
+
store?(...ctx: any[]): any;
|
|
375
|
+
update?(...ctx: any[]): any;
|
|
376
|
+
destroy?(...ctx: any[]): any;
|
|
365
377
|
}
|
|
366
378
|
/**
|
|
367
379
|
* Defines the contract for all middlewares.
|
|
@@ -419,6 +431,16 @@ type Bindings = {
|
|
|
419
431
|
};
|
|
420
432
|
type UseKey = keyof RemoveIndexSignature<Bindings>;
|
|
421
433
|
//#endregion
|
|
434
|
+
//#region src/Contracts/Router.d.ts
|
|
435
|
+
type RouteMethod = 'get' | 'head' | 'put' | 'patch' | 'post' | 'delete';
|
|
436
|
+
interface RouteDefinition {
|
|
437
|
+
method: RouteMethod;
|
|
438
|
+
path: string;
|
|
439
|
+
name?: string | undefined;
|
|
440
|
+
handler: EventHandler;
|
|
441
|
+
signature: [string, string | undefined];
|
|
442
|
+
}
|
|
443
|
+
//#endregion
|
|
422
444
|
//#region src/Utils/Logger.d.ts
|
|
423
445
|
declare class Logger {
|
|
424
446
|
/**
|
|
@@ -429,8 +451,8 @@ declare class Logger {
|
|
|
429
451
|
* @param log If set to false, array of [name, dots, value] output will be returned and not logged
|
|
430
452
|
* @returns
|
|
431
453
|
*/
|
|
432
|
-
static
|
|
433
|
-
static
|
|
454
|
+
static twoColumnDetail(name: string, value: string, log?: true, spacer?: string): void;
|
|
455
|
+
static twoColumnDetail(name: string, value: string, log?: false, spacer?: string): [string, string, string];
|
|
434
456
|
/**
|
|
435
457
|
* Logs the message in two columns
|
|
436
458
|
*
|
|
@@ -498,9 +520,10 @@ declare class Logger {
|
|
|
498
520
|
* @param config
|
|
499
521
|
* @param joiner
|
|
500
522
|
* @param log If set to false, string output will be returned and not logged
|
|
523
|
+
* @param sc color to use ue on split text if : is found
|
|
501
524
|
*/
|
|
502
|
-
static parse(config: LoggerParseSignature, joiner?: string, log?: true): void;
|
|
503
|
-
static parse(config: LoggerParseSignature, joiner?: string, log?: false): string;
|
|
525
|
+
static parse(config: LoggerParseSignature, joiner?: string, log?: true, sc?: LoggerChalk): void;
|
|
526
|
+
static parse(config: LoggerParseSignature, joiner?: string, log?: false, sc?: LoggerChalk): string;
|
|
504
527
|
/**
|
|
505
528
|
* Ouput formater object or format the output
|
|
506
529
|
*
|
|
@@ -515,13 +538,18 @@ type LoggerParseSignature = [string, LoggerChalk][];
|
|
|
515
538
|
/**
|
|
516
539
|
* Ouput formater object or format the output
|
|
517
540
|
*
|
|
541
|
+
* @param config
|
|
542
|
+
* @param joiner
|
|
543
|
+
* @param log If set to false, string output will be returned and not logged
|
|
544
|
+
* @param sc color to use ue on split text if : is found
|
|
545
|
+
*
|
|
518
546
|
* @returns
|
|
519
547
|
*/
|
|
520
548
|
interface LoggerLog {
|
|
521
549
|
(): typeof Logger;
|
|
522
|
-
<L extends boolean>(config: string, joiner: LoggerChalk, log?: L): L extends true ? void : string;
|
|
523
|
-
<L extends boolean>(config: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string;
|
|
524
|
-
<L extends boolean>(config?: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string | Logger;
|
|
550
|
+
<L extends boolean>(config: string, joiner: LoggerChalk, log?: L, sc?: LoggerChalk): L extends true ? void : string;
|
|
551
|
+
<L extends boolean>(config: LoggerParseSignature, joiner?: string, log?: L, sc?: LoggerChalk): L extends true ? void : string;
|
|
552
|
+
<L extends boolean>(config?: LoggerParseSignature, joiner?: string, log?: L, sc?: LoggerChalk): L extends true ? void : string | Logger;
|
|
525
553
|
}
|
|
526
554
|
//#endregion
|
|
527
555
|
//#region src/Utils/EnvParser.d.ts
|
|
@@ -543,14 +571,15 @@ declare class FileSystem {
|
|
|
543
571
|
*/
|
|
544
572
|
static fileExists(path: string): Promise<boolean>;
|
|
545
573
|
/**
|
|
546
|
-
* Recursively find files
|
|
574
|
+
* Recursively find files starting from given cwd
|
|
547
575
|
*
|
|
548
|
-
* @param cwd
|
|
549
576
|
* @param name
|
|
550
577
|
* @param extensions
|
|
578
|
+
* @param cwd
|
|
579
|
+
*
|
|
551
580
|
* @returns
|
|
552
581
|
*/
|
|
553
|
-
static
|
|
582
|
+
static resolveFileUp(name: string, extensions: string[] | ((dir: string, filesNames: string[]) => string | false), cwd?: string): string | undefined;
|
|
554
583
|
}
|
|
555
584
|
//#endregion
|
|
556
585
|
//#region src/Utils/Resolver.d.ts
|
|
@@ -610,7 +639,8 @@ declare const packageJsonScript: {
|
|
|
610
639
|
//#region src/Utils/TaskManager.d.ts
|
|
611
640
|
declare class TaskManager {
|
|
612
641
|
static taskRunner(description: string, task: (() => Promise<any>) | (() => any)): Promise<void>;
|
|
642
|
+
static advancedTaskRunner<R = any>(info: [[string, string], [string, string]] | [[string, string]], task: (() => Promise<R>) | (() => R)): Promise<R | undefined>;
|
|
613
643
|
}
|
|
614
644
|
//#endregion
|
|
615
|
-
export { Bindings, DotFlatten, DotNestedKeys, DotNestedValue, EnvParser, EventHandler, FileSystem, GenericWithNullableStringValues, HttpContext, IApplication, IContainer, IController, IMiddleware, IPathName, IRequest, IResponse, IRouter, IServiceProvider, Logger, LoggerChalk, LoggerLog, LoggerParseSignature, PathLoader, Resolver, RouteEventHandler, RouterEnd, TaskManager, UseKey, baseTsconfig, mainTsconfig, packageJsonScript };
|
|
645
|
+
export { Bindings, DotFlatten, DotNestedKeys, DotNestedValue, EnvParser, EventHandler, ExtractControllerMethods, FileSystem, GenericWithNullableStringValues, HttpContext, IApplication, IContainer, IController, IMiddleware, IPathName, IRequest, IResponse, IRouter, IServiceProvider, Logger, LoggerChalk, LoggerLog, LoggerParseSignature, PathLoader, Resolver, RouteDefinition, RouteEventHandler, RouteMethod, RouterEnd, TaskManager, UseKey, baseTsconfig, mainTsconfig, packageJsonScript };
|
|
616
646
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -75,7 +75,7 @@ var FileSystem = class {
|
|
|
75
75
|
if (parts.length > 0 && parts[0][0] === "@") packageName += parts.shift() + "/";
|
|
76
76
|
packageName += parts.shift();
|
|
77
77
|
const packageJson = path.join(cwd ?? process.cwd(), "node_modules", packageName);
|
|
78
|
-
const resolved = this.
|
|
78
|
+
const resolved = this.resolveFileUp("package", ["json"], packageJson);
|
|
79
79
|
if (!resolved) return;
|
|
80
80
|
return path.join(path.dirname(resolved), parts.join("/"));
|
|
81
81
|
}
|
|
@@ -94,28 +94,29 @@ var FileSystem = class {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
* Recursively find files
|
|
97
|
+
* Recursively find files starting from given cwd
|
|
98
98
|
*
|
|
99
|
-
* @param cwd
|
|
100
99
|
* @param name
|
|
101
100
|
* @param extensions
|
|
101
|
+
* @param cwd
|
|
102
|
+
*
|
|
102
103
|
* @returns
|
|
103
104
|
*/
|
|
104
|
-
static
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
105
|
+
static resolveFileUp(name, extensions, cwd) {
|
|
106
|
+
cwd ??= process.cwd();
|
|
107
|
+
return escalade(cwd, (dir, filesNames) => {
|
|
108
|
+
if (typeof extensions === "function") return extensions(dir, filesNames);
|
|
109
|
+
const candidates = new Set(extensions.map((ext) => `${name}.${ext}`));
|
|
110
|
+
for (const filename of filesNames) if (candidates.has(filename)) return filename;
|
|
110
111
|
return false;
|
|
111
|
-
});
|
|
112
|
+
}) ?? void 0;
|
|
112
113
|
}
|
|
113
114
|
};
|
|
114
115
|
|
|
115
116
|
//#endregion
|
|
116
117
|
//#region src/Utils/Logger.ts
|
|
117
118
|
var Logger = class Logger {
|
|
118
|
-
static
|
|
119
|
+
static twoColumnDetail(name, value, log = true, spacer = ".") {
|
|
119
120
|
const regex = /\x1b\[\d+m/g;
|
|
120
121
|
const width = Math.max(process.stdout.columns, 100);
|
|
121
122
|
const dots = Math.max(width - name.replace(regex, "").length - value.replace(regex, "").length - 10, 0);
|
|
@@ -152,7 +153,7 @@ var Logger = class Logger {
|
|
|
152
153
|
info: chalk.bgBlue,
|
|
153
154
|
error: chalk.bgRed
|
|
154
155
|
};
|
|
155
|
-
const [_name, dots, val] = this.
|
|
156
|
+
const [_name, dots, val] = this.twoColumnDetail(name, value, false);
|
|
156
157
|
console.log(this.textFormat(_name, color[status], preserveCol), dots, val);
|
|
157
158
|
if (exit) process.exit(0);
|
|
158
159
|
}
|
|
@@ -219,10 +220,12 @@ var Logger = class Logger {
|
|
|
219
220
|
return acc;
|
|
220
221
|
}, input);
|
|
221
222
|
}
|
|
222
|
-
static parse(config, joiner = " ", log = true) {
|
|
223
|
+
static parse(config, joiner = " ", log = true, sc) {
|
|
223
224
|
const string = config.map(([str, opt]) => {
|
|
224
225
|
if (Array.isArray(opt)) opt = Logger.chalker(opt);
|
|
225
|
-
|
|
226
|
+
const output = typeof opt === "string" && typeof chalk[opt] === "function" ? chalk[opt](str) : typeof opt === "function" ? opt(str) : str;
|
|
227
|
+
if (!sc) return output;
|
|
228
|
+
return this.textFormat(output, Logger.chalker(Array.isArray(sc) ? sc : [sc]));
|
|
226
229
|
}).join(joiner);
|
|
227
230
|
if (log) console.log(string);
|
|
228
231
|
else return string;
|
|
@@ -232,11 +235,11 @@ var Logger = class Logger {
|
|
|
232
235
|
*
|
|
233
236
|
* @returns
|
|
234
237
|
*/
|
|
235
|
-
static log = ((config, joiner, log = true) => {
|
|
238
|
+
static log = ((config, joiner, log = true, sc) => {
|
|
236
239
|
if (typeof config === "string") {
|
|
237
240
|
const conf = [[config, joiner]];
|
|
238
|
-
return this.parse(conf, "", log);
|
|
239
|
-
} else if (config) return this.parse(config, String(joiner), log);
|
|
241
|
+
return this.parse(conf, "", log, sc);
|
|
242
|
+
} else if (config) return this.parse(config, String(joiner), log, sc);
|
|
240
243
|
return this;
|
|
241
244
|
});
|
|
242
245
|
};
|
|
@@ -379,7 +382,21 @@ var TaskManager = class {
|
|
|
379
382
|
} finally {
|
|
380
383
|
const endTime = process.hrtime(startTime);
|
|
381
384
|
const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6;
|
|
382
|
-
Logger.
|
|
385
|
+
Logger.twoColumnDetail(Logger.parse([[description, "green"]], "", false), [Logger.parse([[`${Math.floor(duration)}ms`, "gray"]], "", false), Logger.parse([[result !== false ? "✔" : "✘", result !== false ? "green" : "red"]], "", false)].join(" "));
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
static async advancedTaskRunner(info, task) {
|
|
389
|
+
const startTime = process.hrtime();
|
|
390
|
+
const [startInfo, stopInfo] = info;
|
|
391
|
+
if (stopInfo) Logger.twoColumnDetail(startInfo[0], Logger.log(startInfo[1], ["yellow", "bold"], false));
|
|
392
|
+
try {
|
|
393
|
+
return await Promise.race([task()]);
|
|
394
|
+
} catch (e) {
|
|
395
|
+
Logger.error("ERROR: " + e.message);
|
|
396
|
+
} finally {
|
|
397
|
+
const endTime = process.hrtime(startTime);
|
|
398
|
+
const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6;
|
|
399
|
+
Logger.twoColumnDetail(stopInfo?.[0] ?? startInfo[0], [Logger.parse([[`${Math.floor(duration)}ms`, "gray"]], "", false), Logger.parse([[`✔ ${stopInfo?.[1] ?? startInfo[1]}`, ["green", "bold"]]], "", false)].join(" "));
|
|
383
400
|
}
|
|
384
401
|
}
|
|
385
402
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["app: IApplication","request: IRequest","response: IResponse","value: any","path","path: string","nodepath","path","result: any"],"sources":["../src/Contracts/IHttp.ts","../src/Utils/EnvParser.ts","../src/Utils/FileSystem.ts","../src/Utils/Logger.ts","../src/Utils/PathLoader.ts","../src/Utils/Resolver.ts","../src/Utils/scripts.ts","../src/Utils/TaskManager.ts"],"sourcesContent":["import type { Middleware, MiddlewareOptions } from 'h3'\n\nimport { IApplication } from './IApplication'\nimport { IRequest } from './IRequest'\nimport { IResponse } from './IResponse'\n\nexport type RouterEnd = 'get' | 'delete' | 'put' | 'post' | 'patch' | 'apiResource' | 'group' | 'route';\n\n/**\n * Interface for the Router contract, defining methods for HTTP routing.\n */\nexport interface IRouter {\n /**\n * Registers a GET route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n get (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a POST route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n post (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a PUT route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n put (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a DELETE route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n delete (\n path: string,\n definition: EventHandler | [(new (...args: any[]) => IController), methodName: string],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers an API resource with standard CRUD routes.\n * @param path - The base path for the resource.\n * @param controller - The controller class handling the resource.\n * @param middleware - Optional middleware array.\n */\n apiResource (\n path: string,\n controller: new (app: IApplication) => IController,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd | 'name'>;\n\n /**\n * Generates a URL for a named route.\n * @param name - The name of the route.\n * @param params - Optional parameters to replace in the route path.\n * @returns The generated URL or undefined if the route is not found.\n */\n route (name: string, params?: Record<string, string>): string | undefined;\n\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string): this\n\n /**\n * Groups routes with shared prefix or middleware.\n * @param options - Configuration for prefix or middleware.\n * @param callback - Callback function defining grouped routes.\n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: () => this): this;\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: Middleware, opts?: Middleware | MiddlewareOptions): this\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions): this;\n}\n\n/**\n * Represents the HTTP context for a single request lifecycle.\n * Encapsulates the application instance, request, and response objects.\n */\nexport class HttpContext {\n constructor(\n public app: IApplication,\n public request: IRequest,\n public response: IResponse\n ) { }\n\n /**\n * Factory method to create a new HttpContext instance from a context object.\n * @param ctx - Object containing app, request, and response\n * @returns A new HttpContext instance\n */\n static init (ctx: { app: IApplication; request: IRequest; response: IResponse }): HttpContext {\n /**\n * Return a new instance\n */\n return new HttpContext(ctx.app, ctx.request, ctx.response)\n }\n}\n\n\n/**\n * Type for EventHandler, representing a function that handles an H3 event.\n */\nexport type EventHandler = (ctx: HttpContext) => any\nexport type RouteEventHandler = (...args: any[]) => any\n\n/**\n * Defines the contract for all controllers.\n * Any controller implementing this must define these methods.\n */\nexport interface IController {\n show (...ctx: any[]): any\n index (...ctx: any[]): any\n store (...ctx: any[]): any\n update (...ctx: any[]): any\n destroy (...ctx: any[]): any\n}\n\n/**\n * Defines the contract for all middlewares.\n * Any middleware implementing this must define these methods.\n */\nexport interface IMiddleware {\n handle (context: HttpContext, next: () => Promise<any>): Promise<any>\n} \n","import { GenericWithNullableStringValues } from '../Contracts/ObjContract'\n\nexport class EnvParser {\n\n static parse (initial: GenericWithNullableStringValues) {\n const parsed = { ...initial }\n\n for (const key in parsed) {\n const value: any = parsed[key]\n parsed[key] = this.parseValue(value)\n }\n\n return parsed\n }\n\n static parseValue (value: any) {\n /**\n * Null/undefined stay untouched \n */\n if (value === null || value === undefined) return value\n\n /**\n * Convert string \"true\"/\"false\" to boolean \n */\n if (value === 'true') return true\n if (value === 'false') return false\n\n /**\n * Convert string numbers to number \n */\n if (!isNaN(value) && value.trim() !== '') {\n return Number(value)\n }\n\n /**\n * Convert string \"null\" and \"undefined\"\n */\n if (value === 'null') return null\n if (value === 'undefined') return undefined\n\n /**\n * Otherwise return as-is (string)\n */\n return value\n }\n}\n","import { access } from 'fs/promises'\nimport escalade from 'escalade/sync'\nimport path from 'path'\n\nexport class FileSystem {\n static findModulePkg (moduleId: string, cwd?: string) {\n const parts = moduleId.replace(/\\\\/g, '/').split('/')\n\n let packageName = ''\n // Handle scoped package name\n if (parts.length > 0 && parts[0][0] === '@') {\n packageName += parts.shift() + '/'\n }\n packageName += parts.shift()\n\n const packageJson = path.join(cwd ?? process.cwd(), 'node_modules', packageName)\n\n const resolved = this.findUpConfig(packageJson, 'package', ['json'])\n\n if (!resolved) {\n return\n }\n\n return path.join(path.dirname(resolved), parts.join('/'))\n }\n\n /**\n * Check if file exists\n * \n * @param path \n * @returns \n */\n static async fileExists (path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Recursively find files\n * \n * @param cwd \n * @param name \n * @param extensions \n * @returns \n */\n static findUpConfig (cwd: string, name: string, extensions: string[]) {\n return escalade(cwd, (_dir, names) => {\n for (const ext of extensions) {\n const filename = `${name}.${ext}`\n if (names.includes(filename)) {\n return filename\n }\n }\n return false\n })\n }\n} \n","import chalk, { type ChalkInstance } from 'chalk'\nimport { LoggerChalk, LoggerLog, LoggerParseSignature } from '../Contracts/Utils'\n\nexport class Logger {\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param value \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static twoColumnLog (name: string, value: string, log?: true, spacer?: string): void\n static twoColumnLog (name: string, value: string, log?: false, spacer?: string): [string, string, string]\n static twoColumnLog (name: string, value: string, log = true, spacer = '.'): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.max(process.stdout.columns, 100)\n const dots = Math.max(width - name.replace(regex, '').length - value.replace(regex, '').length - 10, 0)\n\n if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value)\n else return [name, chalk.gray(spacer.repeat(dots)), value]\n }\n\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param desc \n * @param width \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static describe (name: string, desc: string, width?: number, log?: true): void\n static describe (name: string, desc: string, width?: number, log?: false): [string, string, string]\n static describe (name: string, desc: string, width = 50, log = true): [string, string, string] | void {\n width = Math.min(width, 30)\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const dots = Math.max(width - name.replace(regex, '').length, 0)\n\n if (log) return console.log(name, ' '.repeat(dots), desc)\n else return [name, ' '.repeat(dots), desc]\n }\n\n /**\n * Logs the message in two columns but allways passing status\n * \n * @param name \n * @param value \n * @param status \n * @param exit \n * @param preserveCol \n */\n static split (name: string, value: string, status?: 'success' | 'info' | 'error', exit = false, preserveCol = false) {\n status ??= 'info'\n const color = { success: chalk.bgGreen, info: chalk.bgBlue, error: chalk.bgRed }\n\n const [_name, dots, val] = this.twoColumnLog(name, value, false)\n\n console.log(this.textFormat(_name, color[status], preserveCol), dots, val)\n\n if (exit) process.exit(0)\n }\n\n /**\n * Wraps text with chalk\n * \n * @param txt \n * @param color \n * @param preserveCol \n * @returns \n */\n static textFormat (\n txt: unknown,\n color: (txt: string) => string,\n preserveCol = false\n ): string {\n const str = String(txt)\n\n if (preserveCol) return str\n\n const [first, ...rest] = str.split(':')\n if (rest.length === 0) return str\n\n return color(` ${first} `) + rest.join(':')\n }\n\n\n /**\n * Logs a success message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static success (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.green('✓'), this.textFormat(msg, chalk.bgGreen, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an informational message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static info (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.blue('ℹ'), this.textFormat(msg, chalk.bgBlue, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an error message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static error (msg: string | string[] | Error & { detail?: string }, exit = true, preserveCol = false) {\n if (msg instanceof Error) {\n if (msg.message) {\n console.error(chalk.red('✖'), this.textFormat('ERROR:' + msg.message, chalk.bgRed, preserveCol))\n }\n console.error(chalk.red(`${msg.detail ? `${msg.detail}\\n` : ''}${msg.stack}`), '\\n')\n }\n else {\n console.error(chalk.red('✖'), this.textFormat(msg, chalk.bgRed, preserveCol), '\\n')\n }\n if (exit) process.exit(1)\n }\n\n /**\n * Terminates the process\n */\n static quiet () {\n process.exit(0)\n }\n\n static chalker (styles: LoggerChalk[]) {\n return (input: any): string =>\n styles.reduce((acc, style) => {\n if ((style as any) in chalk) {\n const fn = typeof style === 'function'\n ? style\n : chalk[style as never]\n return fn(acc)\n }\n return acc\n }, input)\n }\n\n /**\n * Parse an array formated message and logs it\n * \n * @param config \n * @param joiner \n * @param log If set to false, string output will be returned and not logged \n */\n static parse (config: LoggerParseSignature, joiner?: string, log?: true): void\n static parse (config: LoggerParseSignature, joiner?: string, log?: false): string\n static parse (config: LoggerParseSignature, joiner = ' ', log = true): string | void {\n const string = config.map(([str, opt]) => {\n if (Array.isArray(opt)) {\n opt = Logger.chalker(opt) as ChalkInstance\n }\n\n return typeof opt === 'string' && typeof chalk[opt] === 'function'\n ? (chalk as any)[opt](str)\n : typeof opt === 'function' ? opt(str) : str\n }).join(joiner)\n\n if (log) console.log(string)\n else return string\n }\n\n /**\n * Ouput formater object or format the output\n * \n * @returns \n */\n public static log: LoggerLog = ((config, joiner, log: boolean = true) => {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n return this.parse(conf, '', log as false)\n } else if (config) {\n return this.parse(config, String(joiner), log as false)\n }\n\n return this\n }) as LoggerLog\n}\n","import { IPathName } from '../Contracts/IApplication'\nimport nodepath from 'path'\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n database: '/src/database',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param prefix - The base path to prefix to the path\n * @returns \n */\n getPath (name: IPathName, prefix?: string): string {\n let path: string\n\n if (prefix && name !== 'base') {\n path = nodepath.join(prefix, this.paths[name])\n } else {\n path = this.paths[name]\n }\n\n\n if (name === 'public') {\n path = path.replace('/public', nodepath.join('/', process.env.DIST_DIR ?? '.h3ravel/serve'))\n } else {\n path = path.replace('/src/', `/${process.env.DIST_DIR ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, '$1'))\n }\n\n return nodepath.normalize(path)\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import crypto from 'crypto'\nimport preferredPM from 'preferred-pm'\n\nexport class Resolver {\n static async getPakageInstallCommand (pkg?: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install '\n\n if (!pkg) {\n if (pm === 'npm' || pm === 'pnpm' || pm === 'bun')\n cmd = 'install'\n else\n cmd = ''\n } else if (pm === 'yarn' || pm === 'pnpm' || pm === 'bun')\n cmd = 'add '\n\n return `${pm} ${cmd}${pkg ?? ''}`\n }\n\n static async getInstallCommand (pkg: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install'\n if (pm === 'yarn' || pm === 'pnpm')\n cmd = 'add'\n else if (pm === 'bun')\n cmd = 'create'\n\n return `${pm} ${cmd} ${pkg}`\n }\n\n\n /**\n * Create a hash for a function or an object\n * \n * @param provider \n * @returns \n */\n static hashObjectOrFunction (provider: object | ((..._: any[]) => any)): string {\n return crypto\n .createHash('sha1')\n .update(provider.toString())\n .digest('hex')\n }\n}\n","export const mainTsconfig = {\n extends: '@h3ravel/shared/tsconfig.json',\n compilerOptions: {\n baseUrl: '.',\n outDir: 'dist',\n paths: {\n 'src/*': ['./../src/*'],\n 'App/*': ['./../src/app/*'],\n 'root/*': ['./../*'],\n 'routes/*': ['./../src/routes/*'],\n 'config/*': ['./../src/config/*'],\n 'resources/*': ['./../src/resources/*']\n },\n target: 'es2022',\n module: 'es2022',\n moduleResolution: 'Node',\n esModuleInterop: true,\n strict: true,\n allowJs: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n noEmit: true,\n experimentalDecorators: true,\n emitDecoratorMetadata: true\n },\n include: ['./**/*.d.ts', './../**/*'],\n exclude: [\n '.',\n './../**/console/bin',\n './../dist',\n './../**/dist',\n './../**/node_modules',\n './../.node_modules',\n './../**/node_modules/*',\n './../**/public',\n './../public',\n './../**/storage',\n './../storage',\n './../**coverage**',\n './../eslint.config.js',\n './../jest.config.ts',\n './../arquebus.config.js'\n ]\n}\n\nexport const baseTsconfig = {\n extends: './.h3ravel/tsconfig.json'\n}\n\nexport const packageJsonScript = {\n build: 'NODE_ENV=production tsdown --config-loader unconfig -c tsdown.default.config.ts',\n dev: 'NODE_ENV=development pnpm tsdown --config-loader unconfig -c tsdown.default.config.ts',\n start: 'DIST_DIR=dist node -r source-map-support/register dist/server.js',\n lint: 'eslint . --ext .ts',\n test: 'NODE_NO_WARNINGS=1 NODE_ENV=testing jest --passWithNoTests',\n postinstall: 'pnpm spawn'\n}\n","import { Logger } from './Logger'\n\nexport class TaskManager {\n public static async taskRunner (\n description: string,\n task: (() => Promise<any>) | (() => any)\n ): Promise<void> {\n const startTime = process.hrtime()\n let result: any = false\n\n try {\n result = await Promise.all([(task || (() => true))()].flat())\n } finally {\n const endTime = process.hrtime(startTime)\n const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n Logger.twoColumnLog(\n Logger.parse([[description, 'green']], '', false),\n [\n Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n Logger.parse([[result !== false ? '✔' : '✘', result !== false ? 'green' : 'red']], '', false),\n ].join(' ')\n )\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["app: IApplication","request: IRequest","response: IResponse","value: any","path","path: string","nodepath","path","result: any","e: any"],"sources":["../src/Contracts/IHttp.ts","../src/Utils/EnvParser.ts","../src/Utils/FileSystem.ts","../src/Utils/Logger.ts","../src/Utils/PathLoader.ts","../src/Utils/Resolver.ts","../src/Utils/scripts.ts","../src/Utils/TaskManager.ts"],"sourcesContent":["import type { Middleware, MiddlewareOptions } from 'h3'\n\nimport { IApplication } from './IApplication'\nimport { IRequest } from './IRequest'\nimport { IResponse } from './IResponse'\n\nexport type RouterEnd = 'get' | 'delete' | 'put' | 'post' | 'patch' | 'apiResource' | 'group' | 'route';\n\nexport type ExtractControllerMethods<T> = {\n [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never\n}[keyof T];\n\n/**\n * Interface for the Router contract, defining methods for HTTP routing.\n */\nexport interface IRouter {\n /**\n * Registers a GET route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n get<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a POST route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n post<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a PUT route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n put<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a route that responds to HTTP PATCH requests.\n *\n * @param path The URL pattern to match (can include parameters, e.g., '/users/:id').\n * @param definition Either:\n * - An EventHandler function\n * - A tuple: [ControllerClass, methodName]\n * @param name Optional route name (for URL generation or referencing).\n * @param middleware Optional array of middleware functions to execute before the handler.\n */\n patch<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers a DELETE route.\n * @param path - The route path.\n * @param definition - The handler function or [controller class, method] array.\n * @param name - Optional route name.\n * @param middleware - Optional middleware array.\n */\n delete<C extends new (...args: any) => any> (\n path: string,\n definition: EventHandler | [C, methodName: ExtractControllerMethods<InstanceType<C>>],\n name?: string,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd>;\n\n /**\n * Registers an API resource with standard CRUD routes.\n * @param path - The base path for the resource.\n * @param controller - The controller class handling the resource.\n * @param middleware - Optional middleware array.\n */\n apiResource (\n path: string,\n controller: new (app: IApplication) => IController,\n middleware?: IMiddleware[]\n ): Omit<this, RouterEnd | 'name'>;\n\n /**\n * Generates a URL for a named route.\n * @param name - The name of the route.\n * @param params - Optional parameters to replace in the route path.\n * @returns The generated URL or undefined if the route is not found.\n */\n route (name: string, params?: Record<string, string>): string | undefined;\n\n\n /**\n * Set the name of the current route\n * \n * @param name \n */\n name (name: string): this\n\n /**\n * Groups routes with shared prefix or middleware.\n * @param options - Configuration for prefix or middleware.\n * @param callback - Callback function defining grouped routes.\n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: () => this): this;\n\n /**\n * Registers middleware for a specific path.\n * @param path - The path to apply the middleware.\n * @param handler - The middleware handler.\n * @param opts - Optional middleware options.\n */\n middleware (path: Middleware, opts?: Middleware | MiddlewareOptions): this\n middleware (path: string | IMiddleware[] | Middleware, handler: Middleware | MiddlewareOptions, opts?: MiddlewareOptions): this;\n}\n\n/**\n * Represents the HTTP context for a single request lifecycle.\n * Encapsulates the application instance, request, and response objects.\n */\nexport class HttpContext {\n constructor(\n public app: IApplication,\n public request: IRequest,\n public response: IResponse\n ) { }\n\n /**\n * Factory method to create a new HttpContext instance from a context object.\n * @param ctx - Object containing app, request, and response\n * @returns A new HttpContext instance\n */\n static init (ctx: { app: IApplication; request: IRequest; response: IResponse }): HttpContext {\n /**\n * Return a new instance\n */\n return new HttpContext(ctx.app, ctx.request, ctx.response)\n }\n}\n\n\n/**\n * Type for EventHandler, representing a function that handles an H3 event.\n */\nexport type EventHandler = (ctx: HttpContext) => any\nexport type RouteEventHandler = (...args: any[]) => any\n\n/**\n * Defines the contract for all controllers.\n * Any controller implementing this must define these methods.\n */\nexport interface IController {\n show?(...ctx: any[]): any\n index?(...ctx: any[]): any\n store?(...ctx: any[]): any\n update?(...ctx: any[]): any\n destroy?(...ctx: any[]): any\n}\n\n/**\n * Defines the contract for all middlewares.\n * Any middleware implementing this must define these methods.\n */\nexport interface IMiddleware {\n handle (context: HttpContext, next: () => Promise<any>): Promise<any>\n} \n","import { GenericWithNullableStringValues } from '../Contracts/ObjContract'\n\nexport class EnvParser {\n\n static parse (initial: GenericWithNullableStringValues) {\n const parsed = { ...initial }\n\n for (const key in parsed) {\n const value: any = parsed[key]\n parsed[key] = this.parseValue(value)\n }\n\n return parsed\n }\n\n static parseValue (value: any) {\n /**\n * Null/undefined stay untouched \n */\n if (value === null || value === undefined) return value\n\n /**\n * Convert string \"true\"/\"false\" to boolean \n */\n if (value === 'true') return true\n if (value === 'false') return false\n\n /**\n * Convert string numbers to number \n */\n if (!isNaN(value) && value.trim() !== '') {\n return Number(value)\n }\n\n /**\n * Convert string \"null\" and \"undefined\"\n */\n if (value === 'null') return null\n if (value === 'undefined') return undefined\n\n /**\n * Otherwise return as-is (string)\n */\n return value\n }\n}\n","import { access } from 'fs/promises'\nimport escalade from 'escalade/sync'\nimport path from 'path'\n\nexport class FileSystem {\n static findModulePkg (moduleId: string, cwd?: string) {\n const parts = moduleId.replace(/\\\\/g, '/').split('/')\n\n let packageName = ''\n // Handle scoped package name\n if (parts.length > 0 && parts[0][0] === '@') {\n packageName += parts.shift() + '/'\n }\n packageName += parts.shift()\n\n const packageJson = path.join(cwd ?? process.cwd(), 'node_modules', packageName)\n\n const resolved = this.resolveFileUp('package', ['json'], packageJson)\n\n if (!resolved) {\n return\n }\n\n return path.join(path.dirname(resolved), parts.join('/'))\n }\n\n /**\n * Check if file exists\n * \n * @param path \n * @returns \n */\n static async fileExists (path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Recursively find files starting from given cwd\n * \n * @param name \n * @param extensions \n * @param cwd \n * \n * @returns \n */\n static resolveFileUp (\n name: string,\n extensions: string[] | ((dir: string, filesNames: string[]) => string | false),\n cwd?: string\n ) {\n cwd ??= process.cwd()\n\n return escalade(cwd, (dir, filesNames) => {\n if (typeof extensions === 'function') {\n return extensions(dir, filesNames)\n }\n\n const candidates = new Set(extensions.map(ext => `${name}.${ext}`))\n for (const filename of filesNames) {\n if (candidates.has(filename)) {\n return filename\n }\n }\n\n return false\n }) ?? undefined\n }\n} \n","import chalk, { type ChalkInstance } from 'chalk'\nimport { LoggerChalk, LoggerLog, LoggerParseSignature } from '../Contracts/Utils'\n\nexport class Logger {\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param value \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static twoColumnDetail (name: string, value: string, log?: true, spacer?: string): void\n static twoColumnDetail (name: string, value: string, log?: false, spacer?: string): [string, string, string]\n static twoColumnDetail (name: string, value: string, log = true, spacer = '.'): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.max(process.stdout.columns, 100)\n const dots = Math.max(width - name.replace(regex, '').length - value.replace(regex, '').length - 10, 0)\n\n if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value)\n else return [name, chalk.gray(spacer.repeat(dots)), value]\n }\n\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param desc \n * @param width \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static describe (name: string, desc: string, width?: number, log?: true): void\n static describe (name: string, desc: string, width?: number, log?: false): [string, string, string]\n static describe (name: string, desc: string, width = 50, log = true): [string, string, string] | void {\n width = Math.min(width, 30)\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const dots = Math.max(width - name.replace(regex, '').length, 0)\n\n if (log) return console.log(name, ' '.repeat(dots), desc)\n else return [name, ' '.repeat(dots), desc]\n }\n\n /**\n * Logs the message in two columns but allways passing status\n * \n * @param name \n * @param value \n * @param status \n * @param exit \n * @param preserveCol \n */\n static split (name: string, value: string, status?: 'success' | 'info' | 'error', exit = false, preserveCol = false) {\n status ??= 'info'\n const color = { success: chalk.bgGreen, info: chalk.bgBlue, error: chalk.bgRed }\n\n const [_name, dots, val] = this.twoColumnDetail(name, value, false)\n\n console.log(this.textFormat(_name, color[status], preserveCol), dots, val)\n\n if (exit) process.exit(0)\n }\n\n /**\n * Wraps text with chalk\n * \n * @param txt \n * @param color \n * @param preserveCol \n * @returns \n */\n static textFormat (\n txt: unknown,\n color: (txt: string) => string,\n preserveCol = false\n ): string {\n const str = String(txt)\n\n if (preserveCol) return str\n\n const [first, ...rest] = str.split(':')\n if (rest.length === 0) return str\n\n return color(` ${first} `) + rest.join(':')\n }\n\n\n /**\n * Logs a success message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static success (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.green('✓'), this.textFormat(msg, chalk.bgGreen, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an informational message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static info (msg: any, exit = false, preserveCol = false) {\n console.log(chalk.blue('ℹ'), this.textFormat(msg, chalk.bgBlue, preserveCol), '\\n')\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an error message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static error (msg: string | string[] | Error & { detail?: string }, exit = true, preserveCol = false) {\n if (msg instanceof Error) {\n if (msg.message) {\n console.error(chalk.red('✖'), this.textFormat('ERROR:' + msg.message, chalk.bgRed, preserveCol))\n }\n console.error(chalk.red(`${msg.detail ? `${msg.detail}\\n` : ''}${msg.stack}`), '\\n')\n }\n else {\n console.error(chalk.red('✖'), this.textFormat(msg, chalk.bgRed, preserveCol), '\\n')\n }\n if (exit) process.exit(1)\n }\n\n /**\n * Terminates the process\n */\n static quiet () {\n process.exit(0)\n }\n\n static chalker (styles: LoggerChalk[]) {\n return (input: any): string =>\n styles.reduce((acc, style) => {\n if ((style as any) in chalk) {\n const fn = typeof style === 'function'\n ? style\n : chalk[style as never]\n return fn(acc)\n }\n return acc\n }, input)\n }\n\n /**\n * Parse an array formated message and logs it\n * \n * @param config \n * @param joiner \n * @param log If set to false, string output will be returned and not logged \n * @param sc color to use ue on split text if : is found \n */\n static parse (config: LoggerParseSignature, joiner?: string, log?: true, sc?: LoggerChalk): void\n static parse (config: LoggerParseSignature, joiner?: string, log?: false, sc?: LoggerChalk): string\n static parse (config: LoggerParseSignature, joiner = ' ', log = true, sc?: LoggerChalk): string | void {\n const string = config.map(([str, opt]) => {\n if (Array.isArray(opt)) {\n opt = Logger.chalker(opt) as ChalkInstance\n }\n\n const output = typeof opt === 'string' && typeof chalk[opt] === 'function'\n ? (chalk as any)[opt](str)\n : typeof opt === 'function' ? opt(str) : str\n\n if (!sc) {\n return output\n }\n\n return this.textFormat(output, Logger.chalker(Array.isArray(sc) ? sc : [sc]))\n }).join(joiner)\n\n if (log) console.log(string)\n else return string\n }\n\n /**\n * Ouput formater object or format the output\n * \n * @returns \n */\n public static log: LoggerLog = ((config, joiner, log: boolean = true, sc) => {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n return this.parse(conf, '', log as false, sc)\n } else if (config) {\n return this.parse(config, String(joiner), log as false, sc)\n }\n\n return this\n }) as LoggerLog\n}\n","import { IPathName } from '../Contracts/IApplication'\nimport nodepath from 'path'\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n database: '/src/database',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param prefix - The base path to prefix to the path\n * @returns \n */\n getPath (name: IPathName, prefix?: string): string {\n let path: string\n\n if (prefix && name !== 'base') {\n path = nodepath.join(prefix, this.paths[name])\n } else {\n path = this.paths[name]\n }\n\n\n if (name === 'public') {\n path = path.replace('/public', nodepath.join('/', process.env.DIST_DIR ?? '.h3ravel/serve'))\n } else {\n path = path.replace('/src/', `/${process.env.DIST_DIR ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, '$1'))\n }\n\n return nodepath.normalize(path)\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import crypto from 'crypto'\nimport preferredPM from 'preferred-pm'\n\nexport class Resolver {\n static async getPakageInstallCommand (pkg?: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install '\n\n if (!pkg) {\n if (pm === 'npm' || pm === 'pnpm' || pm === 'bun')\n cmd = 'install'\n else\n cmd = ''\n } else if (pm === 'yarn' || pm === 'pnpm' || pm === 'bun')\n cmd = 'add '\n\n return `${pm} ${cmd}${pkg ?? ''}`\n }\n\n static async getInstallCommand (pkg: string) {\n const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n let cmd = 'install'\n if (pm === 'yarn' || pm === 'pnpm')\n cmd = 'add'\n else if (pm === 'bun')\n cmd = 'create'\n\n return `${pm} ${cmd} ${pkg}`\n }\n\n\n /**\n * Create a hash for a function or an object\n * \n * @param provider \n * @returns \n */\n static hashObjectOrFunction (provider: object | ((..._: any[]) => any)): string {\n return crypto\n .createHash('sha1')\n .update(provider.toString())\n .digest('hex')\n }\n}\n","export const mainTsconfig = {\n extends: '@h3ravel/shared/tsconfig.json',\n compilerOptions: {\n baseUrl: '.',\n outDir: 'dist',\n paths: {\n 'src/*': ['./../src/*'],\n 'App/*': ['./../src/app/*'],\n 'root/*': ['./../*'],\n 'routes/*': ['./../src/routes/*'],\n 'config/*': ['./../src/config/*'],\n 'resources/*': ['./../src/resources/*']\n },\n target: 'es2022',\n module: 'es2022',\n moduleResolution: 'Node',\n esModuleInterop: true,\n strict: true,\n allowJs: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n noEmit: true,\n experimentalDecorators: true,\n emitDecoratorMetadata: true\n },\n include: ['./**/*.d.ts', './../**/*'],\n exclude: [\n '.',\n './../**/console/bin',\n './../dist',\n './../**/dist',\n './../**/node_modules',\n './../.node_modules',\n './../**/node_modules/*',\n './../**/public',\n './../public',\n './../**/storage',\n './../storage',\n './../**coverage**',\n './../eslint.config.js',\n './../jest.config.ts',\n './../arquebus.config.js'\n ]\n}\n\nexport const baseTsconfig = {\n extends: './.h3ravel/tsconfig.json'\n}\n\nexport const packageJsonScript = {\n build: 'NODE_ENV=production tsdown --config-loader unconfig -c tsdown.default.config.ts',\n dev: 'NODE_ENV=development pnpm tsdown --config-loader unconfig -c tsdown.default.config.ts',\n start: 'DIST_DIR=dist node -r source-map-support/register dist/server.js',\n lint: 'eslint . --ext .ts',\n test: 'NODE_NO_WARNINGS=1 NODE_ENV=testing jest --passWithNoTests',\n postinstall: 'pnpm spawn'\n}\n","import { Logger } from './Logger'\n\nexport class TaskManager {\n public static async taskRunner (\n description: string,\n task: (() => Promise<any>) | (() => any)\n ): Promise<void> {\n const startTime = process.hrtime()\n let result: any = false\n\n try {\n result = await Promise.all([(task || (() => true))()].flat())\n } finally {\n const endTime = process.hrtime(startTime)\n const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n Logger.twoColumnDetail(\n Logger.parse([[description, 'green']], '', false),\n [\n Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n Logger.parse([[result !== false ? '✔' : '✘', result !== false ? 'green' : 'red']], '', false),\n ].join(' ')\n )\n }\n }\n\n public static async advancedTaskRunner<R = any> (\n info: [[string, string], [string, string]] | [[string, string]],\n task: (() => Promise<R>) | (() => R)\n ): Promise<R | undefined> {\n const startTime = process.hrtime()\n const [startInfo, stopInfo] = info\n\n if (stopInfo) {\n Logger.twoColumnDetail(startInfo[0], Logger.log(startInfo[1], ['yellow', 'bold'], false))\n }\n\n try {\n return await Promise.race([task()])\n } catch (e: any) {\n Logger.error('ERROR: ' + e.message)\n } finally {\n const endTime = process.hrtime(startTime)\n const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n\n Logger.twoColumnDetail(\n stopInfo?.[0] ?? startInfo[0],\n [\n Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n Logger.parse([[`✔ ${stopInfo?.[1] ?? startInfo[1]}`, ['green', 'bold']]], '', false),\n ].join(' ')\n )\n }\n }\n}\n"],"mappings":"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"}
|