@h3ravel/core 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @h3ravel/core
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - rebuild all dependencies
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @h3ravel/shared@0.5.0
13
+
14
+ ## 0.4.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 8ceb2c1: implement the Application class directly since it already implements the IClass contract
19
+
20
+ ### Patch Changes
21
+
22
+ - a27f452: chore: fix all linting issues.
23
+ - c906050: chore: migrate tests suite to jest
24
+ - Updated dependencies [8ceb2c1]
25
+ - Updated dependencies [a27f452]
26
+ - Updated dependencies [c906050]
27
+ - @h3ravel/shared@0.4.0
28
+
3
29
  ## 0.3.0
4
30
 
5
31
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -244,7 +244,6 @@ var Application = class _Application extends Container {
244
244
  * Attempt to dynamically import an optional module
245
245
  */
246
246
  async safeImport(moduleName) {
247
- console.log(moduleName);
248
247
  try {
249
248
  const mod = await import(moduleName);
250
249
  return mod.default ?? mod ?? {};
@@ -286,7 +285,7 @@ var Application = class _Application extends Container {
286
285
  * @returns
287
286
  */
288
287
  getVersion(key) {
289
- return this.versions[key]?.replaceAll(/\^|\~/g, "");
288
+ return this.versions[key]?.replaceAll(/\^|~/g, "");
290
289
  }
291
290
  };
292
291
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Container.ts","../src/Utils/PathLoader.ts","../src/Application.ts","../src/Controller.ts","../src/ServiceProvider.ts","../src/Http/Kernel.ts","../src/Providers/AppServiceProvider.ts","../src/Providers/ViewServiceProvider.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Application';\nexport * from './Container';\nexport * from './Controller';\nexport * from './ServiceProvider';\nexport * from './Contracts/BindingsContract';\nexport * from './Exceptions/Handler';\nexport * from './Http/Kernel';\nexport * from './Providers/AppServiceProvider';\nexport * from './Providers/ViewServiceProvider';\nexport * from './Utils/PathLoader';\n","import type { Bindings, UseKey } from \"./Contracts/BindingsContract\"\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\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> (key: T | (new (..._args: any[]) => Bindings[T])): Bindings[T] {\n // 1️⃣ Direct factory binding\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n // 2️⃣ If class constructor → auto-resolve via reflection\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 const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n const dependencies = paramTypes.map((dep) => this.make(dep))\n return new ClassType(...dependencies)\n }\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 { IPathName } from \"@h3ravel/shared\"\nimport nodepath from \"path\"\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param base - The base path to include to the path\n * @returns \n */\n getPath (name: IPathName, base?: string): string {\n if (base && name !== 'base') {\n return nodepath.join(base, this.paths[name])\n }\n\n return this.paths[name]\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from './Utils/PathLoader'\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: IApplication) => IServiceProvider> = []\n\n constructor(basePath: string) {\n super()\n this.basePath = basePath\n this.setPath('base', basePath)\n this.loadOptions()\n this.registerBaseBindings()\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('app.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: IApplication) => IServiceProvider>> {\n return [\n (await this.safeImport('@h3ravel/core')).AppServiceProvider,\n (await this.safeImport('@h3ravel/http')).HttpServiceProvider,\n (await this.safeImport('@h3ravel/config')).ConfigServiceProvider,\n (await this.safeImport('@h3ravel/router')).RouteServiceProvider,\n (await this.safeImport('@h3ravel/router')).AssetsServiceProvider,\n (await this.safeImport('@h3ravel/core')).ViewServiceProvider,\n (await this.safeImport('@h3ravel/database'))?.DatabaseServiceProvider,\n (await this.safeImport('@h3ravel/cache'))?.CacheServiceProvider,\n (await this.safeImport('@h3ravel/console'))?.ConsoleServiceProvider,\n (await this.safeImport('@h3ravel/queue'))?.QueueServiceProvider,\n (await this.safeImport('@h3ravel/mail'))?.MailServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: IApplication) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders()\n return [...coreProviders, ...this.externalProviders]\n }\n\n registerProviders (providers: Array<new (_app: IApplication) => 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 console.log(moduleName)\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 { HttpContext, IApplication, IController } from '@h3ravel/shared'\n\nimport { Application } from '.'\n\n/**\n * Base controller class\n */\nexport abstract class Controller implements IController {\n protected app: IApplication\n\n constructor(app: Application) {\n this.app = app\n }\n\n public show (_ctx: HttpContext): any { return }\n public index (_ctx: HttpContext): any { return }\n public store (_ctx: HttpContext): any { return }\n public update (_ctx: HttpContext): any { return }\n public destroy (_ctx: HttpContext): any { return }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\n\nexport abstract class ServiceProvider implements IServiceProvider {\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 { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\nexport class Kernel {\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n async handle (event: H3Event, next: (ctx: HttpContext) => Promise<unknown>): Promise<unknown> {\n const ctx = this.context(event)\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n // Auto-set JSON header if plain object returned\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 private async runMiddleware (context: HttpContext, next: (ctx: HttpContext) => Promise<unknown>) {\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 return middleware.handle(context, () => runner(i + 1))\n } else {\n return next(context)\n }\n }\n\n return runner(0)\n }\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 AppServiceProvider extends ServiceProvider {\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\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('view', () => edge)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;ACIO,IAAMA,YAAN,MAAMA;EAAb,OAAaA;;;EACDC,WAAW,oBAAIC,IAAAA;EACfC,aAAa,oBAAID,IAAAA;EAOzBE,KACIC,KACAC,SACF;AACE,SAAKL,SAASM,IAAIF,KAAKC,OAAAA;EAC3B;;;;EAKAE,UACIH,KACAC,SACF;AACE,SAAKL,SAASM,IAAIF,KAAK,MAAA;AACnB,UAAI,CAAC,KAAKF,WAAWM,IAAIJ,GAAAA,GAAM;AAC3B,aAAKF,WAAWI,IAAIF,KAAKC,QAAAA,CAAAA;MAC7B;AACA,aAAO,KAAKH,WAAWO,IAAIL,GAAAA;IAC/B,CAAA;EACJ;;;;EAKAM,KAAwBN,KAA8D;AAElF,QAAI,KAAKJ,SAASQ,IAAIJ,GAAAA,GAAM;AACxB,aAAO,KAAKJ,SAASS,IAAIL,GAAAA,EAAAA;IAC7B;AAGA,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,UAAMC,aAAoBC,QAAQC,YAAY,qBAAqBH,SAAAA,KAAc,CAAA;AACjF,UAAMI,eAAeH,WAAWI,IAAI,CAACC,QAAQ,KAAKV,KAAKU,GAAAA,CAAAA;AACvD,WAAO,IAAIN,UAAAA,GAAaI,YAAAA;EAC5B;;;;EAMAV,IAAKJ,KAAsB;AACvB,WAAO,KAAKJ,SAASQ,IAAIJ,GAAAA;EAC7B;AACJ;;;ACrEA,kBAAqB;AAEd,IAAMiB,aAAN,MAAMA;EAFb,OAEaA;;;EACDC,QAAQ;IACZC,MAAM;IACNC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,SAAS;EACb;;;;;;;;;EAUAC,QAASC,MAAiBR,MAAuB;AAC7C,QAAIA,QAAQQ,SAAS,QAAQ;AACzB,aAAOC,YAAAA,QAASC,KAAKV,MAAM,KAAKD,MAAMS,IAAAA,CAAK;IAC/C;AAEA,WAAO,KAAKT,MAAMS,IAAAA;EACtB;;;;;;;;EASAG,QAASH,MAAiBI,OAAcZ,MAAe;AACnD,QAAIA,QAAQQ,SAAS,QAAQ;AACzB,WAAKT,MAAMS,IAAAA,IAAQC,YAAAA,QAASC,KAAKV,MAAMY,KAAAA;IAC3C;AAEA,SAAKb,MAAMS,IAAAA,IAAQI;EACvB;AACJ;;;ACxCA,uBAAiB;AAEV,IAAMC,cAAN,MAAMA,qBAAoBC,UAAAA;EAJjC,OAIiCA;;;EAC7BC,QAAQ,IAAIC,WAAAA;EACJC,SAAS;EACTC,WAAW;IAAEC,KAAK;IAAKC,IAAI;EAAI;EAC/BC;EAEAC,YAAgC,CAAA;EAC9BC,oBAAyE,CAAA;EAEnF,YAAYF,UAAkB;AAC1B,UAAK;AACL,SAAKA,WAAWA;AAChB,SAAKG,QAAQ,QAAQH,QAAAA;AACrB,SAAKI,YAAW;AAChB,SAAKC,qBAAoB;EAC7B;;;;EAKUA,uBAAwB;AAC9B,SAAKC,KAAKd,cAAa,MAAM,IAAI;AACjC,SAAKc,KAAK,aAAa,MAAM,KAAKN,QAAQ;AAC1C,SAAKM,KAAK,aAAa,MAAM,KAAKZ,KAAK;EAC3C;;;;EAKA,MAAaa,8BAA+B;AACxC,UAAMN,YAAY,MAAM,KAAKO,gBAAe;AAE5C,eAAWC,iBAAiBR,WAAW;AACnC,UAAI,CAACQ;AAAe;AACpB,YAAMC,WAAW,IAAID,cAAc,IAAI;AACvC,YAAM,KAAKE,SAASD,QAAAA;IACxB;EACJ;EAEA,MAAgBN,cAAe;AAC3B,UAAMN,MAAM,MAAM,KAAKc,WAAW,KAAKC,QAAQ,QAAQ,cAAA,CAAA;AACvD,UAAMC,OAAO,MAAM,KAAKF,WAAW,iBAAA;AAEnC,QAAId,OAAOA,IAAIiB,cAAc;AACzB,WAAKlB,SAASC,MAAMA,IAAIiB,aAAa,eAAA;IACzC;AACA,QAAID,QAAQA,KAAKE,iBAAiB;AAC9B,WAAKnB,SAASE,KAAKD,IAAIkB,gBAAgBC;IAC3C;EACJ;;;;;;;;;EAUA,MAAgBC,yBAAwF;AACpG,WAAO;OACF,MAAM,KAAKN,WAAW,eAAA,GAAkBO;OACxC,MAAM,KAAKP,WAAW,eAAA,GAAkBQ;OACxC,MAAM,KAAKR,WAAW,iBAAA,GAAoBS;OAC1C,MAAM,KAAKT,WAAW,iBAAA,GAAoBU;OAC1C,MAAM,KAAKV,WAAW,iBAAA,GAAoBW;OAC1C,MAAM,KAAKX,WAAW,eAAA,GAAkBY;OACxC,MAAM,KAAKZ,WAAW,mBAAA,IAAuBa;OAC7C,MAAM,KAAKb,WAAW,gBAAA,IAAoBc;OAC1C,MAAM,KAAKd,WAAW,kBAAA,IAAsBe;OAC5C,MAAM,KAAKf,WAAW,gBAAA,IAAoBgB;OAC1C,MAAM,KAAKhB,WAAW,eAAA,IAAmBiB;;EAElD;EAEA,MAAgBrB,kBAAiF;AAC7F,UAAMsB,gBAAgB,MAAM,KAAKZ,uBAAsB;AACvD,WAAO;SAAIY;SAAkB,KAAK5B;;EACtC;EAEA6B,kBAAmB9B,WAAsE;AACrF,SAAKC,kBAAkB8B,KAAI,GAAI/B,SAAAA;EACnC;;;;EAKA,MAAaU,SAAUD,UAA4B;AAC/C,UAAMA,SAASC,SAAQ;AACvB,SAAKV,UAAU+B,KAAKtB,QAAAA;EACxB;;;;EAKA,MAAauB,OAAQ;AACjB,QAAI,KAAKrC;AAAQ;AAEjB,eAAWc,YAAY,KAAKT,WAAW;AACnC,UAAIS,SAASuB,MAAM;AACf,cAAMvB,SAASuB,KAAI;MACvB;IACJ;AAEA,SAAKrC,SAAS;EAClB;;;;EAKA,MAAcgB,WAAYsB,YAAoB;AAC1CC,YAAQC,IAAIF,UAAAA;AACZ,QAAI;AACA,YAAMG,MAAM,MAAM,OAAOH;AACzB,aAAOG,IAAIC,WAAWD,OAAO,CAAC;IAClC,QAAQ;AACJ,aAAO;IACX;EACJ;;;;;;EAOAE,cAAuB;AACnB,WAAO,KAAKvC;EAChB;;;;;;;;EASAa,QAAS2B,MAAiBC,KAAc;AACpC,WAAOC,iBAAAA,QAAKC,KAAK,KAAKjD,MAAMmB,QAAQ2B,MAAM,KAAKxC,QAAQ,GAAGyC,OAAO,EAAA;EACrE;;;;;;;;EASAtC,QAASqC,MAAiBE,OAAc;AACpC,WAAO,KAAKhD,MAAMS,QAAQqC,MAAME,OAAM,KAAK1C,QAAQ;EACvD;;;;;;EAOA4C,WAAYC,KAAmB;AAC3B,WAAO,KAAKhD,SAASgD,GAAAA,GAAMC,WAAW,UAAU,EAAA;EACpD;AACJ;;;AC9JO,IAAeC,aAAf,MAAeA;EAHtB,OAGsBA;;;EACRC;EAEV,YAAYA,KAAkB;AAC1B,SAAKA,MAAMA;EACf;EAEOC,KAAMC,MAAwB;AAAE;EAAO;EACvCC,MAAOD,MAAwB;AAAE;EAAO;EACxCE,MAAOF,MAAwB;AAAE;EAAO;EACxCG,OAAQH,MAAwB;AAAE;EAAO;EACzCI,QAASJ,MAAwB;AAAE;EAAO;AACrD;;;AChBO,IAAeK,kBAAf,MAAeA;EAAtB,OAAsBA;;;EACRC;EAEV,YAAYA,KAAkB;AAC1B,SAAKA,MAAMA;EACf;AAaJ;;;ACjBO,IAAMC,SAAN,MAAMA;EAAb,OAAaA;;;;;EACT,YACcC,SACAC,aAA4B,CAAA,GACxC;SAFYD,UAAAA;SACAC,aAAAA;EACV;EAEJ,MAAMC,OAAQC,OAAgBC,MAAgE;AAC1F,UAAMC,MAAM,KAAKL,QAAQG,KAAAA;AACzB,UAAMG,SAAS,MAAM,KAAKC,cAAcF,KAAK,MAAMD,KAAKC,GAAAA,CAAAA;AAGxD,QAAIC,WAAWE,UAAa,KAAKC,cAAcH,MAAAA,GAAS;AACpDH,YAAMO,IAAIC,QAAQC,IAAI,gBAAgB,iCAAA;IAC1C;AAEA,WAAON;EACX;EAEA,MAAcC,cAAeP,SAAsBI,MAA8C;AAC7F,QAAIS,QAAQ;AAEZ,UAAMC,SAAS,8BAAOC,MAAAA;AAClB,UAAIA,KAAKF;AAAO,cAAM,IAAIG,MAAM,8BAAA;AAChCH,cAAQE;AACR,YAAMd,aAAa,KAAKA,WAAWc,CAAAA;AAEnC,UAAId,YAAY;AACZ,eAAOA,WAAWC,OAAOF,SAAS,MAAMc,OAAOC,IAAI,CAAA,CAAA;MACvD,OAAO;AACH,eAAOX,KAAKJ,OAAAA;MAChB;IACJ,GAVe;AAYf,WAAOc,OAAO,CAAA;EAClB;EAEQL,cAAeQ,OAAkD;AACrE,WAAO,OAAOA,UAAU,YACpBA,UAAU,SACTA,MAAM,gBAAgBC,UAAUD,MAAM,gBAAgBE;EAC/D;AACJ;;;AC7CA,8BAAO;AAaA,IAAMC,qBAAN,cAAiCC,gBAAAA;EAbxC,OAawCA;;;EACpCC,WAAY;EAEZ;AACJ;;;ACjBA,kBAAqB;AAGd,IAAMC,sBAAN,cAAkCC,gBAAAA;EAHzC,OAGyCA;;;EACrCC,WAAkB;AACd,UAAMC,SAAS,KAAKC,IAAIC,KAAK,QAAA;AAC7B,UAAMC,OAAOC,iBAAKC,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","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","paramTypes","Reflect","getMetadata","dependencies","map","dep","PathLoader","paths","base","views","assets","routes","config","public","storage","getPath","name","nodepath","join","setPath","path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","AppServiceProvider","HttpServiceProvider","ConfigServiceProvider","RouteServiceProvider","AssetsServiceProvider","ViewServiceProvider","DatabaseServiceProvider","CacheServiceProvider","ConsoleServiceProvider","QueueServiceProvider","MailServiceProvider","coreProviders","registerProviders","push","boot","moduleName","console","log","mod","default","getBasePath","name","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","ServiceProvider","app","Kernel","context","middleware","handle","event","next","ctx","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","AppServiceProvider","ServiceProvider","register","ViewServiceProvider","ServiceProvider","register","config","app","make","edge","Edge","create","cache","process","env","NODE_ENV","mount","getPath","global","get","bind"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Container.ts","../src/Utils/PathLoader.ts","../src/Application.ts","../src/Controller.ts","../src/ServiceProvider.ts","../src/Http/Kernel.ts","../src/Providers/AppServiceProvider.ts","../src/Providers/ViewServiceProvider.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Application';\nexport * from './Container';\nexport * from './Controller';\nexport * from './ServiceProvider';\nexport * from './Contracts/BindingsContract';\nexport * from './Exceptions/Handler';\nexport * from './Http/Kernel';\nexport * from './Providers/AppServiceProvider';\nexport * from './Providers/ViewServiceProvider';\nexport * from './Utils/PathLoader';\n","import type { Bindings, UseKey } from './Contracts/BindingsContract'\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\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> (key: T | (new (..._args: any[]) => Bindings[T])): Bindings[T] {\n // 1️⃣ Direct factory binding\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n // 2️⃣ If class constructor → auto-resolve via reflection\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 const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n const dependencies = paramTypes.map((dep) => this.make(dep))\n return new ClassType(...dependencies)\n }\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 { IPathName } from '@h3ravel/shared'\nimport nodepath from 'path'\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param base - The base path to include to the path\n * @returns \n */\n getPath (name: IPathName, base?: string): string {\n if (base && name !== 'base') {\n return nodepath.join(base, this.paths[name])\n }\n\n return this.paths[name]\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from './Utils/PathLoader'\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 }\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('app.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 this.safeImport('@h3ravel/core')).AppServiceProvider,\n (await this.safeImport('@h3ravel/http')).HttpServiceProvider,\n (await this.safeImport('@h3ravel/config')).ConfigServiceProvider,\n (await this.safeImport('@h3ravel/router')).RouteServiceProvider,\n (await this.safeImport('@h3ravel/router')).AssetsServiceProvider,\n (await this.safeImport('@h3ravel/core')).ViewServiceProvider,\n (await this.safeImport('@h3ravel/database'))?.DatabaseServiceProvider,\n (await this.safeImport('@h3ravel/cache'))?.CacheServiceProvider,\n (await this.safeImport('@h3ravel/console'))?.ConsoleServiceProvider,\n (await this.safeImport('@h3ravel/queue'))?.QueueServiceProvider,\n (await this.safeImport('@h3ravel/mail'))?.MailServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders()\n return [...coreProviders, ...this.externalProviders]\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 { HttpContext, IController } from '@h3ravel/shared'\n\nimport { Application } from '.'\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: HttpContext): any { return }\n public index (_ctx: HttpContext): any { return }\n public store (_ctx: HttpContext): any { return }\n public update (_ctx: HttpContext): any { return }\n public destroy (_ctx: HttpContext): any { return }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\n\nexport abstract class ServiceProvider implements IServiceProvider {\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 { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\nexport class Kernel {\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n async handle (event: H3Event, next: (ctx: HttpContext) => Promise<unknown>): Promise<unknown> {\n const ctx = this.context(event)\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n // Auto-set JSON header if plain object returned\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 private async runMiddleware (context: HttpContext, next: (ctx: HttpContext) => Promise<unknown>) {\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 return middleware.handle(context, () => runner(i + 1))\n } else {\n return next(context)\n }\n }\n\n return runner(0)\n }\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 AppServiceProvider extends ServiceProvider {\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\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('view', () => edge)\n }\n}\n"],"mappings":"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","names":["Container","bindings","Map","singletons","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","paramTypes","Reflect","getMetadata","dependencies","map","dep","PathLoader","paths","base","views","assets","routes","config","public","storage","getPath","name","nodepath","join","setPath","path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","AppServiceProvider","HttpServiceProvider","ConfigServiceProvider","RouteServiceProvider","AssetsServiceProvider","ViewServiceProvider","DatabaseServiceProvider","CacheServiceProvider","ConsoleServiceProvider","QueueServiceProvider","MailServiceProvider","coreProviders","registerProviders","push","boot","moduleName","mod","default","getBasePath","name","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","ServiceProvider","app","Kernel","context","middleware","handle","event","next","ctx","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","AppServiceProvider","ServiceProvider","register","ViewServiceProvider","ServiceProvider","register","config","app","make","edge","Edge","create","cache","process","env","NODE_ENV","mount","getPath","global","get","bind"]}
package/dist/index.d.cts CHANGED
@@ -28,7 +28,7 @@ type RemoveIndexSignature<T> = {
28
28
  };
29
29
  type Bindings = {
30
30
  [key: string]: any;
31
- env<T extends string>(): NodeJS.ProcessEnv;
31
+ env(): NodeJS.ProcessEnv;
32
32
  env<T extends string>(key: T, def?: any): any;
33
33
  view: Edge;
34
34
  asset(key: string, def?: string): string;
@@ -78,7 +78,7 @@ declare class Application extends Container implements IApplication {
78
78
  private versions;
79
79
  private basePath;
80
80
  private providers;
81
- protected externalProviders: Array<new (_app: IApplication) => IServiceProvider>;
81
+ protected externalProviders: Array<new (_app: Application) => IServiceProvider>;
82
82
  constructor(basePath: string);
83
83
  /**
84
84
  * Register core bindings into the container
@@ -97,9 +97,9 @@ declare class Application extends Container implements IApplication {
97
97
  * Minimal App: Loads only core, config, http, router by default.
98
98
  * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.
99
99
  */
100
- protected getConfiguredProviders(): Promise<Array<new (_app: IApplication) => IServiceProvider>>;
101
- protected getAllProviders(): Promise<Array<new (_app: IApplication) => IServiceProvider>>;
102
- registerProviders(providers: Array<new (_app: IApplication) => IServiceProvider>): void;
100
+ protected getConfiguredProviders(): Promise<Array<new (_app: Application) => IServiceProvider>>;
101
+ protected getAllProviders(): Promise<Array<new (_app: Application) => IServiceProvider>>;
102
+ registerProviders(providers: Array<new (_app: Application) => IServiceProvider>): void;
103
103
  /**
104
104
  * Register a provider
105
105
  */
@@ -146,7 +146,7 @@ declare class Application extends Container implements IApplication {
146
146
  * Base controller class
147
147
  */
148
148
  declare abstract class Controller implements IController {
149
- protected app: IApplication;
149
+ protected app: Application;
150
150
  constructor(app: Application);
151
151
  show(_ctx: HttpContext): any;
152
152
  index(_ctx: HttpContext): any;
package/dist/index.d.ts CHANGED
@@ -28,7 +28,7 @@ type RemoveIndexSignature<T> = {
28
28
  };
29
29
  type Bindings = {
30
30
  [key: string]: any;
31
- env<T extends string>(): NodeJS.ProcessEnv;
31
+ env(): NodeJS.ProcessEnv;
32
32
  env<T extends string>(key: T, def?: any): any;
33
33
  view: Edge;
34
34
  asset(key: string, def?: string): string;
@@ -78,7 +78,7 @@ declare class Application extends Container implements IApplication {
78
78
  private versions;
79
79
  private basePath;
80
80
  private providers;
81
- protected externalProviders: Array<new (_app: IApplication) => IServiceProvider>;
81
+ protected externalProviders: Array<new (_app: Application) => IServiceProvider>;
82
82
  constructor(basePath: string);
83
83
  /**
84
84
  * Register core bindings into the container
@@ -97,9 +97,9 @@ declare class Application extends Container implements IApplication {
97
97
  * Minimal App: Loads only core, config, http, router by default.
98
98
  * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.
99
99
  */
100
- protected getConfiguredProviders(): Promise<Array<new (_app: IApplication) => IServiceProvider>>;
101
- protected getAllProviders(): Promise<Array<new (_app: IApplication) => IServiceProvider>>;
102
- registerProviders(providers: Array<new (_app: IApplication) => IServiceProvider>): void;
100
+ protected getConfiguredProviders(): Promise<Array<new (_app: Application) => IServiceProvider>>;
101
+ protected getAllProviders(): Promise<Array<new (_app: Application) => IServiceProvider>>;
102
+ registerProviders(providers: Array<new (_app: Application) => IServiceProvider>): void;
103
103
  /**
104
104
  * Register a provider
105
105
  */
@@ -146,7 +146,7 @@ declare class Application extends Container implements IApplication {
146
146
  * Base controller class
147
147
  */
148
148
  declare abstract class Controller implements IController {
149
- protected app: IApplication;
149
+ protected app: Application;
150
150
  constructor(app: Application);
151
151
  show(_ctx: HttpContext): any;
152
152
  index(_ctx: HttpContext): any;
package/dist/index.js CHANGED
@@ -95,7 +95,7 @@ var PathLoader = class {
95
95
  };
96
96
 
97
97
  // src/Application.ts
98
- import path from "path";
98
+ import path from "node:path";
99
99
  var Application = class _Application extends Container {
100
100
  static {
101
101
  __name(this, "Application");
@@ -203,7 +203,6 @@ var Application = class _Application extends Container {
203
203
  * Attempt to dynamically import an optional module
204
204
  */
205
205
  async safeImport(moduleName) {
206
- console.log(moduleName);
207
206
  try {
208
207
  const mod = await import(moduleName);
209
208
  return mod.default ?? mod ?? {};
@@ -245,7 +244,7 @@ var Application = class _Application extends Container {
245
244
  * @returns
246
245
  */
247
246
  getVersion(key) {
248
- return this.versions[key]?.replaceAll(/\^|\~/g, "");
247
+ return this.versions[key]?.replaceAll(/\^|~/g, "");
249
248
  }
250
249
  };
251
250
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Container.ts","../src/Utils/PathLoader.ts","../src/Application.ts","../src/Controller.ts","../src/ServiceProvider.ts","../src/Http/Kernel.ts","../src/Providers/AppServiceProvider.ts","../src/Providers/ViewServiceProvider.ts"],"sourcesContent":["import type { Bindings, UseKey } from \"./Contracts/BindingsContract\"\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\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> (key: T | (new (..._args: any[]) => Bindings[T])): Bindings[T] {\n // 1️⃣ Direct factory binding\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n // 2️⃣ If class constructor → auto-resolve via reflection\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 const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n const dependencies = paramTypes.map((dep) => this.make(dep))\n return new ClassType(...dependencies)\n }\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 { IPathName } from \"@h3ravel/shared\"\nimport nodepath from \"path\"\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param base - The base path to include to the path\n * @returns \n */\n getPath (name: IPathName, base?: string): string {\n if (base && name !== 'base') {\n return nodepath.join(base, this.paths[name])\n }\n\n return this.paths[name]\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from './Utils/PathLoader'\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: IApplication) => IServiceProvider> = []\n\n constructor(basePath: string) {\n super()\n this.basePath = basePath\n this.setPath('base', basePath)\n this.loadOptions()\n this.registerBaseBindings()\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('app.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: IApplication) => IServiceProvider>> {\n return [\n (await this.safeImport('@h3ravel/core')).AppServiceProvider,\n (await this.safeImport('@h3ravel/http')).HttpServiceProvider,\n (await this.safeImport('@h3ravel/config')).ConfigServiceProvider,\n (await this.safeImport('@h3ravel/router')).RouteServiceProvider,\n (await this.safeImport('@h3ravel/router')).AssetsServiceProvider,\n (await this.safeImport('@h3ravel/core')).ViewServiceProvider,\n (await this.safeImport('@h3ravel/database'))?.DatabaseServiceProvider,\n (await this.safeImport('@h3ravel/cache'))?.CacheServiceProvider,\n (await this.safeImport('@h3ravel/console'))?.ConsoleServiceProvider,\n (await this.safeImport('@h3ravel/queue'))?.QueueServiceProvider,\n (await this.safeImport('@h3ravel/mail'))?.MailServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: IApplication) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders()\n return [...coreProviders, ...this.externalProviders]\n }\n\n registerProviders (providers: Array<new (_app: IApplication) => 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 console.log(moduleName)\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 { HttpContext, IApplication, IController } from '@h3ravel/shared'\n\nimport { Application } from '.'\n\n/**\n * Base controller class\n */\nexport abstract class Controller implements IController {\n protected app: IApplication\n\n constructor(app: Application) {\n this.app = app\n }\n\n public show (_ctx: HttpContext): any { return }\n public index (_ctx: HttpContext): any { return }\n public store (_ctx: HttpContext): any { return }\n public update (_ctx: HttpContext): any { return }\n public destroy (_ctx: HttpContext): any { return }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\n\nexport abstract class ServiceProvider implements IServiceProvider {\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 { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\nexport class Kernel {\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n async handle (event: H3Event, next: (ctx: HttpContext) => Promise<unknown>): Promise<unknown> {\n const ctx = this.context(event)\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n // Auto-set JSON header if plain object returned\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 private async runMiddleware (context: HttpContext, next: (ctx: HttpContext) => Promise<unknown>) {\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 return middleware.handle(context, () => runner(i + 1))\n } else {\n return next(context)\n }\n }\n\n return runner(0)\n }\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 AppServiceProvider extends ServiceProvider {\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\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('view', () => edge)\n }\n}\n"],"mappings":"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","names":["Container","bindings","Map","singletons","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","paramTypes","Reflect","getMetadata","dependencies","map","dep","nodepath","PathLoader","paths","base","views","assets","routes","config","public","storage","getPath","name","nodepath","join","setPath","path","path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","AppServiceProvider","HttpServiceProvider","ConfigServiceProvider","RouteServiceProvider","AssetsServiceProvider","ViewServiceProvider","DatabaseServiceProvider","CacheServiceProvider","ConsoleServiceProvider","QueueServiceProvider","MailServiceProvider","coreProviders","registerProviders","push","boot","moduleName","console","log","mod","default","getBasePath","name","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","ServiceProvider","app","Kernel","context","middleware","handle","event","next","ctx","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","AppServiceProvider","ServiceProvider","register","Edge","ViewServiceProvider","ServiceProvider","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/Utils/PathLoader.ts","../src/Application.ts","../src/Controller.ts","../src/ServiceProvider.ts","../src/Http/Kernel.ts","../src/Providers/AppServiceProvider.ts","../src/Providers/ViewServiceProvider.ts"],"sourcesContent":["import type { Bindings, UseKey } from './Contracts/BindingsContract'\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\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> (key: T | (new (..._args: any[]) => Bindings[T])): Bindings[T] {\n // 1️⃣ Direct factory binding\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n // 2️⃣ If class constructor → auto-resolve via reflection\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 const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n const dependencies = paramTypes.map((dep) => this.make(dep))\n return new ClassType(...dependencies)\n }\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 { IPathName } from '@h3ravel/shared'\nimport nodepath from 'path'\n\nexport class PathLoader {\n private paths = {\n base: '',\n views: '/src/resources/views',\n assets: '/public/assets',\n routes: '/src/routes',\n config: '/src/config',\n public: '/public',\n storage: '/storage',\n }\n\n /**\n * Dynamically retrieves a path property from the class.\n * Any property ending with \"Path\" is accessible automatically.\n *\n * @param name - The base name of the path property\n * @param base - The base path to include to the path\n * @returns \n */\n getPath (name: IPathName, base?: string): string {\n if (base && name !== 'base') {\n return nodepath.join(base, this.paths[name])\n }\n\n return this.paths[name]\n }\n\n /**\n * Programatically set the paths.\n *\n * @param name - The base name of the path property\n * @param path - The new path\n * @param base - The base path to include to the path\n */\n setPath (name: IPathName, path: string, base?: string) {\n if (base && name !== 'base') {\n this.paths[name] = nodepath.join(base, path)\n }\n\n this.paths[name] = path\n }\n}\n","import { IApplication, IPathName, IServiceProvider } from '@h3ravel/shared'\n\nimport { Container } from './Container'\nimport { PathLoader } from './Utils/PathLoader'\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 }\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('app.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 this.safeImport('@h3ravel/core')).AppServiceProvider,\n (await this.safeImport('@h3ravel/http')).HttpServiceProvider,\n (await this.safeImport('@h3ravel/config')).ConfigServiceProvider,\n (await this.safeImport('@h3ravel/router')).RouteServiceProvider,\n (await this.safeImport('@h3ravel/router')).AssetsServiceProvider,\n (await this.safeImport('@h3ravel/core')).ViewServiceProvider,\n (await this.safeImport('@h3ravel/database'))?.DatabaseServiceProvider,\n (await this.safeImport('@h3ravel/cache'))?.CacheServiceProvider,\n (await this.safeImport('@h3ravel/console'))?.ConsoleServiceProvider,\n (await this.safeImport('@h3ravel/queue'))?.QueueServiceProvider,\n (await this.safeImport('@h3ravel/mail'))?.MailServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders()\n return [...coreProviders, ...this.externalProviders]\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 { HttpContext, IController } from '@h3ravel/shared'\n\nimport { Application } from '.'\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: HttpContext): any { return }\n public index (_ctx: HttpContext): any { return }\n public store (_ctx: HttpContext): any { return }\n public update (_ctx: HttpContext): any { return }\n public destroy (_ctx: HttpContext): any { return }\n}\n","import { Application } from './Application'\nimport { IServiceProvider } from '@h3ravel/shared'\n\nexport abstract class ServiceProvider implements IServiceProvider {\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 { HttpContext, IMiddleware } from '@h3ravel/shared'\n\nimport type { H3Event } from 'h3'\n\nexport class Kernel {\n constructor(\n protected context: (event: H3Event) => HttpContext,\n protected middleware: IMiddleware[] = [],\n ) { }\n\n async handle (event: H3Event, next: (ctx: HttpContext) => Promise<unknown>): Promise<unknown> {\n const ctx = this.context(event)\n const result = await this.runMiddleware(ctx, () => next(ctx))\n\n // Auto-set JSON header if plain object returned\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 private async runMiddleware (context: HttpContext, next: (ctx: HttpContext) => Promise<unknown>) {\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 return middleware.handle(context, () => runner(i + 1))\n } else {\n return next(context)\n }\n }\n\n return runner(0)\n }\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 AppServiceProvider extends ServiceProvider {\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '../ServiceProvider'\n\nexport class ViewServiceProvider extends ServiceProvider {\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('view', () => edge)\n }\n}\n"],"mappings":"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","names":["Container","bindings","Map","singletons","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","paramTypes","Reflect","getMetadata","dependencies","map","dep","nodepath","PathLoader","paths","base","views","assets","routes","config","public","storage","getPath","name","nodepath","join","setPath","path","path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","AppServiceProvider","HttpServiceProvider","ConfigServiceProvider","RouteServiceProvider","AssetsServiceProvider","ViewServiceProvider","DatabaseServiceProvider","CacheServiceProvider","ConsoleServiceProvider","QueueServiceProvider","MailServiceProvider","coreProviders","registerProviders","push","boot","moduleName","mod","default","getBasePath","name","pth","path","join","getVersion","key","replaceAll","Controller","app","show","_ctx","index","store","update","destroy","ServiceProvider","app","Kernel","context","middleware","handle","event","next","ctx","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","AppServiceProvider","ServiceProvider","register","Edge","ViewServiceProvider","ServiceProvider","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": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Core application container, lifecycle management and service providers for H3ravel.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,7 +14,7 @@
14
14
  "reflect-metadata": "^0.2.2",
15
15
  "srvx": "^0.8.2",
16
16
  "tslib": "^2.6.0",
17
- "@h3ravel/shared": "0.3.0"
17
+ "@h3ravel/shared": "0.5.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "typescript": "^5.4.0"
@@ -25,6 +25,6 @@
25
25
  "dev": "tsx watch src/index.ts",
26
26
  "start": "node dist/index.js",
27
27
  "lint": "eslint . --ext .ts",
28
- "test": "vitest"
28
+ "test": "jest --passWithNoTests"
29
29
  }
30
30
  }
@@ -11,7 +11,7 @@ export class Application extends Container implements IApplication {
11
11
  private basePath: string
12
12
 
13
13
  private providers: IServiceProvider[] = []
14
- protected externalProviders: Array<new (_app: IApplication) => IServiceProvider> = []
14
+ protected externalProviders: Array<new (_app: Application) => IServiceProvider> = []
15
15
 
16
16
  constructor(basePath: string) {
17
17
  super()
@@ -63,7 +63,7 @@ export class Application extends Container implements IApplication {
63
63
  * Minimal App: Loads only core, config, http, router by default.
64
64
  * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.
65
65
  */
66
- protected async getConfiguredProviders (): Promise<Array<new (_app: IApplication) => IServiceProvider>> {
66
+ protected async getConfiguredProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {
67
67
  return [
68
68
  (await this.safeImport('@h3ravel/core')).AppServiceProvider,
69
69
  (await this.safeImport('@h3ravel/http')).HttpServiceProvider,
@@ -79,12 +79,12 @@ export class Application extends Container implements IApplication {
79
79
  ]
80
80
  }
81
81
 
82
- protected async getAllProviders (): Promise<Array<new (_app: IApplication) => IServiceProvider>> {
82
+ protected async getAllProviders (): Promise<Array<new (_app: Application) => IServiceProvider>> {
83
83
  const coreProviders = await this.getConfiguredProviders()
84
84
  return [...coreProviders, ...this.externalProviders]
85
85
  }
86
86
 
87
- registerProviders (providers: Array<new (_app: IApplication) => IServiceProvider>): void {
87
+ registerProviders (providers: Array<new (_app: Application) => IServiceProvider>): void {
88
88
  this.externalProviders.push(...providers)
89
89
  }
90
90
 
@@ -160,6 +160,6 @@ export class Application extends Container implements IApplication {
160
160
  * @returns
161
161
  */
162
162
  getVersion (key: 'app' | 'ts') {
163
- return this.versions[key]?.replaceAll(/\^|\~/g, '')
163
+ return this.versions[key]?.replaceAll(/\^|~/g, '')
164
164
  }
165
165
  }
package/src/Container.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Bindings, UseKey } from "./Contracts/BindingsContract"
1
+ import type { Bindings, UseKey } from './Contracts/BindingsContract'
2
2
 
3
3
  type IBinding = UseKey | (new (..._args: any[]) => unknown)
4
4
 
@@ -1,9 +1,9 @@
1
1
  // import { DotNestedKeys, DotNestedValue } from "@h3ravel/support";
2
- import type { H3, serve } from "h3";
2
+ import type { H3, serve } from 'h3'
3
3
 
4
- import type { Edge } from "edge.js";
5
- import { IRouter } from "@h3ravel/shared";
6
- import { PathLoader } from "../Utils/PathLoader";
4
+ import type { Edge } from 'edge.js'
5
+ import { IRouter } from '@h3ravel/shared'
6
+ import { PathLoader } from '../Utils/PathLoader'
7
7
 
8
8
  type RemoveIndexSignature<T> = {
9
9
  [K in keyof T as string extends K
@@ -15,7 +15,7 @@ type RemoveIndexSignature<T> = {
15
15
 
16
16
  export type Bindings = {
17
17
  [key: string]: any;
18
- env<T extends string> (): NodeJS.ProcessEnv
18
+ env (): NodeJS.ProcessEnv
19
19
  env<T extends string> (key: T, def?: any): any
20
20
  view: Edge,
21
21
  asset (key: string, def?: string): string,
package/src/Controller.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { HttpContext, IApplication, IController } from '@h3ravel/shared'
1
+ import { HttpContext, IController } from '@h3ravel/shared'
2
2
 
3
3
  import { Application } from '.'
4
4
 
@@ -6,7 +6,7 @@ import { Application } from '.'
6
6
  * Base controller class
7
7
  */
8
8
  export abstract class Controller implements IController {
9
- protected app: IApplication
9
+ protected app: Application
10
10
 
11
11
  constructor(app: Application) {
12
12
  this.app = app
@@ -1,5 +1,5 @@
1
- import { IPathName } from "@h3ravel/shared"
2
- import nodepath from "path"
1
+ import { IPathName } from '@h3ravel/shared'
2
+ import nodepath from 'path'
3
3
 
4
4
  export class PathLoader {
5
5
  private paths = {