@h3ravel/shared 0.18.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -21,10 +21,16 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  }) : target, mod));
22
22
 
23
23
  //#endregion
24
- let chalk = require("chalk");
25
- chalk = __toESM(chalk);
24
+ let fs_promises = require("fs/promises");
25
+ fs_promises = __toESM(fs_promises);
26
+ let escalade_sync = require("escalade/sync");
27
+ escalade_sync = __toESM(escalade_sync);
26
28
  let path = require("path");
27
29
  path = __toESM(path);
30
+ let chalk = require("chalk");
31
+ chalk = __toESM(chalk);
32
+ let preferred_pm = require("preferred-pm");
33
+ preferred_pm = __toESM(preferred_pm);
28
34
 
29
35
  //#region src/Contracts/IHttp.ts
30
36
  /**
@@ -56,7 +62,7 @@ var EnvParser = class {
56
62
  static parse(initial) {
57
63
  const parsed = { ...initial };
58
64
  for (const key in parsed) {
59
- let value = parsed[key];
65
+ const value = parsed[key];
60
66
  parsed[key] = this.parseValue(value);
61
67
  }
62
68
  return parsed;
@@ -87,20 +93,76 @@ var EnvParser = class {
87
93
  }
88
94
  };
89
95
 
96
+ //#endregion
97
+ //#region src/Utils/FileSystem.ts
98
+ var FileSystem = class {
99
+ static findModulePkg(moduleId, cwd) {
100
+ const parts = moduleId.replace(/\\/g, "/").split("/");
101
+ let packageName = "";
102
+ if (parts.length > 0 && parts[0][0] === "@") packageName += parts.shift() + "/";
103
+ packageName += parts.shift();
104
+ const packageJson = path.default.join(cwd ?? process.cwd(), "node_modules", packageName);
105
+ const resolved = this.findUpConfig(packageJson, "package", ["json"]);
106
+ if (!resolved) return;
107
+ return path.default.join(path.default.dirname(resolved), parts.join("/"));
108
+ }
109
+ /**
110
+ * Check if file exists
111
+ *
112
+ * @param path
113
+ * @returns
114
+ */
115
+ static async fileExists(path$2) {
116
+ try {
117
+ await (0, fs_promises.access)(path$2);
118
+ return true;
119
+ } catch {
120
+ return false;
121
+ }
122
+ }
123
+ /**
124
+ * Recursively find files
125
+ *
126
+ * @param cwd
127
+ * @param name
128
+ * @param extensions
129
+ * @returns
130
+ */
131
+ static findUpConfig(cwd, name, extensions) {
132
+ return (0, escalade_sync.default)(cwd, (_dir, names) => {
133
+ for (const ext of extensions) {
134
+ const filename = `${name}.${ext}`;
135
+ if (names.includes(filename)) return filename;
136
+ }
137
+ return false;
138
+ });
139
+ }
140
+ };
141
+
90
142
  //#endregion
91
143
  //#region src/Utils/Logger.ts
92
- var Logger = class {
93
- static twoColumnLog(name, value, log = true) {
144
+ var Logger = class Logger {
145
+ static twoColumnLog(name, value, log = true, spacer = ".") {
94
146
  const regex = /\x1b\[\d+m/g;
95
147
  const width = Math.min(process.stdout.columns, 100);
96
148
  const dots = Math.max(width - name.replace(regex, "").length - value.replace(regex, "").length - 10, 0);
97
- if (log) return console.log(name, chalk.default.gray(".".repeat(dots)), value);
149
+ if (log) return console.log(name, chalk.default.gray(spacer.repeat(dots)), value);
98
150
  else return [
99
151
  name,
100
- chalk.default.gray(".".repeat(dots)),
152
+ chalk.default.gray(spacer.repeat(dots)),
101
153
  value
102
154
  ];
103
155
  }
156
+ static describe(name, desc, width = 50, log = true) {
157
+ width = Math.min(width, 30);
158
+ const dots = Math.max(width - name.replace(/\x1b\[\d+m/g, "").length, 0);
159
+ if (log) return console.log(name, " ".repeat(dots), desc);
160
+ else return [
161
+ name,
162
+ " ".repeat(dots),
163
+ desc
164
+ ];
165
+ }
104
166
  /**
105
167
  * Logs the message in two columns but allways passing status
106
168
  *
@@ -175,20 +237,32 @@ var Logger = class {
175
237
  static quiet() {
176
238
  process.exit(0);
177
239
  }
240
+ static chalker(styles) {
241
+ return (input) => styles.reduce((acc, style) => {
242
+ if (style in chalk.default) return (typeof style === "function" ? style : chalk.default[style])(acc);
243
+ return acc;
244
+ }, input);
245
+ }
178
246
  static parse(config, joiner = " ", log = true) {
179
247
  const string = config.map(([str, opt]) => {
248
+ if (Array.isArray(opt)) opt = Logger.chalker(opt);
180
249
  return typeof opt === "string" && typeof chalk.default[opt] === "function" ? chalk.default[opt](str) : typeof opt === "function" ? opt(str) : str;
181
250
  }).join(joiner);
182
251
  if (log) console.log(string);
183
252
  else return string;
184
253
  }
185
- static log(config, joiner) {
254
+ /**
255
+ * Ouput formater object or format the output
256
+ *
257
+ * @returns
258
+ */
259
+ static log = ((config, joiner, log = true) => {
186
260
  if (typeof config === "string") {
187
261
  const conf = [[config, joiner]];
188
- return this.parse(conf);
189
- } else if (config) return this.parse(config, joiner);
262
+ return this.parse(conf, "", log);
263
+ } else if (config) return this.parse(config, String(joiner), log);
190
264
  return this;
191
- }
265
+ });
192
266
  };
193
267
 
194
268
  //#endregion
@@ -213,12 +287,12 @@ var PathLoader = class {
213
287
  * @returns
214
288
  */
215
289
  getPath(name, prefix) {
216
- let path$1;
217
- if (prefix && name !== "base") path$1 = path.default.join(prefix, this.paths[name]);
218
- else path$1 = this.paths[name];
219
- path$1 = path$1.replace("/src/", `/${process.env.SRC_PATH ?? "src"}/`.replace(/([^:]\/)\/+/g, "$1"));
220
- if (name === "database" && process.env.SRC_PATH && !"/src/".includes(process.env.SRC_PATH)) return path.default.resolve(path$1.replace(process.env.SRC_PATH, ""));
221
- return path$1;
290
+ let path$2;
291
+ if (prefix && name !== "base") path$2 = path.default.join(prefix, this.paths[name]);
292
+ else path$2 = this.paths[name];
293
+ path$2 = path$2.replace("/src/", `/${process.env.SRC_PATH ?? "src"}/`.replace(/([^:]\/)\/+/g, "$1"));
294
+ if (name === "database" && process.env.SRC_PATH && !"/src/".includes(process.env.SRC_PATH)) return path.default.resolve(path$2.replace(process.env.SRC_PATH, ""));
295
+ return path$2;
222
296
  }
223
297
  /**
224
298
  * Programatically set the paths.
@@ -227,9 +301,21 @@ var PathLoader = class {
227
301
  * @param path - The new path
228
302
  * @param base - The base path to include to the path
229
303
  */
230
- setPath(name, path$1, base) {
231
- if (base && name !== "base") this.paths[name] = path.default.join(base, path$1);
232
- this.paths[name] = path$1;
304
+ setPath(name, path$2, base) {
305
+ if (base && name !== "base") this.paths[name] = path.default.join(base, path$2);
306
+ this.paths[name] = path$2;
307
+ }
308
+ };
309
+
310
+ //#endregion
311
+ //#region src/Utils/Resolver.ts
312
+ var Resolver = class {
313
+ static async getPakageInstallCommand(pkg) {
314
+ const pm = (await (0, preferred_pm.default)(process.cwd()))?.name ?? "pnpm";
315
+ let cmd = "install";
316
+ if (pm === "yarn" || pm === "pnpm") cmd = "add";
317
+ else if (pm === "bun") cmd = "create";
318
+ return `${pm} ${cmd} ${pkg}`;
233
319
  }
234
320
  };
235
321
 
@@ -251,8 +337,10 @@ var TaskManager = class {
251
337
 
252
338
  //#endregion
253
339
  exports.EnvParser = EnvParser;
340
+ exports.FileSystem = FileSystem;
254
341
  exports.HttpContext = HttpContext;
255
342
  exports.Logger = Logger;
256
343
  exports.PathLoader = PathLoader;
344
+ exports.Resolver = Resolver;
257
345
  exports.TaskManager = TaskManager;
258
346
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["app: IApplication","request: IRequest","response: IResponse","value: any","path: string","nodepath","path","result: any"],"sources":["../src/Contracts/IHttp.ts","../src/Utils/EnvParser.ts","../src/Utils/Logger.ts","../src/Utils/PathLoader.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: string | IMiddleware[], handler: Middleware, 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 let 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 chalk, { type ChalkInstance } from 'chalk'\n\nexport class Logger {\n /**\n * Logs the message in two columns\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): void\n static twoColumnLog (name: string, value: string, log?: false): [string, string, string]\n static twoColumnLog (name: string, value: string, log = true): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.min(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('.'.repeat(dots)), value)\n else return [name, chalk.gray('.'.repeat(dots)), value]\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 /**\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: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: true): void\n static parse (config: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: false): string\n static parse (config: [string, keyof ChalkInstance | ChalkInstance][], joiner = ' ', log = true): string | void {\n const string = config.map(([str, opt]) => {\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 static log (): typeof Logger\n static log (config: string, joiner: keyof ChalkInstance): void\n static log (config: [string, keyof ChalkInstance][], joiner?: string): void\n static log (config?: string | [string, keyof ChalkInstance][], joiner?: string): void | Logger {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n return this.parse(conf)\n } else if (config) {\n return this.parse(config, joiner)\n }\n return this\n }\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 path = path.replace('/src/', `/${process.env.SRC_PATH ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, \"$1\"))\n\n if (name === 'database' && process.env.SRC_PATH && !'/src/'.includes(process.env.SRC_PATH)) {\n return nodepath.resolve(path.replace(process.env.SRC_PATH, ''))\n }\n\n return 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 { 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/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: string | IMiddleware[], handler: Middleware, 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.min(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 path = path.replace('/src/', `/${process.env.SRC_PATH ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, '$1'))\n\n if (name === 'database' && process.env.SRC_PATH && !'/src/'.includes(process.env.SRC_PATH)) {\n return nodepath.resolve(path.replace(process.env.SRC_PATH, ''))\n }\n\n return 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 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 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","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
@@ -158,7 +158,7 @@ interface IRequest {
158
158
  * Gets route parameters.
159
159
  * @returns An object containing route parameters.
160
160
  */
161
- params: NonNullable<H3Event["context"]["params"]>;
161
+ params: NonNullable<H3Event['context']['params']>;
162
162
  /**
163
163
  * Gets query parameters.
164
164
  * @returns An object containing query parameters.
@@ -407,7 +407,7 @@ type Bindings = {
407
407
  [key: `app.${string}`]: any;
408
408
  env(): NodeJS.ProcessEnv;
409
409
  env<T extends string>(key: T, def?: any): any;
410
- view(templatePath: string, state?: Record<string, any>): Promise<string>;
410
+ view(viewPath: string, params?: Record<string, any>): Promise<string>;
411
411
  edge: Edge;
412
412
  asset(key: string, def?: string): string;
413
413
  router: IRouter;
@@ -426,25 +426,29 @@ type Bindings = {
426
426
  };
427
427
  type UseKey = keyof RemoveIndexSignature<Bindings>;
428
428
  //#endregion
429
- //#region src/Utils/EnvParser.d.ts
430
- declare class EnvParser {
431
- static parse(initial: GenericWithNullableStringValues): {
432
- [name: string]: string | undefined;
433
- };
434
- static parseValue(value: any): any;
435
- }
436
- //#endregion
437
429
  //#region src/Utils/Logger.d.ts
438
430
  declare class Logger {
439
431
  /**
440
432
  * Logs the message in two columns
433
+ *
441
434
  * @param name
442
435
  * @param value
443
436
  * @param log If set to false, array of [name, dots, value] output will be returned and not logged
444
437
  * @returns
445
438
  */
446
- static twoColumnLog(name: string, value: string, log?: true): void;
447
- static twoColumnLog(name: string, value: string, log?: false): [string, string, string];
439
+ static twoColumnLog(name: string, value: string, log?: true, spacer?: string): void;
440
+ static twoColumnLog(name: string, value: string, log?: false, spacer?: string): [string, string, string];
441
+ /**
442
+ * Logs the message in two columns
443
+ *
444
+ * @param name
445
+ * @param desc
446
+ * @param width
447
+ * @param log If set to false, array of [name, dots, value] output will be returned and not logged
448
+ * @returns
449
+ */
450
+ static describe(name: string, desc: string, width?: number, log?: true): void;
451
+ static describe(name: string, desc: string, width?: number, log?: false): [string, string, string];
448
452
  /**
449
453
  * Logs the message in two columns but allways passing status
450
454
  *
@@ -494,6 +498,7 @@ declare class Logger {
494
498
  * Terminates the process
495
499
  */
496
500
  static quiet(): void;
501
+ static chalker(styles: LoggerChalk[]): (input: any) => string;
497
502
  /**
498
503
  * Parse an array formated message and logs it
499
504
  *
@@ -501,16 +506,63 @@ declare class Logger {
501
506
  * @param joiner
502
507
  * @param log If set to false, string output will be returned and not logged
503
508
  */
504
- static parse(config: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: true): void;
505
- static parse(config: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: false): string;
509
+ static parse(config: LoggerParseSignature, joiner?: string, log?: true): void;
510
+ static parse(config: LoggerParseSignature, joiner?: string, log?: false): string;
506
511
  /**
507
512
  * Ouput formater object or format the output
508
513
  *
509
514
  * @returns
510
515
  */
511
- static log(): typeof Logger;
512
- static log(config: string, joiner: keyof ChalkInstance): void;
513
- static log(config: [string, keyof ChalkInstance][], joiner?: string): void;
516
+ static log: LoggerLog;
517
+ }
518
+ //#endregion
519
+ //#region src/Contracts/Utils.d.ts
520
+ type LoggerChalk = keyof ChalkInstance | ChalkInstance | (keyof ChalkInstance)[];
521
+ type LoggerParseSignature = [string, LoggerChalk][];
522
+ /**
523
+ * Ouput formater object or format the output
524
+ *
525
+ * @returns
526
+ */
527
+ interface LoggerLog {
528
+ (): typeof Logger;
529
+ <L extends boolean>(config: string, joiner: LoggerChalk, log?: L): L extends true ? void : string;
530
+ <L extends boolean>(config: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string;
531
+ <L extends boolean>(config?: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string | Logger;
532
+ }
533
+ //#endregion
534
+ //#region src/Utils/EnvParser.d.ts
535
+ declare class EnvParser {
536
+ static parse(initial: GenericWithNullableStringValues): {
537
+ [name: string]: string | undefined;
538
+ };
539
+ static parseValue(value: any): any;
540
+ }
541
+ //#endregion
542
+ //#region src/Utils/FileSystem.d.ts
543
+ declare class FileSystem {
544
+ static findModulePkg(moduleId: string, cwd?: string): string | undefined;
545
+ /**
546
+ * Check if file exists
547
+ *
548
+ * @param path
549
+ * @returns
550
+ */
551
+ static fileExists(path: string): Promise<boolean>;
552
+ /**
553
+ * Recursively find files
554
+ *
555
+ * @param cwd
556
+ * @param name
557
+ * @param extensions
558
+ * @returns
559
+ */
560
+ static findUpConfig(cwd: string, name: string, extensions: string[]): string | void;
561
+ }
562
+ //#endregion
563
+ //#region src/Utils/Resolver.d.ts
564
+ declare class Resolver {
565
+ static getPakageInstallCommand(pkg: string): Promise<string>;
514
566
  }
515
567
  //#endregion
516
568
  //#region src/Utils/TaskManager.d.ts
@@ -518,5 +570,5 @@ declare class TaskManager {
518
570
  static taskRunner(description: string, task: (() => Promise<any>) | (() => any)): Promise<void>;
519
571
  }
520
572
  //#endregion
521
- export { Bindings, DotFlatten, DotNestedKeys, DotNestedValue, EnvParser, EventHandler, GenericWithNullableStringValues, HttpContext, IApplication, IContainer, IController, IMiddleware, IPathName, IRequest, IResponse, IRouter, IServiceProvider, Logger, PathLoader, RouteEventHandler, RouterEnd, TaskManager, UseKey };
573
+ 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 };
522
574
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -159,7 +159,7 @@ interface IRequest {
159
159
  * Gets route parameters.
160
160
  * @returns An object containing route parameters.
161
161
  */
162
- params: NonNullable<H3Event["context"]["params"]>;
162
+ params: NonNullable<H3Event['context']['params']>;
163
163
  /**
164
164
  * Gets query parameters.
165
165
  * @returns An object containing query parameters.
@@ -395,7 +395,7 @@ type Bindings = {
395
395
  [key: `app.${string}`]: any;
396
396
  env(): NodeJS.ProcessEnv;
397
397
  env<T extends string>(key: T, def?: any): any;
398
- view(templatePath: string, state?: Record<string, any>): Promise<string>;
398
+ view(viewPath: string, params?: Record<string, any>): Promise<string>;
399
399
  edge: Edge;
400
400
  asset(key: string, def?: string): string;
401
401
  router: IRouter;
@@ -414,25 +414,29 @@ type Bindings = {
414
414
  };
415
415
  type UseKey = keyof RemoveIndexSignature<Bindings>;
416
416
  //#endregion
417
- //#region src/Utils/EnvParser.d.ts
418
- declare class EnvParser {
419
- static parse(initial: GenericWithNullableStringValues): {
420
- [name: string]: string | undefined;
421
- };
422
- static parseValue(value: any): any;
423
- }
424
- //#endregion
425
417
  //#region src/Utils/Logger.d.ts
426
418
  declare class Logger {
427
419
  /**
428
420
  * Logs the message in two columns
421
+ *
429
422
  * @param name
430
423
  * @param value
431
424
  * @param log If set to false, array of [name, dots, value] output will be returned and not logged
432
425
  * @returns
433
426
  */
434
- static twoColumnLog(name: string, value: string, log?: true): void;
435
- static twoColumnLog(name: string, value: string, log?: false): [string, string, string];
427
+ static twoColumnLog(name: string, value: string, log?: true, spacer?: string): void;
428
+ static twoColumnLog(name: string, value: string, log?: false, spacer?: string): [string, string, string];
429
+ /**
430
+ * Logs the message in two columns
431
+ *
432
+ * @param name
433
+ * @param desc
434
+ * @param width
435
+ * @param log If set to false, array of [name, dots, value] output will be returned and not logged
436
+ * @returns
437
+ */
438
+ static describe(name: string, desc: string, width?: number, log?: true): void;
439
+ static describe(name: string, desc: string, width?: number, log?: false): [string, string, string];
436
440
  /**
437
441
  * Logs the message in two columns but allways passing status
438
442
  *
@@ -482,6 +486,7 @@ declare class Logger {
482
486
  * Terminates the process
483
487
  */
484
488
  static quiet(): void;
489
+ static chalker(styles: LoggerChalk[]): (input: any) => string;
485
490
  /**
486
491
  * Parse an array formated message and logs it
487
492
  *
@@ -489,16 +494,63 @@ declare class Logger {
489
494
  * @param joiner
490
495
  * @param log If set to false, string output will be returned and not logged
491
496
  */
492
- static parse(config: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: true): void;
493
- static parse(config: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: false): string;
497
+ static parse(config: LoggerParseSignature, joiner?: string, log?: true): void;
498
+ static parse(config: LoggerParseSignature, joiner?: string, log?: false): string;
494
499
  /**
495
500
  * Ouput formater object or format the output
496
501
  *
497
502
  * @returns
498
503
  */
499
- static log(): typeof Logger;
500
- static log(config: string, joiner: keyof ChalkInstance): void;
501
- static log(config: [string, keyof ChalkInstance][], joiner?: string): void;
504
+ static log: LoggerLog;
505
+ }
506
+ //#endregion
507
+ //#region src/Contracts/Utils.d.ts
508
+ type LoggerChalk = keyof ChalkInstance | ChalkInstance | (keyof ChalkInstance)[];
509
+ type LoggerParseSignature = [string, LoggerChalk][];
510
+ /**
511
+ * Ouput formater object or format the output
512
+ *
513
+ * @returns
514
+ */
515
+ interface LoggerLog {
516
+ (): typeof Logger;
517
+ <L extends boolean>(config: string, joiner: LoggerChalk, log?: L): L extends true ? void : string;
518
+ <L extends boolean>(config: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string;
519
+ <L extends boolean>(config?: LoggerParseSignature, joiner?: string, log?: L): L extends true ? void : string | Logger;
520
+ }
521
+ //#endregion
522
+ //#region src/Utils/EnvParser.d.ts
523
+ declare class EnvParser {
524
+ static parse(initial: GenericWithNullableStringValues): {
525
+ [name: string]: string | undefined;
526
+ };
527
+ static parseValue(value: any): any;
528
+ }
529
+ //#endregion
530
+ //#region src/Utils/FileSystem.d.ts
531
+ declare class FileSystem {
532
+ static findModulePkg(moduleId: string, cwd?: string): string | undefined;
533
+ /**
534
+ * Check if file exists
535
+ *
536
+ * @param path
537
+ * @returns
538
+ */
539
+ static fileExists(path: string): Promise<boolean>;
540
+ /**
541
+ * Recursively find files
542
+ *
543
+ * @param cwd
544
+ * @param name
545
+ * @param extensions
546
+ * @returns
547
+ */
548
+ static findUpConfig(cwd: string, name: string, extensions: string[]): string | void;
549
+ }
550
+ //#endregion
551
+ //#region src/Utils/Resolver.d.ts
552
+ declare class Resolver {
553
+ static getPakageInstallCommand(pkg: string): Promise<string>;
502
554
  }
503
555
  //#endregion
504
556
  //#region src/Utils/TaskManager.d.ts
@@ -506,5 +558,5 @@ declare class TaskManager {
506
558
  static taskRunner(description: string, task: (() => Promise<any>) | (() => any)): Promise<void>;
507
559
  }
508
560
  //#endregion
509
- export { Bindings, DotFlatten, DotNestedKeys, DotNestedValue, EnvParser, EventHandler, GenericWithNullableStringValues, HttpContext, IApplication, IContainer, IController, IMiddleware, IPathName, IRequest, IResponse, IRouter, IServiceProvider, Logger, PathLoader, RouteEventHandler, RouterEnd, TaskManager, UseKey };
561
+ 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 };
510
562
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
+ import { access } from "fs/promises";
2
+ import escalade from "escalade/sync";
3
+ import path from "path";
1
4
  import chalk from "chalk";
2
- import nodepath from "path";
5
+ import preferredPM from "preferred-pm";
3
6
 
4
7
  //#region src/Contracts/IHttp.ts
5
8
  /**
@@ -31,7 +34,7 @@ var EnvParser = class {
31
34
  static parse(initial) {
32
35
  const parsed = { ...initial };
33
36
  for (const key in parsed) {
34
- let value = parsed[key];
37
+ const value = parsed[key];
35
38
  parsed[key] = this.parseValue(value);
36
39
  }
37
40
  return parsed;
@@ -62,20 +65,76 @@ var EnvParser = class {
62
65
  }
63
66
  };
64
67
 
68
+ //#endregion
69
+ //#region src/Utils/FileSystem.ts
70
+ var FileSystem = class {
71
+ static findModulePkg(moduleId, cwd) {
72
+ const parts = moduleId.replace(/\\/g, "/").split("/");
73
+ let packageName = "";
74
+ if (parts.length > 0 && parts[0][0] === "@") packageName += parts.shift() + "/";
75
+ packageName += parts.shift();
76
+ const packageJson = path.join(cwd ?? process.cwd(), "node_modules", packageName);
77
+ const resolved = this.findUpConfig(packageJson, "package", ["json"]);
78
+ if (!resolved) return;
79
+ return path.join(path.dirname(resolved), parts.join("/"));
80
+ }
81
+ /**
82
+ * Check if file exists
83
+ *
84
+ * @param path
85
+ * @returns
86
+ */
87
+ static async fileExists(path$1) {
88
+ try {
89
+ await access(path$1);
90
+ return true;
91
+ } catch {
92
+ return false;
93
+ }
94
+ }
95
+ /**
96
+ * Recursively find files
97
+ *
98
+ * @param cwd
99
+ * @param name
100
+ * @param extensions
101
+ * @returns
102
+ */
103
+ static findUpConfig(cwd, name, extensions) {
104
+ return escalade(cwd, (_dir, names) => {
105
+ for (const ext of extensions) {
106
+ const filename = `${name}.${ext}`;
107
+ if (names.includes(filename)) return filename;
108
+ }
109
+ return false;
110
+ });
111
+ }
112
+ };
113
+
65
114
  //#endregion
66
115
  //#region src/Utils/Logger.ts
67
- var Logger = class {
68
- static twoColumnLog(name, value, log = true) {
116
+ var Logger = class Logger {
117
+ static twoColumnLog(name, value, log = true, spacer = ".") {
69
118
  const regex = /\x1b\[\d+m/g;
70
119
  const width = Math.min(process.stdout.columns, 100);
71
120
  const dots = Math.max(width - name.replace(regex, "").length - value.replace(regex, "").length - 10, 0);
72
- if (log) return console.log(name, chalk.gray(".".repeat(dots)), value);
121
+ if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value);
73
122
  else return [
74
123
  name,
75
- chalk.gray(".".repeat(dots)),
124
+ chalk.gray(spacer.repeat(dots)),
76
125
  value
77
126
  ];
78
127
  }
128
+ static describe(name, desc, width = 50, log = true) {
129
+ width = Math.min(width, 30);
130
+ const dots = Math.max(width - name.replace(/\x1b\[\d+m/g, "").length, 0);
131
+ if (log) return console.log(name, " ".repeat(dots), desc);
132
+ else return [
133
+ name,
134
+ " ".repeat(dots),
135
+ desc
136
+ ];
137
+ }
79
138
  /**
80
139
  * Logs the message in two columns but allways passing status
81
140
  *
@@ -150,20 +209,32 @@ var Logger = class {
150
209
  static quiet() {
151
210
  process.exit(0);
152
211
  }
212
+ static chalker(styles) {
213
+ return (input) => styles.reduce((acc, style) => {
214
+ if (style in chalk) return (typeof style === "function" ? style : chalk[style])(acc);
215
+ return acc;
216
+ }, input);
217
+ }
153
218
  static parse(config, joiner = " ", log = true) {
154
219
  const string = config.map(([str, opt]) => {
220
+ if (Array.isArray(opt)) opt = Logger.chalker(opt);
155
221
  return typeof opt === "string" && typeof chalk[opt] === "function" ? chalk[opt](str) : typeof opt === "function" ? opt(str) : str;
156
222
  }).join(joiner);
157
223
  if (log) console.log(string);
158
224
  else return string;
159
225
  }
160
- static log(config, joiner) {
226
+ /**
227
+ * Ouput formater object or format the output
228
+ *
229
+ * @returns
230
+ */
231
+ static log = ((config, joiner, log = true) => {
161
232
  if (typeof config === "string") {
162
233
  const conf = [[config, joiner]];
163
- return this.parse(conf);
164
- } else if (config) return this.parse(config, joiner);
234
+ return this.parse(conf, "", log);
235
+ } else if (config) return this.parse(config, String(joiner), log);
165
236
  return this;
166
- }
237
+ });
167
238
  };
168
239
 
169
240
  //#endregion
@@ -188,12 +259,12 @@ var PathLoader = class {
188
259
  * @returns
189
260
  */
190
261
  getPath(name, prefix) {
191
- let path;
192
- if (prefix && name !== "base") path = nodepath.join(prefix, this.paths[name]);
193
- else path = this.paths[name];
194
- path = path.replace("/src/", `/${process.env.SRC_PATH ?? "src"}/`.replace(/([^:]\/)\/+/g, "$1"));
195
- if (name === "database" && process.env.SRC_PATH && !"/src/".includes(process.env.SRC_PATH)) return nodepath.resolve(path.replace(process.env.SRC_PATH, ""));
196
- return path;
262
+ let path$1;
263
+ if (prefix && name !== "base") path$1 = path.join(prefix, this.paths[name]);
264
+ else path$1 = this.paths[name];
265
+ path$1 = path$1.replace("/src/", `/${process.env.SRC_PATH ?? "src"}/`.replace(/([^:]\/)\/+/g, "$1"));
266
+ if (name === "database" && process.env.SRC_PATH && !"/src/".includes(process.env.SRC_PATH)) return path.resolve(path$1.replace(process.env.SRC_PATH, ""));
267
+ return path$1;
197
268
  }
198
269
  /**
199
270
  * Programatically set the paths.
@@ -202,9 +273,21 @@ var PathLoader = class {
202
273
  * @param path - The new path
203
274
  * @param base - The base path to include to the path
204
275
  */
205
- setPath(name, path, base) {
206
- if (base && name !== "base") this.paths[name] = nodepath.join(base, path);
207
- this.paths[name] = path;
276
+ setPath(name, path$1, base) {
277
+ if (base && name !== "base") this.paths[name] = path.join(base, path$1);
278
+ this.paths[name] = path$1;
279
+ }
280
+ };
281
+
282
+ //#endregion
283
+ //#region src/Utils/Resolver.ts
284
+ var Resolver = class {
285
+ static async getPakageInstallCommand(pkg) {
286
+ const pm = (await preferredPM(process.cwd()))?.name ?? "pnpm";
287
+ let cmd = "install";
288
+ if (pm === "yarn" || pm === "pnpm") cmd = "add";
289
+ else if (pm === "bun") cmd = "create";
290
+ return `${pm} ${cmd} ${pkg}`;
208
291
  }
209
292
  };
210
293
 
@@ -225,5 +308,5 @@ var TaskManager = class {
225
308
  };
226
309
 
227
310
  //#endregion
228
- export { EnvParser, HttpContext, Logger, PathLoader, TaskManager };
311
+ export { EnvParser, FileSystem, HttpContext, Logger, PathLoader, Resolver, TaskManager };
229
312
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["app: IApplication","request: IRequest","response: IResponse","value: any","path: string","result: any"],"sources":["../src/Contracts/IHttp.ts","../src/Utils/EnvParser.ts","../src/Utils/Logger.ts","../src/Utils/PathLoader.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: string | IMiddleware[], handler: Middleware, 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 let 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 chalk, { type ChalkInstance } from 'chalk'\n\nexport class Logger {\n /**\n * Logs the message in two columns\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): void\n static twoColumnLog (name: string, value: string, log?: false): [string, string, string]\n static twoColumnLog (name: string, value: string, log = true): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.min(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('.'.repeat(dots)), value)\n else return [name, chalk.gray('.'.repeat(dots)), value]\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 /**\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: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: true): void\n static parse (config: [string, keyof ChalkInstance | ChalkInstance][], joiner?: string, log?: false): string\n static parse (config: [string, keyof ChalkInstance | ChalkInstance][], joiner = ' ', log = true): string | void {\n const string = config.map(([str, opt]) => {\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 static log (): typeof Logger\n static log (config: string, joiner: keyof ChalkInstance): void\n static log (config: [string, keyof ChalkInstance][], joiner?: string): void\n static log (config?: string | [string, keyof ChalkInstance][], joiner?: string): void | Logger {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n return this.parse(conf)\n } else if (config) {\n return this.parse(config, joiner)\n }\n return this\n }\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 path = path.replace('/src/', `/${process.env.SRC_PATH ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, \"$1\"))\n\n if (name === 'database' && process.env.SRC_PATH && !'/src/'.includes(process.env.SRC_PATH)) {\n return nodepath.resolve(path.replace(process.env.SRC_PATH, ''))\n }\n\n return 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 { Logger } from \"./Logger\"\n\nexport class TaskManager {\n public static async taskRunner (\n description: string,\n task: (() => Promise<any>) | (() => any)\n ): Promise<void> {\n const startTime = process.hrtime()\n let result: any = false\n\n try {\n result = await Promise.all([(task || (() => true))()].flat())\n } finally {\n const endTime = process.hrtime(startTime)\n const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n Logger.twoColumnLog(\n Logger.parse([[description, 'green']], '', false),\n [\n Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n Logger.parse([[result !== false ? '✔' : '✘', result !== false ? 'green' : 'red']], '', false),\n ].join(' ')\n )\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["app: IApplication","request: IRequest","response: IResponse","value: any","path","path: string","nodepath","path","result: any"],"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/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: string | IMiddleware[], handler: Middleware, 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.min(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 path = path.replace('/src/', `/${process.env.SRC_PATH ?? 'src'}/`.replace(/([^:]\\/)\\/+/g, '$1'))\n\n if (name === 'database' && process.env.SRC_PATH && !'/src/'.includes(process.env.SRC_PATH)) {\n return nodepath.resolve(path.replace(process.env.SRC_PATH, ''))\n }\n\n return 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 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 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","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.18.1",
3
+ "version": "0.20.0",
4
4
  "description": "Shared Utilities.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -46,7 +46,9 @@
46
46
  "dependencies": {
47
47
  "h3": "^2.0.0-beta.4",
48
48
  "chalk": "^5.6.0",
49
- "edge.js": "^6.3.0"
49
+ "edge.js": "^6.3.0",
50
+ "preferred-pm": "^4.1.1",
51
+ "escalade": "^3.2.0"
50
52
  },
51
53
  "devDependencies": {
52
54
  "fetchdts": "^0.1.6",
package/tsconfig.json CHANGED
@@ -11,5 +11,5 @@
11
11
  "skipLibCheck": true,
12
12
  "resolveJsonModule": true
13
13
  },
14
- "exclude": ["./dist", "./**/dist", "/.node_modules"]
14
+ "exclude": ["./dist", "./**/dist", "./node_modules"]
15
15
  }