@h3ravel/core 1.7.1 → 1.7.2
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 +20 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +15 -19
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -109,6 +109,24 @@ var init_Container = __esm({
|
|
|
109
109
|
}
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
+
// src/Registerer.ts
|
|
113
|
+
var import_support, Registerer;
|
|
114
|
+
var init_Registerer = __esm({
|
|
115
|
+
"src/Registerer.ts"() {
|
|
116
|
+
"use strict";
|
|
117
|
+
import_support = require("@h3ravel/support");
|
|
118
|
+
Registerer = class {
|
|
119
|
+
static {
|
|
120
|
+
__name(this, "Registerer");
|
|
121
|
+
}
|
|
122
|
+
static register() {
|
|
123
|
+
globalThis.dd = import_support.dd;
|
|
124
|
+
globalThis.dump = import_support.dump;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
112
130
|
// src/Application.ts
|
|
113
131
|
var import_shared, import_dotenv, import_node_path, Application;
|
|
114
132
|
var init_Application = __esm({
|
|
@@ -116,6 +134,7 @@ var init_Application = __esm({
|
|
|
116
134
|
"use strict";
|
|
117
135
|
init_Container();
|
|
118
136
|
import_shared = require("@h3ravel/shared");
|
|
137
|
+
init_Registerer();
|
|
119
138
|
import_dotenv = __toESM(require("dotenv"), 1);
|
|
120
139
|
import_node_path = __toESM(require("path"), 1);
|
|
121
140
|
Application = class _Application extends Container {
|
|
@@ -137,6 +156,7 @@ var init_Application = __esm({
|
|
|
137
156
|
this.setPath("base", basePath);
|
|
138
157
|
this.loadOptions();
|
|
139
158
|
this.registerBaseBindings();
|
|
159
|
+
Registerer.register();
|
|
140
160
|
import_dotenv.default.config({
|
|
141
161
|
quiet: true
|
|
142
162
|
});
|
|
@@ -437,30 +457,11 @@ var init_Kernel = __esm({
|
|
|
437
457
|
}
|
|
438
458
|
});
|
|
439
459
|
|
|
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
460
|
// src/ServiceProvider.ts
|
|
459
461
|
var ServiceProvider;
|
|
460
462
|
var init_ServiceProvider = __esm({
|
|
461
463
|
"src/ServiceProvider.ts"() {
|
|
462
464
|
"use strict";
|
|
463
|
-
init_Registerer();
|
|
464
465
|
ServiceProvider = class {
|
|
465
466
|
static {
|
|
466
467
|
__name(this, "ServiceProvider");
|
|
@@ -471,13 +472,6 @@ var init_ServiceProvider = __esm({
|
|
|
471
472
|
constructor(app) {
|
|
472
473
|
this.app = app;
|
|
473
474
|
}
|
|
474
|
-
/**
|
|
475
|
-
* Register bindings to the container.
|
|
476
|
-
* Runs before boot().
|
|
477
|
-
*/
|
|
478
|
-
register() {
|
|
479
|
-
Registerer.register();
|
|
480
|
-
}
|
|
481
475
|
};
|
|
482
476
|
}
|
|
483
477
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAaA;AAAb;;;AAAO,IAAMA,YAAN,MAAMA;MAAb,OAAaA;;;MACDC,WAAW,oBAAIC,IAAAA;MACfC,aAAa,oBAAID,IAAAA;;;;;;;MAQzB,OAAOE,gBAAiBC,QAA2B;AAC/C,YAAIC,QAAQC,gBAAgBF,MAAAA,EAAQG,SAAS,EAAG,QAAO;AAEvD,cAAMC,cAAcJ,OAAOG;AAE3B,iBAASE,IAAI,GAAGA,IAAID,aAAaC,KAAK;AAClC,cAAIJ,QAAQC,gBAAgBF,QAAQ,WAAWK,CAAAA,EAAG,EAAEF,SAAS,GAAG;AAC5D,mBAAO;UACX;QACJ;AAEA,eAAO;MACX;MAOAG,KACIC,KACAC,SACF;AACE,aAAKZ,SAASa,IAAIF,KAAKC,OAAAA;MAC3B;;;;MAKAE,UACIH,KACAC,SACF;AACE,aAAKZ,SAASa,IAAIF,KAAK,MAAA;AACnB,cAAI,CAAC,KAAKT,WAAWa,IAAIJ,GAAAA,GAAM;AAC3B,iBAAKT,WAAWW,IAAIF,KAAKC,QAAAA,CAAAA;UAC7B;AACA,iBAAO,KAAKV,WAAWc,IAAIL,GAAAA;QAC/B,CAAA;MACJ;;;;MAKAM,KACIN,KACqC;AAIrC,YAAI,KAAKX,SAASe,IAAIJ,GAAAA,GAAM;AACxB,iBAAO,KAAKX,SAASgB,IAAIL,GAAAA,EAAAA;QAC7B;AAKA,YAAI,OAAOA,QAAQ,YAAY;AAC3B,iBAAO,KAAKO,MAAMP,GAAAA;QACtB;AAEA,cAAM,IAAIQ,MACN,6BAA6B,OAAOR,QAAQ,WAAWA,MAAOA,KAAaS,IAAAA,EAAM;MAEzF;;;;MAKQF,MAAyBG,WAA8D;AAC3F,YAAIC,eAAsB,CAAA;AAE1B,YAAIC,MAAMC,QAASH,UAAkBI,UAAU,GAAG;AAC9CH,yBAAgBD,UAAkBI,WAAWC,IAAI,CAACC,UAAAA;AAC9C,mBAAO,KAAKV,KAAKU,KAAAA;UACrB,CAAA;QACJ,OAAO;AACH,gBAAMC,aAAoBvB,QAAQwB,YAAY,qBAAqBR,SAAAA,KAAc,CAAA;AACjFC,yBAAeM,WAAWF,IAAI,CAACI,QAAQ,KAAKb,KAAKa,GAAAA,CAAAA;QACrD;AAEA,eAAO,IAAIT,UAAAA,GAAaC,YAAAA;MAC5B;;;;MAKAP,IAAKJ,KAAsB;AACvB,eAAO,KAAKX,SAASe,IAAIJ,GAAAA;MAC7B;IACJ;;;;;ACtGA,IACA,eACA,eACA,kBAEaoB;AALb;;;;AACA,oBAA2B;AAC3B,oBAAmB;AACnB,uBAAiB;AAEV,IAAMA,cAAN,MAAMA,qBAAoBC,UAAAA;MALjC,OAKiCA;;;MAC7BC,QAAQ,IAAIC,yBAAAA;MACJC,SAAS;MACTC,WAAW;QAAEC,KAAK;QAAKC,IAAI;MAAI;MAC/BC;MAEAC,YAAgC,CAAA;MAC9BC,oBAAwE,CAAA;MAElF,YAAYF,UAAkB;AAC1B,cAAK;AACL,aAAKA,WAAWA;AAChB,aAAKG,QAAQ,QAAQH,QAAAA;AACrB,aAAKI,YAAW;AAChB,aAAKC,qBAAoB;AACzBC,sBAAAA,QAAOC,OAAO;UAAEC,OAAO;QAAK,CAAA;MAChC;;;;MAKUH,uBAAwB;AAC9B,aAAKI,KAAKjB,cAAa,MAAM,IAAI;AACjC,aAAKiB,KAAK,aAAa,MAAM,KAAKT,QAAQ;AAC1C,aAAKS,KAAK,cAAc,MAAM,KAAKf,KAAK;MAC5C;;;;MAKA,MAAagB,8BAA+B;AACxC,cAAMT,YAAY,MAAM,KAAKU,gBAAe;AAE5C,mBAAWC,iBAAiBX,WAAW;AACnC,cAAI,CAACW,cAAe;AACpB,gBAAMC,WAAW,IAAID,cAAc,IAAI;AACvC,gBAAM,KAAKE,SAASD,QAAAA;QACxB;MACJ;MAEA,MAAgBT,cAAe;AAC3B,cAAMN,MAAM,MAAM,KAAKiB,WAAW,KAAKC,QAAQ,QAAQ,cAAA,CAAA;AACvD,cAAMC,OAAO,MAAM,KAAKF,WAAW,iBAAA;AAEnC,YAAIjB,OAAOA,IAAIoB,cAAc;AACzB,eAAKrB,SAASC,MAAMA,IAAIoB,aAAa,eAAA;QACzC;AACA,YAAID,QAAQA,KAAKE,iBAAiB;AAC9B,eAAKtB,SAASE,KAAKD,IAAIqB,gBAAgBC;QAC3C;MACJ;;;;;;;;;MAUA,MAAgBC,yBAAuF;AACnG,eAAO;WACF,MAAM,6DAAyBC;WAC/B,MAAM,6DAAyBC;;MAExC;MAEA,MAAgBZ,kBAAgF;AAC5F,cAAMa,gBAAgB,MAAM,KAAKH,uBAAsB;AACvD,cAAMI,eAAe;aAAID;aAAkB,KAAKtB;;AAKhD,cAAMwB,kBAAkBC,MAAMC,KAAK,IAAIC,IAAIJ,YAAAA,CAAAA;AAE3C,eAAO,KAAKK,cAAcJ,eAAAA;MAC9B;MAEQI,cAAe7B,WAA+D;AAClF,cAAM8B,cAAc,oBAAIC,IAAAA;AAKxB/B,kBAAUgC,QAAQ,CAACC,aAAAA;AACfH,sBAAYI,IAAID,SAASE,MAAOF,SAAiBG,YAAY,CAAA;QACjE,CAAA;AAKApC,kBAAUgC,QAAQ,CAACC,aAAAA;AACf,gBAAMI,QAASJ,SAAiBI;AAChC,cAAI,CAACA,MAAO;AAEZ,gBAAM,CAACC,WAAWC,MAAAA,IAAUF,MAAMG,MAAM,GAAA;AACxC,gBAAMC,iBAAiBX,YAAYY,IAAIH,MAAAA,KAAW;AAElD,cAAID,cAAc,UAAU;AACxBR,wBAAYI,IAAID,SAASE,MAAMM,iBAAiB,CAAA;UACpD,WAAWH,cAAc,SAAS;AAC9BR,wBAAYI,IAAID,SAASE,MAAMM,iBAAiB,CAAA;UACpD;QACJ,CAAA;AAKA,cAAME,SAAS3C,UAAU4C,KACrB,CAACC,GAAGC,OAAOhB,YAAYY,IAAII,EAAEX,IAAI,KAAK,MAAML,YAAYY,IAAIG,EAAEV,IAAI,KAAK,EAAA;AAM3E,YAAIY,QAAQC,IAAIC,cAAc,QAAQ;AAClCC,kBAAQC,MACJR,OAAOS,IAAI,CAACC,OAAO;YACfpB,UAAUoB,EAAElB;YACZmB,UAAUxB,YAAYY,IAAIW,EAAElB,IAAI;YAChCoB,OAAQF,EAAUhB,SAAS;UAC/B,EAAA,CAAA;QAER;AAEA,eAAOM;MACX;MAEAa,kBAAmBxD,WAAqE;AACpF,aAAKC,kBAAkBwD,KAAI,GAAIzD,SAAAA;MACnC;;;;MAKA,MAAaa,SAAUD,UAA4B;AAC/C,cAAMA,SAASC,SAAQ;AACvB,aAAKb,UAAUyD,KAAK7C,QAAAA;MACxB;;;;MAKA,MAAa8C,OAAQ;AACjB,YAAI,KAAK/D,OAAQ;AAEjB,mBAAWiB,YAAY,KAAKZ,WAAW;AACnC,cAAIY,SAAS8C,MAAM;AACf,kBAAM9C,SAAS8C,KAAI;UACvB;QACJ;AAEA,aAAK/D,SAAS;MAClB;;;;MAKA,MAAcmB,WAAY6C,YAAoB;AAC1C,YAAI;AACA,gBAAMC,MAAM,MAAM,OAAOD;AACzB,iBAAOC,IAAIC,WAAWD,OAAO,CAAC;QAClC,QAAQ;AACJ,iBAAO;QACX;MACJ;;;;;;MAOAE,cAAuB;AACnB,eAAO,KAAK/D;MAChB;;;;;;;;MASAgB,QAASoB,MAAiB4B,KAAc;AACpC,eAAOC,iBAAAA,QAAKC,KAAK,KAAKxE,MAAMsB,QAAQoB,MAAM,KAAKpC,QAAQ,GAAGgE,OAAO,EAAA;MACrE;;;;;;;;MASA7D,QAASiC,MAAiB6B,OAAc;AACpC,eAAO,KAAKvE,MAAMS,QAAQiC,MAAM6B,OAAM,KAAKjE,QAAQ;MACvD;;;;;;MAOAmE,WAAYC,KAAmB;AAC3B,eAAO,KAAKvE,SAASuE,GAAAA,GAAMC,WAAW,SAAS,EAAA;MACnD;IACJ;;;;;AClNA;;;;;;;ACDA,IAGsBC;AAHtB;;;AAGO,IAAeA,aAAf,MAAeA;MAHtB,OAGsBA;;;MACRC;MAEV,YAAYA,KAAkB;AAC1B,aAAKA,MAAMA;MACf;MAEOC,QAASC,MAAkB;AAAE;MAAO;MACpCC,SAAUD,MAAkB;AAAE;MAAO;MACrCE,SAAUF,MAAkB;AAAE;MAAO;MACrCG,UAAWH,MAAkB;AAAE;MAAO;MACtCI,WAAYJ,MAAkB;AAAE;MAAO;IAClD;;;;;AClBO,SAASK,UAAWC,cAAsB;AAC7C,SAAO,SAAUC,QAAW;AACxBA,WAAOC,aAAaF;EACxB;AACJ;AAOO,SAASG,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;AAtBA;;;AAAgBL;AAWAI;;;;;ACXhB;;;;;;;ACIA,IAIaG;AAJb;;;AAIO,IAAMA,SAAN,MAAMA;MAJb,OAIaA;;;;;;;;;MAKT,YACcC,SACAC,aAA4B,CAAA,GACxC;aAFYD,UAAAA;aACAC,aAAAA;MACV;;;;;;;;MASJ,MAAMC,OACFC,OACAC,MACgB;AAIhB,cAAMC,MAAM,KAAKL,QAAQG,KAAAA;AACzB,cAAM,EAAEG,IAAG,IAAKD,IAAIE;AAMpBD,YAAIE,KAAK,QAAQ,MAAM,OAAOC,UAAkBC,WAAAA;AAC5C,gBAAMC,OAAOL,IAAIM,KAAK,MAAA;AACtB,iBAAOP,IAAIQ,SAASC,KAAK,MAAMH,KAAKI,OAAON,UAAUC,MAAAA,CAAAA;QACzD,CAAA;AAKA,cAAMM,SAAS,MAAM,KAAKC,cAAcZ,KAAK,MAAMD,KAAKC,GAAAA,CAAAA;AAMxD,YAAIW,WAAWE,UAAa,KAAKC,cAAcH,MAAAA,GAAS;AACpDb,gBAAMiB,IAAIC,QAAQC,IAAI,gBAAgB,iCAAA;QAC1C;AAEA,eAAON;MACX;;;;;;;;MASA,MAAcC,cACVjB,SACAI,MACF;AACE,YAAImB,QAAQ;AAEZ,cAAMC,SAAS,8BAAOC,MAAAA;AAClB,cAAIA,KAAKF,MAAO,OAAM,IAAIG,MAAM,8BAAA;AAChCH,kBAAQE;AACR,gBAAMxB,aAAa,KAAKA,WAAWwB,CAAAA;AAEnC,cAAIxB,YAAY;AAIZ,mBAAOA,WAAWC,OAAOF,SAAS,MAAMwB,OAAOC,IAAI,CAAA,CAAA;UACvD,OAAO;AAIH,mBAAOrB,KAAKJ,OAAAA;UAChB;QACJ,GAhBe;AAkBf,eAAOwB,OAAO,CAAA;MAClB;;;;;;;MAQQL,cAAeQ,OAAkD;AACrE,eAAO,OAAOA,UAAU,YACpBA,UAAU,SACTA,MAAM,gBAAgBC,UAAUD,MAAM,gBAAgBE;MAC/D;IACJ;;;;;ACzGA,oBAEaC;AAFb;;;qBAAyB;AAElB,IAAMA,aAAN,MAAMA;MAFb,OAEaA;;;MACT,OAAOC,WAAY;AACfC,mBAAWC,KAAKA;AAChBD,mBAAWE,OAAOA;MACtB;IACJ;;;;;ACLA,IAEsBC;AAFtB;;;;AAEO,IAAeA,kBAAf,MAAeA;MAFtB,OAEsBA;;;MAClB,OAAcC;MACd,OAAcC,WAAW;MACfC;MAEV,YAAYA,KAAkB;AAC1B,aAAKA,MAAMA;MACf;;;;;MAMAC,WAAkC;AAC9BC,mBAAWD,SAAQ;MACvB;IAOJ;;;;;AC1BA,6BAaaE;AAbb;;;8BAAO;AAEP;AAWO,IAAMA,sBAAN,cAAkCC,gBAAAA;MAbzC,OAayCA;;;MACrC,OAAcC,WAAW;MAEzBC,WAAY;MAEZ;IACJ;;;;;ACnBA,iBAGaC;AAHb;;;kBAAqB;AACrB;AAEO,IAAMA,sBAAN,cAAkCC,gBAAAA;MAHzC,OAGyCA;;;MACrC,OAAcC,WAAW;MAEzBC,WAAkB;AACd,cAAMC,SAAS,KAAKC,IAAIC,KAAK,QAAA;AAC7B,cAAMC,OAAOC,iBAAKC,OAAO;UACrBC,OAAOC,QAAQC,IAAIC,aAAa;QACpC,CAAA;AAEAN,aAAKO,MAAM,KAAKT,IAAIU,QAAQ,OAAA,CAAA;AAE5BR,aAAKS,OAAO,SAAS,KAAKX,IAAIC,KAAK,OAAA,CAAA;AACnCC,aAAKS,OAAO,UAAUZ,OAAOa,GAAG;AAChCV,aAAKS,OAAO,OAAO,KAAKX,GAAG;AAE3B,aAAKA,IAAIa,KAAK,QAAQ,MAAMX,IAAAA;MAChC;IACJ;;;;;ACpBA;;;;;;;;;;;;;;;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/Container.ts","../src/Registerer.ts","../src/Application.ts","../src/Contracts/ServiceProviderConstructor.ts","../src/Controller.ts","../src/Di/Inject.ts","../src/Exceptions/Handler.ts","../src/Http/Kernel.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 { dd, dump } from '@h3ravel/support'\n\nexport class Registerer {\n static register () {\n globalThis.dd = dd\n globalThis.dump = dump\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from '@h3ravel/shared'\nimport { Registerer } from './Registerer'\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 Registerer.register()\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","/// <reference path=\"../globals.d.ts\" />\n\nimport { 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 { 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 '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 }\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","Registerer","register","globalThis","dd","dump","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","Registerer","register","dotenv","config","quiet","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","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","ServiceProvider","order","priority","app","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
|
@@ -174,7 +174,7 @@ declare abstract class ServiceProvider implements IServiceProvider {
|
|
|
174
174
|
* Register bindings to the container.
|
|
175
175
|
* Runs before boot().
|
|
176
176
|
*/
|
|
177
|
-
register(): void | Promise<void>;
|
|
177
|
+
abstract register(): void | Promise<void>;
|
|
178
178
|
/**
|
|
179
179
|
* Perform post-registration booting of services.
|
|
180
180
|
* Runs after all providers have been registered.
|
package/dist/index.d.ts
CHANGED
|
@@ -174,7 +174,7 @@ declare abstract class ServiceProvider implements IServiceProvider {
|
|
|
174
174
|
* Register bindings to the container.
|
|
175
175
|
* Runs before boot().
|
|
176
176
|
*/
|
|
177
|
-
register(): void | Promise<void>;
|
|
177
|
+
abstract register(): void | Promise<void>;
|
|
178
178
|
/**
|
|
179
179
|
* Perform post-registration booting of services.
|
|
180
180
|
* Runs after all providers have been registered.
|
package/dist/index.js
CHANGED
|
@@ -75,6 +75,20 @@ var Container = class {
|
|
|
75
75
|
|
|
76
76
|
// src/Application.ts
|
|
77
77
|
import { PathLoader } from "@h3ravel/shared";
|
|
78
|
+
|
|
79
|
+
// src/Registerer.ts
|
|
80
|
+
import { dd, dump } from "@h3ravel/support";
|
|
81
|
+
var Registerer = class {
|
|
82
|
+
static {
|
|
83
|
+
__name(this, "Registerer");
|
|
84
|
+
}
|
|
85
|
+
static register() {
|
|
86
|
+
globalThis.dd = dd;
|
|
87
|
+
globalThis.dump = dump;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/Application.ts
|
|
78
92
|
import dotenv from "dotenv";
|
|
79
93
|
import path from "path";
|
|
80
94
|
var Application = class _Application extends Container {
|
|
@@ -96,6 +110,7 @@ var Application = class _Application extends Container {
|
|
|
96
110
|
this.setPath("base", basePath);
|
|
97
111
|
this.loadOptions();
|
|
98
112
|
this.registerBaseBindings();
|
|
113
|
+
Registerer.register();
|
|
99
114
|
dotenv.config({
|
|
100
115
|
quiet: true
|
|
101
116
|
});
|
|
@@ -366,18 +381,6 @@ var Kernel = class {
|
|
|
366
381
|
// src/Providers/CoreServiceProvider.ts
|
|
367
382
|
import "reflect-metadata";
|
|
368
383
|
|
|
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
384
|
// src/ServiceProvider.ts
|
|
382
385
|
var ServiceProvider = class {
|
|
383
386
|
static {
|
|
@@ -389,13 +392,6 @@ var ServiceProvider = class {
|
|
|
389
392
|
constructor(app) {
|
|
390
393
|
this.app = app;
|
|
391
394
|
}
|
|
392
|
-
/**
|
|
393
|
-
* Register bindings to the container.
|
|
394
|
-
* Runs before boot().
|
|
395
|
-
*/
|
|
396
|
-
register() {
|
|
397
|
-
Registerer.register();
|
|
398
|
-
}
|
|
399
395
|
};
|
|
400
396
|
|
|
401
397
|
// src/Providers/CoreServiceProvider.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";;;;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,EAAG,QAAO;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,cAAe;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,MAAO;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,OAAQ;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;;;AClBO,SAASK,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,MAAO,OAAM,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;;;ACAP,SAASC,IAAIC,YAAY;AAElB,IAAMC,aAAN,MAAMA;EAFb,OAEaA;;;EACT,OAAOC,WAAY;AACfC,eAAWC,KAAKA;AAChBD,eAAWE,OAAOA;EACtB;AACJ;;;ACHO,IAAeC,kBAAf,MAAeA;EAFtB,OAEsBA;;;EAClB,OAAcC;EACd,OAAcC,WAAW;EACfC;EAEV,YAAYA,KAAkB;AAC1B,SAAKA,MAAMA;EACf;;;;;EAMAC,WAAkC;AAC9BC,eAAWD,SAAQ;EACvB;AAOJ;;;AFbO,IAAME,sBAAN,cAAkCC,gBAAAA;EAbzC,OAayCA;;;EACrC,OAAcC,WAAW;EAEzBC,WAAY;EAEZ;AACJ;;;AGnBA,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","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/Container.ts","../src/Application.ts","../src/Registerer.ts","../src/Controller.ts","../src/Di/Inject.ts","../src/Http/Kernel.ts","../src/Providers/CoreServiceProvider.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 { Registerer } from './Registerer'\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 Registerer.register()\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 { 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 '.'\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 }\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 { 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","dd","dump","Registerer","register","globalThis","dd","dump","dotenv","path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","Registerer","register","dotenv","config","quiet","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","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","ServiceProvider","order","priority","app","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.7.
|
|
3
|
+
"version": "1.7.2",
|
|
4
4
|
"description": "Core application container, lifecycle management and service providers for H3ravel.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"reflect-metadata": "^0.2.2",
|
|
43
43
|
"srvx": "^0.8.2",
|
|
44
44
|
"tslib": "^2.6.0",
|
|
45
|
-
"@h3ravel/
|
|
46
|
-
"@h3ravel/
|
|
45
|
+
"@h3ravel/shared": "^0.17.2",
|
|
46
|
+
"@h3ravel/support": "^0.9.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"typescript": "^5.4.0"
|