-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(ioc): rewritten IoC package to use implicit deps
- Loading branch information
Showing
10 changed files
with
93 additions
and
152 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,34 @@ | ||
import { ResolveDeps, ResolveResult } from './Container.js'; | ||
import { InjectableOptions } from './Injectable.js'; | ||
import { Container } from './Container.js'; | ||
import { Injectable, InjectableOptions } from './Injectable.js'; | ||
import { Resolvable } from './Resolvable.js'; | ||
|
||
export class Executable<T, TDeps extends ResolveDeps> extends Resolvable<() => T, TDeps> { | ||
constructor(private readonly def: ExecutableDefinition<T, TDeps>) { | ||
export class Executable<T> extends Resolvable<() => T> { | ||
constructor(private readonly def: ExecutableDefinition<T>) { | ||
super(def); | ||
} | ||
|
||
public override get cached() { | ||
return true; | ||
} | ||
|
||
override resolve(deps: ResolveResult): () => T { | ||
return () => this.def.setup(deps as ResolveResult<TDeps>); | ||
public override resolve(container: Container) { | ||
return () => | ||
this.def.setup({ | ||
container, | ||
inject: injectable => container.resolve(injectable), | ||
}); | ||
} | ||
} | ||
|
||
public execute(deps: ResolveResult<TDeps>): void { | ||
this.def.setup(deps); | ||
} | ||
export interface ExecutableContext { | ||
readonly container: Container; | ||
readonly inject: <T>(injectable: Injectable<T>) => T; | ||
} | ||
|
||
export interface ExecutableDefinition<T, TDeps extends ResolveDeps = ResolveDeps> | ||
extends InjectableOptions { | ||
readonly deps: TDeps; | ||
readonly setup: (deps: ResolveResult<TDeps>) => T; | ||
export interface ExecutableDefinition<T> extends InjectableOptions { | ||
readonly setup: (ctx: ExecutableContext) => T; | ||
} | ||
|
||
export function defineExecutable<T, TDeps extends ResolveDeps>( | ||
definition: ExecutableDefinition<T, TDeps>, | ||
): Executable<T, TDeps> { | ||
export function defineExecutable<T>(definition: ExecutableDefinition<T>): Executable<T> { | ||
return new Executable(definition); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,34 +1,35 @@ | ||
import { EmptyObject } from '@nzyme/types'; | ||
|
||
import { ResolveDeps, ResolveResult } from './Container.js'; | ||
import { Container } from './Container.js'; | ||
import { Injectable } from './Injectable.js'; | ||
import { Resolvable, ResolvableOptions } from './Resolvable.js'; | ||
|
||
export class Factory<T, TDeps extends ResolveDeps = ResolveDeps> extends Resolvable<T, TDeps> { | ||
constructor(private readonly def: FactoryOptions<T, TDeps>) { | ||
export class Factory<T> extends Resolvable<T> { | ||
constructor(private readonly def: FactoryOptions<T>) { | ||
super(def); | ||
} | ||
|
||
public override get cached() { | ||
return false; | ||
} | ||
|
||
override resolve(deps: ResolveResult, scope?: Injectable): T { | ||
return this.def.setup(deps as ResolveResult<TDeps>, scope); | ||
public override resolve(container: Container, scope?: Injectable) { | ||
return this.def.setup({ | ||
container, | ||
scope, | ||
inject: injectable => container.resolve(injectable), | ||
}); | ||
} | ||
} | ||
|
||
public create(deps: ResolveResult<TDeps>): T { | ||
return this.def.setup(deps); | ||
} | ||
export interface FactoryContext { | ||
readonly container: Container; | ||
readonly scope?: Injectable; | ||
readonly inject: <T>(injectable: Injectable<T>) => T; | ||
} | ||
|
||
export interface FactoryOptions<T, TDeps extends ResolveDeps = EmptyObject> | ||
extends ResolvableOptions<T, TDeps> { | ||
readonly setup: (deps: ResolveResult<TDeps>, scope?: Injectable) => T; | ||
export interface FactoryOptions<T> extends ResolvableOptions<T> { | ||
readonly setup: (ctx: FactoryContext) => T; | ||
} | ||
|
||
export function defineFactory<T, TDeps extends ResolveDeps = EmptyObject>( | ||
definition: FactoryOptions<T, TDeps>, | ||
): Factory<T, TDeps> { | ||
export function defineFactory<T>(definition: FactoryOptions<T>): Factory<T> { | ||
return new Factory(definition); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,18 @@ | ||
import { EmptyObject } from '@nzyme/types'; | ||
|
||
import { ResolveDeps } from './Container.js'; | ||
import { Container } from './Container.js'; | ||
import { Injectable, InjectableOptions } from './Injectable.js'; | ||
|
||
export abstract class Resolvable< | ||
T = unknown, | ||
TDeps extends ResolveDeps = ResolveDeps, | ||
> extends Injectable<T> { | ||
export abstract class Resolvable<T = unknown> extends Injectable<T> { | ||
public readonly for?: Injectable<T>; | ||
public readonly deps: TDeps; | ||
|
||
constructor(def: ResolvableOptions<T, TDeps>) { | ||
constructor(def: ResolvableOptions<T>) { | ||
super(def); | ||
this.for = def.for; | ||
this.deps = def.deps ?? ({} as TDeps); | ||
} | ||
|
||
public abstract get cached(): boolean; | ||
public abstract resolve(deps: TDeps, scope?: Injectable): T | undefined; | ||
public abstract resolve(container: Container, scope?: Injectable): T | undefined; | ||
} | ||
|
||
export interface ResolvableOptions<T, TDeps extends ResolveDeps = EmptyObject> | ||
extends InjectableOptions { | ||
readonly deps?: TDeps; | ||
export interface ResolvableOptions<T> extends InjectableOptions { | ||
readonly for?: Injectable<T>; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,33 @@ | ||
import { EmptyObject } from '@nzyme/types'; | ||
|
||
import { ResolveDeps, ResolveResult } from './Container.js'; | ||
import { Container } from './Container.js'; | ||
import { Injectable } from './Injectable.js'; | ||
import { Resolvable, ResolvableOptions } from './Resolvable.js'; | ||
|
||
export class Service<T, TDeps extends ResolveDeps = ResolveDeps> extends Resolvable<T, TDeps> { | ||
constructor(private readonly def: ServiceOptions<T, TDeps>) { | ||
export class Service<T> extends Resolvable<T> { | ||
constructor(private readonly def: ServiceOptions<T>) { | ||
super(def); | ||
} | ||
|
||
public override get cached() { | ||
return true; | ||
} | ||
|
||
override resolve(deps: ResolveResult): T { | ||
return this.def.setup(deps as ResolveResult<TDeps>); | ||
public override resolve(container: Container) { | ||
return this.def.setup({ | ||
container, | ||
inject: injectable => container.resolve(injectable), | ||
}); | ||
} | ||
} | ||
|
||
public create(deps: ResolveResult<TDeps>): T { | ||
return this.def.setup(deps); | ||
} | ||
export interface ServiceContext { | ||
readonly container: Container; | ||
readonly inject: <T>(injectable: Injectable<T>) => T; | ||
} | ||
|
||
export interface ServiceOptions<T, TDeps extends ResolveDeps = EmptyObject> | ||
extends ResolvableOptions<T, TDeps> { | ||
readonly setup: (deps: ResolveResult<TDeps>) => T; | ||
export interface ServiceOptions<T> extends ResolvableOptions<T> { | ||
readonly setup: (ctx: ServiceContext) => T; | ||
} | ||
|
||
export function defineService<T, TDeps extends ResolveDeps = EmptyObject>( | ||
definition: ServiceOptions<T, TDeps>, | ||
): Service<T, TDeps> { | ||
export function defineService<T>(definition: ServiceOptions<T>): Service<T> { | ||
return new Service(definition); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.