@codefast/di 0.5.0-canary.9 → 0.6.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 +865 -0
- package/README.md +119 -30
- package/dist/ambient/active-container.d.ts +37 -0
- package/dist/ambient/active-container.d.ts.map +1 -0
- package/dist/ambient/active-container.js +41 -0
- package/dist/ambient/active-container.js.map +1 -0
- package/dist/container/binding-builders.d.ts +12 -8
- package/dist/container/binding-builders.d.ts.map +1 -1
- package/dist/container/binding-builders.js +56 -31
- package/dist/container/binding-builders.js.map +1 -1
- package/dist/container/container.d.ts +33 -19
- package/dist/container/container.d.ts.map +1 -1
- package/dist/container/container.js +279 -118
- package/dist/container/container.js.map +1 -1
- package/dist/{resolution → core}/binding-scope.d.ts +2 -2
- package/dist/core/binding-scope.d.ts.map +1 -0
- package/dist/core/binding-scope.js.map +1 -0
- package/dist/{binding.d.ts → core/binding.d.ts} +70 -15
- package/dist/core/binding.d.ts.map +1 -0
- package/dist/{binding.js → core/binding.js} +27 -12
- package/dist/core/binding.js.map +1 -0
- package/dist/core/constraint-requirement.d.ts +38 -0
- package/dist/core/constraint-requirement.d.ts.map +1 -0
- package/dist/core/constraint-requirement.js +28 -0
- package/dist/core/constraint-requirement.js.map +1 -0
- package/dist/{constructor-type.d.ts → core/constructor-type.d.ts} +1 -1
- package/dist/core/constructor-type.d.ts.map +1 -0
- package/dist/core/constructor-type.js.map +1 -0
- package/dist/{module.d.ts → core/module.d.ts} +5 -5
- package/dist/core/module.d.ts.map +1 -0
- package/dist/{module.js → core/module.js} +4 -4
- package/dist/core/module.js.map +1 -0
- package/dist/{registry.d.ts → core/registry.d.ts} +27 -7
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/{registry.js → core/registry.js} +125 -52
- package/dist/core/registry.js.map +1 -0
- package/dist/core/tag.d.ts +80 -0
- package/dist/core/tag.d.ts.map +1 -0
- package/dist/core/tag.js +84 -0
- package/dist/core/tag.js.map +1 -0
- package/dist/{token.d.ts → core/token.d.ts} +2 -6
- package/dist/core/token.d.ts.map +1 -0
- package/dist/core/token.js +13 -0
- package/dist/core/token.js.map +1 -0
- package/dist/{types.d.ts → core/types.d.ts} +27 -21
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js.map +1 -0
- package/dist/decorators/inject.d.ts +5 -49
- package/dist/decorators/inject.d.ts.map +1 -1
- package/dist/decorators/inject.js +34 -104
- package/dist/decorators/inject.js.map +1 -1
- package/dist/decorators/injectable.d.ts +25 -5
- package/dist/decorators/injectable.d.ts.map +1 -1
- package/dist/decorators/injectable.js +2 -3
- package/dist/decorators/injectable.js.map +1 -1
- package/dist/decorators/lifecycle-decorators.d.ts +4 -2
- package/dist/decorators/lifecycle-decorators.d.ts.map +1 -1
- package/dist/decorators/lifecycle-decorators.js +19 -25
- package/dist/decorators/lifecycle-decorators.js.map +1 -1
- package/dist/{resolution → errors}/diagnostics.d.ts +2 -0
- package/dist/errors/diagnostics.d.ts.map +1 -0
- package/dist/errors/diagnostics.js.map +1 -0
- package/dist/{errors.d.ts → errors/errors.d.ts} +89 -4
- package/dist/errors/errors.d.ts.map +1 -0
- package/dist/{errors.js → errors/errors.js} +129 -7
- package/dist/errors/errors.js.map +1 -0
- package/dist/index.d.ts +21 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/injection/descriptor.d.ts +79 -0
- package/dist/injection/descriptor.d.ts.map +1 -0
- package/dist/injection/descriptor.js +118 -0
- package/dist/injection/descriptor.js.map +1 -0
- package/dist/{resolution → injection}/resolve-options.d.ts +21 -11
- package/dist/injection/resolve-options.d.ts.map +1 -0
- package/dist/injection/resolve-options.js +101 -0
- package/dist/injection/resolve-options.js.map +1 -0
- package/dist/introspection/dependency-graph.d.ts +16 -5
- package/dist/introspection/dependency-graph.d.ts.map +1 -1
- package/dist/introspection/dependency-graph.js +138 -57
- package/dist/introspection/dependency-graph.js.map +1 -1
- package/dist/introspection/graph-adapters/cytoscape.d.ts +6 -3
- package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -1
- package/dist/introspection/graph-adapters/cytoscape.js +3 -0
- package/dist/introspection/graph-adapters/cytoscape.js.map +1 -1
- package/dist/introspection/graph-adapters/dot.d.ts.map +1 -1
- package/dist/introspection/graph-adapters/dot.js +12 -5
- package/dist/introspection/graph-adapters/dot.js.map +1 -1
- package/dist/introspection/graph-adapters/mermaid.d.ts +9 -0
- package/dist/introspection/graph-adapters/mermaid.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/mermaid.js +47 -0
- package/dist/introspection/graph-adapters/mermaid.js.map +1 -0
- package/dist/introspection/graph-adapters/reactflow.d.ts +6 -3
- package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -1
- package/dist/introspection/graph-adapters/reactflow.js +5 -1
- package/dist/introspection/graph-adapters/reactflow.js.map +1 -1
- package/dist/introspection/inspector.d.ts +4 -4
- package/dist/introspection/inspector.d.ts.map +1 -1
- package/dist/introspection/inspector.js +10 -6
- package/dist/introspection/inspector.js.map +1 -1
- package/dist/lifecycle/lifecycle-manager.d.ts +27 -0
- package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -0
- package/dist/{resolution/lifecycle.js → lifecycle/lifecycle-manager.js} +39 -9
- package/dist/lifecycle/lifecycle-manager.js.map +1 -0
- package/dist/lifecycle/scope-manager.d.ts +48 -0
- package/dist/lifecycle/scope-manager.d.ts.map +1 -0
- package/dist/lifecycle/scope-manager.js +135 -0
- package/dist/lifecycle/scope-manager.js.map +1 -0
- package/dist/metadata/metadata-reader-token.d.ts +1 -1
- package/dist/metadata/metadata-reader-token.d.ts.map +1 -1
- package/dist/metadata/metadata-reader-token.js +1 -1
- package/dist/metadata/metadata-reader-token.js.map +1 -1
- package/dist/metadata/metadata-types.d.ts +9 -9
- package/dist/metadata/metadata-types.d.ts.map +1 -1
- package/dist/metadata/symbol-metadata-reader.d.ts +19 -6
- package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -1
- package/dist/metadata/symbol-metadata-reader.js +89 -9
- package/dist/metadata/symbol-metadata-reader.js.map +1 -1
- package/dist/metadata/verifying-metadata-reader.d.ts +16 -0
- package/dist/metadata/verifying-metadata-reader.d.ts.map +1 -0
- package/dist/metadata/verifying-metadata-reader.js +32 -0
- package/dist/metadata/verifying-metadata-reader.js.map +1 -0
- package/dist/resolution/{activation-need.d.ts → cache/activation-need.d.ts} +5 -5
- package/dist/resolution/cache/activation-need.d.ts.map +1 -0
- package/dist/resolution/cache/activation-need.js.map +1 -0
- package/dist/resolution/{binding-lookup-cache.d.ts → cache/binding-lookup-cache.d.ts} +6 -5
- package/dist/resolution/cache/binding-lookup-cache.d.ts.map +1 -0
- package/dist/resolution/cache/binding-lookup-cache.js.map +1 -0
- package/dist/resolution/cache/class-introspector.d.ts +66 -0
- package/dist/resolution/cache/class-introspector.d.ts.map +1 -0
- package/dist/resolution/cache/class-introspector.js +194 -0
- package/dist/resolution/cache/class-introspector.js.map +1 -0
- package/dist/resolution/context.d.ts +84 -0
- package/dist/resolution/context.d.ts.map +1 -0
- package/dist/resolution/{environment.js → context.js} +54 -80
- package/dist/resolution/context.js.map +1 -0
- package/dist/resolution/path/resolution-path.d.ts +94 -0
- package/dist/resolution/path/resolution-path.d.ts.map +1 -0
- package/dist/resolution/path/resolution-path.js +117 -0
- package/dist/resolution/path/resolution-path.js.map +1 -0
- package/dist/resolution/{instantiation-plan.d.ts → plan/instantiation-plan.d.ts} +30 -7
- package/dist/resolution/plan/instantiation-plan.d.ts.map +1 -0
- package/dist/resolution/plan/instantiation-plan.js +390 -0
- package/dist/resolution/plan/instantiation-plan.js.map +1 -0
- package/dist/resolution/resolver.d.ts +28 -28
- package/dist/resolution/resolver.d.ts.map +1 -1
- package/dist/resolution/resolver.js +552 -239
- package/dist/resolution/resolver.js.map +1 -1
- package/dist/resolution/select/binding-select.d.ts +34 -0
- package/dist/resolution/select/binding-select.d.ts.map +1 -0
- package/dist/resolution/select/binding-select.js +175 -0
- package/dist/resolution/select/binding-select.js.map +1 -0
- package/dist/resolution/{constraints.d.ts → select/constraints.d.ts} +13 -12
- package/dist/resolution/select/constraints.d.ts.map +1 -0
- package/dist/resolution/{constraints.js → select/constraints.js} +33 -22
- package/dist/resolution/select/constraints.js.map +1 -0
- package/package.json +160 -20
- package/src/ambient/active-container.ts +65 -0
- package/src/container/binding-builders.ts +72 -44
- package/src/container/container.ts +355 -170
- package/src/{resolution → core}/binding-scope.ts +2 -2
- package/src/{binding.ts → core/binding.ts} +101 -39
- package/src/core/constraint-requirement.ts +51 -0
- package/src/{constructor-type.ts → core/constructor-type.ts} +1 -1
- package/src/{module.ts → core/module.ts} +10 -10
- package/src/core/registry.ts +365 -0
- package/src/core/tag.ts +144 -0
- package/src/{token.ts → core/token.ts} +2 -14
- package/src/{types.ts → core/types.ts} +37 -34
- package/src/decorators/inject.ts +39 -175
- package/src/decorators/injectable.ts +40 -10
- package/src/decorators/lifecycle-decorators.ts +22 -34
- package/src/{resolution → errors}/diagnostics.ts +2 -0
- package/src/{errors.ts → errors/errors.ts} +152 -8
- package/src/index.ts +43 -15
- package/src/injection/descriptor.ts +206 -0
- package/src/injection/resolve-options.ts +144 -0
- package/src/introspection/dependency-graph.ts +223 -63
- package/src/introspection/graph-adapters/cytoscape.ts +9 -3
- package/src/introspection/graph-adapters/dot.ts +13 -5
- package/src/introspection/graph-adapters/mermaid.ts +61 -0
- package/src/introspection/graph-adapters/reactflow.ts +11 -4
- package/src/introspection/inspector.ts +16 -12
- package/src/{resolution/lifecycle.ts → lifecycle/lifecycle-manager.ts} +68 -32
- package/src/lifecycle/scope-manager.ts +156 -0
- package/src/metadata/metadata-reader-token.ts +2 -2
- package/src/metadata/metadata-types.ts +9 -9
- package/src/metadata/symbol-metadata-reader.ts +95 -18
- package/src/metadata/verifying-metadata-reader.ts +41 -0
- package/src/resolution/{activation-need.ts → cache/activation-need.ts} +8 -8
- package/src/resolution/{binding-lookup-cache.ts → cache/binding-lookup-cache.ts} +6 -5
- package/src/resolution/cache/class-introspector.ts +251 -0
- package/src/resolution/{environment.ts → context.ts} +84 -145
- package/src/resolution/path/resolution-path.ts +167 -0
- package/src/resolution/plan/instantiation-plan.ts +579 -0
- package/src/resolution/resolver.ts +635 -313
- package/src/resolution/select/binding-select.ts +210 -0
- package/src/resolution/select/constraints.ts +130 -0
- package/dist/binding.d.ts.map +0 -1
- package/dist/binding.js.map +0 -1
- package/dist/constructor-type.d.ts.map +0 -1
- package/dist/constructor-type.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/module.d.ts.map +0 -1
- package/dist/module.js.map +0 -1
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js.map +0 -1
- package/dist/resolution/activation-need.d.ts.map +0 -1
- package/dist/resolution/activation-need.js.map +0 -1
- package/dist/resolution/binding-lookup-cache.d.ts.map +0 -1
- package/dist/resolution/binding-lookup-cache.js.map +0 -1
- package/dist/resolution/binding-scope.d.ts.map +0 -1
- package/dist/resolution/binding-scope.js.map +0 -1
- package/dist/resolution/binding-select.d.ts +0 -23
- package/dist/resolution/binding-select.d.ts.map +0 -1
- package/dist/resolution/binding-select.js +0 -121
- package/dist/resolution/binding-select.js.map +0 -1
- package/dist/resolution/class-introspector.d.ts +0 -27
- package/dist/resolution/class-introspector.d.ts.map +0 -1
- package/dist/resolution/class-introspector.js +0 -60
- package/dist/resolution/class-introspector.js.map +0 -1
- package/dist/resolution/constraints.d.ts.map +0 -1
- package/dist/resolution/constraints.js.map +0 -1
- package/dist/resolution/diagnostics.d.ts.map +0 -1
- package/dist/resolution/diagnostics.js.map +0 -1
- package/dist/resolution/environment.d.ts +0 -94
- package/dist/resolution/environment.d.ts.map +0 -1
- package/dist/resolution/environment.js.map +0 -1
- package/dist/resolution/instantiation-plan.d.ts.map +0 -1
- package/dist/resolution/instantiation-plan.js +0 -183
- package/dist/resolution/instantiation-plan.js.map +0 -1
- package/dist/resolution/lifecycle.d.ts +0 -23
- package/dist/resolution/lifecycle.d.ts.map +0 -1
- package/dist/resolution/lifecycle.js.map +0 -1
- package/dist/resolution/resolution-path.d.ts +0 -98
- package/dist/resolution/resolution-path.d.ts.map +0 -1
- package/dist/resolution/resolution-path.js +0 -98
- package/dist/resolution/resolution-path.js.map +0 -1
- package/dist/resolution/resolve-options.d.ts.map +0 -1
- package/dist/resolution/resolve-options.js +0 -56
- package/dist/resolution/resolve-options.js.map +0 -1
- package/dist/resolution/scope.d.ts +0 -28
- package/dist/resolution/scope.d.ts.map +0 -1
- package/dist/resolution/scope.js +0 -88
- package/dist/resolution/scope.js.map +0 -1
- package/dist/token.d.ts.map +0 -1
- package/dist/token.js +0 -22
- package/dist/token.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/src/registry.ts +0 -282
- package/src/resolution/binding-select.ts +0 -154
- package/src/resolution/class-introspector.ts +0 -74
- package/src/resolution/constraints.ts +0 -121
- package/src/resolution/instantiation-plan.ts +0 -292
- package/src/resolution/resolution-path.ts +0 -156
- package/src/resolution/resolve-options.ts +0 -89
- package/src/resolution/scope.ts +0 -105
- /package/dist/{resolution → core}/binding-scope.js +0 -0
- /package/dist/{constructor-type.js → core/constructor-type.js} +0 -0
- /package/dist/{types.js → core/types.js} +0 -0
- /package/dist/{resolution → errors}/diagnostics.js +0 -0
- /package/dist/resolution/{activation-need.js → cache/activation-need.js} +0 -0
- /package/dist/resolution/{binding-lookup-cache.js → cache/binding-lookup-cache.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-reader-token.js","sourceRoot":"","sources":["../../src/metadata/metadata-reader-token.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metadata-reader-token.js","sourceRoot":"","sources":["../../src/metadata/metadata-reader-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAIrC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA0B,KAAK,CAAiB,gBAAgB,CAAC,CAAC"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
1
|
+
import type { Constructor } from "#/core/types";
|
|
2
|
+
import type { InjectionDescriptor } from "#/injection/descriptor";
|
|
3
|
+
import type { DependencySlot } from "#/injection/resolve-options";
|
|
4
4
|
/**
|
|
5
|
+
* One constructor parameter's declaration.
|
|
6
|
+
*
|
|
7
|
+
* @remarks Extends {@link DependencySlot} so the two dependency sources stay literally one shape
|
|
8
|
+
* rather than two that happen to match; `index` is the only thing a parameter adds.
|
|
9
|
+
*
|
|
5
10
|
* @since 0.3.16-canary.0
|
|
6
11
|
*/
|
|
7
|
-
export interface ParamMetadata {
|
|
12
|
+
export interface ParamMetadata extends DependencySlot {
|
|
8
13
|
readonly index: number;
|
|
9
|
-
readonly token: Token<unknown> | Constructor;
|
|
10
|
-
readonly optional: boolean;
|
|
11
|
-
readonly multi: boolean;
|
|
12
|
-
readonly name?: string;
|
|
13
|
-
readonly tags?: ReadonlyArray<readonly [string, unknown]>;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* @since 0.3.16-canary.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-types.d.ts","sourceRoot":"","sources":["../../src/metadata/metadata-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"metadata-types.d.ts","sourceRoot":"","sources":["../../src/metadata/metadata-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAC7E,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACzE,mBAAmB,CAAC,CAClB,MAAM,EAAE,WAAW,GAClB,aAAa,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;CAC3G"}
|
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Constructor } from "#/core/types";
|
|
2
|
+
import type { InjectionDescriptor } from "#/injection/descriptor";
|
|
2
3
|
import type { ConstructorMetadata, LifecycleMetadata, MetadataReader } from "#/metadata/metadata-types";
|
|
3
|
-
|
|
4
|
+
type AccessorEntry = {
|
|
5
|
+
readonly key: string | symbol;
|
|
6
|
+
readonly descriptor: InjectionDescriptor;
|
|
7
|
+
};
|
|
4
8
|
/**
|
|
5
9
|
* @since 0.3.16-canary.0
|
|
6
10
|
*/
|
|
7
11
|
export declare class SymbolMetadataReader implements MetadataReader {
|
|
8
12
|
#private;
|
|
9
13
|
getConstructorMetadata(target: Constructor): ConstructorMetadata | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Lifecycle hooks aggregated over the base chain — an inherited hook method exists on the instance.
|
|
16
|
+
*
|
|
17
|
+
* @remarks `postConstruct` runs base first (a derived hook may rely on base state); `preDestroy`
|
|
18
|
+
* runs derived first, mirroring teardown. A method name repeated across levels runs once.
|
|
19
|
+
*/
|
|
10
20
|
getLifecycleMetadata(target: Constructor): LifecycleMetadata | undefined;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Accessor injections aggregated over the base chain, base first — the order initializers run.
|
|
23
|
+
*
|
|
24
|
+
* @remarks Not deduplicated: a derived accessor shadowing a base one still runs both initializers.
|
|
25
|
+
*/
|
|
26
|
+
getAccessorMetadata(target: Constructor): ReadonlyArray<AccessorEntry> | undefined;
|
|
15
27
|
}
|
|
16
28
|
/**
|
|
17
29
|
* @since 0.3.16-canary.0
|
|
18
30
|
*/
|
|
19
31
|
export declare const defaultMetadataReader: SymbolMetadataReader;
|
|
32
|
+
export {};
|
|
20
33
|
//# sourceMappingURL=symbol-metadata-reader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-metadata-reader.d.ts","sourceRoot":"","sources":["../../src/metadata/symbol-metadata-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"symbol-metadata-reader.d.ts","sourceRoot":"","sources":["../../src/metadata/symbol-metadata-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAExG,KAAK,aAAa,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEjG;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;;IAsCzD,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAE3E;IAED;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAmBvE;IAED;;;;OAIG;IACH,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC,GAAG,SAAS,CAgBjF;CACF;AAiBD;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,oBAAiD,CAAC"}
|
|
@@ -3,29 +3,109 @@ import { INJECT_ACCESSOR_KEY, INJECTABLE_KEY, LIFECYCLE_KEY, METADATA_SYMBOL } f
|
|
|
3
3
|
* @since 0.3.16-canary.0
|
|
4
4
|
*/
|
|
5
5
|
export class SymbolMetadataReader {
|
|
6
|
-
|
|
6
|
+
// Merged chain answers, cached per class: decorator metadata cannot change once a class is defined.
|
|
7
|
+
#lifecycleByClass;
|
|
8
|
+
#accessorsByClass;
|
|
9
|
+
/**
|
|
10
|
+
* Whatever a decorator stored under `key` on this exact class, narrowed as far as the platform allows.
|
|
11
|
+
*
|
|
12
|
+
* @remarks Own-property only: an inherited `Symbol.metadata` belongs to the base class. Constructor
|
|
13
|
+
* metadata must not be borrowed (each class opts into its deps); the lifecycle and accessor readers
|
|
14
|
+
* walk the base chain themselves, because the platform runs inherited members regardless.
|
|
15
|
+
*/
|
|
16
|
+
#read(target, key) {
|
|
7
17
|
const descriptor = Object.getOwnPropertyDescriptor(target, METADATA_SYMBOL);
|
|
8
18
|
if (descriptor === undefined) {
|
|
9
19
|
return undefined;
|
|
10
20
|
}
|
|
11
21
|
const record = descriptor.value;
|
|
12
|
-
if (
|
|
22
|
+
if (typeof record !== "object" || record === null || !Object.hasOwn(record, key)) {
|
|
13
23
|
return undefined;
|
|
14
24
|
}
|
|
15
|
-
return record;
|
|
25
|
+
return Reflect.get(record, key);
|
|
26
|
+
}
|
|
27
|
+
/** Each class level's own bucket under `key`, base first — the order construction runs them. */
|
|
28
|
+
#ownBucketsBaseFirst(target, key) {
|
|
29
|
+
const buckets = [];
|
|
30
|
+
let current = target;
|
|
31
|
+
while (typeof current === "function" && current !== Function.prototype) {
|
|
32
|
+
const bucket = this.#read(current, key);
|
|
33
|
+
if (bucket !== undefined) {
|
|
34
|
+
buckets.unshift(bucket);
|
|
35
|
+
}
|
|
36
|
+
current = Object.getPrototypeOf(current);
|
|
37
|
+
}
|
|
38
|
+
return buckets;
|
|
16
39
|
}
|
|
17
40
|
getConstructorMetadata(target) {
|
|
18
|
-
|
|
19
|
-
return record?.[INJECTABLE_KEY];
|
|
41
|
+
return this.#read(target, INJECTABLE_KEY);
|
|
20
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Lifecycle hooks aggregated over the base chain — an inherited hook method exists on the instance.
|
|
45
|
+
*
|
|
46
|
+
* @remarks `postConstruct` runs base first (a derived hook may rely on base state); `preDestroy`
|
|
47
|
+
* runs derived first, mirroring teardown. A method name repeated across levels runs once.
|
|
48
|
+
*/
|
|
21
49
|
getLifecycleMetadata(target) {
|
|
22
|
-
const
|
|
23
|
-
|
|
50
|
+
const cached = this.#lifecycleByClass?.get(target);
|
|
51
|
+
if (cached !== undefined) {
|
|
52
|
+
return cached ?? undefined;
|
|
53
|
+
}
|
|
54
|
+
const buckets = this.#ownBucketsBaseFirst(target, LIFECYCLE_KEY);
|
|
55
|
+
let merged;
|
|
56
|
+
if (buckets.length === 0) {
|
|
57
|
+
merged = null;
|
|
58
|
+
}
|
|
59
|
+
else if (buckets.length === 1) {
|
|
60
|
+
merged = buckets[0];
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
merged = {
|
|
64
|
+
postConstruct: mergeUniqueNames(buckets.map((bucket) => bucket.postConstruct)),
|
|
65
|
+
preDestroy: mergeUniqueNames(buckets.map((bucket) => bucket.preDestroy).reverse()),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
(this.#lifecycleByClass ??= new WeakMap()).set(target, merged);
|
|
69
|
+
return merged ?? undefined;
|
|
24
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Accessor injections aggregated over the base chain, base first — the order initializers run.
|
|
73
|
+
*
|
|
74
|
+
* @remarks Not deduplicated: a derived accessor shadowing a base one still runs both initializers.
|
|
75
|
+
*/
|
|
25
76
|
getAccessorMetadata(target) {
|
|
26
|
-
const
|
|
27
|
-
|
|
77
|
+
const cached = this.#accessorsByClass?.get(target);
|
|
78
|
+
if (cached !== undefined) {
|
|
79
|
+
return cached ?? undefined;
|
|
80
|
+
}
|
|
81
|
+
const buckets = this.#ownBucketsBaseFirst(target, INJECT_ACCESSOR_KEY);
|
|
82
|
+
let merged;
|
|
83
|
+
if (buckets.length === 0) {
|
|
84
|
+
merged = null;
|
|
85
|
+
}
|
|
86
|
+
else if (buckets.length === 1) {
|
|
87
|
+
merged = buckets[0];
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
merged = buckets.flat();
|
|
91
|
+
}
|
|
92
|
+
(this.#accessorsByClass ??= new WeakMap()).set(target, merged);
|
|
93
|
+
return merged ?? undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Concatenates hook-name lists in the given order, keeping each name's first occurrence. */
|
|
97
|
+
function mergeUniqueNames(lists) {
|
|
98
|
+
const seen = new Set();
|
|
99
|
+
const merged = [];
|
|
100
|
+
for (const list of lists) {
|
|
101
|
+
for (const name of list) {
|
|
102
|
+
if (!seen.has(name)) {
|
|
103
|
+
seen.add(name);
|
|
104
|
+
merged.push(name);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
28
107
|
}
|
|
108
|
+
return merged;
|
|
29
109
|
}
|
|
30
110
|
/**
|
|
31
111
|
* @since 0.3.16-canary.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-metadata-reader.js","sourceRoot":"","sources":["../../src/metadata/symbol-metadata-reader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"symbol-metadata-reader.js","sourceRoot":"","sources":["../../src/metadata/symbol-metadata-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a foreign {@link MetadataReader} so its answers are verified before anything dereferences
|
|
3
|
+
* them.
|
|
4
|
+
*/
|
|
5
|
+
import type { MetadataReader } from "#/metadata/metadata-types";
|
|
6
|
+
/**
|
|
7
|
+
* The reader a container should hand its resolver: verified when it came from outside.
|
|
8
|
+
*
|
|
9
|
+
* @remarks The decorator reader writes the metadata it later reads, so there is nothing to check and
|
|
10
|
+
* nothing to pay — a container that supplies no reader of its own is left on the same code path it
|
|
11
|
+
* has always taken. A supplied reader is a claim, and only its callers can be charged for checking.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.6.0
|
|
14
|
+
*/
|
|
15
|
+
export declare function verifyingMetadataReader(reader: MetadataReader): MetadataReader;
|
|
16
|
+
//# sourceMappingURL=verifying-metadata-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifying-metadata-reader.d.ts","sourceRoot":"","sources":["../../src/metadata/verifying-metadata-reader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAWhE;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAe9E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a foreign {@link MetadataReader} so its answers are verified before anything dereferences
|
|
3
|
+
* them.
|
|
4
|
+
*/
|
|
5
|
+
import { defaultMetadataReader } from "#/metadata/symbol-metadata-reader";
|
|
6
|
+
import { verifyAccessorMetadata, verifyConstructorMetadata, verifyLifecycleMetadata, } from "#/resolution/cache/class-introspector";
|
|
7
|
+
// Wrapping a wrapper would stack a layer per child container, so each one is remembered.
|
|
8
|
+
const verifyingReaders = new WeakSet();
|
|
9
|
+
/**
|
|
10
|
+
* The reader a container should hand its resolver: verified when it came from outside.
|
|
11
|
+
*
|
|
12
|
+
* @remarks The decorator reader writes the metadata it later reads, so there is nothing to check and
|
|
13
|
+
* nothing to pay — a container that supplies no reader of its own is left on the same code path it
|
|
14
|
+
* has always taken. A supplied reader is a claim, and only its callers can be charged for checking.
|
|
15
|
+
*
|
|
16
|
+
* @since 0.6.0
|
|
17
|
+
*/
|
|
18
|
+
export function verifyingMetadataReader(reader) {
|
|
19
|
+
if (reader === defaultMetadataReader || verifyingReaders.has(reader)) {
|
|
20
|
+
return reader;
|
|
21
|
+
}
|
|
22
|
+
const verifying = {
|
|
23
|
+
getConstructorMetadata: (target) => verifyConstructorMetadata(reader, target),
|
|
24
|
+
getLifecycleMetadata: (target) => verifyLifecycleMetadata(reader, target),
|
|
25
|
+
...(reader.getAccessorMetadata === undefined
|
|
26
|
+
? {}
|
|
27
|
+
: { getAccessorMetadata: (target) => verifyAccessorMetadata(reader, target) }),
|
|
28
|
+
};
|
|
29
|
+
verifyingReaders.add(verifying);
|
|
30
|
+
return verifying;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=verifying-metadata-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifying-metadata-reader.js","sourceRoot":"","sources":["../../src/metadata/verifying-metadata-reader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,uCAAuC,CAAC;AAE/C,yFAAyF;AACzF,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAsB;IAC5D,IAAI,MAAM,KAAK,qBAAqB,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,SAAS,GAAmB;QAChC,sBAAsB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC;QAC7E,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,mBAAmB,KAAK,SAAS;YAC1C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;KACjF,CAAC;IAEF,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
* @remarks Versioned on the lifecycle manager plus the own registry, since `onActivation` can be
|
|
5
5
|
* registered at any time and a rebind mints binding ids the memo must not keep forever.
|
|
6
6
|
*/
|
|
7
|
-
import type { Binding } from "#/binding";
|
|
8
|
-
import type { BindingRegistry } from "#/registry";
|
|
9
|
-
import type {
|
|
10
|
-
import type {
|
|
7
|
+
import type { Binding } from "#/core/binding";
|
|
8
|
+
import type { BindingRegistry } from "#/core/registry";
|
|
9
|
+
import type { LifecycleManager } from "#/lifecycle/lifecycle-manager";
|
|
10
|
+
import type { ClassIntrospector } from "#/resolution/cache/class-introspector";
|
|
11
11
|
/**
|
|
12
12
|
* @since 0.5.0-canary.8
|
|
13
13
|
*/
|
|
14
14
|
export declare class ActivationNeedCache {
|
|
15
15
|
#private;
|
|
16
16
|
constructor(lifecycle: LifecycleManager, classes: ClassIntrospector, registry: BindingRegistry);
|
|
17
|
-
needsActivation<
|
|
17
|
+
needsActivation<Value>(binding: Binding<Value>): boolean;
|
|
18
18
|
/**
|
|
19
19
|
* Settles a class binding's answer once its lifecycle metadata has actually been read, which
|
|
20
20
|
* only happens on the first instantiation.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activation-need.d.ts","sourceRoot":"","sources":["../../../src/resolution/cache/activation-need.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE/E;;GAEG;AACH,qBAAa,mBAAmB;;IAO9B,YAAY,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAI7F;IAED,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CA0BvD;IAED;;;;;;OAMG;IACH,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,EAAE,OAAO,GAAG,OAAO,CAOhG;CAcF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activation-need.js","sourceRoot":"","sources":["../../../src/resolution/cache/activation-need.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Options-less token → terminal binding, memoized per container chain.
|
|
3
3
|
*
|
|
4
|
-
* @
|
|
4
|
+
* @remarks Each cache links to its parent's, so a child answers from its own chain without walking
|
|
5
|
+
* the container hierarchy again.
|
|
5
6
|
*/
|
|
6
|
-
import type { Binding } from "#/binding";
|
|
7
|
-
import type { BindingRegistry } from "#/registry";
|
|
8
|
-
import type { Token } from "#/token";
|
|
9
|
-
import type { Constructor } from "#/types";
|
|
7
|
+
import type { Binding } from "#/core/binding";
|
|
8
|
+
import type { BindingRegistry } from "#/core/registry";
|
|
9
|
+
import type { Token } from "#/core/token";
|
|
10
|
+
import type { Constructor } from "#/core/types";
|
|
10
11
|
/**
|
|
11
12
|
* A token's terminal binding with alias hops already folded, plus the container that owns it.
|
|
12
13
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding-lookup-cache.d.ts","sourceRoot":"","sources":["../../../src/resolution/cache/binding-lookup-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,KAAK,CAAC;AAOlC;;GAEG;AACH,qBAAa,kBAAkB,CAAC,KAAK;;IAenC,YAAY,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,EAIjG;IAED,6EAA6E;IAC7E,YAAY,IAAI,MAAM,CAMrB;IAED,mEAAmE;IACnE,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,IAAI,CAiBlF;IAED,kEAAkE;IAClE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,IAAI,CAe9F;CA2CF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding-lookup-cache.js","sourceRoot":"","sources":["../../../src/resolution/cache/binding-lookup-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-class decorator metadata, cached by constructor.
|
|
3
|
+
*
|
|
4
|
+
* @remarks Metadata cannot change once a class is defined, so nothing here needs version stamping.
|
|
5
|
+
*/
|
|
6
|
+
import type { AmbientResolution } from "#/ambient/active-container";
|
|
7
|
+
import type { Container } from "#/container/container";
|
|
8
|
+
import type { Constructor } from "#/core/types";
|
|
9
|
+
import type { InjectionDescriptor } from "#/injection/descriptor";
|
|
10
|
+
import type { ConstructorMetadata, LifecycleMetadata, MetadataReader } from "#/metadata/metadata-types";
|
|
11
|
+
/**
|
|
12
|
+
* A reader's constructor metadata for a class, verified the first time this process asks.
|
|
13
|
+
*
|
|
14
|
+
* @remarks Metadata cannot change once a class is defined, so re-checking per container would charge
|
|
15
|
+
* every fresh container for a fact already established — a per-request child or a cold boot pays
|
|
16
|
+
* that repeatedly.
|
|
17
|
+
*
|
|
18
|
+
* @since 0.6.0
|
|
19
|
+
*/
|
|
20
|
+
export declare function verifyConstructorMetadata(reader: MetadataReader, target: Constructor): ConstructorMetadata | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Verifies what a reader claims about a class, since a `MetadataReader` is a public seam.
|
|
23
|
+
*
|
|
24
|
+
* @remarks Every path that reads constructor metadata comes through here, so a reader that answers
|
|
25
|
+
* wrongly is a named error at the class it described rather than a `TypeError` raised later inside a
|
|
26
|
+
* resolve. Only what a consumer dereferences is checked: `params` and each entry's `token`.
|
|
27
|
+
* `optional`/`multi` degrade to falsy without crashing, and `index` is decorative — dependencies are
|
|
28
|
+
* consumed positionally.
|
|
29
|
+
*
|
|
30
|
+
* @since 0.6.0
|
|
31
|
+
*/
|
|
32
|
+
export declare function assertConstructorMetadata(metadata: unknown, target: Constructor): ConstructorMetadata | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* A reader's lifecycle metadata for a class, verified the first time this process asks.
|
|
35
|
+
*
|
|
36
|
+
* @since 0.6.0
|
|
37
|
+
*/
|
|
38
|
+
export declare function verifyLifecycleMetadata(reader: MetadataReader, target: Constructor): LifecycleMetadata | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* A reader's accessor metadata for a class, verified the first time this process asks.
|
|
41
|
+
*
|
|
42
|
+
* @since 0.6.0
|
|
43
|
+
*/
|
|
44
|
+
export declare function verifyAccessorMetadata(reader: MetadataReader, target: Constructor): ReadonlyArray<{
|
|
45
|
+
readonly key: string | symbol;
|
|
46
|
+
readonly descriptor: InjectionDescriptor;
|
|
47
|
+
}> | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* @since 0.5.0-canary.8
|
|
50
|
+
*/
|
|
51
|
+
export declare class ClassIntrospector {
|
|
52
|
+
#private;
|
|
53
|
+
constructor(reader: MetadataReader, container: Container);
|
|
54
|
+
constructorMetadata(target: Constructor): ConstructorMetadata | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Whether the class has a `@postConstruct` hook, or `undefined` until {@link discoverPostConstruct}.
|
|
57
|
+
*
|
|
58
|
+
* @remarks Callers treat unknown as "assume it does", so the first activation settles it.
|
|
59
|
+
*/
|
|
60
|
+
knownPostConstruct(target: Constructor): boolean | undefined;
|
|
61
|
+
discoverPostConstruct(target: Constructor): void;
|
|
62
|
+
/** True when the class has accessor injection, which reads the container during construction. */
|
|
63
|
+
needsActiveContainer(target: Constructor): boolean;
|
|
64
|
+
instantiate(target: Constructor, deps: Array<unknown>, resolution?: AmbientResolution): unknown;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=class-introspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-introspector.d.ts","sourceRoot":"","sources":["../../../src/resolution/cache/class-introspector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AA6BxG;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,WAAW,GAClB,mBAAmB,GAAG,SAAS,CAYjC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CA4BjH;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,CA2BlH;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,WAAW,GAClB,aAAa,CAAC;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;CAAE,CAAC,GAAG,SAAS,CAoCxG;AAED;;GAEG;AACH,qBAAa,iBAAiB;;IAS5B,YAAY,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAGvD;IAED,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAQxE;IAED;;;;OAIG;IACH,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAE3D;IAED,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAM/C;IAED,iGAAiG;IACjG,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAOjD;IAED,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAM9F;CACF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-class decorator metadata, cached by constructor.
|
|
3
|
+
*
|
|
4
|
+
* @remarks Metadata cannot change once a class is defined, so nothing here needs version stamping.
|
|
5
|
+
*/
|
|
6
|
+
import { runWithAmbientResolution } from "#/ambient/active-container";
|
|
7
|
+
import { InvalidMetadataError } from "#/errors/errors";
|
|
8
|
+
// Verified pairs, not verified classes: two readers may disagree about the same class, and a reader
|
|
9
|
+
// that goes out of scope takes its record with it.
|
|
10
|
+
const verifiedTargets = new WeakMap();
|
|
11
|
+
const verifiedLifecycleTargets = new WeakMap();
|
|
12
|
+
const verifiedAccessorTargets = new WeakMap();
|
|
13
|
+
function isVerified(cache, reader, target) {
|
|
14
|
+
return cache.get(reader)?.has(target) ?? false;
|
|
15
|
+
}
|
|
16
|
+
function markVerified(cache, reader, target) {
|
|
17
|
+
let verified = cache.get(reader);
|
|
18
|
+
if (verified === undefined) {
|
|
19
|
+
verified = new WeakSet();
|
|
20
|
+
cache.set(reader, verified);
|
|
21
|
+
}
|
|
22
|
+
verified.add(target);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A reader's constructor metadata for a class, verified the first time this process asks.
|
|
26
|
+
*
|
|
27
|
+
* @remarks Metadata cannot change once a class is defined, so re-checking per container would charge
|
|
28
|
+
* every fresh container for a fact already established — a per-request child or a cold boot pays
|
|
29
|
+
* that repeatedly.
|
|
30
|
+
*
|
|
31
|
+
* @since 0.6.0
|
|
32
|
+
*/
|
|
33
|
+
export function verifyConstructorMetadata(reader, target) {
|
|
34
|
+
const metadata = reader.getConstructorMetadata(target);
|
|
35
|
+
if (metadata === undefined) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
if (isVerified(verifiedTargets, reader, target)) {
|
|
39
|
+
return metadata;
|
|
40
|
+
}
|
|
41
|
+
assertConstructorMetadata(metadata, target);
|
|
42
|
+
markVerified(verifiedTargets, reader, target);
|
|
43
|
+
return metadata;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Verifies what a reader claims about a class, since a `MetadataReader` is a public seam.
|
|
47
|
+
*
|
|
48
|
+
* @remarks Every path that reads constructor metadata comes through here, so a reader that answers
|
|
49
|
+
* wrongly is a named error at the class it described rather than a `TypeError` raised later inside a
|
|
50
|
+
* resolve. Only what a consumer dereferences is checked: `params` and each entry's `token`.
|
|
51
|
+
* `optional`/`multi` degrade to falsy without crashing, and `index` is decorative — dependencies are
|
|
52
|
+
* consumed positionally.
|
|
53
|
+
*
|
|
54
|
+
* @since 0.6.0
|
|
55
|
+
*/
|
|
56
|
+
export function assertConstructorMetadata(metadata, target) {
|
|
57
|
+
if (metadata === undefined) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
if (typeof metadata !== "object" || metadata === null) {
|
|
61
|
+
throw new InvalidMetadataError(target.name, `constructor metadata: expected an object, received ${typeof metadata}`);
|
|
62
|
+
}
|
|
63
|
+
const params = Reflect.get(metadata, "params");
|
|
64
|
+
if (!Array.isArray(params)) {
|
|
65
|
+
throw new InvalidMetadataError(target.name, "constructor metadata: params is not an array");
|
|
66
|
+
}
|
|
67
|
+
for (const [position, param] of params.entries()) {
|
|
68
|
+
if (typeof param !== "object" || param === null) {
|
|
69
|
+
throw new InvalidMetadataError(target.name, `constructor metadata: params[${String(position)}] is not an object`);
|
|
70
|
+
}
|
|
71
|
+
const dependency = Reflect.get(param, "token");
|
|
72
|
+
if (typeof dependency !== "object" && typeof dependency !== "function") {
|
|
73
|
+
throw new InvalidMetadataError(target.name, `constructor metadata: params[${String(position)}].token is not a token or a class`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return metadata;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A reader's lifecycle metadata for a class, verified the first time this process asks.
|
|
80
|
+
*
|
|
81
|
+
* @since 0.6.0
|
|
82
|
+
*/
|
|
83
|
+
export function verifyLifecycleMetadata(reader, target) {
|
|
84
|
+
const metadata = reader.getLifecycleMetadata(target);
|
|
85
|
+
if (metadata === undefined || isVerified(verifiedLifecycleTargets, reader, target)) {
|
|
86
|
+
return metadata;
|
|
87
|
+
}
|
|
88
|
+
if (typeof metadata !== "object" || metadata === null) {
|
|
89
|
+
throw new InvalidMetadataError(target.name, `lifecycle metadata: expected an object, received ${typeof metadata}`);
|
|
90
|
+
}
|
|
91
|
+
for (const phase of ["postConstruct", "preDestroy"]) {
|
|
92
|
+
const methods = Reflect.get(metadata, phase);
|
|
93
|
+
if (methods === undefined) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!Array.isArray(methods)) {
|
|
97
|
+
throw new InvalidMetadataError(target.name, `lifecycle metadata: ${phase} is not an array`);
|
|
98
|
+
}
|
|
99
|
+
for (const [position, name] of methods.entries()) {
|
|
100
|
+
if (typeof name !== "string") {
|
|
101
|
+
throw new InvalidMetadataError(target.name, `lifecycle metadata: ${phase}[${String(position)}] is not a string`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
markVerified(verifiedLifecycleTargets, reader, target);
|
|
106
|
+
return metadata;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* A reader's accessor metadata for a class, verified the first time this process asks.
|
|
110
|
+
*
|
|
111
|
+
* @since 0.6.0
|
|
112
|
+
*/
|
|
113
|
+
export function verifyAccessorMetadata(reader, target) {
|
|
114
|
+
const metadata = reader.getAccessorMetadata?.(target);
|
|
115
|
+
if (metadata === undefined || isVerified(verifiedAccessorTargets, reader, target)) {
|
|
116
|
+
return metadata;
|
|
117
|
+
}
|
|
118
|
+
if (!Array.isArray(metadata)) {
|
|
119
|
+
throw new InvalidMetadataError(target.name, "accessor metadata: expected an array");
|
|
120
|
+
}
|
|
121
|
+
for (const [position, entry] of metadata.entries()) {
|
|
122
|
+
if (typeof entry !== "object" || entry === null) {
|
|
123
|
+
throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}] is not an object`);
|
|
124
|
+
}
|
|
125
|
+
const key = Reflect.get(entry, "key");
|
|
126
|
+
if (typeof key !== "string" && typeof key !== "symbol") {
|
|
127
|
+
throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}].key is not a string or symbol`);
|
|
128
|
+
}
|
|
129
|
+
const descriptor = Reflect.get(entry, "descriptor");
|
|
130
|
+
if (typeof descriptor !== "object" || descriptor === null) {
|
|
131
|
+
throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}].descriptor is not an object`);
|
|
132
|
+
}
|
|
133
|
+
const dependency = Reflect.get(descriptor, "token");
|
|
134
|
+
if (typeof dependency !== "object" && typeof dependency !== "function") {
|
|
135
|
+
throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}].descriptor.token is not a token or a class`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
markVerified(verifiedAccessorTargets, reader, target);
|
|
139
|
+
return metadata;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* @since 0.5.0-canary.8
|
|
143
|
+
*/
|
|
144
|
+
export class ClassIntrospector {
|
|
145
|
+
// Unallocated until the container resolves its first class binding — a container bound entirely
|
|
146
|
+
// to constants, factories or aliases never introspects one.
|
|
147
|
+
#constructorMetadata;
|
|
148
|
+
#hasPostConstruct;
|
|
149
|
+
#needsActiveContainer;
|
|
150
|
+
#reader;
|
|
151
|
+
#container;
|
|
152
|
+
constructor(reader, container) {
|
|
153
|
+
this.#reader = reader;
|
|
154
|
+
this.#container = container;
|
|
155
|
+
}
|
|
156
|
+
constructorMetadata(target) {
|
|
157
|
+
const cached = this.#constructorMetadata?.get(target);
|
|
158
|
+
if (cached !== undefined) {
|
|
159
|
+
return cached === null ? undefined : cached;
|
|
160
|
+
}
|
|
161
|
+
const metadata = this.#reader.getConstructorMetadata(target);
|
|
162
|
+
(this.#constructorMetadata ??= new WeakMap()).set(target, metadata ?? null);
|
|
163
|
+
return metadata;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Whether the class has a `@postConstruct` hook, or `undefined` until {@link discoverPostConstruct}.
|
|
167
|
+
*
|
|
168
|
+
* @remarks Callers treat unknown as "assume it does", so the first activation settles it.
|
|
169
|
+
*/
|
|
170
|
+
knownPostConstruct(target) {
|
|
171
|
+
return this.#hasPostConstruct?.get(target);
|
|
172
|
+
}
|
|
173
|
+
discoverPostConstruct(target) {
|
|
174
|
+
const lifecycle = this.#reader.getLifecycleMetadata(target);
|
|
175
|
+
(this.#hasPostConstruct ??= new WeakMap()).set(target, lifecycle !== undefined && lifecycle.postConstruct !== undefined && lifecycle.postConstruct.length > 0);
|
|
176
|
+
}
|
|
177
|
+
/** True when the class has accessor injection, which reads the container during construction. */
|
|
178
|
+
needsActiveContainer(target) {
|
|
179
|
+
let needsActiveContainer = this.#needsActiveContainer?.get(target);
|
|
180
|
+
if (needsActiveContainer === undefined) {
|
|
181
|
+
needsActiveContainer = (this.#reader.getAccessorMetadata?.(target)?.length ?? 0) > 0;
|
|
182
|
+
(this.#needsActiveContainer ??= new WeakMap()).set(target, needsActiveContainer);
|
|
183
|
+
}
|
|
184
|
+
return needsActiveContainer;
|
|
185
|
+
}
|
|
186
|
+
instantiate(target, deps, resolution) {
|
|
187
|
+
const invokable = target;
|
|
188
|
+
if (!this.needsActiveContainer(target)) {
|
|
189
|
+
return new invokable(...deps);
|
|
190
|
+
}
|
|
191
|
+
return runWithAmbientResolution(this.#container, resolution, () => new invokable(...deps));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=class-introspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-introspector.js","sourceRoot":"","sources":["../../../src/resolution/cache/class-introspector.ts"],"names":[],"mappings":"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"}
|