@strav/kernel
Advanced tools
+1
-1
| { | ||
| "name": "@strav/kernel", | ||
| "version": "1.0.0-alpha.42", | ||
| "version": "1.0.0-alpha.43", | ||
| "description": "Strav kernel — IoC container, service providers, lifecycle, config, events, helpers", | ||
@@ -5,0 +5,0 @@ "type": "module", |
@@ -16,3 +16,7 @@ /** | ||
| import { Container } from './container.ts' | ||
| import { ServiceProvider, type ServiceProviderEntry } from './service_provider.ts' | ||
| import { | ||
| resolveProviders, | ||
| type ServiceProvider, | ||
| type ServiceProviderEntry, | ||
| } from './service_provider.ts' | ||
| import type { Constructor } from './types.ts' | ||
@@ -35,23 +39,2 @@ | ||
| async function resolveProviderEntry(entry: ServiceProviderEntry): Promise<ServiceProvider> { | ||
| if (entry instanceof ServiceProvider) return entry | ||
| if (typeof entry === 'function') { | ||
| // Constructor: a class whose prototype derives from ServiceProvider. | ||
| if (entry.prototype instanceof ServiceProvider) { | ||
| return new (entry as new () => ServiceProvider)() | ||
| } | ||
| // Closure: returns (or resolves to) a ServiceProvider instance. | ||
| const result = await (entry as () => ServiceProvider | Promise<ServiceProvider>)() | ||
| if (!(result instanceof ServiceProvider)) { | ||
| throw new Error( | ||
| 'Application: provider closure must return a ServiceProvider instance.', | ||
| ) | ||
| } | ||
| return result | ||
| } | ||
| throw new Error( | ||
| 'Application: provider entry must be a ServiceProvider, a constructor, or a closure.', | ||
| ) | ||
| } | ||
| export class Application extends Container { | ||
@@ -149,6 +132,3 @@ /** | ||
| const resolved: ServiceProvider[] = [] | ||
| for (const entry of this._providerEntries) { | ||
| resolved.push(await resolveProviderEntry(entry)) | ||
| } | ||
| const resolved = await resolveProviders(this._providerEntries) | ||
| const sorted = this.topologicalSort(resolved) | ||
@@ -155,0 +135,0 @@ |
@@ -6,3 +6,8 @@ // Core kernel exports: Application, Container, ServiceProvider, inject, types. | ||
| export { getParamTypes, INJECTABLE, inject, isInjectable } from './inject.ts' | ||
| export { ServiceProvider, type ServiceProviderEntry } from './service_provider.ts' | ||
| export { | ||
| resolveProviderEntry, | ||
| resolveProviders, | ||
| ServiceProvider, | ||
| type ServiceProviderEntry, | ||
| } from './service_provider.ts' | ||
| export type { | ||
@@ -9,0 +14,0 @@ Binding, |
@@ -77,1 +77,36 @@ /** | ||
| } | ||
| /** | ||
| * Resolve a single `ServiceProviderEntry` to a concrete `ServiceProvider` | ||
| * instance — passing instances through, constructing classes, and invoking | ||
| * (and awaiting) closures. Used by `Application.start()` and by tooling that | ||
| * needs to read provider metadata (`name`, `dependencies`, `commands`) before | ||
| * the app boots. | ||
| */ | ||
| export async function resolveProviderEntry(entry: ServiceProviderEntry): Promise<ServiceProvider> { | ||
| if (entry instanceof ServiceProvider) return entry | ||
| if (typeof entry === 'function') { | ||
| // Constructor: a class whose prototype derives from ServiceProvider. | ||
| if (entry.prototype instanceof ServiceProvider) { | ||
| return new (entry as new () => ServiceProvider)() | ||
| } | ||
| // Closure: returns (or resolves to) a ServiceProvider instance. | ||
| const result = await (entry as () => ServiceProvider | Promise<ServiceProvider>)() | ||
| if (!(result instanceof ServiceProvider)) { | ||
| throw new Error('Application: provider closure must return a ServiceProvider instance.') | ||
| } | ||
| return result | ||
| } | ||
| throw new Error( | ||
| 'Application: provider entry must be a ServiceProvider, a constructor, or a closure.', | ||
| ) | ||
| } | ||
| /** Resolve an ordered list of entries to instances, preserving order. */ | ||
| export async function resolveProviders( | ||
| entries: readonly ServiceProviderEntry[], | ||
| ): Promise<ServiceProvider[]> { | ||
| const resolved: ServiceProvider[] = [] | ||
| for (const entry of entries) resolved.push(await resolveProviderEntry(entry)) | ||
| return resolved | ||
| } |
144238
0.45%3528
0.54%