@h3ravel/shared 0.20.11 → 0.20.13

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 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.findUpConfig(packageJson, "package", ["json"]);
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,19 +123,20 @@ 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 findUpConfig(cwd, name, extensions) {
134
- return (0, escalade_sync.default)(cwd, (_dir, names) => {
135
- for (const ext of extensions) {
136
- const filename = `${name}.${ext}`;
137
- if (names.includes(filename)) return filename;
138
- }
134
+ static resolveFileUp(name, extensions, cwd) {
135
+ cwd ??= process.cwd();
136
+ return (0, escalade_sync.default)(cwd, (dir, names) => {
137
+ if (typeof extensions === "function") return extensions(dir, names);
138
+ const candidates = new Set(extensions.map((ext) => `${name}.${ext}`));
139
+ for (const filename of names) if (candidates.has(filename)) return filename;
139
140
  return false;
140
141
  });
141
142
  }
@@ -194,8 +195,11 @@ var Logger = class Logger {
194
195
  * @returns
195
196
  */
196
197
  static textFormat(txt, color, preserveCol = false) {
197
- if (preserveCol) return String(txt);
198
- return String(txt).split(":").map((e, i, a) => i == 0 && a.length > 1 ? color(" " + e + ": ") : e).join("");
198
+ const str = String(txt);
199
+ if (preserveCol) return str;
200
+ const [first, ...rest] = str.split(":");
201
+ if (rest.length === 0) return str;
202
+ return color(` ${first} `) + rest.join(":");
199
203
  }
200
204
  /**
201
205
  * Logs a success message
@@ -245,10 +249,12 @@ var Logger = class Logger {
245
249
  return acc;
246
250
  }, input);
247
251
  }
248
- static parse(config, joiner = " ", log = true) {
252
+ static parse(config, joiner = " ", log = true, sc) {
249
253
  const string = config.map(([str, opt]) => {
250
254
  if (Array.isArray(opt)) opt = Logger.chalker(opt);
251
- return typeof opt === "string" && typeof chalk.default[opt] === "function" ? chalk.default[opt](str) : typeof opt === "function" ? opt(str) : str;
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]));
252
258
  }).join(joiner);
253
259
  if (log) console.log(string);
254
260
  else return string;
@@ -258,11 +264,11 @@ var Logger = class Logger {
258
264
  *
259
265
  * @returns
260
266
  */
261
- static log = ((config, joiner, log = true) => {
267
+ static log = ((config, joiner, log = true, sc) => {
262
268
  if (typeof config === "string") {
263
269
  const conf = [[config, joiner]];
264
- return this.parse(conf, "", log);
265
- } 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);
266
272
  return this;
267
273
  });
268
274
  };
@@ -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 (txt: any, color: (txt: string) => string, preserveCol = false) {\n if (preserveCol) return String(txt)\n return String(txt).split(':').map((e, i, a) => i == 0 && a.length > 1 ? color(' ' + e + ': ') : e).join('')\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"],"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, names: string[]) => string | false),\n cwd?: string\n ) {\n cwd ??= process.cwd()\n\n return escalade(cwd, (dir, names) => {\n if (typeof extensions === 'function') {\n return extensions(dir, names)\n }\n\n const candidates = new Set(extensions.map(ext => `${name}.${ext}`))\n for (const filename of names) {\n if (candidates.has(filename)) {\n return filename\n }\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 * @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.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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"}
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
- console?: boolean;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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
  /**
@@ -460,7 +482,7 @@ declare class Logger {
460
482
  * @param preserveCol
461
483
  * @returns
462
484
  */
463
- static textFormat(txt: any, color: (txt: string) => string, preserveCol?: boolean): string;
485
+ static textFormat(txt: unknown, color: (txt: string) => string, preserveCol?: boolean): string;
464
486
  /**
465
487
  * Logs a success message
466
488
  *
@@ -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 findUpConfig(cwd: string, name: string, extensions: string[]): string | void;
582
+ static resolveFileUp(name: string, extensions: string[] | ((dir: string, names: string[]) => string | false), cwd?: string): string | void;
554
583
  }
555
584
  //#endregion
556
585
  //#region src/Utils/Resolver.d.ts
@@ -612,5 +641,5 @@ declare class TaskManager {
612
641
  static taskRunner(description: string, task: (() => Promise<any>) | (() => any)): Promise<void>;
613
642
  }
614
643
  //#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 };
644
+ 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
645
  //# 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
- console?: boolean;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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 | [(new (...args: any[]) => IController), methodName: string], name?: string, middleware?: IMiddleware[]): Omit<this, RouterEnd>;
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
  /**
@@ -460,7 +482,7 @@ declare class Logger {
460
482
  * @param preserveCol
461
483
  * @returns
462
484
  */
463
- static textFormat(txt: any, color: (txt: string) => string, preserveCol?: boolean): string;
485
+ static textFormat(txt: unknown, color: (txt: string) => string, preserveCol?: boolean): string;
464
486
  /**
465
487
  * Logs a success message
466
488
  *
@@ -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 findUpConfig(cwd: string, name: string, extensions: string[]): string | void;
582
+ static resolveFileUp(name: string, extensions: string[] | ((dir: string, names: string[]) => string | false), cwd?: string): string | void;
554
583
  }
555
584
  //#endregion
556
585
  //#region src/Utils/Resolver.d.ts
@@ -612,5 +641,5 @@ declare class TaskManager {
612
641
  static taskRunner(description: string, task: (() => Promise<any>) | (() => any)): Promise<void>;
613
642
  }
614
643
  //#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 };
644
+ 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
645
  //# 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.findUpConfig(packageJson, "package", ["json"]);
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,19 +94,20 @@ 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 findUpConfig(cwd, name, extensions) {
105
- return escalade(cwd, (_dir, names) => {
106
- for (const ext of extensions) {
107
- const filename = `${name}.${ext}`;
108
- if (names.includes(filename)) return filename;
109
- }
105
+ static resolveFileUp(name, extensions, cwd) {
106
+ cwd ??= process.cwd();
107
+ return escalade(cwd, (dir, names) => {
108
+ if (typeof extensions === "function") return extensions(dir, names);
109
+ const candidates = new Set(extensions.map((ext) => `${name}.${ext}`));
110
+ for (const filename of names) if (candidates.has(filename)) return filename;
110
111
  return false;
111
112
  });
112
113
  }
@@ -165,8 +166,11 @@ var Logger = class Logger {
165
166
  * @returns
166
167
  */
167
168
  static textFormat(txt, color, preserveCol = false) {
168
- if (preserveCol) return String(txt);
169
- return String(txt).split(":").map((e, i, a) => i == 0 && a.length > 1 ? color(" " + e + ": ") : e).join("");
169
+ const str = String(txt);
170
+ if (preserveCol) return str;
171
+ const [first, ...rest] = str.split(":");
172
+ if (rest.length === 0) return str;
173
+ return color(` ${first} `) + rest.join(":");
170
174
  }
171
175
  /**
172
176
  * Logs a success message
@@ -216,10 +220,12 @@ var Logger = class Logger {
216
220
  return acc;
217
221
  }, input);
218
222
  }
219
- static parse(config, joiner = " ", log = true) {
223
+ static parse(config, joiner = " ", log = true, sc) {
220
224
  const string = config.map(([str, opt]) => {
221
225
  if (Array.isArray(opt)) opt = Logger.chalker(opt);
222
- return typeof opt === "string" && typeof chalk[opt] === "function" ? chalk[opt](str) : typeof opt === "function" ? opt(str) : str;
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]));
223
229
  }).join(joiner);
224
230
  if (log) console.log(string);
225
231
  else return string;
@@ -229,11 +235,11 @@ var Logger = class Logger {
229
235
  *
230
236
  * @returns
231
237
  */
232
- static log = ((config, joiner, log = true) => {
238
+ static log = ((config, joiner, log = true, sc) => {
233
239
  if (typeof config === "string") {
234
240
  const conf = [[config, joiner]];
235
- return this.parse(conf, "", log);
236
- } 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);
237
243
  return this;
238
244
  });
239
245
  };
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 (txt: any, color: (txt: string) => string, preserveCol = false) {\n if (preserveCol) return String(txt)\n return String(txt).split(':').map((e, i, a) => i == 0 && a.length > 1 ? color(' ' + e + ': ') : e).join('')\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":";;;;;;;;;;;;AAqHA,IAAa,cAAb,MAAa,YAAY;CACrB,YACI,AAAOA,KACP,AAAOC,SACP,AAAOC,UACT;EAHS;EACA;EACA;;;;;;;CAQX,OAAO,KAAM,KAAiF;;;;AAI1F,SAAO,IAAI,YAAY,IAAI,KAAK,IAAI,SAAS,IAAI,SAAS;;;;;;ACnIlE,IAAa,YAAb,MAAuB;CAEnB,OAAO,MAAO,SAA0C;EACpD,MAAM,SAAS,EAAE,GAAG,SAAS;AAE7B,OAAK,MAAM,OAAO,QAAQ;GACtB,MAAMC,QAAa,OAAO;AAC1B,UAAO,OAAO,KAAK,WAAW,MAAM;;AAGxC,SAAO;;CAGX,OAAO,WAAY,OAAY;;;;AAI3B,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;;;;AAKlD,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,UAAU,QAAS,QAAO;;;;AAK9B,MAAI,CAAC,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK,GAClC,QAAO,OAAO,MAAM;;;;AAMxB,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,UAAU,YAAa,QAAO;;;;AAKlC,SAAO;;;;;;ACvCf,IAAa,aAAb,MAAwB;CACpB,OAAO,cAAe,UAAkB,KAAc;EAClD,MAAM,QAAQ,SAAS,QAAQ,OAAO,IAAI,CAAC,MAAM,IAAI;EAErD,IAAI,cAAc;AAElB,MAAI,MAAM,SAAS,KAAK,MAAM,GAAG,OAAO,IACpC,gBAAe,MAAM,OAAO,GAAG;AAEnC,iBAAe,MAAM,OAAO;EAE5B,MAAM,cAAc,KAAK,KAAK,OAAO,QAAQ,KAAK,EAAE,gBAAgB,YAAY;EAEhF,MAAM,WAAW,KAAK,aAAa,aAAa,WAAW,CAAC,OAAO,CAAC;AAEpE,MAAI,CAAC,SACD;AAGJ,SAAO,KAAK,KAAK,KAAK,QAAQ,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;;;;;;;;CAS7D,aAAa,WAAY,QAAgC;AACrD,MAAI;AACA,SAAM,OAAOC,OAAK;AAClB,UAAO;UACH;AACJ,UAAO;;;;;;;;;;;CAYf,OAAO,aAAc,KAAa,MAAc,YAAsB;AAClE,SAAO,SAAS,MAAM,MAAM,UAAU;AAClC,QAAK,MAAM,OAAO,YAAY;IAC1B,MAAM,WAAW,GAAG,KAAK,GAAG;AAC5B,QAAI,MAAM,SAAS,SAAS,CACxB,QAAO;;AAGf,UAAO;IACT;;;;;;ACvDV,IAAa,SAAb,MAAa,OAAO;CAWhB,OAAO,aAAc,MAAc,OAAe,MAAM,MAAM,SAAS,KAAsC;EAEzG,MAAM,QAAQ;EACd,MAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,SAAS,IAAI;EACnD,MAAM,OAAO,KAAK,IAAI,QAAQ,KAAK,QAAQ,OAAO,GAAG,CAAC,SAAS,MAAM,QAAQ,OAAO,GAAG,CAAC,SAAS,IAAI,EAAE;AAEvG,MAAI,IAAK,QAAO,QAAQ,IAAI,MAAM,MAAM,KAAK,OAAO,OAAO,KAAK,CAAC,EAAE,MAAM;MACpE,QAAO;GAAC;GAAM,MAAM,KAAK,OAAO,OAAO,KAAK,CAAC;GAAE;GAAM;;CAc9D,OAAO,SAAU,MAAc,MAAc,QAAQ,IAAI,MAAM,MAAuC;AAClG,UAAQ,KAAK,IAAI,OAAO,GAAG;EAG3B,MAAM,OAAO,KAAK,IAAI,QAAQ,KAAK,QADrB,eACoC,GAAG,CAAC,QAAQ,EAAE;AAEhE,MAAI,IAAK,QAAO,QAAQ,IAAI,MAAM,IAAI,OAAO,KAAK,EAAE,KAAK;MACpD,QAAO;GAAC;GAAM,IAAI,OAAO,KAAK;GAAE;GAAK;;;;;;;;;;;CAY9C,OAAO,MAAO,MAAc,OAAe,QAAuC,OAAO,OAAO,cAAc,OAAO;AACjH,aAAW;EACX,MAAM,QAAQ;GAAE,SAAS,MAAM;GAAS,MAAM,MAAM;GAAQ,OAAO,MAAM;GAAO;EAEhF,MAAM,CAAC,OAAO,MAAM,OAAO,KAAK,aAAa,MAAM,OAAO,MAAM;AAEhE,UAAQ,IAAI,KAAK,WAAW,OAAO,MAAM,SAAS,YAAY,EAAE,MAAM,IAAI;AAE1E,MAAI,KAAM,SAAQ,KAAK,EAAE;;;;;;;;;;CAW7B,OAAO,WAAY,KAAU,OAAgC,cAAc,OAAO;AAC9E,MAAI,YAAa,QAAO,OAAO,IAAI;AACnC,SAAO,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,GAAG,GAAG,MAAM,KAAK,KAAK,EAAE,SAAS,IAAI,MAAM,MAAM,IAAI,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG;;;;;;;;;CAU/G,OAAO,QAAS,KAAU,OAAO,OAAO,cAAc,OAAO;AACzD,UAAQ,IAAI,MAAM,MAAM,IAAI,EAAE,KAAK,WAAW,KAAK,MAAM,SAAS,YAAY,EAAE,KAAK;AACrF,MAAI,KAAM,SAAQ,KAAK,EAAE;;;;;;;;;CAU7B,OAAO,KAAM,KAAU,OAAO,OAAO,cAAc,OAAO;AACtD,UAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,WAAW,KAAK,MAAM,QAAQ,YAAY,EAAE,KAAK;AACnF,MAAI,KAAM,SAAQ,KAAK,EAAE;;;;;;;;;CAU7B,OAAO,MAAO,KAAsD,OAAO,MAAM,cAAc,OAAO;AAClG,MAAI,eAAe,OAAO;AACtB,OAAI,IAAI,QACJ,SAAQ,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,WAAW,WAAW,IAAI,SAAS,MAAM,OAAO,YAAY,CAAC;AAEpG,WAAQ,MAAM,MAAM,IAAI,GAAG,IAAI,SAAS,GAAG,IAAI,OAAO,MAAM,KAAK,IAAI,QAAQ,EAAE,KAAK;QAGpF,SAAQ,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,WAAW,KAAK,MAAM,OAAO,YAAY,EAAE,KAAK;AAEvF,MAAI,KAAM,SAAQ,KAAK,EAAE;;;;;CAM7B,OAAO,QAAS;AACZ,UAAQ,KAAK,EAAE;;CAGnB,OAAO,QAAS,QAAuB;AACnC,UAAQ,UACJ,OAAO,QAAQ,KAAK,UAAU;AAC1B,OAAK,SAAiB,MAIlB,SAHW,OAAO,UAAU,aACtB,QACA,MAAM,QACF,IAAI;AAElB,UAAO;KACR,MAAM;;CAYjB,OAAO,MAAO,QAA8B,SAAS,KAAK,MAAM,MAAqB;EACjF,MAAM,SAAS,OAAO,KAAK,CAAC,KAAK,SAAS;AACtC,OAAI,MAAM,QAAQ,IAAI,CAClB,OAAM,OAAO,QAAQ,IAAI;AAG7B,UAAO,OAAO,QAAQ,YAAY,OAAO,MAAM,SAAS,aACjD,MAAc,KAAK,IAAI,GACxB,OAAO,QAAQ,aAAa,IAAI,IAAI,GAAG;IAC/C,CAAC,KAAK,OAAO;AAEf,MAAI,IAAK,SAAQ,IAAI,OAAO;MACvB,QAAO;;;;;;;CAQhB,OAAc,QAAmB,QAAQ,QAAQ,MAAe,SAAS;AACrE,MAAI,OAAO,WAAW,UAAU;GAC5B,MAAM,OAAO,CAAC,CAAC,QAAQ,OAAO,CAAC;AAC/B,UAAO,KAAK,MAAM,MAAM,IAAI,IAAa;aAClC,OACP,QAAO,KAAK,MAAM,QAAQ,OAAO,OAAO,EAAE,IAAa;AAG3D,SAAO;;;;;;AChLf,IAAa,aAAb,MAAwB;CACpB,AAAQ,QAAQ;EACZ,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,UAAU;EACb;;;;;;;;;CAUD,QAAS,MAAiB,QAAyB;EAC/C,IAAIC;AAEJ,MAAI,UAAU,SAAS,OACnB,UAAOC,KAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;MAE9C,UAAO,KAAK,MAAM;AAItB,MAAI,SAAS,SACT,UAAOC,OAAK,QAAQ,WAAWD,KAAS,KAAK,KAAK,QAAQ,IAAI,YAAY,iBAAiB,CAAC;MAE5F,UAAOC,OAAK,QAAQ,SAAS,IAAI,QAAQ,IAAI,YAAY,MAAM,GAAG,QAAQ,gBAAgB,KAAK,CAAC;AAGpG,SAAOD,KAAS,UAAUC,OAAK;;;;;;;;;CAUnC,QAAS,MAAiB,QAAc,MAAe;AACnD,MAAI,QAAQ,SAAS,OACjB,MAAK,MAAM,QAAQD,KAAS,KAAK,MAAMC,OAAK;AAGhD,OAAK,MAAM,QAAQA;;;;;;ACnD3B,IAAa,WAAb,MAAsB;CAClB,aAAa,wBAAyB,KAAc;EAChD,MAAM,MAAM,MAAM,YAAY,QAAQ,KAAK,CAAC,GAAG,QAAQ;EAEvD,IAAI,MAAM;AAEV,MAAI,CAAC,IACD,KAAI,OAAO,SAAS,OAAO,UAAU,OAAO,MACxC,OAAM;MAEN,OAAM;WACH,OAAO,UAAU,OAAO,UAAU,OAAO,MAChD,OAAM;AAEV,SAAO,GAAG,GAAG,GAAG,MAAM,OAAO;;CAGjC,aAAa,kBAAmB,KAAa;EACzC,MAAM,MAAM,MAAM,YAAY,QAAQ,KAAK,CAAC,GAAG,QAAQ;EAEvD,IAAI,MAAM;AACV,MAAI,OAAO,UAAU,OAAO,OACxB,OAAM;WACD,OAAO,MACZ,OAAM;AAEV,SAAO,GAAG,GAAG,GAAG,IAAI,GAAG;;;;;;;;CAU3B,OAAO,qBAAsB,UAAmD;AAC5E,SAAO,OACF,WAAW,OAAO,CAClB,OAAO,SAAS,UAAU,CAAC,CAC3B,OAAO,MAAM;;;;;;AC3C1B,MAAa,eAAe;CAC1B,SAAS;CACT,iBAAiB;EACf,SAAS;EACT,QAAQ;EACR,OAAO;GACL,SAAS,CAAC,aAAa;GACvB,SAAS,CAAC,iBAAiB;GAC3B,UAAU,CAAC,SAAS;GACpB,YAAY,CAAC,oBAAoB;GACjC,YAAY,CAAC,oBAAoB;GACjC,eAAe,CAAC,uBAAuB;GACxC;EACD,QAAQ;EACR,QAAQ;EACR,kBAAkB;EAClB,iBAAiB;EACjB,QAAQ;EACR,SAAS;EACT,cAAc;EACd,mBAAmB;EACnB,QAAQ;EACR,wBAAwB;EACxB,uBAAuB;EACxB;CACD,SAAS,CAAC,eAAe,YAAY;CACrC,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACF;AAED,MAAa,eAAe,EAC1B,SAAS,4BACV;AAED,MAAa,oBAAoB;CAC/B,OAAO;CACP,KAAK;CACL,OAAO;CACP,MAAM;CACN,MAAM;CACN,aAAa;CACd;;;;ACtDD,IAAa,cAAb,MAAyB;CACrB,aAAoB,WAChB,aACA,MACa;EACb,MAAM,YAAY,QAAQ,QAAQ;EAClC,IAAIC,SAAc;AAElB,MAAI;AACA,YAAS,MAAM,QAAQ,IAAI,EAAE,eAAe,QAAQ,CAAC,CAAC,MAAM,CAAC;YACvD;GACN,MAAM,UAAU,QAAQ,OAAO,UAAU;GACzC,MAAM,YAAY,QAAQ,KAAK,MAAM,QAAQ,MAAM;AACnD,UAAO,aACH,OAAO,MAAM,CAAC,CAAC,aAAa,QAAQ,CAAC,EAAE,IAAI,MAAM,EACjD,CACI,OAAO,MAAM,CAAC,CAAC,GAAG,KAAK,MAAM,SAAS,CAAC,KAAK,OAAO,CAAC,EAAE,IAAI,MAAM,EAChE,OAAO,MAAM,CAAC,CAAC,WAAW,QAAQ,MAAM,KAAK,WAAW,QAAQ,UAAU,MAAM,CAAC,EAAE,IAAI,MAAM,CAChG,CAAC,KAAK,IAAI,CACd"}
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\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, names: string[]) => string | false),\n cwd?: string\n ) {\n cwd ??= process.cwd()\n\n return escalade(cwd, (dir, names) => {\n if (typeof extensions === 'function') {\n return extensions(dir, names)\n }\n\n const candidates = new Set(extensions.map(ext => `${name}.${ext}`))\n for (const filename of names) {\n if (candidates.has(filename)) {\n return filename\n }\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 * @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.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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h3ravel/shared",
3
- "version": "0.20.11",
3
+ "version": "0.20.13",
4
4
  "description": "Shared Utilities.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",