Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@strav/kernel

Package Overview
Dependencies
Maintainers
1
Versions
110
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@strav/kernel - npm Package Compare versions

Comparing version
1.0.0-alpha.42
to
1.0.0-alpha.43
+1
-1
package.json
{
"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
}