@h3ravel/core 1.6.0 → 1.7.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
@@ -49,8 +49,7 @@ var init_Container = __esm({
49
49
  * @returns
50
50
  */
51
51
  static hasAnyDecorator(target) {
52
- if (Reflect.getMetadataKeys(target).length > 0)
53
- return true;
52
+ if (Reflect.getMetadataKeys(target).length > 0) return true;
54
53
  const paramLength = target.length;
55
54
  for (let i = 0; i < paramLength; i++) {
56
55
  if (Reflect.getMetadataKeys(target, `__param_${i}`).length > 0) {
@@ -156,8 +155,7 @@ var init_Application = __esm({
156
155
  async registerConfiguredProviders() {
157
156
  const providers = await this.getAllProviders();
158
157
  for (const ProviderClass of providers) {
159
- if (!ProviderClass)
160
- continue;
158
+ if (!ProviderClass) continue;
161
159
  const provider = new ProviderClass(this);
162
160
  await this.register(provider);
163
161
  }
@@ -182,8 +180,8 @@ var init_Application = __esm({
182
180
  */
183
181
  async getConfiguredProviders() {
184
182
  return [
185
- (await Promise.resolve().then(() => (init_src(), src_exports))).CoreServiceProvider,
186
- (await Promise.resolve().then(() => (init_src(), src_exports))).ViewServiceProvider
183
+ (await Promise.resolve().then(() => (init_index(), index_exports))).CoreServiceProvider,
184
+ (await Promise.resolve().then(() => (init_index(), index_exports))).ViewServiceProvider
187
185
  ];
188
186
  }
189
187
  async getAllProviders() {
@@ -202,8 +200,7 @@ var init_Application = __esm({
202
200
  });
203
201
  providers.forEach((Provider) => {
204
202
  const order = Provider.order;
205
- if (!order)
206
- return;
203
+ if (!order) return;
207
204
  const [direction, target] = order.split(":");
208
205
  const targetPriority = priorityMap.get(target) ?? 0;
209
206
  if (direction === "before") {
@@ -236,8 +233,7 @@ var init_Application = __esm({
236
233
  * Boot all providers after registration
237
234
  */
238
235
  async boot() {
239
- if (this.booted)
240
- return;
236
+ if (this.booted) return;
241
237
  for (const provider of this.providers) {
242
238
  if (provider.boot) {
243
239
  await provider.boot();
@@ -296,6 +292,13 @@ var init_Application = __esm({
296
292
  }
297
293
  });
298
294
 
295
+ // src/Contracts/ServiceProviderConstructor.ts
296
+ var init_ServiceProviderConstructor = __esm({
297
+ "src/Contracts/ServiceProviderConstructor.ts"() {
298
+ "use strict";
299
+ }
300
+ });
301
+
299
302
  // src/Controller.ts
300
303
  var Controller;
301
304
  var init_Controller = __esm({
@@ -328,32 +331,6 @@ var init_Controller = __esm({
328
331
  }
329
332
  });
330
333
 
331
- // src/ServiceProvider.ts
332
- var ServiceProvider;
333
- var init_ServiceProvider = __esm({
334
- "src/ServiceProvider.ts"() {
335
- "use strict";
336
- ServiceProvider = class {
337
- static {
338
- __name(this, "ServiceProvider");
339
- }
340
- static order;
341
- static priority = 0;
342
- app;
343
- constructor(app) {
344
- this.app = app;
345
- }
346
- };
347
- }
348
- });
349
-
350
- // src/Contracts/ServiceProviderConstructor.ts
351
- var init_ServiceProviderConstructor = __esm({
352
- "src/Contracts/ServiceProviderConstructor.ts"() {
353
- "use strict";
354
- }
355
- });
356
-
357
334
  // src/Di/Inject.ts
358
335
  function Inject(...dependencies) {
359
336
  return function(target) {
@@ -436,8 +413,7 @@ var init_Kernel = __esm({
436
413
  async runMiddleware(context, next) {
437
414
  let index = -1;
438
415
  const runner = /* @__PURE__ */ __name(async (i) => {
439
- if (i <= index)
440
- throw new Error("next() called multiple times");
416
+ if (i <= index) throw new Error("next() called multiple times");
441
417
  index = i;
442
418
  const middleware = this.middleware[i];
443
419
  if (middleware) {
@@ -461,6 +437,51 @@ var init_Kernel = __esm({
461
437
  }
462
438
  });
463
439
 
440
+ // src/Registerer.ts
441
+ var import_support, Registerer;
442
+ var init_Registerer = __esm({
443
+ "src/Registerer.ts"() {
444
+ "use strict";
445
+ import_support = require("@h3ravel/support");
446
+ Registerer = class {
447
+ static {
448
+ __name(this, "Registerer");
449
+ }
450
+ static register() {
451
+ globalThis.dd = import_support.dd;
452
+ globalThis.dump = import_support.dump;
453
+ }
454
+ };
455
+ }
456
+ });
457
+
458
+ // src/ServiceProvider.ts
459
+ var ServiceProvider;
460
+ var init_ServiceProvider = __esm({
461
+ "src/ServiceProvider.ts"() {
462
+ "use strict";
463
+ init_Registerer();
464
+ ServiceProvider = class {
465
+ static {
466
+ __name(this, "ServiceProvider");
467
+ }
468
+ static order;
469
+ static priority = 0;
470
+ app;
471
+ constructor(app) {
472
+ this.app = app;
473
+ }
474
+ /**
475
+ * Register bindings to the container.
476
+ * Runs before boot().
477
+ */
478
+ register() {
479
+ Registerer.register();
480
+ }
481
+ };
482
+ }
483
+ });
484
+
464
485
  // src/Providers/CoreServiceProvider.ts
465
486
  var import_reflect_metadata, CoreServiceProvider;
466
487
  var init_CoreServiceProvider = __esm({
@@ -507,8 +528,8 @@ var init_ViewServiceProvider = __esm({
507
528
  });
508
529
 
509
530
  // src/index.ts
510
- var src_exports = {};
511
- __export(src_exports, {
531
+ var index_exports = {};
532
+ __export(index_exports, {
512
533
  Application: () => Application,
513
534
  Container: () => Container,
514
535
  Controller: () => Controller,
@@ -516,25 +537,27 @@ __export(src_exports, {
516
537
  Inject: () => Inject,
517
538
  Injectable: () => Injectable,
518
539
  Kernel: () => Kernel,
540
+ Registerer: () => Registerer,
519
541
  ServiceProvider: () => ServiceProvider,
520
542
  ViewServiceProvider: () => ViewServiceProvider
521
543
  });
522
- module.exports = __toCommonJS(src_exports);
523
- var init_src = __esm({
544
+ module.exports = __toCommonJS(index_exports);
545
+ var init_index = __esm({
524
546
  "src/index.ts"() {
525
547
  init_Application();
526
548
  init_Container();
527
- init_Controller();
528
- init_ServiceProvider();
529
549
  init_ServiceProviderConstructor();
550
+ init_Controller();
530
551
  init_Inject();
531
552
  init_Handler();
532
553
  init_Kernel();
533
554
  init_CoreServiceProvider();
534
555
  init_ViewServiceProvider();
556
+ init_Registerer();
557
+ init_ServiceProvider();
535
558
  }
536
559
  });
537
- init_src();
560
+ init_index();
538
561
  // Annotate the CommonJS export names for ESM import in node:
539
562
  0 && (module.exports = {
540
563
  Application,
@@ -544,6 +567,7 @@ init_src();
544
567
  Inject,
545
568
  Injectable,
546
569
  Kernel,
570
+ Registerer,
547
571
  ServiceProvider,
548
572
  ViewServiceProvider
549
573
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Container.ts","../src/Application.ts","../src/Controller.ts","../src/ServiceProvider.ts","../src/Contracts/ServiceProviderConstructor.ts","../src/Di/Inject.ts","../src/Exceptions/Handler.ts","../src/Http/Kernel.ts","../src/Providers/CoreServiceProvider.ts","../src/Providers/ViewServiceProvider.ts","../src/index.ts"],"sourcesContent":["import type { Bindings, IContainer, UseKey } from '@h3ravel/shared'\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container implements IContainer {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\n\n /**\n * Check if the target has any decorators\n * \n * @param target \n * @returns \n */\n static hasAnyDecorator (target: Function): boolean {\n if (Reflect.getMetadataKeys(target).length > 0) return true\n\n const paramLength = target.length\n\n for (let i = 0; i < paramLength; i++) {\n if (Reflect.getMetadataKeys(target, `__param_${i}`).length > 0) {\n return true\n }\n }\n\n return false\n }\n\n /**\n * Bind a transient service to the container\n */\n bind<T> (key: new (...args: any[]) => T, factory: () => T): void\n bind<T extends UseKey> (key: T, factory: () => Bindings[T]): void\n bind<T extends UseKey> (\n key: T,\n factory: () => Bindings[T] | T\n ) {\n this.bindings.set(key, factory)\n }\n\n /**\n * Bind a singleton service to the container\n */\n singleton<T extends UseKey> (\n key: T | (new (..._args: any[]) => Bindings[T]),\n factory: () => Bindings[T]\n ) {\n this.bindings.set(key, () => {\n if (!this.singletons.has(key)) {\n this.singletons.set(key, factory())\n }\n return this.singletons.get(key)!\n })\n }\n\n /**\n * Resolve a service from the container\n */\n make<T extends UseKey, X = undefined> (\n key: T | (new (..._args: any[]) => Bindings[T])\n ): X extends undefined ? Bindings[T] : X {\n /**\n * Direct factory binding\n */\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n /**\n * If this is a class constructor, auto-resolve via reflection\n */\n if (typeof key === 'function') {\n return this.build(key)\n }\n\n throw new Error(\n `No binding found for key: ${typeof key === 'string' ? key : (key as any)?.name}`\n )\n }\n\n /**\n * Automatically build a class with constructor dependency injection\n */\n private build<T extends UseKey> (ClassType: new (..._args: any[]) => Bindings[T]): Bindings[T] {\n let dependencies: any[] = [];\n\n if (Array.isArray((ClassType as any).__inject__)) {\n dependencies = (ClassType as any).__inject__.map((alias: any) => {\n return this.make(alias)\n });\n } else {\n const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n dependencies = paramTypes.map((dep) => this.make(dep))\n }\n\n return new ClassType(...dependencies);\n }\n\n /**\n * Check if a service is registered\n */\n has (key: UseKey): boolean {\n return this.bindings.has(key)\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from '@h3ravel/shared'\nimport dotenv from 'dotenv'\nimport path from 'node:path'\n\nexport class Application extends Container implements IApplication {\n paths = new PathLoader()\n private booted = false\n private versions = { app: '0', ts: '0' }\n private basePath: string\n\n private providers: IServiceProvider[] = []\n protected externalProviders: Array<new (_app: Application) => IServiceProvider> = []\n\n constructor(basePath: string) {\n super()\n this.basePath = basePath\n this.setPath('base', basePath)\n this.loadOptions()\n this.registerBaseBindings();\n dotenv.config({ quiet: true })\n }\n\n /**\n * Register core bindings into the container\n */\n protected registerBaseBindings () {\n this.bind(Application, () => this)\n this.bind('path.base', () => this.basePath)\n this.bind('load.paths', () => this.paths)\n }\n\n /**\n * Dynamically register all configured providers\n */\n public async registerConfiguredProviders () {\n const providers = await this.getAllProviders()\n\n for (const ProviderClass of providers) {\n if (!ProviderClass) continue\n const provider = new ProviderClass(this)\n await this.register(provider)\n }\n }\n\n protected async loadOptions () {\n const app = await this.safeImport(this.getPath('base', 'package.json'))\n const core = await this.safeImport('../package.json')\n\n if (app && app.dependencies) {\n this.versions.app = app.dependencies['@h3ravel/core']\n }\n if (core && core.devDependencies) {\n this.versions.ts = app.devDependencies.typescript\n }\n }\n\n /**\n * Load default and optional providers dynamically\n * \n * Auto-Registration Behavior\n * \n * Minimal App: Loads only core, config, http, router by default.\n * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.\n */\n protected async getConfiguredProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n return [\n (await import('@h3ravel/core')).CoreServiceProvider,\n (await import('@h3ravel/core')).ViewServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders();\n const allProviders = [...coreProviders, ...this.externalProviders];\n\n /**\n * Deduplicate by class reference\n */\n const uniqueProviders = Array.from(new Set(allProviders));\n\n return this.sortProviders(uniqueProviders);\n }\n\n private sortProviders (providers: Array<new (_app: Application) => IServiceProvider>) {\n const priorityMap = new Map<string, number>();\n\n /**\n * Base priority (default 0)\n */\n providers.forEach((Provider) => {\n priorityMap.set(Provider.name, (Provider as any).priority ?? 0);\n });\n\n /**\n * Handle before/after adjustments\n */\n providers.forEach((Provider) => {\n const order = (Provider as any).order;\n if (!order) return;\n\n const [direction, target] = order.split(':');\n const targetPriority = priorityMap.get(target) ?? 0;\n\n if (direction === 'before') {\n priorityMap.set(Provider.name, targetPriority - 1);\n } else if (direction === 'after') {\n priorityMap.set(Provider.name, targetPriority + 1);\n }\n });\n\n /**\n * Sort the service providers based on thier name and priority\n */\n const sorted = providers.sort(\n (A, B) => (priorityMap.get(B.name) ?? 0) - (priorityMap.get(A.name) ?? 0)\n );\n\n /**\n * If debug is enabled, let's show the loaded service provider info\n */\n if (process.env.APP_DEBUG === 'true') {\n console.table(\n sorted.map((P) => ({\n Provider: P.name,\n Priority: priorityMap.get(P.name),\n Order: (P as any).order || 'N/A',\n }))\n );\n }\n\n return sorted\n }\n\n registerProviders (providers: Array<new (_app: Application) => IServiceProvider>): void {\n this.externalProviders.push(...providers)\n }\n\n /**\n * Register a provider\n */\n public async register (provider: IServiceProvider) {\n await provider.register()\n this.providers.push(provider)\n }\n\n /**\n * Boot all providers after registration\n */\n public async boot () {\n if (this.booted) return\n\n for (const provider of this.providers) {\n if (provider.boot) {\n await provider.boot()\n }\n }\n\n this.booted = true\n }\n\n /**\n * Attempt to dynamically import an optional module\n */\n private async safeImport (moduleName: string) {\n try {\n const mod = await import(moduleName)\n return mod.default ?? mod ?? {}\n } catch {\n return null\n }\n }\n\n /**\n * Get the base path of the app\n * \n * @returns \n */\n getBasePath (): string {\n return this.basePath\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 * @returns \n */\n getPath (name: IPathName, pth?: string) {\n return path.join(this.paths.getPath(name, this.basePath), pth ?? '')\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 * @returns \n */\n setPath (name: IPathName, path: string) {\n return this.paths.setPath(name, path, this.basePath)\n }\n\n /**\n * Returns the installed version of the system core and typescript.\n *\n * @returns \n */\n getVersion (key: 'app' | 'ts') {\n return this.versions[key]?.replaceAll(/\\^|~/g, '')\n }\n}\n","import { Application } from '.'\nimport { IController } from '@h3ravel/shared'\n\n/**\n * Base controller class\n */\nexport abstract class Controller implements IController {\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n public show (..._ctx: any[]): any { return }\n public index (..._ctx: any[]): any { return }\n public store (..._ctx: any[]): any { return }\n public update (..._ctx: any[]): any { return }\n public destroy (..._ctx: any[]): any { return }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\n\nexport abstract class ServiceProvider implements IServiceProvider {\n public static order?: `before:${string}` | `after:${string}` | string | undefined;\n public static priority = 0;\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n /**\n * Register bindings to the container.\n * Runs before boot().\n */\n abstract register (): void | Promise<void>\n\n /**\n * Perform post-registration booting of services.\n * Runs after all providers have been registered.\n */\n boot?(): void | Promise<void>\n}\n","import { Application, ServiceProvider } from \"..\";\n\nimport { IServiceProvider } from \"@h3ravel/shared\";\n\nexport type ServiceProviderConstructor = (new (app: Application) => ServiceProvider) & IServiceProvider;\n","export function Inject (...dependencies: string[]) {\n return function (target: any) {\n target.__inject__ = dependencies;\n };\n}\n\n/**\n * Allows binding dependencies to both class and class methods \n * \n * @returns \n */\nexport function Injectable (): ClassDecorator & MethodDecorator {\n return (...args: any[]) => {\n if (args.length === 1) {\n void args[0]; // class target\n }\n if (args.length === 3) {\n void args[0]; // target\n void args[1]; // propertyKey\n void args[2]; // descriptor\n }\n };\n}\n","export default class { }\n","import { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\n/**\n * Kernel class handles middleware execution and response transformations.\n * It acts as the core middleware pipeline for HTTP requests.\n */\nexport class Kernel {\n /**\n * @param context - A factory function that converts an H3Event into an HttpContext.\n * @param middleware - An array of middleware classes that will be executed in sequence.\n */\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n /**\n * Handles an incoming request and passes it through middleware before invoking the next handler.\n * \n * @param event - The raw H3 event object.\n * @param next - A callback function that represents the next layer (usually the controller or final handler).\n * @returns A promise resolving to the result of the request pipeline.\n */\n async handle (\n event: H3Event,\n next: (ctx: HttpContext) => Promise<unknown>\n ): Promise<unknown> {\n /**\n * Convert the raw event into a standardized HttpContext\n */\n const ctx = this.context(event)\n const { app } = ctx.request\n\n /**\n * Dynamically bind the view renderer to the service container.\n * This allows any part of the request lifecycle to render templates using Edge.\n */\n app.bind('view', () => async (template: string, params?: Record<string, any>) => {\n const edge = app.make('edge')\n return ctx.response.html(await edge.render(template, params))\n })\n\n /**\n * Run middleware stack and obtain result\n */\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n /**\n * If a plain object is returned from a controller or middleware,\n * automatically set the JSON Content-Type header for the response.\n */\n if (result !== undefined && this.isPlainObject(result)) {\n event.res.headers.set('Content-Type', 'application/json; charset=UTF-8')\n }\n\n return result\n }\n\n /**\n * Sequentially runs middleware in the order they were registered.\n * \n * @param context - The standardized HttpContext.\n * @param next - Callback to execute when middleware completes.\n * @returns A promise resolving to the final handler's result.\n */\n private async runMiddleware (\n context: HttpContext,\n next: (ctx: HttpContext) => Promise<unknown>\n ) {\n let index = -1\n\n const runner = async (i: number): Promise<unknown> => {\n if (i <= index) throw new Error('next() called multiple times')\n index = i\n const middleware = this.middleware[i]\n\n if (middleware) {\n /**\n * Execute the current middleware and proceed to the next one\n */\n return middleware.handle(context, () => runner(i + 1))\n } else {\n /**\n * If no more middleware, call the final handler\n */\n return next(context)\n }\n }\n\n return runner(0)\n }\n\n /**\n * Utility function to determine if a value is a plain object or array.\n * \n * @param value - The value to check.\n * @returns True if the value is a plain object or array, otherwise false.\n */\n private isPlainObject (value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' &&\n value !== null &&\n (value.constructor === Object || value.constructor === Array)\n }\n}\n","import 'reflect-metadata'\n\nimport { ServiceProvider } from '../ServiceProvider'\n\n/**\n * Bootstraps core services and bindings.\n * \n * Bind essential services to the container (logger, config repository).\n * Register app-level singletons.\n * Set up exception handling.\n * \n * Auto-Registered\n */\nexport class CoreServiceProvider extends ServiceProvider {\n public static priority = 999;\n\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\n public static priority = 995;\n\n register (): void {\n const config = this.app.make('config')\n const edge = Edge.create({\n cache: process.env.NODE_ENV === 'production'\n })\n\n edge.mount(this.app.getPath('views'))\n\n edge.global('asset', this.app.make('asset'))\n edge.global('config', config.get)\n edge.global('app', this.app)\n\n this.app.bind('edge', () => edge)\n }\n}\n","/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Application';\nexport * from './Container';\nexport * from './Controller';\nexport * from './ServiceProvider';\nexport * from './Contracts/ServiceProviderConstructor';\nexport * from './Di/Inject';\nexport * from './Exceptions/Handler';\nexport * from './Http/Kernel';\nexport * from './Providers/CoreServiceProvider';\nexport * from './Providers/ViewServiceProvider';\n"],"mappings":"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","names":["Container","bindings","Map","singletons","hasAnyDecorator","target","Reflect","getMetadataKeys","length","paramLength","i","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","dependencies","Array","isArray","__inject__","map","alias","paramTypes","getMetadata","dep","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","dotenv","config","quiet","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","CoreServiceProvider","ViewServiceProvider","coreProviders","allProviders","uniqueProviders","Array","from","Set","sortProviders","priorityMap","Map","forEach","Provider","set","name","priority","order","direction","target","split","targetPriority","get","sorted","sort","A","B","process","env","APP_DEBUG","console","table","map","P","Priority","Order","registerProviders","push","boot","moduleName","mod","default","getBasePath","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","ServiceProvider","order","priority","app","Inject","dependencies","target","__inject__","Injectable","args","length","Kernel","context","middleware","handle","event","next","ctx","app","request","bind","template","params","edge","make","response","html","render","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","CoreServiceProvider","ServiceProvider","priority","register","ViewServiceProvider","ServiceProvider","priority","register","config","app","make","edge","Edge","create","cache","process","env","NODE_ENV","mount","getPath","global","get","bind"]}
1
+ {"version":3,"sources":["../src/Container.ts","../src/Application.ts","../src/Contracts/ServiceProviderConstructor.ts","../src/Controller.ts","../src/Di/Inject.ts","../src/Exceptions/Handler.ts","../src/Http/Kernel.ts","../src/Registerer.ts","../src/ServiceProvider.ts","../src/Providers/CoreServiceProvider.ts","../src/Providers/ViewServiceProvider.ts","../src/index.ts"],"sourcesContent":["import type { Bindings, IContainer, UseKey } from '@h3ravel/shared'\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container implements IContainer {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\n\n /**\n * Check if the target has any decorators\n * \n * @param target \n * @returns \n */\n static hasAnyDecorator (target: Function): boolean {\n if (Reflect.getMetadataKeys(target).length > 0) return true\n\n const paramLength = target.length\n\n for (let i = 0; i < paramLength; i++) {\n if (Reflect.getMetadataKeys(target, `__param_${i}`).length > 0) {\n return true\n }\n }\n\n return false\n }\n\n /**\n * Bind a transient service to the container\n */\n bind<T> (key: new (...args: any[]) => T, factory: () => T): void\n bind<T extends UseKey> (key: T, factory: () => Bindings[T]): void\n bind<T extends UseKey> (\n key: T,\n factory: () => Bindings[T] | T\n ) {\n this.bindings.set(key, factory)\n }\n\n /**\n * Bind a singleton service to the container\n */\n singleton<T extends UseKey> (\n key: T | (new (..._args: any[]) => Bindings[T]),\n factory: () => Bindings[T]\n ) {\n this.bindings.set(key, () => {\n if (!this.singletons.has(key)) {\n this.singletons.set(key, factory())\n }\n return this.singletons.get(key)!\n })\n }\n\n /**\n * Resolve a service from the container\n */\n make<T extends UseKey, X = undefined> (\n key: T | (new (..._args: any[]) => Bindings[T])\n ): X extends undefined ? Bindings[T] : X {\n /**\n * Direct factory binding\n */\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n /**\n * If this is a class constructor, auto-resolve via reflection\n */\n if (typeof key === 'function') {\n return this.build(key)\n }\n\n throw new Error(\n `No binding found for key: ${typeof key === 'string' ? key : (key as any)?.name}`\n )\n }\n\n /**\n * Automatically build a class with constructor dependency injection\n */\n private build<T extends UseKey> (ClassType: new (..._args: any[]) => Bindings[T]): Bindings[T] {\n let dependencies: any[] = [];\n\n if (Array.isArray((ClassType as any).__inject__)) {\n dependencies = (ClassType as any).__inject__.map((alias: any) => {\n return this.make(alias)\n });\n } else {\n const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n dependencies = paramTypes.map((dep) => this.make(dep))\n }\n\n return new ClassType(...dependencies);\n }\n\n /**\n * Check if a service is registered\n */\n has (key: UseKey): boolean {\n return this.bindings.has(key)\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from '@h3ravel/shared'\nimport dotenv from 'dotenv'\nimport path from 'node:path'\n\nexport class Application extends Container implements IApplication {\n paths = new PathLoader()\n private booted = false\n private versions = { app: '0', ts: '0' }\n private basePath: string\n\n private providers: IServiceProvider[] = []\n protected externalProviders: Array<new (_app: Application) => IServiceProvider> = []\n\n constructor(basePath: string) {\n super()\n this.basePath = basePath\n this.setPath('base', basePath)\n this.loadOptions()\n this.registerBaseBindings();\n dotenv.config({ quiet: true })\n }\n\n /**\n * Register core bindings into the container\n */\n protected registerBaseBindings () {\n this.bind(Application, () => this)\n this.bind('path.base', () => this.basePath)\n this.bind('load.paths', () => this.paths)\n }\n\n /**\n * Dynamically register all configured providers\n */\n public async registerConfiguredProviders () {\n const providers = await this.getAllProviders()\n\n for (const ProviderClass of providers) {\n if (!ProviderClass) continue\n const provider = new ProviderClass(this)\n await this.register(provider)\n }\n }\n\n protected async loadOptions () {\n const app = await this.safeImport(this.getPath('base', 'package.json'))\n const core = await this.safeImport('../package.json')\n\n if (app && app.dependencies) {\n this.versions.app = app.dependencies['@h3ravel/core']\n }\n if (core && core.devDependencies) {\n this.versions.ts = app.devDependencies.typescript\n }\n }\n\n /**\n * Load default and optional providers dynamically\n * \n * Auto-Registration Behavior\n * \n * Minimal App: Loads only core, config, http, router by default.\n * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.\n */\n protected async getConfiguredProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n return [\n (await import('@h3ravel/core')).CoreServiceProvider,\n (await import('@h3ravel/core')).ViewServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders();\n const allProviders = [...coreProviders, ...this.externalProviders];\n\n /**\n * Deduplicate by class reference\n */\n const uniqueProviders = Array.from(new Set(allProviders));\n\n return this.sortProviders(uniqueProviders);\n }\n\n private sortProviders (providers: Array<new (_app: Application) => IServiceProvider>) {\n const priorityMap = new Map<string, number>();\n\n /**\n * Base priority (default 0)\n */\n providers.forEach((Provider) => {\n priorityMap.set(Provider.name, (Provider as any).priority ?? 0);\n });\n\n /**\n * Handle before/after adjustments\n */\n providers.forEach((Provider) => {\n const order = (Provider as any).order;\n if (!order) return;\n\n const [direction, target] = order.split(':');\n const targetPriority = priorityMap.get(target) ?? 0;\n\n if (direction === 'before') {\n priorityMap.set(Provider.name, targetPriority - 1);\n } else if (direction === 'after') {\n priorityMap.set(Provider.name, targetPriority + 1);\n }\n });\n\n /**\n * Sort the service providers based on thier name and priority\n */\n const sorted = providers.sort(\n (A, B) => (priorityMap.get(B.name) ?? 0) - (priorityMap.get(A.name) ?? 0)\n );\n\n /**\n * If debug is enabled, let's show the loaded service provider info\n */\n if (process.env.APP_DEBUG === 'true') {\n console.table(\n sorted.map((P) => ({\n Provider: P.name,\n Priority: priorityMap.get(P.name),\n Order: (P as any).order || 'N/A',\n }))\n );\n }\n\n return sorted\n }\n\n registerProviders (providers: Array<new (_app: Application) => IServiceProvider>): void {\n this.externalProviders.push(...providers)\n }\n\n /**\n * Register a provider\n */\n public async register (provider: IServiceProvider) {\n await provider.register()\n this.providers.push(provider)\n }\n\n /**\n * Boot all providers after registration\n */\n public async boot () {\n if (this.booted) return\n\n for (const provider of this.providers) {\n if (provider.boot) {\n await provider.boot()\n }\n }\n\n this.booted = true\n }\n\n /**\n * Attempt to dynamically import an optional module\n */\n private async safeImport (moduleName: string) {\n try {\n const mod = await import(moduleName)\n return mod.default ?? mod ?? {}\n } catch {\n return null\n }\n }\n\n /**\n * Get the base path of the app\n * \n * @returns \n */\n getBasePath (): string {\n return this.basePath\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 * @returns \n */\n getPath (name: IPathName, pth?: string) {\n return path.join(this.paths.getPath(name, this.basePath), pth ?? '')\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 * @returns \n */\n setPath (name: IPathName, path: string) {\n return this.paths.setPath(name, path, this.basePath)\n }\n\n /**\n * Returns the installed version of the system core and typescript.\n *\n * @returns \n */\n getVersion (key: 'app' | 'ts') {\n return this.versions[key]?.replaceAll(/\\^|~/g, '')\n }\n}\n","import { Application, ServiceProvider } from \"..\";\n\nimport { IServiceProvider } from \"@h3ravel/shared\";\n\nexport type ServiceProviderConstructor = (new (app: Application) => ServiceProvider) & IServiceProvider;\n","import { Application } from '.'\nimport { IController } from '@h3ravel/shared'\n\n/**\n * Base controller class\n */\nexport abstract class Controller implements IController {\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n public show (..._ctx: any[]): any { return }\n public index (..._ctx: any[]): any { return }\n public store (..._ctx: any[]): any { return }\n public update (..._ctx: any[]): any { return }\n public destroy (..._ctx: any[]): any { return }\n}\n","export function Inject (...dependencies: string[]) {\n return function (target: any) {\n target.__inject__ = dependencies;\n };\n}\n\n/**\n * Allows binding dependencies to both class and class methods \n * \n * @returns \n */\nexport function Injectable (): ClassDecorator & MethodDecorator {\n return (...args: any[]) => {\n if (args.length === 1) {\n void args[0]; // class target\n }\n if (args.length === 3) {\n void args[0]; // target\n void args[1]; // propertyKey\n void args[2]; // descriptor\n }\n };\n}\n","export default class { }\n","import { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\n/**\n * Kernel class handles middleware execution and response transformations.\n * It acts as the core middleware pipeline for HTTP requests.\n */\nexport class Kernel {\n /**\n * @param context - A factory function that converts an H3Event into an HttpContext.\n * @param middleware - An array of middleware classes that will be executed in sequence.\n */\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n /**\n * Handles an incoming request and passes it through middleware before invoking the next handler.\n * \n * @param event - The raw H3 event object.\n * @param next - A callback function that represents the next layer (usually the controller or final handler).\n * @returns A promise resolving to the result of the request pipeline.\n */\n async handle (\n event: H3Event,\n next: (ctx: HttpContext) => Promise<unknown>\n ): Promise<unknown> {\n /**\n * Convert the raw event into a standardized HttpContext\n */\n const ctx = this.context(event)\n const { app } = ctx.request\n\n /**\n * Dynamically bind the view renderer to the service container.\n * This allows any part of the request lifecycle to render templates using Edge.\n */\n app.bind('view', () => async (template: string, params?: Record<string, any>) => {\n const edge = app.make('edge')\n return ctx.response.html(await edge.render(template, params))\n })\n\n /**\n * Run middleware stack and obtain result\n */\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n /**\n * If a plain object is returned from a controller or middleware,\n * automatically set the JSON Content-Type header for the response.\n */\n if (result !== undefined && this.isPlainObject(result)) {\n event.res.headers.set('Content-Type', 'application/json; charset=UTF-8')\n }\n\n return result\n }\n\n /**\n * Sequentially runs middleware in the order they were registered.\n * \n * @param context - The standardized HttpContext.\n * @param next - Callback to execute when middleware completes.\n * @returns A promise resolving to the final handler's result.\n */\n private async runMiddleware (\n context: HttpContext,\n next: (ctx: HttpContext) => Promise<unknown>\n ) {\n let index = -1\n\n const runner = async (i: number): Promise<unknown> => {\n if (i <= index) throw new Error('next() called multiple times')\n index = i\n const middleware = this.middleware[i]\n\n if (middleware) {\n /**\n * Execute the current middleware and proceed to the next one\n */\n return middleware.handle(context, () => runner(i + 1))\n } else {\n /**\n * If no more middleware, call the final handler\n */\n return next(context)\n }\n }\n\n return runner(0)\n }\n\n /**\n * Utility function to determine if a value is a plain object or array.\n * \n * @param value - The value to check.\n * @returns True if the value is a plain object or array, otherwise false.\n */\n private isPlainObject (value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' &&\n value !== null &&\n (value.constructor === Object || value.constructor === Array)\n }\n}\n","import { dd, dump } from '@h3ravel/support'\n\nexport class Registerer {\n static register () {\n globalThis.dd = dd\n globalThis.dump = dump\n }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\nimport { Registerer } from './Registerer';\n\nexport abstract class ServiceProvider implements IServiceProvider {\n public static order?: `before:${string}` | `after:${string}` | string | undefined;\n public static priority = 0;\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n /**\n * Register bindings to the container.\n * Runs before boot().\n */\n register (): void | Promise<void> {\n Registerer.register()\n }\n\n /**\n * Perform post-registration booting of services.\n * Runs after all providers have been registered.\n */\n boot?(): void | Promise<void>\n}\n","import 'reflect-metadata'\n\nimport { ServiceProvider } from '../ServiceProvider'\n\n/**\n * Bootstraps core services and bindings.\n * \n * Bind essential services to the container (logger, config repository).\n * Register app-level singletons.\n * Set up exception handling.\n * \n * Auto-Registered\n */\nexport class CoreServiceProvider extends ServiceProvider {\n public static priority = 999;\n\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\n public static priority = 995;\n\n register (): void {\n const config = this.app.make('config')\n const edge = Edge.create({\n cache: process.env.NODE_ENV === 'production'\n })\n\n edge.mount(this.app.getPath('views'))\n\n edge.global('asset', this.app.make('asset'))\n edge.global('config', config.get)\n edge.global('app', this.app)\n\n this.app.bind('edge', () => edge)\n }\n}\n","export * from './Application'\nexport * from './Container'\nexport * from './Contracts/ServiceProviderConstructor'\nexport * from './Controller'\nexport * from './Di/Inject'\nexport * from './Exceptions/Handler'\nexport * from './Http/Kernel'\nexport * from './Providers/CoreServiceProvider'\nexport * from './Providers/ViewServiceProvider'\nexport * from './Registerer'\nexport * from './ServiceProvider'\n"],"mappings":"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","names":["Container","bindings","Map","singletons","hasAnyDecorator","target","Reflect","getMetadataKeys","length","paramLength","i","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","dependencies","Array","isArray","__inject__","map","alias","paramTypes","getMetadata","dep","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","dotenv","config","quiet","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","CoreServiceProvider","ViewServiceProvider","coreProviders","allProviders","uniqueProviders","Array","from","Set","sortProviders","priorityMap","Map","forEach","Provider","set","name","priority","order","direction","target","split","targetPriority","get","sorted","sort","A","B","process","env","APP_DEBUG","console","table","map","P","Priority","Order","registerProviders","push","boot","moduleName","mod","default","getBasePath","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","Inject","dependencies","target","__inject__","Injectable","args","length","Kernel","context","middleware","handle","event","next","ctx","app","request","bind","template","params","edge","make","response","html","render","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","Registerer","register","globalThis","dd","dump","ServiceProvider","order","priority","app","register","Registerer","CoreServiceProvider","ServiceProvider","priority","register","ViewServiceProvider","ServiceProvider","priority","register","config","app","make","edge","Edge","create","cache","process","env","NODE_ENV","mount","getPath","global","get","bind"]}
package/dist/index.d.cts CHANGED
@@ -105,6 +105,8 @@ declare class Application extends Container implements IApplication {
105
105
  getVersion(key: 'app' | 'ts'): string;
106
106
  }
107
107
 
108
+ type ServiceProviderConstructor = (new (app: Application) => ServiceProvider) & IServiceProvider;
109
+
108
110
  /**
109
111
  * Base controller class
110
112
  */
@@ -118,25 +120,6 @@ declare abstract class Controller implements IController {
118
120
  destroy(..._ctx: any[]): any;
119
121
  }
120
122
 
121
- declare abstract class ServiceProvider implements IServiceProvider {
122
- static order?: `before:${string}` | `after:${string}` | string | undefined;
123
- static priority: number;
124
- protected app: Application;
125
- constructor(app: Application);
126
- /**
127
- * Register bindings to the container.
128
- * Runs before boot().
129
- */
130
- abstract register(): void | Promise<void>;
131
- /**
132
- * Perform post-registration booting of services.
133
- * Runs after all providers have been registered.
134
- */
135
- boot?(): void | Promise<void>;
136
- }
137
-
138
- type ServiceProviderConstructor = (new (app: Application) => ServiceProvider) & IServiceProvider;
139
-
140
123
  declare function Inject(...dependencies: string[]): (target: any) => void;
141
124
  /**
142
125
  * Allows binding dependencies to both class and class methods
@@ -182,6 +165,23 @@ declare class Kernel {
182
165
  private isPlainObject;
183
166
  }
184
167
 
168
+ declare abstract class ServiceProvider implements IServiceProvider {
169
+ static order?: `before:${string}` | `after:${string}` | string | undefined;
170
+ static priority: number;
171
+ protected app: Application;
172
+ constructor(app: Application);
173
+ /**
174
+ * Register bindings to the container.
175
+ * Runs before boot().
176
+ */
177
+ register(): void | Promise<void>;
178
+ /**
179
+ * Perform post-registration booting of services.
180
+ * Runs after all providers have been registered.
181
+ */
182
+ boot?(): void | Promise<void>;
183
+ }
184
+
185
185
  /**
186
186
  * Bootstraps core services and bindings.
187
187
  *
@@ -201,4 +201,8 @@ declare class ViewServiceProvider extends ServiceProvider {
201
201
  register(): void;
202
202
  }
203
203
 
204
- export { Application, Container, Controller, CoreServiceProvider, Inject, Injectable, Kernel, ServiceProvider, type ServiceProviderConstructor, ViewServiceProvider };
204
+ declare class Registerer {
205
+ static register(): void;
206
+ }
207
+
208
+ export { Application, Container, Controller, CoreServiceProvider, Inject, Injectable, Kernel, Registerer, ServiceProvider, type ServiceProviderConstructor, ViewServiceProvider };
package/dist/index.d.ts CHANGED
@@ -105,6 +105,8 @@ declare class Application extends Container implements IApplication {
105
105
  getVersion(key: 'app' | 'ts'): string;
106
106
  }
107
107
 
108
+ type ServiceProviderConstructor = (new (app: Application) => ServiceProvider) & IServiceProvider;
109
+
108
110
  /**
109
111
  * Base controller class
110
112
  */
@@ -118,25 +120,6 @@ declare abstract class Controller implements IController {
118
120
  destroy(..._ctx: any[]): any;
119
121
  }
120
122
 
121
- declare abstract class ServiceProvider implements IServiceProvider {
122
- static order?: `before:${string}` | `after:${string}` | string | undefined;
123
- static priority: number;
124
- protected app: Application;
125
- constructor(app: Application);
126
- /**
127
- * Register bindings to the container.
128
- * Runs before boot().
129
- */
130
- abstract register(): void | Promise<void>;
131
- /**
132
- * Perform post-registration booting of services.
133
- * Runs after all providers have been registered.
134
- */
135
- boot?(): void | Promise<void>;
136
- }
137
-
138
- type ServiceProviderConstructor = (new (app: Application) => ServiceProvider) & IServiceProvider;
139
-
140
123
  declare function Inject(...dependencies: string[]): (target: any) => void;
141
124
  /**
142
125
  * Allows binding dependencies to both class and class methods
@@ -182,6 +165,23 @@ declare class Kernel {
182
165
  private isPlainObject;
183
166
  }
184
167
 
168
+ declare abstract class ServiceProvider implements IServiceProvider {
169
+ static order?: `before:${string}` | `after:${string}` | string | undefined;
170
+ static priority: number;
171
+ protected app: Application;
172
+ constructor(app: Application);
173
+ /**
174
+ * Register bindings to the container.
175
+ * Runs before boot().
176
+ */
177
+ register(): void | Promise<void>;
178
+ /**
179
+ * Perform post-registration booting of services.
180
+ * Runs after all providers have been registered.
181
+ */
182
+ boot?(): void | Promise<void>;
183
+ }
184
+
185
185
  /**
186
186
  * Bootstraps core services and bindings.
187
187
  *
@@ -201,4 +201,8 @@ declare class ViewServiceProvider extends ServiceProvider {
201
201
  register(): void;
202
202
  }
203
203
 
204
- export { Application, Container, Controller, CoreServiceProvider, Inject, Injectable, Kernel, ServiceProvider, type ServiceProviderConstructor, ViewServiceProvider };
204
+ declare class Registerer {
205
+ static register(): void;
206
+ }
207
+
208
+ export { Application, Container, Controller, CoreServiceProvider, Inject, Injectable, Kernel, Registerer, ServiceProvider, type ServiceProviderConstructor, ViewServiceProvider };
package/dist/index.js CHANGED
@@ -15,8 +15,7 @@ var Container = class {
15
15
  * @returns
16
16
  */
17
17
  static hasAnyDecorator(target) {
18
- if (Reflect.getMetadataKeys(target).length > 0)
19
- return true;
18
+ if (Reflect.getMetadataKeys(target).length > 0) return true;
20
19
  const paramLength = target.length;
21
20
  for (let i = 0; i < paramLength; i++) {
22
21
  if (Reflect.getMetadataKeys(target, `__param_${i}`).length > 0) {
@@ -77,7 +76,7 @@ var Container = class {
77
76
  // src/Application.ts
78
77
  import { PathLoader } from "@h3ravel/shared";
79
78
  import dotenv from "dotenv";
80
- import path from "node:path";
79
+ import path from "path";
81
80
  var Application = class _Application extends Container {
82
81
  static {
83
82
  __name(this, "Application");
@@ -115,8 +114,7 @@ var Application = class _Application extends Container {
115
114
  async registerConfiguredProviders() {
116
115
  const providers = await this.getAllProviders();
117
116
  for (const ProviderClass of providers) {
118
- if (!ProviderClass)
119
- continue;
117
+ if (!ProviderClass) continue;
120
118
  const provider = new ProviderClass(this);
121
119
  await this.register(provider);
122
120
  }
@@ -161,8 +159,7 @@ var Application = class _Application extends Container {
161
159
  });
162
160
  providers.forEach((Provider) => {
163
161
  const order = Provider.order;
164
- if (!order)
165
- return;
162
+ if (!order) return;
166
163
  const [direction, target] = order.split(":");
167
164
  const targetPriority = priorityMap.get(target) ?? 0;
168
165
  if (direction === "before") {
@@ -195,8 +192,7 @@ var Application = class _Application extends Container {
195
192
  * Boot all providers after registration
196
193
  */
197
194
  async boot() {
198
- if (this.booted)
199
- return;
195
+ if (this.booted) return;
200
196
  for (const provider of this.providers) {
201
197
  if (provider.boot) {
202
198
  await provider.boot();
@@ -279,19 +275,6 @@ var Controller = class {
279
275
  }
280
276
  };
281
277
 
282
- // src/ServiceProvider.ts
283
- var ServiceProvider = class {
284
- static {
285
- __name(this, "ServiceProvider");
286
- }
287
- static order;
288
- static priority = 0;
289
- app;
290
- constructor(app) {
291
- this.app = app;
292
- }
293
- };
294
-
295
278
  // src/Di/Inject.ts
296
279
  function Inject(...dependencies) {
297
280
  return function(target) {
@@ -358,8 +341,7 @@ var Kernel = class {
358
341
  async runMiddleware(context, next) {
359
342
  let index = -1;
360
343
  const runner = /* @__PURE__ */ __name(async (i) => {
361
- if (i <= index)
362
- throw new Error("next() called multiple times");
344
+ if (i <= index) throw new Error("next() called multiple times");
363
345
  index = i;
364
346
  const middleware = this.middleware[i];
365
347
  if (middleware) {
@@ -383,6 +365,40 @@ var Kernel = class {
383
365
 
384
366
  // src/Providers/CoreServiceProvider.ts
385
367
  import "reflect-metadata";
368
+
369
+ // src/Registerer.ts
370
+ import { dd, dump } from "@h3ravel/support";
371
+ var Registerer = class {
372
+ static {
373
+ __name(this, "Registerer");
374
+ }
375
+ static register() {
376
+ globalThis.dd = dd;
377
+ globalThis.dump = dump;
378
+ }
379
+ };
380
+
381
+ // src/ServiceProvider.ts
382
+ var ServiceProvider = class {
383
+ static {
384
+ __name(this, "ServiceProvider");
385
+ }
386
+ static order;
387
+ static priority = 0;
388
+ app;
389
+ constructor(app) {
390
+ this.app = app;
391
+ }
392
+ /**
393
+ * Register bindings to the container.
394
+ * Runs before boot().
395
+ */
396
+ register() {
397
+ Registerer.register();
398
+ }
399
+ };
400
+
401
+ // src/Providers/CoreServiceProvider.ts
386
402
  var CoreServiceProvider = class extends ServiceProvider {
387
403
  static {
388
404
  __name(this, "CoreServiceProvider");
@@ -419,6 +435,7 @@ export {
419
435
  Inject,
420
436
  Injectable,
421
437
  Kernel,
438
+ Registerer,
422
439
  ServiceProvider,
423
440
  ViewServiceProvider
424
441
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Container.ts","../src/Application.ts","../src/Controller.ts","../src/ServiceProvider.ts","../src/Di/Inject.ts","../src/Http/Kernel.ts","../src/Providers/CoreServiceProvider.ts","../src/Providers/ViewServiceProvider.ts"],"sourcesContent":["import type { Bindings, IContainer, UseKey } from '@h3ravel/shared'\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container implements IContainer {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\n\n /**\n * Check if the target has any decorators\n * \n * @param target \n * @returns \n */\n static hasAnyDecorator (target: Function): boolean {\n if (Reflect.getMetadataKeys(target).length > 0) return true\n\n const paramLength = target.length\n\n for (let i = 0; i < paramLength; i++) {\n if (Reflect.getMetadataKeys(target, `__param_${i}`).length > 0) {\n return true\n }\n }\n\n return false\n }\n\n /**\n * Bind a transient service to the container\n */\n bind<T> (key: new (...args: any[]) => T, factory: () => T): void\n bind<T extends UseKey> (key: T, factory: () => Bindings[T]): void\n bind<T extends UseKey> (\n key: T,\n factory: () => Bindings[T] | T\n ) {\n this.bindings.set(key, factory)\n }\n\n /**\n * Bind a singleton service to the container\n */\n singleton<T extends UseKey> (\n key: T | (new (..._args: any[]) => Bindings[T]),\n factory: () => Bindings[T]\n ) {\n this.bindings.set(key, () => {\n if (!this.singletons.has(key)) {\n this.singletons.set(key, factory())\n }\n return this.singletons.get(key)!\n })\n }\n\n /**\n * Resolve a service from the container\n */\n make<T extends UseKey, X = undefined> (\n key: T | (new (..._args: any[]) => Bindings[T])\n ): X extends undefined ? Bindings[T] : X {\n /**\n * Direct factory binding\n */\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n /**\n * If this is a class constructor, auto-resolve via reflection\n */\n if (typeof key === 'function') {\n return this.build(key)\n }\n\n throw new Error(\n `No binding found for key: ${typeof key === 'string' ? key : (key as any)?.name}`\n )\n }\n\n /**\n * Automatically build a class with constructor dependency injection\n */\n private build<T extends UseKey> (ClassType: new (..._args: any[]) => Bindings[T]): Bindings[T] {\n let dependencies: any[] = [];\n\n if (Array.isArray((ClassType as any).__inject__)) {\n dependencies = (ClassType as any).__inject__.map((alias: any) => {\n return this.make(alias)\n });\n } else {\n const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n dependencies = paramTypes.map((dep) => this.make(dep))\n }\n\n return new ClassType(...dependencies);\n }\n\n /**\n * Check if a service is registered\n */\n has (key: UseKey): boolean {\n return this.bindings.has(key)\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from '@h3ravel/shared'\nimport dotenv from 'dotenv'\nimport path from 'node:path'\n\nexport class Application extends Container implements IApplication {\n paths = new PathLoader()\n private booted = false\n private versions = { app: '0', ts: '0' }\n private basePath: string\n\n private providers: IServiceProvider[] = []\n protected externalProviders: Array<new (_app: Application) => IServiceProvider> = []\n\n constructor(basePath: string) {\n super()\n this.basePath = basePath\n this.setPath('base', basePath)\n this.loadOptions()\n this.registerBaseBindings();\n dotenv.config({ quiet: true })\n }\n\n /**\n * Register core bindings into the container\n */\n protected registerBaseBindings () {\n this.bind(Application, () => this)\n this.bind('path.base', () => this.basePath)\n this.bind('load.paths', () => this.paths)\n }\n\n /**\n * Dynamically register all configured providers\n */\n public async registerConfiguredProviders () {\n const providers = await this.getAllProviders()\n\n for (const ProviderClass of providers) {\n if (!ProviderClass) continue\n const provider = new ProviderClass(this)\n await this.register(provider)\n }\n }\n\n protected async loadOptions () {\n const app = await this.safeImport(this.getPath('base', 'package.json'))\n const core = await this.safeImport('../package.json')\n\n if (app && app.dependencies) {\n this.versions.app = app.dependencies['@h3ravel/core']\n }\n if (core && core.devDependencies) {\n this.versions.ts = app.devDependencies.typescript\n }\n }\n\n /**\n * Load default and optional providers dynamically\n * \n * Auto-Registration Behavior\n * \n * Minimal App: Loads only core, config, http, router by default.\n * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.\n */\n protected async getConfiguredProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n return [\n (await import('@h3ravel/core')).CoreServiceProvider,\n (await import('@h3ravel/core')).ViewServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders();\n const allProviders = [...coreProviders, ...this.externalProviders];\n\n /**\n * Deduplicate by class reference\n */\n const uniqueProviders = Array.from(new Set(allProviders));\n\n return this.sortProviders(uniqueProviders);\n }\n\n private sortProviders (providers: Array<new (_app: Application) => IServiceProvider>) {\n const priorityMap = new Map<string, number>();\n\n /**\n * Base priority (default 0)\n */\n providers.forEach((Provider) => {\n priorityMap.set(Provider.name, (Provider as any).priority ?? 0);\n });\n\n /**\n * Handle before/after adjustments\n */\n providers.forEach((Provider) => {\n const order = (Provider as any).order;\n if (!order) return;\n\n const [direction, target] = order.split(':');\n const targetPriority = priorityMap.get(target) ?? 0;\n\n if (direction === 'before') {\n priorityMap.set(Provider.name, targetPriority - 1);\n } else if (direction === 'after') {\n priorityMap.set(Provider.name, targetPriority + 1);\n }\n });\n\n /**\n * Sort the service providers based on thier name and priority\n */\n const sorted = providers.sort(\n (A, B) => (priorityMap.get(B.name) ?? 0) - (priorityMap.get(A.name) ?? 0)\n );\n\n /**\n * If debug is enabled, let's show the loaded service provider info\n */\n if (process.env.APP_DEBUG === 'true') {\n console.table(\n sorted.map((P) => ({\n Provider: P.name,\n Priority: priorityMap.get(P.name),\n Order: (P as any).order || 'N/A',\n }))\n );\n }\n\n return sorted\n }\n\n registerProviders (providers: Array<new (_app: Application) => IServiceProvider>): void {\n this.externalProviders.push(...providers)\n }\n\n /**\n * Register a provider\n */\n public async register (provider: IServiceProvider) {\n await provider.register()\n this.providers.push(provider)\n }\n\n /**\n * Boot all providers after registration\n */\n public async boot () {\n if (this.booted) return\n\n for (const provider of this.providers) {\n if (provider.boot) {\n await provider.boot()\n }\n }\n\n this.booted = true\n }\n\n /**\n * Attempt to dynamically import an optional module\n */\n private async safeImport (moduleName: string) {\n try {\n const mod = await import(moduleName)\n return mod.default ?? mod ?? {}\n } catch {\n return null\n }\n }\n\n /**\n * Get the base path of the app\n * \n * @returns \n */\n getBasePath (): string {\n return this.basePath\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 * @returns \n */\n getPath (name: IPathName, pth?: string) {\n return path.join(this.paths.getPath(name, this.basePath), pth ?? '')\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 * @returns \n */\n setPath (name: IPathName, path: string) {\n return this.paths.setPath(name, path, this.basePath)\n }\n\n /**\n * Returns the installed version of the system core and typescript.\n *\n * @returns \n */\n getVersion (key: 'app' | 'ts') {\n return this.versions[key]?.replaceAll(/\\^|~/g, '')\n }\n}\n","import { Application } from '.'\nimport { IController } from '@h3ravel/shared'\n\n/**\n * Base controller class\n */\nexport abstract class Controller implements IController {\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n public show (..._ctx: any[]): any { return }\n public index (..._ctx: any[]): any { return }\n public store (..._ctx: any[]): any { return }\n public update (..._ctx: any[]): any { return }\n public destroy (..._ctx: any[]): any { return }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\n\nexport abstract class ServiceProvider implements IServiceProvider {\n public static order?: `before:${string}` | `after:${string}` | string | undefined;\n public static priority = 0;\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n /**\n * Register bindings to the container.\n * Runs before boot().\n */\n abstract register (): void | Promise<void>\n\n /**\n * Perform post-registration booting of services.\n * Runs after all providers have been registered.\n */\n boot?(): void | Promise<void>\n}\n","export function Inject (...dependencies: string[]) {\n return function (target: any) {\n target.__inject__ = dependencies;\n };\n}\n\n/**\n * Allows binding dependencies to both class and class methods \n * \n * @returns \n */\nexport function Injectable (): ClassDecorator & MethodDecorator {\n return (...args: any[]) => {\n if (args.length === 1) {\n void args[0]; // class target\n }\n if (args.length === 3) {\n void args[0]; // target\n void args[1]; // propertyKey\n void args[2]; // descriptor\n }\n };\n}\n","import { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\n/**\n * Kernel class handles middleware execution and response transformations.\n * It acts as the core middleware pipeline for HTTP requests.\n */\nexport class Kernel {\n /**\n * @param context - A factory function that converts an H3Event into an HttpContext.\n * @param middleware - An array of middleware classes that will be executed in sequence.\n */\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n /**\n * Handles an incoming request and passes it through middleware before invoking the next handler.\n * \n * @param event - The raw H3 event object.\n * @param next - A callback function that represents the next layer (usually the controller or final handler).\n * @returns A promise resolving to the result of the request pipeline.\n */\n async handle (\n event: H3Event,\n next: (ctx: HttpContext) => Promise<unknown>\n ): Promise<unknown> {\n /**\n * Convert the raw event into a standardized HttpContext\n */\n const ctx = this.context(event)\n const { app } = ctx.request\n\n /**\n * Dynamically bind the view renderer to the service container.\n * This allows any part of the request lifecycle to render templates using Edge.\n */\n app.bind('view', () => async (template: string, params?: Record<string, any>) => {\n const edge = app.make('edge')\n return ctx.response.html(await edge.render(template, params))\n })\n\n /**\n * Run middleware stack and obtain result\n */\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n /**\n * If a plain object is returned from a controller or middleware,\n * automatically set the JSON Content-Type header for the response.\n */\n if (result !== undefined && this.isPlainObject(result)) {\n event.res.headers.set('Content-Type', 'application/json; charset=UTF-8')\n }\n\n return result\n }\n\n /**\n * Sequentially runs middleware in the order they were registered.\n * \n * @param context - The standardized HttpContext.\n * @param next - Callback to execute when middleware completes.\n * @returns A promise resolving to the final handler's result.\n */\n private async runMiddleware (\n context: HttpContext,\n next: (ctx: HttpContext) => Promise<unknown>\n ) {\n let index = -1\n\n const runner = async (i: number): Promise<unknown> => {\n if (i <= index) throw new Error('next() called multiple times')\n index = i\n const middleware = this.middleware[i]\n\n if (middleware) {\n /**\n * Execute the current middleware and proceed to the next one\n */\n return middleware.handle(context, () => runner(i + 1))\n } else {\n /**\n * If no more middleware, call the final handler\n */\n return next(context)\n }\n }\n\n return runner(0)\n }\n\n /**\n * Utility function to determine if a value is a plain object or array.\n * \n * @param value - The value to check.\n * @returns True if the value is a plain object or array, otherwise false.\n */\n private isPlainObject (value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' &&\n value !== null &&\n (value.constructor === Object || value.constructor === Array)\n }\n}\n","import 'reflect-metadata'\n\nimport { ServiceProvider } from '../ServiceProvider'\n\n/**\n * Bootstraps core services and bindings.\n * \n * Bind essential services to the container (logger, config repository).\n * Register app-level singletons.\n * Set up exception handling.\n * \n * Auto-Registered\n */\nexport class CoreServiceProvider extends ServiceProvider {\n public static priority = 999;\n\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\n public static priority = 995;\n\n register (): void {\n const config = this.app.make('config')\n const edge = Edge.create({\n cache: process.env.NODE_ENV === 'production'\n })\n\n edge.mount(this.app.getPath('views'))\n\n edge.global('asset', this.app.make('asset'))\n edge.global('config', config.get)\n edge.global('app', this.app)\n\n this.app.bind('edge', () => edge)\n }\n}\n"],"mappings":";;;;AAIO,IAAMA,YAAN,MAAMA;EAAb,OAAaA;;;EACDC,WAAW,oBAAIC,IAAAA;EACfC,aAAa,oBAAID,IAAAA;;;;;;;EAQzB,OAAOE,gBAAiBC,QAA2B;AAC/C,QAAIC,QAAQC,gBAAgBF,MAAAA,EAAQG,SAAS;AAAG,aAAO;AAEvD,UAAMC,cAAcJ,OAAOG;AAE3B,aAASE,IAAI,GAAGA,IAAID,aAAaC,KAAK;AAClC,UAAIJ,QAAQC,gBAAgBF,QAAQ,WAAWK,CAAAA,EAAG,EAAEF,SAAS,GAAG;AAC5D,eAAO;MACX;IACJ;AAEA,WAAO;EACX;EAOAG,KACIC,KACAC,SACF;AACE,SAAKZ,SAASa,IAAIF,KAAKC,OAAAA;EAC3B;;;;EAKAE,UACIH,KACAC,SACF;AACE,SAAKZ,SAASa,IAAIF,KAAK,MAAA;AACnB,UAAI,CAAC,KAAKT,WAAWa,IAAIJ,GAAAA,GAAM;AAC3B,aAAKT,WAAWW,IAAIF,KAAKC,QAAAA,CAAAA;MAC7B;AACA,aAAO,KAAKV,WAAWc,IAAIL,GAAAA;IAC/B,CAAA;EACJ;;;;EAKAM,KACIN,KACqC;AAIrC,QAAI,KAAKX,SAASe,IAAIJ,GAAAA,GAAM;AACxB,aAAO,KAAKX,SAASgB,IAAIL,GAAAA,EAAAA;IAC7B;AAKA,QAAI,OAAOA,QAAQ,YAAY;AAC3B,aAAO,KAAKO,MAAMP,GAAAA;IACtB;AAEA,UAAM,IAAIQ,MACN,6BAA6B,OAAOR,QAAQ,WAAWA,MAAOA,KAAaS,IAAAA,EAAM;EAEzF;;;;EAKQF,MAAyBG,WAA8D;AAC3F,QAAIC,eAAsB,CAAA;AAE1B,QAAIC,MAAMC,QAASH,UAAkBI,UAAU,GAAG;AAC9CH,qBAAgBD,UAAkBI,WAAWC,IAAI,CAACC,UAAAA;AAC9C,eAAO,KAAKV,KAAKU,KAAAA;MACrB,CAAA;IACJ,OAAO;AACH,YAAMC,aAAoBvB,QAAQwB,YAAY,qBAAqBR,SAAAA,KAAc,CAAA;AACjFC,qBAAeM,WAAWF,IAAI,CAACI,QAAQ,KAAKb,KAAKa,GAAAA,CAAAA;IACrD;AAEA,WAAO,IAAIT,UAAAA,GAAaC,YAAAA;EAC5B;;;;EAKAP,IAAKJ,KAAsB;AACvB,WAAO,KAAKX,SAASe,IAAIJ,GAAAA;EAC7B;AACJ;;;ACrGA,SAASoB,kBAAkB;AAC3B,OAAOC,YAAY;AACnB,OAAOC,UAAU;AAEV,IAAMC,cAAN,MAAMA,qBAAoBC,UAAAA;EALjC,OAKiCA;;;EAC7BC,QAAQ,IAAIC,WAAAA;EACJC,SAAS;EACTC,WAAW;IAAEC,KAAK;IAAKC,IAAI;EAAI;EAC/BC;EAEAC,YAAgC,CAAA;EAC9BC,oBAAwE,CAAA;EAElF,YAAYF,UAAkB;AAC1B,UAAK;AACL,SAAKA,WAAWA;AAChB,SAAKG,QAAQ,QAAQH,QAAAA;AACrB,SAAKI,YAAW;AAChB,SAAKC,qBAAoB;AACzBC,WAAOC,OAAO;MAAEC,OAAO;IAAK,CAAA;EAChC;;;;EAKUH,uBAAwB;AAC9B,SAAKI,KAAKjB,cAAa,MAAM,IAAI;AACjC,SAAKiB,KAAK,aAAa,MAAM,KAAKT,QAAQ;AAC1C,SAAKS,KAAK,cAAc,MAAM,KAAKf,KAAK;EAC5C;;;;EAKA,MAAagB,8BAA+B;AACxC,UAAMT,YAAY,MAAM,KAAKU,gBAAe;AAE5C,eAAWC,iBAAiBX,WAAW;AACnC,UAAI,CAACW;AAAe;AACpB,YAAMC,WAAW,IAAID,cAAc,IAAI;AACvC,YAAM,KAAKE,SAASD,QAAAA;IACxB;EACJ;EAEA,MAAgBT,cAAe;AAC3B,UAAMN,MAAM,MAAM,KAAKiB,WAAW,KAAKC,QAAQ,QAAQ,cAAA,CAAA;AACvD,UAAMC,OAAO,MAAM,KAAKF,WAAW,iBAAA;AAEnC,QAAIjB,OAAOA,IAAIoB,cAAc;AACzB,WAAKrB,SAASC,MAAMA,IAAIoB,aAAa,eAAA;IACzC;AACA,QAAID,QAAQA,KAAKE,iBAAiB;AAC9B,WAAKtB,SAASE,KAAKD,IAAIqB,gBAAgBC;IAC3C;EACJ;;;;;;;;;EAUA,MAAgBC,yBAAuF;AACnG,WAAO;OACF,MAAM,OAAO,YAAA,GAAkBC;OAC/B,MAAM,OAAO,YAAA,GAAkBC;;EAExC;EAEA,MAAgBZ,kBAAgF;AAC5F,UAAMa,gBAAgB,MAAM,KAAKH,uBAAsB;AACvD,UAAMI,eAAe;SAAID;SAAkB,KAAKtB;;AAKhD,UAAMwB,kBAAkBC,MAAMC,KAAK,IAAIC,IAAIJ,YAAAA,CAAAA;AAE3C,WAAO,KAAKK,cAAcJ,eAAAA;EAC9B;EAEQI,cAAe7B,WAA+D;AAClF,UAAM8B,cAAc,oBAAIC,IAAAA;AAKxB/B,cAAUgC,QAAQ,CAACC,aAAAA;AACfH,kBAAYI,IAAID,SAASE,MAAOF,SAAiBG,YAAY,CAAA;IACjE,CAAA;AAKApC,cAAUgC,QAAQ,CAACC,aAAAA;AACf,YAAMI,QAASJ,SAAiBI;AAChC,UAAI,CAACA;AAAO;AAEZ,YAAM,CAACC,WAAWC,MAAAA,IAAUF,MAAMG,MAAM,GAAA;AACxC,YAAMC,iBAAiBX,YAAYY,IAAIH,MAAAA,KAAW;AAElD,UAAID,cAAc,UAAU;AACxBR,oBAAYI,IAAID,SAASE,MAAMM,iBAAiB,CAAA;MACpD,WAAWH,cAAc,SAAS;AAC9BR,oBAAYI,IAAID,SAASE,MAAMM,iBAAiB,CAAA;MACpD;IACJ,CAAA;AAKA,UAAME,SAAS3C,UAAU4C,KACrB,CAACC,GAAGC,OAAOhB,YAAYY,IAAII,EAAEX,IAAI,KAAK,MAAML,YAAYY,IAAIG,EAAEV,IAAI,KAAK,EAAA;AAM3E,QAAIY,QAAQC,IAAIC,cAAc,QAAQ;AAClCC,cAAQC,MACJR,OAAOS,IAAI,CAACC,OAAO;QACfpB,UAAUoB,EAAElB;QACZmB,UAAUxB,YAAYY,IAAIW,EAAElB,IAAI;QAChCoB,OAAQF,EAAUhB,SAAS;MAC/B,EAAA,CAAA;IAER;AAEA,WAAOM;EACX;EAEAa,kBAAmBxD,WAAqE;AACpF,SAAKC,kBAAkBwD,KAAI,GAAIzD,SAAAA;EACnC;;;;EAKA,MAAaa,SAAUD,UAA4B;AAC/C,UAAMA,SAASC,SAAQ;AACvB,SAAKb,UAAUyD,KAAK7C,QAAAA;EACxB;;;;EAKA,MAAa8C,OAAQ;AACjB,QAAI,KAAK/D;AAAQ;AAEjB,eAAWiB,YAAY,KAAKZ,WAAW;AACnC,UAAIY,SAAS8C,MAAM;AACf,cAAM9C,SAAS8C,KAAI;MACvB;IACJ;AAEA,SAAK/D,SAAS;EAClB;;;;EAKA,MAAcmB,WAAY6C,YAAoB;AAC1C,QAAI;AACA,YAAMC,MAAM,MAAM,OAAOD;AACzB,aAAOC,IAAIC,WAAWD,OAAO,CAAC;IAClC,QAAQ;AACJ,aAAO;IACX;EACJ;;;;;;EAOAE,cAAuB;AACnB,WAAO,KAAK/D;EAChB;;;;;;;;EASAgB,QAASoB,MAAiB4B,KAAc;AACpC,WAAOC,KAAKC,KAAK,KAAKxE,MAAMsB,QAAQoB,MAAM,KAAKpC,QAAQ,GAAGgE,OAAO,EAAA;EACrE;;;;;;;;EASA7D,QAASiC,MAAiB6B,OAAc;AACpC,WAAO,KAAKvE,MAAMS,QAAQiC,MAAM6B,OAAM,KAAKjE,QAAQ;EACvD;;;;;;EAOAmE,WAAYC,KAAmB;AAC3B,WAAO,KAAKvE,SAASuE,GAAAA,GAAMC,WAAW,SAAS,EAAA;EACnD;AACJ;;;AChNO,IAAeC,aAAf,MAAeA;EAHtB,OAGsBA;;;EACRC;EAEV,YAAYA,KAAkB;AAC1B,SAAKA,MAAMA;EACf;EAEOC,QAASC,MAAkB;AAAE;EAAO;EACpCC,SAAUD,MAAkB;AAAE;EAAO;EACrCE,SAAUF,MAAkB;AAAE;EAAO;EACrCG,UAAWH,MAAkB;AAAE;EAAO;EACtCI,WAAYJ,MAAkB;AAAE;EAAO;AAClD;;;ACfO,IAAeK,kBAAf,MAAeA;EAAtB,OAAsBA;;;EAClB,OAAcC;EACd,OAAcC,WAAW;EACfC;EAEV,YAAYA,KAAkB;AAC1B,SAAKA,MAAMA;EACf;AAaJ;;;ACvBO,SAASC,UAAWC,cAAsB;AAC7C,SAAO,SAAUC,QAAW;AACxBA,WAAOC,aAAaF;EACxB;AACJ;AAJgBD;AAWT,SAASI,aAAAA;AACZ,SAAO,IAAIC,SAAAA;AACP,QAAIA,KAAKC,WAAW,GAAG;AACnB,WAAKD,KAAK,CAAA;IACd;AACA,QAAIA,KAAKC,WAAW,GAAG;AACnB,WAAKD,KAAK,CAAA;AACV,WAAKA,KAAK,CAAA;AACV,WAAKA,KAAK,CAAA;IACd;EACJ;AACJ;AAXgBD;;;ACHT,IAAMG,SAAN,MAAMA;EAJb,OAIaA;;;;;;;;;EAKT,YACcC,SACAC,aAA4B,CAAA,GACxC;SAFYD,UAAAA;SACAC,aAAAA;EACV;;;;;;;;EASJ,MAAMC,OACFC,OACAC,MACgB;AAIhB,UAAMC,MAAM,KAAKL,QAAQG,KAAAA;AACzB,UAAM,EAAEG,IAAG,IAAKD,IAAIE;AAMpBD,QAAIE,KAAK,QAAQ,MAAM,OAAOC,UAAkBC,WAAAA;AAC5C,YAAMC,OAAOL,IAAIM,KAAK,MAAA;AACtB,aAAOP,IAAIQ,SAASC,KAAK,MAAMH,KAAKI,OAAON,UAAUC,MAAAA,CAAAA;IACzD,CAAA;AAKA,UAAMM,SAAS,MAAM,KAAKC,cAAcZ,KAAK,MAAMD,KAAKC,GAAAA,CAAAA;AAMxD,QAAIW,WAAWE,UAAa,KAAKC,cAAcH,MAAAA,GAAS;AACpDb,YAAMiB,IAAIC,QAAQC,IAAI,gBAAgB,iCAAA;IAC1C;AAEA,WAAON;EACX;;;;;;;;EASA,MAAcC,cACVjB,SACAI,MACF;AACE,QAAImB,QAAQ;AAEZ,UAAMC,SAAS,8BAAOC,MAAAA;AAClB,UAAIA,KAAKF;AAAO,cAAM,IAAIG,MAAM,8BAAA;AAChCH,cAAQE;AACR,YAAMxB,aAAa,KAAKA,WAAWwB,CAAAA;AAEnC,UAAIxB,YAAY;AAIZ,eAAOA,WAAWC,OAAOF,SAAS,MAAMwB,OAAOC,IAAI,CAAA,CAAA;MACvD,OAAO;AAIH,eAAOrB,KAAKJ,OAAAA;MAChB;IACJ,GAhBe;AAkBf,WAAOwB,OAAO,CAAA;EAClB;;;;;;;EAQQL,cAAeQ,OAAkD;AACrE,WAAO,OAAOA,UAAU,YACpBA,UAAU,SACTA,MAAM,gBAAgBC,UAAUD,MAAM,gBAAgBE;EAC/D;AACJ;;;ACzGA,OAAO;AAaA,IAAMC,sBAAN,cAAkCC,gBAAAA;EAbzC,OAayCA;;;EACrC,OAAcC,WAAW;EAEzBC,WAAY;EAEZ;AACJ;;;ACnBA,SAASC,YAAY;AAGd,IAAMC,sBAAN,cAAkCC,gBAAAA;EAHzC,OAGyCA;;;EACrC,OAAcC,WAAW;EAEzBC,WAAkB;AACd,UAAMC,SAAS,KAAKC,IAAIC,KAAK,QAAA;AAC7B,UAAMC,OAAOC,KAAKC,OAAO;MACrBC,OAAOC,QAAQC,IAAIC,aAAa;IACpC,CAAA;AAEAN,SAAKO,MAAM,KAAKT,IAAIU,QAAQ,OAAA,CAAA;AAE5BR,SAAKS,OAAO,SAAS,KAAKX,IAAIC,KAAK,OAAA,CAAA;AACnCC,SAAKS,OAAO,UAAUZ,OAAOa,GAAG;AAChCV,SAAKS,OAAO,OAAO,KAAKX,GAAG;AAE3B,SAAKA,IAAIa,KAAK,QAAQ,MAAMX,IAAAA;EAChC;AACJ;","names":["Container","bindings","Map","singletons","hasAnyDecorator","target","Reflect","getMetadataKeys","length","paramLength","i","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","dependencies","Array","isArray","__inject__","map","alias","paramTypes","getMetadata","dep","PathLoader","dotenv","path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","dotenv","config","quiet","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","CoreServiceProvider","ViewServiceProvider","coreProviders","allProviders","uniqueProviders","Array","from","Set","sortProviders","priorityMap","Map","forEach","Provider","set","name","priority","order","direction","target","split","targetPriority","get","sorted","sort","A","B","process","env","APP_DEBUG","console","table","map","P","Priority","Order","registerProviders","push","boot","moduleName","mod","default","getBasePath","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","ServiceProvider","order","priority","app","Inject","dependencies","target","__inject__","Injectable","args","length","Kernel","context","middleware","handle","event","next","ctx","app","request","bind","template","params","edge","make","response","html","render","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","CoreServiceProvider","ServiceProvider","priority","register","Edge","ViewServiceProvider","ServiceProvider","priority","register","config","app","make","edge","Edge","create","cache","process","env","NODE_ENV","mount","getPath","global","get","bind"]}
1
+ {"version":3,"sources":["../src/Container.ts","../src/Application.ts","../src/Controller.ts","../src/Di/Inject.ts","../src/Http/Kernel.ts","../src/Providers/CoreServiceProvider.ts","../src/Registerer.ts","../src/ServiceProvider.ts","../src/Providers/ViewServiceProvider.ts"],"sourcesContent":["import type { Bindings, IContainer, UseKey } from '@h3ravel/shared'\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container implements IContainer {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\n\n /**\n * Check if the target has any decorators\n * \n * @param target \n * @returns \n */\n static hasAnyDecorator (target: Function): boolean {\n if (Reflect.getMetadataKeys(target).length > 0) return true\n\n const paramLength = target.length\n\n for (let i = 0; i < paramLength; i++) {\n if (Reflect.getMetadataKeys(target, `__param_${i}`).length > 0) {\n return true\n }\n }\n\n return false\n }\n\n /**\n * Bind a transient service to the container\n */\n bind<T> (key: new (...args: any[]) => T, factory: () => T): void\n bind<T extends UseKey> (key: T, factory: () => Bindings[T]): void\n bind<T extends UseKey> (\n key: T,\n factory: () => Bindings[T] | T\n ) {\n this.bindings.set(key, factory)\n }\n\n /**\n * Bind a singleton service to the container\n */\n singleton<T extends UseKey> (\n key: T | (new (..._args: any[]) => Bindings[T]),\n factory: () => Bindings[T]\n ) {\n this.bindings.set(key, () => {\n if (!this.singletons.has(key)) {\n this.singletons.set(key, factory())\n }\n return this.singletons.get(key)!\n })\n }\n\n /**\n * Resolve a service from the container\n */\n make<T extends UseKey, X = undefined> (\n key: T | (new (..._args: any[]) => Bindings[T])\n ): X extends undefined ? Bindings[T] : X {\n /**\n * Direct factory binding\n */\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n /**\n * If this is a class constructor, auto-resolve via reflection\n */\n if (typeof key === 'function') {\n return this.build(key)\n }\n\n throw new Error(\n `No binding found for key: ${typeof key === 'string' ? key : (key as any)?.name}`\n )\n }\n\n /**\n * Automatically build a class with constructor dependency injection\n */\n private build<T extends UseKey> (ClassType: new (..._args: any[]) => Bindings[T]): Bindings[T] {\n let dependencies: any[] = [];\n\n if (Array.isArray((ClassType as any).__inject__)) {\n dependencies = (ClassType as any).__inject__.map((alias: any) => {\n return this.make(alias)\n });\n } else {\n const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n dependencies = paramTypes.map((dep) => this.make(dep))\n }\n\n return new ClassType(...dependencies);\n }\n\n /**\n * Check if a service is registered\n */\n has (key: UseKey): boolean {\n return this.bindings.has(key)\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from '@h3ravel/shared'\nimport dotenv from 'dotenv'\nimport path from 'node:path'\n\nexport class Application extends Container implements IApplication {\n paths = new PathLoader()\n private booted = false\n private versions = { app: '0', ts: '0' }\n private basePath: string\n\n private providers: IServiceProvider[] = []\n protected externalProviders: Array<new (_app: Application) => IServiceProvider> = []\n\n constructor(basePath: string) {\n super()\n this.basePath = basePath\n this.setPath('base', basePath)\n this.loadOptions()\n this.registerBaseBindings();\n dotenv.config({ quiet: true })\n }\n\n /**\n * Register core bindings into the container\n */\n protected registerBaseBindings () {\n this.bind(Application, () => this)\n this.bind('path.base', () => this.basePath)\n this.bind('load.paths', () => this.paths)\n }\n\n /**\n * Dynamically register all configured providers\n */\n public async registerConfiguredProviders () {\n const providers = await this.getAllProviders()\n\n for (const ProviderClass of providers) {\n if (!ProviderClass) continue\n const provider = new ProviderClass(this)\n await this.register(provider)\n }\n }\n\n protected async loadOptions () {\n const app = await this.safeImport(this.getPath('base', 'package.json'))\n const core = await this.safeImport('../package.json')\n\n if (app && app.dependencies) {\n this.versions.app = app.dependencies['@h3ravel/core']\n }\n if (core && core.devDependencies) {\n this.versions.ts = app.devDependencies.typescript\n }\n }\n\n /**\n * Load default and optional providers dynamically\n * \n * Auto-Registration Behavior\n * \n * Minimal App: Loads only core, config, http, router by default.\n * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.\n */\n protected async getConfiguredProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n return [\n (await import('@h3ravel/core')).CoreServiceProvider,\n (await import('@h3ravel/core')).ViewServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders();\n const allProviders = [...coreProviders, ...this.externalProviders];\n\n /**\n * Deduplicate by class reference\n */\n const uniqueProviders = Array.from(new Set(allProviders));\n\n return this.sortProviders(uniqueProviders);\n }\n\n private sortProviders (providers: Array<new (_app: Application) => IServiceProvider>) {\n const priorityMap = new Map<string, number>();\n\n /**\n * Base priority (default 0)\n */\n providers.forEach((Provider) => {\n priorityMap.set(Provider.name, (Provider as any).priority ?? 0);\n });\n\n /**\n * Handle before/after adjustments\n */\n providers.forEach((Provider) => {\n const order = (Provider as any).order;\n if (!order) return;\n\n const [direction, target] = order.split(':');\n const targetPriority = priorityMap.get(target) ?? 0;\n\n if (direction === 'before') {\n priorityMap.set(Provider.name, targetPriority - 1);\n } else if (direction === 'after') {\n priorityMap.set(Provider.name, targetPriority + 1);\n }\n });\n\n /**\n * Sort the service providers based on thier name and priority\n */\n const sorted = providers.sort(\n (A, B) => (priorityMap.get(B.name) ?? 0) - (priorityMap.get(A.name) ?? 0)\n );\n\n /**\n * If debug is enabled, let's show the loaded service provider info\n */\n if (process.env.APP_DEBUG === 'true') {\n console.table(\n sorted.map((P) => ({\n Provider: P.name,\n Priority: priorityMap.get(P.name),\n Order: (P as any).order || 'N/A',\n }))\n );\n }\n\n return sorted\n }\n\n registerProviders (providers: Array<new (_app: Application) => IServiceProvider>): void {\n this.externalProviders.push(...providers)\n }\n\n /**\n * Register a provider\n */\n public async register (provider: IServiceProvider) {\n await provider.register()\n this.providers.push(provider)\n }\n\n /**\n * Boot all providers after registration\n */\n public async boot () {\n if (this.booted) return\n\n for (const provider of this.providers) {\n if (provider.boot) {\n await provider.boot()\n }\n }\n\n this.booted = true\n }\n\n /**\n * Attempt to dynamically import an optional module\n */\n private async safeImport (moduleName: string) {\n try {\n const mod = await import(moduleName)\n return mod.default ?? mod ?? {}\n } catch {\n return null\n }\n }\n\n /**\n * Get the base path of the app\n * \n * @returns \n */\n getBasePath (): string {\n return this.basePath\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 * @returns \n */\n getPath (name: IPathName, pth?: string) {\n return path.join(this.paths.getPath(name, this.basePath), pth ?? '')\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 * @returns \n */\n setPath (name: IPathName, path: string) {\n return this.paths.setPath(name, path, this.basePath)\n }\n\n /**\n * Returns the installed version of the system core and typescript.\n *\n * @returns \n */\n getVersion (key: 'app' | 'ts') {\n return this.versions[key]?.replaceAll(/\\^|~/g, '')\n }\n}\n","import { Application } from '.'\nimport { IController } from '@h3ravel/shared'\n\n/**\n * Base controller class\n */\nexport abstract class Controller implements IController {\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n public show (..._ctx: any[]): any { return }\n public index (..._ctx: any[]): any { return }\n public store (..._ctx: any[]): any { return }\n public update (..._ctx: any[]): any { return }\n public destroy (..._ctx: any[]): any { return }\n}\n","export function Inject (...dependencies: string[]) {\n return function (target: any) {\n target.__inject__ = dependencies;\n };\n}\n\n/**\n * Allows binding dependencies to both class and class methods \n * \n * @returns \n */\nexport function Injectable (): ClassDecorator & MethodDecorator {\n return (...args: any[]) => {\n if (args.length === 1) {\n void args[0]; // class target\n }\n if (args.length === 3) {\n void args[0]; // target\n void args[1]; // propertyKey\n void args[2]; // descriptor\n }\n };\n}\n","import { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\n/**\n * Kernel class handles middleware execution and response transformations.\n * It acts as the core middleware pipeline for HTTP requests.\n */\nexport class Kernel {\n /**\n * @param context - A factory function that converts an H3Event into an HttpContext.\n * @param middleware - An array of middleware classes that will be executed in sequence.\n */\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n /**\n * Handles an incoming request and passes it through middleware before invoking the next handler.\n * \n * @param event - The raw H3 event object.\n * @param next - A callback function that represents the next layer (usually the controller or final handler).\n * @returns A promise resolving to the result of the request pipeline.\n */\n async handle (\n event: H3Event,\n next: (ctx: HttpContext) => Promise<unknown>\n ): Promise<unknown> {\n /**\n * Convert the raw event into a standardized HttpContext\n */\n const ctx = this.context(event)\n const { app } = ctx.request\n\n /**\n * Dynamically bind the view renderer to the service container.\n * This allows any part of the request lifecycle to render templates using Edge.\n */\n app.bind('view', () => async (template: string, params?: Record<string, any>) => {\n const edge = app.make('edge')\n return ctx.response.html(await edge.render(template, params))\n })\n\n /**\n * Run middleware stack and obtain result\n */\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n /**\n * If a plain object is returned from a controller or middleware,\n * automatically set the JSON Content-Type header for the response.\n */\n if (result !== undefined && this.isPlainObject(result)) {\n event.res.headers.set('Content-Type', 'application/json; charset=UTF-8')\n }\n\n return result\n }\n\n /**\n * Sequentially runs middleware in the order they were registered.\n * \n * @param context - The standardized HttpContext.\n * @param next - Callback to execute when middleware completes.\n * @returns A promise resolving to the final handler's result.\n */\n private async runMiddleware (\n context: HttpContext,\n next: (ctx: HttpContext) => Promise<unknown>\n ) {\n let index = -1\n\n const runner = async (i: number): Promise<unknown> => {\n if (i <= index) throw new Error('next() called multiple times')\n index = i\n const middleware = this.middleware[i]\n\n if (middleware) {\n /**\n * Execute the current middleware and proceed to the next one\n */\n return middleware.handle(context, () => runner(i + 1))\n } else {\n /**\n * If no more middleware, call the final handler\n */\n return next(context)\n }\n }\n\n return runner(0)\n }\n\n /**\n * Utility function to determine if a value is a plain object or array.\n * \n * @param value - The value to check.\n * @returns True if the value is a plain object or array, otherwise false.\n */\n private isPlainObject (value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' &&\n value !== null &&\n (value.constructor === Object || value.constructor === Array)\n }\n}\n","import 'reflect-metadata'\n\nimport { ServiceProvider } from '../ServiceProvider'\n\n/**\n * Bootstraps core services and bindings.\n * \n * Bind essential services to the container (logger, config repository).\n * Register app-level singletons.\n * Set up exception handling.\n * \n * Auto-Registered\n */\nexport class CoreServiceProvider extends ServiceProvider {\n public static priority = 999;\n\n register () {\n // Core bindings\n }\n}\n","import { dd, dump } from '@h3ravel/support'\n\nexport class Registerer {\n static register () {\n globalThis.dd = dd\n globalThis.dump = dump\n }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\nimport { Registerer } from './Registerer';\n\nexport abstract class ServiceProvider implements IServiceProvider {\n public static order?: `before:${string}` | `after:${string}` | string | undefined;\n public static priority = 0;\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n /**\n * Register bindings to the container.\n * Runs before boot().\n */\n register (): void | Promise<void> {\n Registerer.register()\n }\n\n /**\n * Perform post-registration booting of services.\n * Runs after all providers have been registered.\n */\n boot?(): void | Promise<void>\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\n public static priority = 995;\n\n register (): void {\n const config = this.app.make('config')\n const edge = Edge.create({\n cache: process.env.NODE_ENV === 'production'\n })\n\n edge.mount(this.app.getPath('views'))\n\n edge.global('asset', this.app.make('asset'))\n edge.global('config', config.get)\n edge.global('app', this.app)\n\n this.app.bind('edge', () => edge)\n }\n}\n"],"mappings":"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","names":["Container","bindings","Map","singletons","hasAnyDecorator","target","Reflect","getMetadataKeys","length","paramLength","i","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","dependencies","Array","isArray","__inject__","map","alias","paramTypes","getMetadata","dep","PathLoader","dotenv","path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","dotenv","config","quiet","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","CoreServiceProvider","ViewServiceProvider","coreProviders","allProviders","uniqueProviders","Array","from","Set","sortProviders","priorityMap","Map","forEach","Provider","set","name","priority","order","direction","target","split","targetPriority","get","sorted","sort","A","B","process","env","APP_DEBUG","console","table","map","P","Priority","Order","registerProviders","push","boot","moduleName","mod","default","getBasePath","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","Inject","dependencies","target","__inject__","Injectable","args","length","Kernel","context","middleware","handle","event","next","ctx","app","request","bind","template","params","edge","make","response","html","render","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","dd","dump","Registerer","register","globalThis","dd","dump","ServiceProvider","order","priority","app","register","Registerer","CoreServiceProvider","ServiceProvider","priority","register","Edge","ViewServiceProvider","ServiceProvider","priority","register","config","app","make","edge","Edge","create","cache","process","env","NODE_ENV","mount","getPath","global","get","bind"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h3ravel/core",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "Core application container, lifecycle management and service providers for H3ravel.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -8,9 +8,9 @@
8
8
  "module": "./dist/index.js",
9
9
  "exports": {
10
10
  ".": {
11
+ "types": "./dist/index.d.ts",
11
12
  "import": "./dist/index.js",
12
- "require": "./dist/index.cjs",
13
- "types": "./dist/index.d.ts"
13
+ "require": "./dist/index.cjs"
14
14
  }
15
15
  },
16
16
  "files": [
@@ -36,13 +36,14 @@
36
36
  "laravel"
37
37
  ],
38
38
  "dependencies": {
39
+ "dotenv": "^17.2.1",
39
40
  "edge.js": "^6.3.0",
40
41
  "h3": "^2.0.0-beta.1",
41
42
  "reflect-metadata": "^0.2.2",
42
43
  "srvx": "^0.8.2",
43
44
  "tslib": "^2.6.0",
44
- "dotenv": "^17.2.1",
45
- "@h3ravel/shared": "^0.17.1"
45
+ "@h3ravel/support": "^0.9.0",
46
+ "@h3ravel/shared": "^0.17.2"
46
47
  },
47
48
  "devDependencies": {
48
49
  "typescript": "^5.4.0"