@codefast/di 0.5.0 → 0.6.1
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 +712 -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 +62 -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 +281 -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 +53 -0
- package/dist/core/constraint-requirement.d.ts.map +1 -0
- package/dist/core/constraint-requirement.js +62 -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 +96 -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} +9 -5
- package/dist/resolution/cache/binding-lookup-cache.d.ts.map +1 -0
- package/dist/resolution/{binding-lookup-cache.js → cache/binding-lookup-cache.js} +55 -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} +37 -7
- package/dist/resolution/plan/instantiation-plan.d.ts.map +1 -0
- package/dist/resolution/plan/instantiation-plan.js +419 -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 +581 -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 +79 -44
- package/src/container/container.ts +357 -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 +94 -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 +158 -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} +63 -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 +615 -0
- package/src/resolution/resolver.ts +663 -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
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { BindToBuilder } from "#/binding";
|
|
2
|
-
import type { Token } from "#/token";
|
|
3
|
-
import type { Constructor } from "#/types";
|
|
1
|
+
import type { BindToBuilder } from "#/core/binding";
|
|
2
|
+
import type { Token } from "#/core/token";
|
|
3
|
+
import type { Constructor } from "#/core/types";
|
|
4
4
|
declare const SYNC_MODULE_BRAND: unique symbol;
|
|
5
5
|
declare const ASYNC_MODULE_BRAND: unique symbol;
|
|
6
6
|
/**
|
|
@@ -30,14 +30,14 @@ export interface AsyncModule {
|
|
|
30
30
|
* @since 0.3.16-canary.0
|
|
31
31
|
*/
|
|
32
32
|
export interface ModuleBuilder {
|
|
33
|
-
bind<
|
|
33
|
+
bind<Value>(token: Token<Value> | Constructor<Value>): BindToBuilder<Value>;
|
|
34
34
|
import(...modules: Array<SyncModule>): void;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
37
|
* @since 0.3.16-canary.0
|
|
38
38
|
*/
|
|
39
39
|
export interface AsyncModuleBuilder {
|
|
40
|
-
bind<
|
|
40
|
+
bind<Value>(token: Token<Value> | Constructor<Value>): BindToBuilder<Value>;
|
|
41
41
|
import(...modules: Array<SyncModule | AsyncModule>): void;
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,QAAA,MAAM,iBAAiB,EAAE,OAAO,MAAiC,CAAC;AAClE,QAAA,MAAM,kBAAkB,EAAE,OAAO,MAAkC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,MAAkC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IACnC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC;IACpC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAID;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC;CAC3D;AAID;;GAEG;AACH,eAAO,MAAM,UAAU;IACrB,MAAM,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,UAAU;CAO1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB,MAAM,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW;CAOzF,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB,MAAM,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,UAAU;IAGzE,WAAW,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW;CAG9F,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,IAAI,UAAU,CAEnF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ── Branded types (runtime symbols for branding)
|
|
1
|
+
// ── Branded types (runtime symbols for branding) ─────────────────────────────────────────────────────────────────────
|
|
2
2
|
const SYNC_MODULE_BRAND = Symbol("di:sync-module");
|
|
3
3
|
const ASYNC_MODULE_BRAND = Symbol("di:async-module");
|
|
4
4
|
/**
|
|
@@ -8,7 +8,7 @@ const ASYNC_MODULE_BRAND = Symbol("di:async-module");
|
|
|
8
8
|
* @since 0.5.0-canary.7
|
|
9
9
|
*/
|
|
10
10
|
export const MODULE_SETUP = Symbol("di:module-setup");
|
|
11
|
-
// ── Static factories
|
|
11
|
+
// ── Static factories ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
12
12
|
/**
|
|
13
13
|
* @since 0.3.16-canary.0
|
|
14
14
|
*/
|
|
@@ -33,7 +33,7 @@ export const AsyncModule = {
|
|
|
33
33
|
};
|
|
34
34
|
},
|
|
35
35
|
};
|
|
36
|
-
// ── Module — unified API
|
|
36
|
+
// ── Module — unified API ─────────────────────────────────────────────────────────────────────────────────────────────
|
|
37
37
|
/**
|
|
38
38
|
* @since 0.3.16-canary.0
|
|
39
39
|
*/
|
|
@@ -49,6 +49,6 @@ export const Module = {
|
|
|
49
49
|
* @since 0.3.16-canary.0
|
|
50
50
|
*/
|
|
51
51
|
export function isSyncModule(module) {
|
|
52
|
-
return module[SYNC_MODULE_BRAND];
|
|
52
|
+
return module[SYNC_MODULE_BRAND] === true;
|
|
53
53
|
}
|
|
54
54
|
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAIA,wHAAwH;AAExH,MAAM,iBAAiB,GAAkB,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAClE,MAAM,kBAAkB,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAsCrE,wHAAwH;AAExH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,CAAC,IAAY,EAAE,KAAuC;QAC1D,OAAO;YACL,IAAI;YACJ,CAAC,iBAAiB,CAAC,EAAE,IAAa;YAClC,CAAC,YAAY,CAAC,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,CAAC,IAAY,EAAE,KAAqD;QACxE,OAAO;YACL,IAAI;YACJ,CAAC,kBAAkB,CAAC,EAAE,IAAa;YACnC,CAAC,YAAY,CAAC,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,wHAAwH;AAExH;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,CAAC,IAAY,EAAE,KAAuC;QAC1D,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,WAAW,CAAC,IAAY,EAAE,KAAqD;QAC7E,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAgC;IAC3D,OAAQ,MAA8B,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { Binding } from "#/binding";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
1
|
+
import type { Binding } from "#/core/binding";
|
|
2
|
+
import type { BindingTag } from "#/core/tag";
|
|
3
|
+
import type { Token } from "#/core/token";
|
|
4
|
+
import type { BindingIdentifier, Constructor } from "#/core/types";
|
|
4
5
|
/**
|
|
5
6
|
* @since 0.3.16-canary.0
|
|
6
7
|
*/
|
|
@@ -8,13 +9,15 @@ export declare class BindingRegistry {
|
|
|
8
9
|
#private;
|
|
9
10
|
/** Monotonic version — increments on every mutation. */
|
|
10
11
|
get version(): number;
|
|
12
|
+
/** Whether a constant has ever been registered here, and so whether teardown has anything to sweep. */
|
|
13
|
+
get hasHeldConstantBinding(): boolean;
|
|
11
14
|
/**
|
|
12
15
|
* Registers a mutation the indexes don't care about (a fluent chain refining scope or an
|
|
13
16
|
* activation hook in place), so version-stamped resolver caches still invalidate.
|
|
14
17
|
*/
|
|
15
18
|
touch(): void;
|
|
16
19
|
/**
|
|
17
|
-
*
|
|
20
|
+
* Adds or replaces a binding using slot-aware last-wins. Returns the displaced binding, if any.
|
|
18
21
|
*
|
|
19
22
|
* @remarks The binding is stored by reference — it must come from `createBinding`, which is
|
|
20
23
|
* what guarantees the single hidden class the resolver's hot reads depend on.
|
|
@@ -34,12 +37,29 @@ export declare class BindingRegistry {
|
|
|
34
37
|
allBindings(): ReadonlyArray<Binding>;
|
|
35
38
|
/** Remove all bindings. Returns all removed. */
|
|
36
39
|
clear(): ReadonlyArray<Binding>;
|
|
40
|
+
/** Whether a slot-based binding currently occupies `binding`'s slot, so adding it would displace. */
|
|
41
|
+
hasSlotOccupant(binding: Binding): boolean;
|
|
37
42
|
getSimpleNamed(token: Token<unknown> | Constructor, name: string): Binding | undefined;
|
|
38
|
-
|
|
43
|
+
/**
|
|
44
|
+
* The binding indexed under one criterion.
|
|
45
|
+
*
|
|
46
|
+
* @remarks Exact, with no re-check: criteria are interned, so a `Map` keyed by the pair answers by
|
|
47
|
+
* identity — where a value-keyed map answered by SameValueZero and parted from `Object.is` on ±0.
|
|
48
|
+
*/
|
|
49
|
+
getSimpleTagged(token: Token<unknown> | Constructor, criterion: BindingTag): Binding | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* The multi-tag bindings whose slot's first criterion is `criterion`.
|
|
52
|
+
*
|
|
53
|
+
* @remarks A prefilter, not an answer: a bucket member's remaining tags still have to be matched
|
|
54
|
+
* against the request — first-criterion bucketing only guarantees each candidate appears once.
|
|
55
|
+
*/
|
|
56
|
+
getMultiTagged(token: Token<unknown> | Constructor, criterion: BindingTag): ReadonlyArray<Binding> | undefined;
|
|
39
57
|
getFastDefault(token: Token<unknown> | Constructor): Binding | undefined;
|
|
40
58
|
/** Summarize available slot strings for a token (for error messages). */
|
|
41
59
|
availableSlotStrings(token: Token<unknown> | Constructor): Array<string>;
|
|
42
|
-
/** Whether the deferred
|
|
43
|
-
get
|
|
60
|
+
/** Whether the deferred named-slot index has had to be built. */
|
|
61
|
+
get isNamedIndexBuilt(): boolean;
|
|
62
|
+
/** Whether the deferred tagged-slot index has had to be built. */
|
|
63
|
+
get isTaggedIndexBuilt(): boolean;
|
|
44
64
|
}
|
|
45
65
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAiB,MAAM,cAAc,CAAC;AAElF;;GAEG;AACH,qBAAa,eAAe;;IAsB1B,wDAAwD;IACxD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,uGAAuG;IACvG,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAyCzC;IAED,iEAAiE;IACjE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAajE;IAED,iFAAiF;IACjF,UAAU,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS,CA4BrD;IAED,oCAAoC;IACpC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAElE;IAED,yBAAyB;IACzB,OAAO,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAElD;IAED,6CAA6C;IAC7C,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,OAAO,CAIhD;IAED,oCAAoC;IACpC,WAAW,IAAI,aAAa,CAAC,OAAO,CAAC,CAMpC;IAED,gDAAgD;IAChD,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,CAU9B;IAED,qGAAqG;IACrG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAWzC;IAED,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAErF;IAED;;;;;OAKG;IACH,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAE/F;IAED;;;;;OAKG;IACH,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,CAE7G;IAED,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAEvE;IAED,yEAAyE;IACzE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAGvE;IA0FD,iEAAiE;IACjE,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,kEAAkE;IAClE,IAAI,kBAAkB,IAAI,OAAO,CAEhC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { bindingSlotEquals, bindingSlotToString } from "#/binding";
|
|
1
|
+
import { bindingSlotEquals, bindingSlotToString } from "#/core/binding";
|
|
2
2
|
/**
|
|
3
3
|
* @since 0.3.16-canary.0
|
|
4
4
|
*/
|
|
@@ -13,13 +13,23 @@ export class BindingRegistry {
|
|
|
13
13
|
#simpleNamed;
|
|
14
14
|
// Fast path for one default slot binding with no predicate
|
|
15
15
|
#fastDefault = new Map();
|
|
16
|
-
// Fast lookup for slot
|
|
17
|
-
//
|
|
16
|
+
// Fast lookup for a slot carrying exactly one tag — keyed by the interned criterion itself, so
|
|
17
|
+
// the (key, value) pair is one hash rather than two. Unallocated until a tagged binding lands.
|
|
18
18
|
#simpleTagged;
|
|
19
|
+
// Name-less slots with two or more tags, bucketed by their FIRST criterion. A matching slot's
|
|
20
|
+
// every tag is in the request, so walking the request's buckets finds each candidate exactly once.
|
|
21
|
+
#multiTagged;
|
|
22
|
+
// Set on the first constant registered and never cleared. Teardown only needs the negative answer
|
|
23
|
+
// to be exact, and that is what lets a container holding no constant skip its sweep entirely.
|
|
24
|
+
#heldConstantBinding = false;
|
|
19
25
|
/** Monotonic version — increments on every mutation. */
|
|
20
26
|
get version() {
|
|
21
27
|
return this.#version;
|
|
22
28
|
}
|
|
29
|
+
/** Whether a constant has ever been registered here, and so whether teardown has anything to sweep. */
|
|
30
|
+
get hasHeldConstantBinding() {
|
|
31
|
+
return this.#heldConstantBinding;
|
|
32
|
+
}
|
|
23
33
|
/**
|
|
24
34
|
* Registers a mutation the indexes don't care about (a fluent chain refining scope or an
|
|
25
35
|
* activation hook in place), so version-stamped resolver caches still invalidate.
|
|
@@ -28,33 +38,47 @@ export class BindingRegistry {
|
|
|
28
38
|
this.#version += 1;
|
|
29
39
|
}
|
|
30
40
|
/**
|
|
31
|
-
*
|
|
41
|
+
* Adds or replaces a binding using slot-aware last-wins. Returns the displaced binding, if any.
|
|
32
42
|
*
|
|
33
43
|
* @remarks The binding is stored by reference — it must come from `createBinding`, which is
|
|
34
44
|
* what guarantees the single hidden class the resolver's hot reads depend on.
|
|
35
45
|
*/
|
|
36
46
|
add(binding) {
|
|
37
47
|
this.#version += 1;
|
|
48
|
+
if (binding.kind === "constant") {
|
|
49
|
+
this.#heldConstantBinding = true;
|
|
50
|
+
}
|
|
38
51
|
const key = binding.token;
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
const bindingsForToken = this.#bindings.
|
|
52
|
+
// Copy-on-write: a selection may be walking the current list inside a `when()` predicate, so
|
|
53
|
+
// mutation replaces the array and never splices one that has been handed out.
|
|
54
|
+
const bindingsForToken = this.#bindings.get(key);
|
|
42
55
|
// Only apply last-wins for slot-based bindings (not predicate-only)
|
|
43
56
|
let displacedBinding;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
let nextBindings;
|
|
58
|
+
if (bindingsForToken === undefined) {
|
|
59
|
+
nextBindings = [binding];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
if (!isPurePredicateBinding(binding)) {
|
|
63
|
+
const existingIndex = bindingsForToken.findIndex((candidate) => !isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot));
|
|
64
|
+
if (existingIndex !== -1) {
|
|
65
|
+
displacedBinding = bindingsForToken[existingIndex];
|
|
66
|
+
this.#byId.delete(displacedBinding.id);
|
|
67
|
+
this.#deindexSimpleNamedBinding(key, displacedBinding);
|
|
68
|
+
this.#deindexSimpleTaggedBinding(key, displacedBinding);
|
|
69
|
+
this.#deindexMultiTaggedBinding(key, displacedBinding);
|
|
70
|
+
}
|
|
52
71
|
}
|
|
72
|
+
nextBindings =
|
|
73
|
+
displacedBinding === undefined
|
|
74
|
+
? [...bindingsForToken, binding]
|
|
75
|
+
: [...bindingsForToken.filter((candidate) => candidate !== displacedBinding), binding];
|
|
53
76
|
}
|
|
54
|
-
|
|
77
|
+
this.#bindings.set(key, nextBindings);
|
|
55
78
|
this.#byId.set(binding.id, binding);
|
|
56
79
|
this.#indexSimpleNamedBinding(key, binding);
|
|
57
80
|
this.#indexSimpleTaggedBinding(key, binding);
|
|
81
|
+
this.#indexMultiTaggedBinding(key, binding);
|
|
58
82
|
this.#refreshFastDefaultForToken(key);
|
|
59
83
|
return displacedBinding;
|
|
60
84
|
}
|
|
@@ -66,6 +90,7 @@ export class BindingRegistry {
|
|
|
66
90
|
this.#bindings.delete(key);
|
|
67
91
|
this.#simpleNamed?.delete(key);
|
|
68
92
|
this.#simpleTagged?.delete(key);
|
|
93
|
+
this.#multiTagged?.delete(key);
|
|
69
94
|
this.#fastDefault.delete(key);
|
|
70
95
|
for (const binding of bindingsForToken) {
|
|
71
96
|
this.#byId.delete(binding.id);
|
|
@@ -84,18 +109,20 @@ export class BindingRegistry {
|
|
|
84
109
|
const bindingsForToken = this.#bindings.get(key);
|
|
85
110
|
if (bindingsForToken !== undefined) {
|
|
86
111
|
const bindingIndex = bindingsForToken.findIndex((candidate) => candidate.id === id);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
112
|
+
// Copy-on-write, like `add`: a walk holding the current array must not lose its place.
|
|
113
|
+
const remaining = bindingIndex === -1 ? bindingsForToken : bindingsForToken.toSpliced(bindingIndex, 1);
|
|
90
114
|
this.#deindexSimpleNamedBinding(key, binding);
|
|
91
115
|
this.#deindexSimpleTaggedBinding(key, binding);
|
|
92
|
-
|
|
116
|
+
this.#deindexMultiTaggedBinding(key, binding);
|
|
117
|
+
if (remaining.length === 0) {
|
|
93
118
|
this.#bindings.delete(key);
|
|
94
119
|
this.#simpleNamed?.delete(key);
|
|
95
120
|
this.#simpleTagged?.delete(key);
|
|
121
|
+
this.#multiTagged?.delete(key);
|
|
96
122
|
this.#fastDefault.delete(key);
|
|
97
123
|
}
|
|
98
124
|
else {
|
|
125
|
+
this.#bindings.set(key, remaining);
|
|
99
126
|
this.#refreshFastDefaultForToken(key);
|
|
100
127
|
}
|
|
101
128
|
}
|
|
@@ -131,17 +158,41 @@ export class BindingRegistry {
|
|
|
131
158
|
this.#byId.clear();
|
|
132
159
|
this.#simpleNamed?.clear();
|
|
133
160
|
this.#simpleTagged?.clear();
|
|
161
|
+
this.#multiTagged?.clear();
|
|
134
162
|
this.#fastDefault.clear();
|
|
135
163
|
return all;
|
|
136
164
|
}
|
|
165
|
+
/** Whether a slot-based binding currently occupies `binding`'s slot, so adding it would displace. */
|
|
166
|
+
hasSlotOccupant(binding) {
|
|
167
|
+
if (isPurePredicateBinding(binding)) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const candidates = this.#bindings.get(binding.token);
|
|
171
|
+
if (candidates === undefined) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
return candidates.some((candidate) => !isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot));
|
|
175
|
+
}
|
|
137
176
|
getSimpleNamed(token, name) {
|
|
138
177
|
return this.#simpleNamed?.get(token)?.get(name);
|
|
139
178
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
179
|
+
/**
|
|
180
|
+
* The binding indexed under one criterion.
|
|
181
|
+
*
|
|
182
|
+
* @remarks Exact, with no re-check: criteria are interned, so a `Map` keyed by the pair answers by
|
|
183
|
+
* identity — where a value-keyed map answered by SameValueZero and parted from `Object.is` on ±0.
|
|
184
|
+
*/
|
|
185
|
+
getSimpleTagged(token, criterion) {
|
|
186
|
+
return this.#simpleTagged?.get(token)?.get(criterion);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The multi-tag bindings whose slot's first criterion is `criterion`.
|
|
190
|
+
*
|
|
191
|
+
* @remarks A prefilter, not an answer: a bucket member's remaining tags still have to be matched
|
|
192
|
+
* against the request — first-criterion bucketing only guarantees each candidate appears once.
|
|
193
|
+
*/
|
|
194
|
+
getMultiTagged(token, criterion) {
|
|
195
|
+
return this.#multiTagged?.get(token)?.get(criterion);
|
|
145
196
|
}
|
|
146
197
|
getFastDefault(token) {
|
|
147
198
|
return this.#fastDefault.get(token);
|
|
@@ -152,38 +203,51 @@ export class BindingRegistry {
|
|
|
152
203
|
return bindingsForToken.map((binding) => bindingSlotToString(binding.slot));
|
|
153
204
|
}
|
|
154
205
|
#indexSimpleTaggedBinding(tokenKey, binding) {
|
|
155
|
-
const
|
|
156
|
-
if (
|
|
206
|
+
const criterion = simpleTagOf(binding);
|
|
207
|
+
if (criterion === undefined) {
|
|
157
208
|
return;
|
|
158
209
|
}
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
const byTagValue = byTagKey.getOrInsert(tagKey, new Map());
|
|
162
|
-
byTagValue.set(tagValue, binding);
|
|
210
|
+
const byCriterion = (this.#simpleTagged ??= new Map()).getOrInsert(tokenKey, new Map());
|
|
211
|
+
byCriterion.set(criterion, binding);
|
|
163
212
|
}
|
|
164
213
|
#deindexSimpleTaggedBinding(tokenKey, binding) {
|
|
165
|
-
const
|
|
166
|
-
if (
|
|
214
|
+
const criterion = simpleTagOf(binding);
|
|
215
|
+
if (criterion === undefined) {
|
|
167
216
|
return;
|
|
168
217
|
}
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
if (byTagKey === undefined) {
|
|
218
|
+
const byCriterion = this.#simpleTagged?.get(tokenKey);
|
|
219
|
+
if (byCriterion === undefined) {
|
|
172
220
|
return;
|
|
173
221
|
}
|
|
174
|
-
|
|
175
|
-
|
|
222
|
+
if (byCriterion.get(criterion)?.id === binding.id) {
|
|
223
|
+
byCriterion.delete(criterion);
|
|
224
|
+
if (byCriterion.size === 0) {
|
|
225
|
+
this.#simpleTagged.delete(tokenKey);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
#indexMultiTaggedBinding(tokenKey, binding) {
|
|
230
|
+
const firstCriterion = multiTagFirstOf(binding);
|
|
231
|
+
if (firstCriterion === undefined) {
|
|
176
232
|
return;
|
|
177
233
|
}
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
234
|
+
const buckets = (this.#multiTagged ??= new Map()).getOrInsert(tokenKey, new Map());
|
|
235
|
+
buckets.getOrInsert(firstCriterion, []).push(binding);
|
|
236
|
+
}
|
|
237
|
+
#deindexMultiTaggedBinding(tokenKey, binding) {
|
|
238
|
+
const firstCriterion = multiTagFirstOf(binding);
|
|
239
|
+
if (firstCriterion === undefined) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const bucket = this.#multiTagged?.get(tokenKey)?.get(firstCriterion);
|
|
243
|
+
if (bucket === undefined) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const bindingIndex = bucket.findIndex((candidate) => candidate.id === binding.id);
|
|
247
|
+
// Spliced in place: nothing walks a bucket while user code runs — candidates are gathered
|
|
248
|
+
// into their own array before any predicate is evaluated.
|
|
249
|
+
if (bindingIndex !== -1) {
|
|
250
|
+
bucket.splice(bindingIndex, 1);
|
|
187
251
|
}
|
|
188
252
|
}
|
|
189
253
|
#indexSimpleNamedBinding(tokenKey, binding) {
|
|
@@ -219,10 +283,14 @@ export class BindingRegistry {
|
|
|
219
283
|
}
|
|
220
284
|
this.#fastDefault.delete(tokenKey);
|
|
221
285
|
}
|
|
222
|
-
/** Whether the deferred
|
|
223
|
-
get
|
|
286
|
+
/** Whether the deferred named-slot index has had to be built. */
|
|
287
|
+
get isNamedIndexBuilt() {
|
|
224
288
|
return this.#simpleNamed !== undefined;
|
|
225
289
|
}
|
|
290
|
+
/** Whether the deferred tagged-slot index has had to be built. */
|
|
291
|
+
get isTaggedIndexBuilt() {
|
|
292
|
+
return this.#simpleTagged !== undefined;
|
|
293
|
+
}
|
|
226
294
|
}
|
|
227
295
|
/** The name a binding is indexed under, or `undefined` when its slot is more than a plain name. */
|
|
228
296
|
function simpleNameOf(binding) {
|
|
@@ -232,12 +300,17 @@ function simpleNameOf(binding) {
|
|
|
232
300
|
/**
|
|
233
301
|
* The tag a binding is indexed under, or `undefined` when its slot is more than one plain tag.
|
|
234
302
|
*
|
|
235
|
-
* @remarks
|
|
236
|
-
*
|
|
303
|
+
* @remarks Carries predicate-bearing bindings too, exactly as the name index does: every lane that
|
|
304
|
+
* reads this index already re-checks what it finds, so an indexed hit was never unconditional.
|
|
237
305
|
*/
|
|
238
306
|
function simpleTagOf(binding) {
|
|
239
307
|
const { name, tags } = binding.slot;
|
|
240
|
-
return name === undefined && tags.length === 1
|
|
308
|
+
return name === undefined && tags.length === 1 ? tags[0] : undefined;
|
|
309
|
+
}
|
|
310
|
+
/** The first criterion a multi-tag slot is bucketed under, or `undefined` for any other shape. */
|
|
311
|
+
function multiTagFirstOf(binding) {
|
|
312
|
+
const { name, tags } = binding.slot;
|
|
313
|
+
return name === undefined && tags.length >= 2 ? tags[0] : undefined;
|
|
241
314
|
}
|
|
242
315
|
/** A binding nothing has to be matched against: the default slot, no predicate. */
|
|
243
316
|
function isDefaultSlotBinding(binding) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/** Tag keys and the interned pairs they mint — the one way a slot criterion is built. */
|
|
2
|
+
declare const TAG_KEY_BRAND: unique symbol;
|
|
3
|
+
declare const BINDING_TAG_BRAND: unique symbol;
|
|
4
|
+
/**
|
|
5
|
+
* A slot's or a request's tag key set, as one word.
|
|
6
|
+
*
|
|
7
|
+
* @remarks A slot matches only if the request carries every key the slot declares, which is
|
|
8
|
+
* `(requestMask & slotMask) === slotMask` — the whole subset test, before any value is read. Keys
|
|
9
|
+
* are prefiltered rather than values indexed because a key set fits in a word and a value set does not.
|
|
10
|
+
*
|
|
11
|
+
* @since 0.6.0
|
|
12
|
+
*/
|
|
13
|
+
export type TagKeyMask = number & {
|
|
14
|
+
readonly [TAG_KEY_BRAND]: "mask";
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The empty key set: what an untagged slot and an untagged request both carry.
|
|
18
|
+
*
|
|
19
|
+
* @since 0.6.0
|
|
20
|
+
*/
|
|
21
|
+
export declare const NO_TAG_KEYS: TagKeyMask;
|
|
22
|
+
/**
|
|
23
|
+
* One `[key, value]` criterion, interned so equal criteria are the same object.
|
|
24
|
+
*
|
|
25
|
+
* @remarks Only {@link TagKey.of} mints one, which is what makes identity a sound stand-in for the
|
|
26
|
+
* `Object.is` comparison the slot contract requires. Never build one by hand — the matcher and the
|
|
27
|
+
* registry index both read identity, so a hand-built criterion matches nothing.
|
|
28
|
+
*
|
|
29
|
+
* @since 0.6.0
|
|
30
|
+
*/
|
|
31
|
+
export interface BindingTag<Value = unknown> {
|
|
32
|
+
readonly key: TagKey<Value>;
|
|
33
|
+
readonly value: Value;
|
|
34
|
+
/** This pair's key mask, copied off the key so the matcher reads one field. */
|
|
35
|
+
readonly mask: TagKeyMask;
|
|
36
|
+
readonly [BINDING_TAG_BRAND]: true;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A named tag key, and the factory for its criteria.
|
|
40
|
+
*
|
|
41
|
+
* @since 0.6.0
|
|
42
|
+
*/
|
|
43
|
+
export interface TagKey<Value = unknown> {
|
|
44
|
+
readonly name: string;
|
|
45
|
+
/** Process-monotonic, so a key set is a mask and the registry can index on a number. */
|
|
46
|
+
readonly id: number;
|
|
47
|
+
readonly mask: TagKeyMask;
|
|
48
|
+
/** The criterion for one value, interned: the same value always yields the same object. */
|
|
49
|
+
of(value: Value): BindingTag<Value>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Declares a tag key, whose `of()` builds the criteria a `whenTagged` and a resolve both take.
|
|
53
|
+
*
|
|
54
|
+
* @remarks The value type is checked at both ends: a key declared `tag<Region>("region")` refuses a
|
|
55
|
+
* value that is not a `Region`, so a bind site and a resolve site cannot drift apart silently.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const Region = tag<"eu" | "us">("region");
|
|
60
|
+
* container.bind(Storage).to(S3).whenTagged(Region.of("eu"));
|
|
61
|
+
* container.resolve(Storage, { tag: Region.of("eu") });
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @since 0.6.0
|
|
65
|
+
*/
|
|
66
|
+
export declare function tag<Value = unknown>(name: string): TagKey<Value>;
|
|
67
|
+
/**
|
|
68
|
+
* The key set a list of criteria covers.
|
|
69
|
+
*
|
|
70
|
+
* @since 0.6.0
|
|
71
|
+
*/
|
|
72
|
+
export declare function tagKeyMaskOf(tags: ReadonlyArray<BindingTag>): TagKeyMask;
|
|
73
|
+
/**
|
|
74
|
+
* Whether a request carrying `requestMask` covers every key in `slotMask`.
|
|
75
|
+
*
|
|
76
|
+
* @since 0.6.0
|
|
77
|
+
*/
|
|
78
|
+
export declare function coversTagKeys(requestMask: TagKeyMask, slotMask: TagKeyMask): boolean;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/core/tag.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,MAAM,CAAC;AAC3C,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAU/C;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAQ,UAAU,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU,CAAC,KAAK,GAAG,OAAO;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,MAAM,CAAC,KAAK,GAAG,OAAO;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,2FAA2F;IAC3F,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;CACrC;AAiBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAyChE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,UAAU,CAQxE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEpF"}
|
package/dist/core/tag.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** Tag keys and the interned pairs they mint — the one way a slot criterion is built. */
|
|
2
|
+
/**
|
|
3
|
+
* How many distinct tag keys one mask bit is shared by.
|
|
4
|
+
*
|
|
5
|
+
* @remarks Ids past this wrap, so two keys can share a bit. The mask is a prefilter only — a shared
|
|
6
|
+
* bit costs a false positive that the identity comparison then rejects, never a false negative.
|
|
7
|
+
*/
|
|
8
|
+
const MASK_WIDTH = 32;
|
|
9
|
+
/**
|
|
10
|
+
* The empty key set: what an untagged slot and an untagged request both carry.
|
|
11
|
+
*
|
|
12
|
+
* @since 0.6.0
|
|
13
|
+
*/
|
|
14
|
+
export const NO_TAG_KEYS = 0;
|
|
15
|
+
let tagKeyCounter = -1;
|
|
16
|
+
/**
|
|
17
|
+
* Distinguishes `-0` from `+0` in the intern cache.
|
|
18
|
+
*
|
|
19
|
+
* @remarks A `Map` key compares by SameValueZero, which holds `+0` and `-0` equal, while tag values
|
|
20
|
+
* compare by `Object.is`, which does not. Interning them to one object would make the
|
|
21
|
+
* two indistinguishable everywhere downstream, so the negative one is cached under this instead.
|
|
22
|
+
*/
|
|
23
|
+
const NEGATIVE_ZERO_KEY = Symbol("di:tag-negative-zero");
|
|
24
|
+
function internKeyFor(value) {
|
|
25
|
+
return value === 0 && Object.is(value, -0) ? NEGATIVE_ZERO_KEY : value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Declares a tag key, whose `of()` builds the criteria a `whenTagged` and a resolve both take.
|
|
29
|
+
*
|
|
30
|
+
* @remarks The value type is checked at both ends: a key declared `tag<Region>("region")` refuses a
|
|
31
|
+
* value that is not a `Region`, so a bind site and a resolve site cannot drift apart silently.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const Region = tag<"eu" | "us">("region");
|
|
36
|
+
* container.bind(Storage).to(S3).whenTagged(Region.of("eu"));
|
|
37
|
+
* container.resolve(Storage, { tag: Region.of("eu") });
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @since 0.6.0
|
|
41
|
+
*/
|
|
42
|
+
export function tag(name) {
|
|
43
|
+
tagKeyCounter += 1;
|
|
44
|
+
const id = tagKeyCounter;
|
|
45
|
+
const mask = (1 << (id % MASK_WIDTH));
|
|
46
|
+
const interned = new Map();
|
|
47
|
+
// One-entry cache in front of the intern map: an inline `.of()` at a call site usually repeats
|
|
48
|
+
// one value, and `Object.is` is the slot contract's own comparison, so a hit is exact — ±0 stay
|
|
49
|
+
// split and `NaN` hits itself, with no `internKeyFor` detour.
|
|
50
|
+
let lastValue;
|
|
51
|
+
let lastPair;
|
|
52
|
+
const key = {
|
|
53
|
+
name,
|
|
54
|
+
id,
|
|
55
|
+
mask,
|
|
56
|
+
of(value) {
|
|
57
|
+
if (lastPair !== undefined && Object.is(value, lastValue)) {
|
|
58
|
+
return lastPair;
|
|
59
|
+
}
|
|
60
|
+
const cacheKey = internKeyFor(value);
|
|
61
|
+
const existing = interned.get(cacheKey);
|
|
62
|
+
if (existing !== undefined) {
|
|
63
|
+
lastValue = value;
|
|
64
|
+
lastPair = existing;
|
|
65
|
+
return existing;
|
|
66
|
+
}
|
|
67
|
+
const pair = { key, value, mask };
|
|
68
|
+
interned.set(cacheKey, pair);
|
|
69
|
+
lastValue = value;
|
|
70
|
+
lastPair = pair;
|
|
71
|
+
return pair;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
return key;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The key set a list of criteria covers.
|
|
78
|
+
*
|
|
79
|
+
* @since 0.6.0
|
|
80
|
+
*/
|
|
81
|
+
export function tagKeyMaskOf(tags) {
|
|
82
|
+
let mask = NO_TAG_KEYS;
|
|
83
|
+
for (let index = 0; index < tags.length; index += 1) {
|
|
84
|
+
mask = (mask | tags[index].mask);
|
|
85
|
+
}
|
|
86
|
+
return mask;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Whether a request carrying `requestMask` covers every key in `slotMask`.
|
|
90
|
+
*
|
|
91
|
+
* @since 0.6.0
|
|
92
|
+
*/
|
|
93
|
+
export function coversTagKeys(requestMask, slotMask) {
|
|
94
|
+
return (requestMask & slotMask) === slotMask;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=tag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/core/tag.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAKzF;;;;;GAKG;AACH,MAAM,UAAU,GAAG,EAAE,CAAC;AAatB;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAe,CAAC;AAiC3C,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAkB,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAExE,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,GAAG,CAAkB,IAAY;IAC/C,aAAa,IAAI,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,aAAa,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAe,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,+FAA+F;IAC/F,gGAAgG;IAChG,8DAA8D;IAC9D,IAAI,SAA4B,CAAC;IACjC,IAAI,QAAuC,CAAC;IAE5C,MAAM,GAAG,GAAkB;QACzB,IAAI;QACJ,EAAE;QACF,IAAI;QACJ,EAAE,CAAC,KAAY;YACb,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC1D,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,SAAS,GAAG,KAAK,CAAC;gBAClB,QAAQ,GAAG,QAAQ,CAAC;gBAEpB,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAuB,CAAC;YAEvD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7B,SAAS,GAAG,KAAK,CAAC;YAClB,QAAQ,GAAG,IAAI,CAAC;YAEhB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAA+B;IAC1D,IAAI,IAAI,GAAG,WAAW,CAAC;IAEvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC,IAAI,CAAe,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,WAAuB,EAAE,QAAoB;IACzE,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,QAAQ,CAAC;AAC/C,CAAC"}
|