Skip to content

Commit

Permalink
refactor: extract reserved providers
Browse files Browse the repository at this point in the history
  • Loading branch information
exuanbo committed Oct 15, 2024
1 parent 3062f47 commit 7ea7ffa
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 5 deletions.
15 changes: 11 additions & 4 deletions src/container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,15 @@ import {assert, ErrorMessage, expectNever} from "./errors";
import type {Injection, Injections} from "./injection";
import {useInjectionContext, withInjectionContext} from "./injection-context";
import {getMetadata} from "./metadata";
import {type InjectionProvider, isClassProvider, isFactoryProvider, isProvider, isValueProvider} from "./provider";
import {
type InjectionProvider,
isClassProvider,
isFactoryProvider,
isProvider,
isValueProvider,
NullProvider,
UndefinedProvider,
} from "./provider";
import {InjectionScope} from "./scope";
import {type Constructor, type InjectionToken, isConstructor, Type} from "./token";
import {Stack} from "./utils/stack";
Expand All @@ -20,8 +28,8 @@ export interface ContainerOptions {
export class Container {
#reservedRegistry = new ProviderRegistry([
[Type.Any, null!],
[Type.Null, {token: Type.Null, useValue: null}],
[Type.Undefined, {token: Type.Undefined, useValue: undefined}],
[Type.Null, NullProvider],
[Type.Undefined, UndefinedProvider],
]);

#providerRegistry = new ProviderRegistry();
Expand Down Expand Up @@ -160,7 +168,6 @@ export class Container {
if (provider) {
return provider;
}
return this.parent?.resolveProvider(token);
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export interface InjectionMetadata<This extends object = any> {
tokens: InjectionToken<This>[];
}

class InjectionMetadataRegistry {
export class InjectionMetadataRegistry {
#map = new WeakMap<DecoratorMetadata, InjectionMetadata>();

get<T extends object>(key: DecoratorMetadata): InjectionMetadata<T> | undefined {
Expand Down
12 changes: 12 additions & 0 deletions src/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,18 @@ export function defineProvider<Value>(provider: InjectionProvider<Value>): Injec
return provider;
}

// @internal
export const NullProvider = defineProvider({
token: Type.Null,
useValue: null,
});

// @internal
export const UndefinedProvider = defineProvider({
token: Type.Undefined,
useValue: undefined,
});

// @internal
export function isProvider<T>(injection: Injection<T>) {
return (
Expand Down

0 comments on commit 7ea7ffa

Please sign in to comment.