@h3ravel/core
Version:
Core application container, lifecycle management and service providers for H3ravel.
1 lines • 25.9 kB
Source Map (JSON)
{"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"]}