@codefast/di 0.5.0-canary.5 → 0.5.0-canary.7
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 +65 -0
- package/README.md +73 -496
- package/dist/binding.d.ts +211 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +46 -0
- package/dist/binding.js.map +1 -0
- package/dist/{constructor-type.d.mts → constructor-type.d.ts} +3 -5
- package/dist/constructor-type.d.ts.map +1 -0
- package/dist/constructor-type.js +2 -0
- package/dist/constructor-type.js.map +1 -0
- package/dist/container/binding-builders.d.ts +35 -0
- package/dist/container/binding-builders.d.ts.map +1 -0
- package/dist/container/binding-builders.js +247 -0
- package/dist/container/binding-builders.js.map +1 -0
- package/dist/container/container.d.ts +58 -0
- package/dist/container/container.d.ts.map +1 -0
- package/dist/container/container.js +641 -0
- package/dist/container/container.js.map +1 -0
- package/dist/decorators/inject.d.ts +57 -0
- package/dist/decorators/inject.d.ts.map +1 -0
- package/dist/decorators/inject.js +145 -0
- package/dist/decorators/inject.js.map +1 -0
- package/dist/decorators/injectable.d.ts +29 -0
- package/dist/decorators/injectable.d.ts.map +1 -0
- package/dist/decorators/injectable.js +53 -0
- package/dist/decorators/injectable.js.map +1 -0
- package/dist/decorators/lifecycle-decorators.d.ts +9 -0
- package/dist/decorators/lifecycle-decorators.d.ts.map +1 -0
- package/dist/decorators/lifecycle-decorators.js +40 -0
- package/dist/decorators/lifecycle-decorators.js.map +1 -0
- package/dist/errors.d.ts +150 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +197 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/introspection/dependency-graph.d.ts +40 -0
- package/dist/introspection/dependency-graph.d.ts.map +1 -0
- package/dist/introspection/dependency-graph.js +66 -0
- package/dist/introspection/dependency-graph.js.map +1 -0
- package/dist/introspection/graph-adapters/cytoscape.d.ts +33 -0
- package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/cytoscape.js +30 -0
- package/dist/introspection/graph-adapters/cytoscape.js.map +1 -0
- package/dist/introspection/graph-adapters/dot.d.ts +6 -0
- package/dist/introspection/graph-adapters/dot.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/dot.js +18 -0
- package/dist/introspection/graph-adapters/dot.js.map +1 -0
- package/dist/introspection/graph-adapters/reactflow.d.ts +38 -0
- package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/reactflow.js +33 -0
- package/dist/introspection/graph-adapters/reactflow.js.map +1 -0
- package/dist/introspection/inspector.d.ts +39 -0
- package/dist/introspection/inspector.d.ts.map +1 -0
- package/dist/introspection/inspector.js +82 -0
- package/dist/introspection/inspector.js.map +1 -0
- package/dist/metadata/{metadata-keys.d.mts → metadata-keys.d.ts} +5 -7
- package/dist/metadata/metadata-keys.d.ts.map +1 -0
- package/dist/metadata/metadata-keys.js +25 -0
- package/dist/metadata/metadata-keys.js.map +1 -0
- package/dist/metadata/metadata-reader-token.d.ts +7 -0
- package/dist/metadata/metadata-reader-token.d.ts.map +1 -0
- package/dist/metadata/metadata-reader-token.js +6 -0
- package/dist/metadata/metadata-reader-token.js.map +1 -0
- package/dist/metadata/metadata-types.d.ts +48 -0
- package/dist/metadata/metadata-types.d.ts.map +1 -0
- package/dist/metadata/metadata-types.js +2 -0
- package/dist/metadata/metadata-types.js.map +1 -0
- package/dist/metadata/symbol-metadata-reader.d.ts +20 -0
- package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -0
- package/dist/metadata/symbol-metadata-reader.js +34 -0
- package/dist/metadata/symbol-metadata-reader.js.map +1 -0
- package/dist/module.d.ts +67 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +54 -0
- package/dist/module.js.map +1 -0
- package/dist/registry.d.ts +33 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +249 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolution/binding-scope.d.ts +10 -0
- package/dist/resolution/binding-scope.d.ts.map +1 -0
- package/dist/resolution/binding-scope.js +24 -0
- package/dist/resolution/binding-scope.js.map +1 -0
- package/dist/resolution/binding-select.d.ts +16 -0
- package/dist/resolution/binding-select.d.ts.map +1 -0
- package/dist/resolution/binding-select.js +143 -0
- package/dist/resolution/binding-select.js.map +1 -0
- package/dist/resolution/constraints.d.ts +51 -0
- package/dist/resolution/constraints.d.ts.map +1 -0
- package/dist/resolution/constraints.js +88 -0
- package/dist/resolution/constraints.js.map +1 -0
- package/dist/resolution/environment.d.ts +47 -0
- package/dist/resolution/environment.d.ts.map +1 -0
- package/dist/resolution/environment.js +100 -0
- package/dist/resolution/environment.js.map +1 -0
- package/dist/resolution/instantiation-plan.d.ts +67 -0
- package/dist/resolution/instantiation-plan.d.ts.map +1 -0
- package/dist/resolution/instantiation-plan.js +163 -0
- package/dist/resolution/instantiation-plan.js.map +1 -0
- package/dist/resolution/lifecycle.d.ts +21 -0
- package/dist/resolution/lifecycle.d.ts.map +1 -0
- package/dist/resolution/lifecycle.js +178 -0
- package/dist/resolution/lifecycle.js.map +1 -0
- package/dist/resolution/resolution-path.d.ts +31 -0
- package/dist/resolution/resolution-path.d.ts.map +1 -0
- package/dist/resolution/resolution-path.js +53 -0
- package/dist/resolution/resolution-path.js.map +1 -0
- package/dist/resolution/resolve-options.d.ts +19 -0
- package/dist/resolution/resolve-options.d.ts.map +1 -0
- package/dist/resolution/resolve-options.js +32 -0
- package/dist/resolution/resolve-options.js.map +1 -0
- package/dist/resolution/resolver.d.ts +35 -0
- package/dist/resolution/resolver.d.ts.map +1 -0
- package/dist/resolution/resolver.js +1320 -0
- package/dist/resolution/resolver.js.map +1 -0
- package/dist/resolution/scope.d.ts +32 -0
- package/dist/resolution/scope.d.ts.map +1 -0
- package/dist/resolution/scope.js +76 -0
- package/dist/resolution/scope.js.map +1 -0
- package/dist/token.d.ts +23 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +22 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +143 -120
- package/src/binding.ts +38 -22
- package/src/container/binding-builders.ts +397 -0
- package/src/container/container.ts +838 -0
- package/src/decorators/inject.ts +16 -3
- package/src/decorators/injectable.ts +3 -3
- package/src/index.ts +14 -7
- package/src/{dependency-graph.ts → introspection/dependency-graph.ts} +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/cytoscape.ts +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/dot.ts +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/reactflow.ts +13 -2
- package/src/{inspector.ts → introspection/inspector.ts} +26 -21
- package/src/metadata/symbol-metadata-reader.ts +4 -4
- package/src/module.ts +14 -6
- package/src/registry.ts +115 -61
- package/src/{binding-select.ts → resolution/binding-select.ts} +16 -3
- package/src/{environment.ts → resolution/environment.ts} +35 -35
- package/src/resolution/instantiation-plan.ts +240 -0
- package/src/{lifecycle.ts → resolution/lifecycle.ts} +20 -13
- package/src/resolution/resolution-path.ts +77 -0
- package/src/resolution/resolver.ts +1755 -0
- package/src/{scope.ts → resolution/scope.ts} +35 -18
- package/src/token.ts +0 -3
- package/dist/binding-scope.d.mts +0 -13
- package/dist/binding-scope.mjs +0 -21
- package/dist/binding-select.d.mts +0 -19
- package/dist/binding-select.mjs +0 -72
- package/dist/binding.d.mts +0 -191
- package/dist/binding.mjs +0 -36
- package/dist/constraints.d.mts +0 -55
- package/dist/constraints.mjs +0 -87
- package/dist/constructor-type.mjs +0 -1
- package/dist/container.d.mts +0 -62
- package/dist/container.mjs +0 -741
- package/dist/decorators/inject.d.mts +0 -49
- package/dist/decorators/inject.mjs +0 -136
- package/dist/decorators/injectable.d.mts +0 -32
- package/dist/decorators/injectable.mjs +0 -57
- package/dist/decorators/lifecycle-decorators.d.mts +0 -11
- package/dist/decorators/lifecycle-decorators.mjs +0 -38
- package/dist/dependency-graph.d.mts +0 -43
- package/dist/dependency-graph.mjs +0 -63
- package/dist/environment.d.mts +0 -55
- package/dist/environment.mjs +0 -98
- package/dist/errors.d.mts +0 -153
- package/dist/errors.mjs +0 -197
- package/dist/graph-adapters/cytoscape.d.mts +0 -36
- package/dist/graph-adapters/cytoscape.mjs +0 -26
- package/dist/graph-adapters/dot.d.mts +0 -9
- package/dist/graph-adapters/dot.mjs +0 -20
- package/dist/graph-adapters/reactflow.d.mts +0 -41
- package/dist/graph-adapters/reactflow.mjs +0 -29
- package/dist/index.d.mts +0 -18
- package/dist/index.mjs +0 -12
- package/dist/inspector.d.mts +0 -48
- package/dist/inspector.mjs +0 -71
- package/dist/lifecycle.d.mts +0 -25
- package/dist/lifecycle.mjs +0 -118
- package/dist/metadata/metadata-keys.mjs +0 -27
- package/dist/metadata/metadata-reader-token.d.mts +0 -10
- package/dist/metadata/metadata-reader-token.mjs +0 -8
- package/dist/metadata/metadata-types.d.mts +0 -51
- package/dist/metadata/metadata-types.mjs +0 -1
- package/dist/metadata/symbol-metadata-reader.d.mts +0 -23
- package/dist/metadata/symbol-metadata-reader.mjs +0 -29
- package/dist/module.d.mts +0 -62
- package/dist/module.mjs +0 -42
- package/dist/registry.d.mts +0 -45
- package/dist/registry.mjs +0 -163
- package/dist/resolve-options.d.mts +0 -22
- package/dist/resolve-options.mjs +0 -28
- package/dist/resolver.d.mts +0 -94
- package/dist/resolver.mjs +0 -767
- package/dist/scope.d.mts +0 -28
- package/dist/scope.mjs +0 -58
- package/dist/token.d.mts +0 -25
- package/dist/token.mjs +0 -22
- package/dist/types.d.mts +0 -92
- package/dist/types.mjs +0 -1
- package/src/container.ts +0 -1141
- package/src/resolver.ts +0 -1626
- /package/src/{binding-scope.ts → resolution/binding-scope.ts} +0 -0
- /package/src/{constraints.ts → resolution/constraints.ts} +0 -0
- /package/src/{resolve-options.ts → resolution/resolve-options.ts} +0 -0
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { MissingScopeContextError } from "#/errors";
|
|
2
2
|
import type { BindingIdentifier } from "#/types";
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Sentinel returned by {@link ScopeManager.peekSingleton} when nothing is cached —
|
|
6
|
+
* lets hot paths read the cache with a single Map.get even for `undefined` values.
|
|
7
|
+
*
|
|
8
|
+
* @since 0.5.0-canary.7
|
|
9
|
+
*/
|
|
10
|
+
export const SINGLETON_MISS: unique symbol = Symbol("di:singleton-miss");
|
|
11
|
+
|
|
4
12
|
/**
|
|
5
13
|
* @since 0.3.16-canary.0
|
|
6
14
|
*/
|
|
7
15
|
export class ScopeManager {
|
|
8
16
|
// Singleton cache: bindingId -> instance
|
|
9
|
-
|
|
17
|
+
readonly #singletons = new Map<BindingIdentifier, unknown>();
|
|
10
18
|
// In-flight promises for async singleton creation
|
|
11
|
-
|
|
19
|
+
readonly #inflight = new Map<BindingIdentifier, Promise<unknown>>();
|
|
12
20
|
// Scoped cache (for child containers): bindingId -> instance
|
|
13
|
-
|
|
21
|
+
readonly #scoped = new Map<BindingIdentifier, unknown>();
|
|
14
22
|
|
|
15
23
|
readonly isChild: boolean;
|
|
16
24
|
|
|
@@ -19,59 +27,68 @@ export class ScopeManager {
|
|
|
19
27
|
}
|
|
20
28
|
|
|
21
29
|
hasSingleton(id: BindingIdentifier): boolean {
|
|
22
|
-
return this.
|
|
30
|
+
return this.#singletons.has(id);
|
|
23
31
|
}
|
|
24
32
|
|
|
25
33
|
getSingleton<Value>(id: BindingIdentifier): Value {
|
|
26
|
-
return this.
|
|
34
|
+
return this.#singletons.get(id) as Value;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Cached value, or {@link SINGLETON_MISS} — one Map.get on the hot path. */
|
|
38
|
+
peekSingleton(id: BindingIdentifier): unknown {
|
|
39
|
+
const value = this.#singletons.get(id);
|
|
40
|
+
if (value === undefined && !this.#singletons.has(id)) {
|
|
41
|
+
return SINGLETON_MISS;
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
27
44
|
}
|
|
28
45
|
|
|
29
46
|
setSingleton(id: BindingIdentifier, instance: unknown): void {
|
|
30
|
-
this.
|
|
47
|
+
this.#singletons.set(id, instance);
|
|
31
48
|
}
|
|
32
49
|
|
|
33
50
|
deleteSingleton(id: BindingIdentifier): boolean {
|
|
34
|
-
return this.
|
|
51
|
+
return this.#singletons.delete(id);
|
|
35
52
|
}
|
|
36
53
|
|
|
37
54
|
getAllSingletons(): ReadonlyMap<BindingIdentifier, unknown> {
|
|
38
|
-
return this
|
|
55
|
+
return this.#singletons;
|
|
39
56
|
}
|
|
40
57
|
|
|
41
58
|
getInflight(id: BindingIdentifier): Promise<unknown> | undefined {
|
|
42
|
-
return this.
|
|
59
|
+
return this.#inflight.get(id);
|
|
43
60
|
}
|
|
44
61
|
|
|
45
62
|
setInflight(id: BindingIdentifier, p: Promise<unknown>): void {
|
|
46
|
-
this.
|
|
63
|
+
this.#inflight.set(id, p);
|
|
47
64
|
}
|
|
48
65
|
|
|
49
66
|
clearInflight(id: BindingIdentifier): void {
|
|
50
|
-
this.
|
|
67
|
+
this.#inflight.delete(id);
|
|
51
68
|
}
|
|
52
69
|
|
|
53
70
|
hasScoped(id: BindingIdentifier): boolean {
|
|
54
|
-
return this.
|
|
71
|
+
return this.#scoped.has(id);
|
|
55
72
|
}
|
|
56
73
|
|
|
57
74
|
getScoped<Value>(id: BindingIdentifier): Value {
|
|
58
|
-
return this.
|
|
75
|
+
return this.#scoped.get(id) as Value;
|
|
59
76
|
}
|
|
60
77
|
|
|
61
78
|
setScoped(id: BindingIdentifier, instance: unknown): void {
|
|
62
79
|
if (!this.isChild) {
|
|
63
80
|
throw new MissingScopeContextError("(unknown)");
|
|
64
81
|
}
|
|
65
|
-
this.
|
|
82
|
+
this.#scoped.set(id, instance);
|
|
66
83
|
}
|
|
67
84
|
|
|
68
85
|
getAllScoped(): ReadonlyMap<BindingIdentifier, unknown> {
|
|
69
|
-
return this
|
|
86
|
+
return this.#scoped;
|
|
70
87
|
}
|
|
71
88
|
|
|
72
89
|
clearAll(): void {
|
|
73
|
-
this.
|
|
74
|
-
this.
|
|
75
|
-
this.
|
|
90
|
+
this.#singletons.clear();
|
|
91
|
+
this.#inflight.clear();
|
|
92
|
+
this.#scoped.clear();
|
|
76
93
|
}
|
|
77
94
|
}
|
package/src/token.ts
CHANGED
|
@@ -21,9 +21,6 @@ export function token<Value>(name: string): Token<Value> {
|
|
|
21
21
|
* @since 0.3.16-canary.0
|
|
22
22
|
*/
|
|
23
23
|
export function tokenName(dependency: Token<unknown> | Constructor): string {
|
|
24
|
-
if (typeof dependency === "function") {
|
|
25
|
-
return dependency.name;
|
|
26
|
-
}
|
|
27
24
|
return dependency.name;
|
|
28
25
|
}
|
|
29
26
|
|
package/dist/binding-scope.d.mts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { BindingScope } from "./types.mjs";
|
|
2
|
-
import { Binding } from "./binding.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/binding-scope.d.ts
|
|
5
|
-
/**
|
|
6
|
-
* Runtime scope used for validation and introspection. Alias bindings are treated as transient
|
|
7
|
-
* because they defer scope to the aliased target at resolve time.
|
|
8
|
-
*
|
|
9
|
-
* @since 0.3.16-canary.0
|
|
10
|
-
*/
|
|
11
|
-
declare function effectiveBindingScope(binding: Binding): BindingScope;
|
|
12
|
-
//#endregion
|
|
13
|
-
export { effectiveBindingScope };
|
package/dist/binding-scope.mjs
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
//#region src/binding-scope.ts
|
|
2
|
-
/**
|
|
3
|
-
* Runtime scope used for validation and introspection. Alias bindings are treated as transient
|
|
4
|
-
* because they defer scope to the aliased target at resolve time.
|
|
5
|
-
*
|
|
6
|
-
* @since 0.3.16-canary.0
|
|
7
|
-
*/
|
|
8
|
-
function effectiveBindingScope(binding) {
|
|
9
|
-
switch (binding.kind) {
|
|
10
|
-
case "alias": return "transient";
|
|
11
|
-
case "class":
|
|
12
|
-
case "constant":
|
|
13
|
-
case "dynamic":
|
|
14
|
-
case "dynamic-async":
|
|
15
|
-
case "resolved":
|
|
16
|
-
case "resolved-async": return binding.scope;
|
|
17
|
-
default: return binding;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
//#endregion
|
|
21
|
-
export { effectiveBindingScope };
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { ConstraintContext, ResolveOptions } from "./types.mjs";
|
|
2
|
-
import { Binding } from "./binding.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/binding-select.d.ts
|
|
5
|
-
/**
|
|
6
|
-
* Select a single candidate from a list of bindings using slot matching + predicates.
|
|
7
|
-
* Returns undefined if no match, throws AmbiguousBindingError if multiple match.
|
|
8
|
-
*
|
|
9
|
-
* @since 0.3.16-canary.0
|
|
10
|
-
*/
|
|
11
|
-
declare function selectBinding(bindings: ReadonlyArray<Binding>, options: ResolveOptions | undefined, ctx: ConstraintContext, tokenDisplayName: string): Binding | undefined;
|
|
12
|
-
/**
|
|
13
|
-
* Select all candidates matching options + predicates.
|
|
14
|
-
*
|
|
15
|
-
* @since 0.3.16-canary.0
|
|
16
|
-
*/
|
|
17
|
-
declare function selectAllBindings(bindings: ReadonlyArray<Binding>, options: ResolveOptions | undefined, ctx: ConstraintContext): Array<Binding>;
|
|
18
|
-
//#endregion
|
|
19
|
-
export { selectAllBindings, selectBinding };
|
package/dist/binding-select.mjs
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { AmbiguousBindingError } from "./errors.mjs";
|
|
2
|
-
//#region src/binding-select.ts
|
|
3
|
-
/**
|
|
4
|
-
* Select a single candidate from a list of bindings using slot matching + predicates.
|
|
5
|
-
* Returns undefined if no match, throws AmbiguousBindingError if multiple match.
|
|
6
|
-
*
|
|
7
|
-
* @since 0.3.16-canary.0
|
|
8
|
-
*/
|
|
9
|
-
function selectBinding(bindings, options, ctx, tokenDisplayName) {
|
|
10
|
-
const candidates = filterBindings(bindings, options, ctx);
|
|
11
|
-
if (candidates.length === 0) return;
|
|
12
|
-
if (candidates.length === 1) return candidates[0];
|
|
13
|
-
throw new AmbiguousBindingError(tokenDisplayName, candidates.map((c) => c.id));
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Select all candidates matching options + predicates.
|
|
17
|
-
*
|
|
18
|
-
* @since 0.3.16-canary.0
|
|
19
|
-
*/
|
|
20
|
-
function selectAllBindings(bindings, options, ctx) {
|
|
21
|
-
return filterBindings(bindings, options, ctx, "all");
|
|
22
|
-
}
|
|
23
|
-
function filterBindings(bindings, options, ctx, selectionMode = "single") {
|
|
24
|
-
if (options === void 0) {
|
|
25
|
-
const resultWithoutOptions = [];
|
|
26
|
-
if (selectionMode === "all") {
|
|
27
|
-
for (const binding of bindings) if (matchesPredicate(binding, ctx)) resultWithoutOptions.push(binding);
|
|
28
|
-
} else for (const binding of bindings) {
|
|
29
|
-
const slot = binding.slot;
|
|
30
|
-
if (slot.name === void 0 && slot.tags.length === 0 && matchesPredicate(binding, ctx)) resultWithoutOptions.push(binding);
|
|
31
|
-
}
|
|
32
|
-
return resultWithoutOptions;
|
|
33
|
-
}
|
|
34
|
-
const result = [];
|
|
35
|
-
for (const binding of bindings) if ((selectionMode === "all" ? matchesSlotForResolveAll(binding, options) : matchesSlot(binding, options)) && matchesPredicate(binding, ctx)) result.push(binding);
|
|
36
|
-
return result;
|
|
37
|
-
}
|
|
38
|
-
function matchesSlotForResolveAll(binding, options) {
|
|
39
|
-
if (!(options !== void 0 && (options.name !== void 0 || options.tags !== void 0 && options.tags.length > 0 || options.tag !== void 0))) return true;
|
|
40
|
-
return matchesSlot(binding, options);
|
|
41
|
-
}
|
|
42
|
-
function matchesSlot(binding, options) {
|
|
43
|
-
const slot = binding.slot;
|
|
44
|
-
const requestedName = options?.name;
|
|
45
|
-
const requestedTags = options?.tags;
|
|
46
|
-
const singleRequestedTag = options?.tag;
|
|
47
|
-
const hasRequestedTags = (requestedTags?.length ?? 0) > 0 || singleRequestedTag !== void 0;
|
|
48
|
-
if (slot.name !== void 0) {
|
|
49
|
-
if (requestedName === void 0) return false;
|
|
50
|
-
if (slot.name !== requestedName) return false;
|
|
51
|
-
} else if (requestedName !== void 0) return false;
|
|
52
|
-
if (slot.tags.length > 0) {
|
|
53
|
-
if (!hasRequestedTags) return false;
|
|
54
|
-
for (const [tagKey, tagValue] of slot.tags) if (!matchesRequestedTag(tagKey, tagValue, requestedTags, singleRequestedTag)) return false;
|
|
55
|
-
} else if (hasRequestedTags) return false;
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
function matchesRequestedTag(tagKey, tagValue, requestedTags, singleRequestedTag) {
|
|
59
|
-
if (singleRequestedTag !== void 0 && singleRequestedTag[0] === tagKey && Object.is(singleRequestedTag[1], tagValue)) return true;
|
|
60
|
-
if (requestedTags === void 0 || requestedTags.length === 0) return false;
|
|
61
|
-
for (let index = 0; index < requestedTags.length; index += 1) {
|
|
62
|
-
const requestedTag = requestedTags[index];
|
|
63
|
-
if (requestedTag[0] === tagKey && Object.is(requestedTag[1], tagValue)) return true;
|
|
64
|
-
}
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
function matchesPredicate(binding, ctx) {
|
|
68
|
-
if (binding.predicate === void 0) return true;
|
|
69
|
-
return binding.predicate(ctx);
|
|
70
|
-
}
|
|
71
|
-
//#endregion
|
|
72
|
-
export { selectAllBindings, selectBinding };
|
package/dist/binding.d.mts
DELETED
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { Constructor } from "./constructor-type.mjs";
|
|
2
|
-
import { Token } from "./token.mjs";
|
|
3
|
-
import { ActivationHandler, BindingIdentifier, BindingScope, BindingTag, ConstraintContext, DeactivationHandler, DependencyKey, ResolutionContext, TokenValue } from "./types.mjs";
|
|
4
|
-
import { InjectionDescriptor } from "./decorators/inject.mjs";
|
|
5
|
-
|
|
6
|
-
//#region src/binding.d.ts
|
|
7
|
-
/**
|
|
8
|
-
* @since 0.3.16-canary.0
|
|
9
|
-
*/
|
|
10
|
-
interface BindingSlot {
|
|
11
|
-
readonly name: string | undefined;
|
|
12
|
-
readonly tags: ReadonlyArray<BindingTag>;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* @since 0.3.16-canary.0
|
|
16
|
-
*/
|
|
17
|
-
declare function bindingSlotEquals(left: BindingSlot, right: BindingSlot): boolean;
|
|
18
|
-
/**
|
|
19
|
-
* @since 0.3.16-canary.0
|
|
20
|
-
*/
|
|
21
|
-
declare const DEFAULT_BINDING_SLOT: {
|
|
22
|
-
name: undefined;
|
|
23
|
-
tags: never[];
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* @since 0.3.16-canary.0
|
|
27
|
-
*/
|
|
28
|
-
declare function bindingSlotToString(slot: BindingSlot): string;
|
|
29
|
-
interface BindingBase<Value> {
|
|
30
|
-
readonly id: BindingIdentifier;
|
|
31
|
-
readonly token: Token<Value> | Constructor<Value>;
|
|
32
|
-
readonly slot: BindingSlot;
|
|
33
|
-
readonly predicate?: (ctx: ConstraintContext) => boolean;
|
|
34
|
-
}
|
|
35
|
-
type BindingBaseKeys = keyof BindingBase<unknown>;
|
|
36
|
-
/**
|
|
37
|
-
* @since 0.3.16-canary.0
|
|
38
|
-
*/
|
|
39
|
-
interface ClassBinding<Value> extends BindingBase<Value> {
|
|
40
|
-
readonly kind: "class";
|
|
41
|
-
readonly target: Constructor<Value>;
|
|
42
|
-
readonly scope: BindingScope;
|
|
43
|
-
readonly onActivation?: ActivationHandler<Value>;
|
|
44
|
-
readonly onDeactivation?: DeactivationHandler<Value>;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* @since 0.3.16-canary.0
|
|
48
|
-
*/
|
|
49
|
-
interface DynamicBinding<Value> extends BindingBase<Value> {
|
|
50
|
-
readonly kind: "dynamic";
|
|
51
|
-
readonly factory: (ctx: ResolutionContext) => Value;
|
|
52
|
-
readonly scope: BindingScope;
|
|
53
|
-
readonly onActivation?: ActivationHandler<Value>;
|
|
54
|
-
readonly onDeactivation?: DeactivationHandler<Value>;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* @since 0.3.16-canary.0
|
|
58
|
-
*/
|
|
59
|
-
interface DynamicAsyncBinding<Value> extends BindingBase<Value> {
|
|
60
|
-
readonly kind: "dynamic-async";
|
|
61
|
-
readonly factory: (ctx: ResolutionContext) => Promise<Value>;
|
|
62
|
-
readonly scope: BindingScope;
|
|
63
|
-
readonly onActivation?: ActivationHandler<Value>;
|
|
64
|
-
readonly onDeactivation?: DeactivationHandler<Value>;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* @since 0.3.16-canary.0
|
|
68
|
-
*/
|
|
69
|
-
interface ResolvedBinding<Value> extends BindingBase<Value> {
|
|
70
|
-
readonly kind: "resolved";
|
|
71
|
-
readonly factory: (...args: Array<unknown>) => Value;
|
|
72
|
-
readonly deps: ReadonlyArray<InjectionDescriptor>;
|
|
73
|
-
readonly scope: BindingScope;
|
|
74
|
-
readonly onActivation?: ActivationHandler<Value>;
|
|
75
|
-
readonly onDeactivation?: DeactivationHandler<Value>;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* @since 0.3.16-canary.0
|
|
79
|
-
*/
|
|
80
|
-
interface ResolvedAsyncBinding<Value> extends BindingBase<Value> {
|
|
81
|
-
readonly kind: "resolved-async";
|
|
82
|
-
readonly factory: (...args: Array<unknown>) => Promise<Value>;
|
|
83
|
-
readonly deps: ReadonlyArray<InjectionDescriptor>;
|
|
84
|
-
readonly scope: BindingScope;
|
|
85
|
-
readonly onActivation?: ActivationHandler<Value>;
|
|
86
|
-
readonly onDeactivation?: DeactivationHandler<Value>;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* @since 0.3.16-canary.0
|
|
90
|
-
*/
|
|
91
|
-
interface ConstantBinding<Value> extends BindingBase<Value> {
|
|
92
|
-
readonly kind: "constant";
|
|
93
|
-
readonly value: Value;
|
|
94
|
-
readonly scope: "singleton";
|
|
95
|
-
readonly onActivation?: ActivationHandler<Value>;
|
|
96
|
-
readonly onDeactivation?: DeactivationHandler<Value>;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* @since 0.3.16-canary.0
|
|
100
|
-
*/
|
|
101
|
-
interface AliasBinding<Value> extends BindingBase<Value> {
|
|
102
|
-
readonly kind: "alias";
|
|
103
|
-
readonly target: Token<Value> | Constructor<Value>;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* @since 0.3.16-canary.0
|
|
107
|
-
*/
|
|
108
|
-
type Binding<Value = unknown> = ClassBinding<Value> | DynamicBinding<Value> | DynamicAsyncBinding<Value> | ResolvedBinding<Value> | ResolvedAsyncBinding<Value> | ConstantBinding<Value> | AliasBinding<Value>;
|
|
109
|
-
/**
|
|
110
|
-
* Builder-only payload before `id`, `token`, `slot`, and `predicate` are applied.
|
|
111
|
-
*
|
|
112
|
-
* @since 0.3.16-canary.0
|
|
113
|
-
*/
|
|
114
|
-
type PartialBinding<Value> = Omit<ClassBinding<Value>, BindingBaseKeys> | Omit<DynamicBinding<Value>, BindingBaseKeys> | Omit<DynamicAsyncBinding<Value>, BindingBaseKeys> | Omit<ResolvedBinding<Value>, BindingBaseKeys> | Omit<ResolvedAsyncBinding<Value>, BindingBaseKeys> | Omit<ConstantBinding<Value>, BindingBaseKeys> | Omit<AliasBinding<Value>, BindingBaseKeys>;
|
|
115
|
-
/**
|
|
116
|
-
* @since 0.3.16-canary.0
|
|
117
|
-
*/
|
|
118
|
-
declare function generateBindingId(): BindingIdentifier;
|
|
119
|
-
/**
|
|
120
|
-
* Common slot-constraint + id methods shared by all concrete binding builders.
|
|
121
|
-
*
|
|
122
|
-
* @since 0.3.16-canary.0
|
|
123
|
-
*/
|
|
124
|
-
interface SlotConstrainedBuilder {
|
|
125
|
-
when(predicate: (ctx: ConstraintContext) => boolean): this;
|
|
126
|
-
whenNamed(name: string): this;
|
|
127
|
-
whenTagged(tag: string, value: unknown): this;
|
|
128
|
-
whenDefault(): this;
|
|
129
|
-
id(): BindingIdentifier;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* @since 0.3.16-canary.0
|
|
133
|
-
*/
|
|
134
|
-
interface BindToBuilder<Value> {
|
|
135
|
-
to(type: Constructor<Value>): BindingBuilder<Value>;
|
|
136
|
-
toSelf(): BindingBuilder<Value>;
|
|
137
|
-
toConstantValue(value: Value): ConstantBindingBuilder<Value>;
|
|
138
|
-
toDynamic(factory: (ctx: ResolutionContext) => Value): BindingBuilder<Value>;
|
|
139
|
-
toDynamicAsync(factory: (ctx: ResolutionContext) => Promise<Value>): BindingBuilder<Value>;
|
|
140
|
-
toResolved<const Deps extends ReadonlyArray<DependencyKey>>(factory: (...args: { [K in keyof Deps]: TokenValue<NoInfer<Deps>[K]> }) => Value, deps: Deps): BindingBuilder<Value>;
|
|
141
|
-
toResolvedAsync<const Deps extends ReadonlyArray<DependencyKey>>(factory: (...args: { [K in keyof Deps]: TokenValue<NoInfer<Deps>[K]> }) => Promise<Value>, deps: Deps): BindingBuilder<Value>;
|
|
142
|
-
toAlias(target: Token<Value> | Constructor<Value>): AliasBindingBuilder;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* @since 0.3.16-canary.0
|
|
146
|
-
*/
|
|
147
|
-
interface BindingBuilder<Value> extends SlotConstrainedBuilder {
|
|
148
|
-
singleton(): SingletonBindingBuilder<Value>;
|
|
149
|
-
transient(): TransientBindingBuilder<Value>;
|
|
150
|
-
scoped(): ScopedBindingBuilder<Value>;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* @since 0.3.16-canary.0
|
|
154
|
-
*/
|
|
155
|
-
interface ConstantBindingBuilder<Value> extends SlotConstrainedBuilder {
|
|
156
|
-
onActivation(fn: ActivationHandler<Value>): SingletonLifecycleBuilder<Value>;
|
|
157
|
-
onDeactivation(fn: DeactivationHandler<Value>): SingletonLifecycleBuilder<Value>;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* @since 0.3.16-canary.0
|
|
161
|
-
*/
|
|
162
|
-
interface AliasBindingBuilder extends SlotConstrainedBuilder {}
|
|
163
|
-
/**
|
|
164
|
-
* @since 0.3.16-canary.0
|
|
165
|
-
*/
|
|
166
|
-
interface SingletonBindingBuilder<Value> {
|
|
167
|
-
onActivation(fn: ActivationHandler<Value>): this;
|
|
168
|
-
onDeactivation(fn: DeactivationHandler<Value>): this;
|
|
169
|
-
id(): BindingIdentifier;
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* @since 0.3.16-canary.0
|
|
173
|
-
*/
|
|
174
|
-
interface TransientBindingBuilder<Value> {
|
|
175
|
-
onActivation(fn: ActivationHandler<Value>): this;
|
|
176
|
-
id(): BindingIdentifier;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* @since 0.3.16-canary.0
|
|
180
|
-
*/
|
|
181
|
-
interface ScopedBindingBuilder<Value> extends TransientBindingBuilder<Value> {}
|
|
182
|
-
/**
|
|
183
|
-
* @since 0.3.16-canary.0
|
|
184
|
-
*/
|
|
185
|
-
interface SingletonLifecycleBuilder<Value> {
|
|
186
|
-
onActivation(fn: ActivationHandler<Value>): this;
|
|
187
|
-
onDeactivation(fn: DeactivationHandler<Value>): this;
|
|
188
|
-
id(): BindingIdentifier;
|
|
189
|
-
}
|
|
190
|
-
//#endregion
|
|
191
|
-
export { AliasBinding, AliasBindingBuilder, BindToBuilder, Binding, BindingBuilder, BindingSlot, ClassBinding, ConstantBinding, ConstantBindingBuilder, DEFAULT_BINDING_SLOT, DynamicAsyncBinding, DynamicBinding, PartialBinding, ResolvedAsyncBinding, ResolvedBinding, ScopedBindingBuilder, SingletonBindingBuilder, SingletonLifecycleBuilder, SlotConstrainedBuilder, TransientBindingBuilder, bindingSlotEquals, bindingSlotToString, generateBindingId };
|
package/dist/binding.mjs
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
//#region src/binding.ts
|
|
2
|
-
/**
|
|
3
|
-
* @since 0.3.16-canary.0
|
|
4
|
-
*/
|
|
5
|
-
function bindingSlotEquals(left, right) {
|
|
6
|
-
if (left.name !== right.name) return false;
|
|
7
|
-
if (left.tags.length !== right.tags.length) return false;
|
|
8
|
-
for (const [tagKey, tagValue] of left.tags) if (!right.tags.some(([otherKey, otherValue]) => otherKey === tagKey && Object.is(otherValue, tagValue))) return false;
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* @since 0.3.16-canary.0
|
|
13
|
-
*/
|
|
14
|
-
const DEFAULT_BINDING_SLOT = {
|
|
15
|
-
name: void 0,
|
|
16
|
-
tags: []
|
|
17
|
-
};
|
|
18
|
-
/**
|
|
19
|
-
* @since 0.3.16-canary.0
|
|
20
|
-
*/
|
|
21
|
-
function bindingSlotToString(slot) {
|
|
22
|
-
if (slot.name === void 0 && slot.tags.length === 0) return "default";
|
|
23
|
-
const parts = [];
|
|
24
|
-
if (slot.name !== void 0) parts.push(`name:${slot.name}`);
|
|
25
|
-
for (const [tagKey, tagValue] of slot.tags) parts.push(`tag:${tagKey}=${String(tagValue)}`);
|
|
26
|
-
return parts.join(",");
|
|
27
|
-
}
|
|
28
|
-
let _idCounter = 0;
|
|
29
|
-
/**
|
|
30
|
-
* @since 0.3.16-canary.0
|
|
31
|
-
*/
|
|
32
|
-
function generateBindingId() {
|
|
33
|
-
return String(++_idCounter);
|
|
34
|
-
}
|
|
35
|
-
//#endregion
|
|
36
|
-
export { DEFAULT_BINDING_SLOT, bindingSlotEquals, bindingSlotToString, generateBindingId };
|
package/dist/constraints.d.mts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { Constructor } from "./constructor-type.mjs";
|
|
2
|
-
import { Token } from "./token.mjs";
|
|
3
|
-
import { BindingTag, ConstraintContext } from "./types.mjs";
|
|
4
|
-
|
|
5
|
-
//#region src/constraints.d.ts
|
|
6
|
-
/**
|
|
7
|
-
* @since 0.3.16-canary.0
|
|
8
|
-
*/
|
|
9
|
-
declare function whenParentIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
|
|
10
|
-
/**
|
|
11
|
-
* @since 0.3.16-canary.0
|
|
12
|
-
*/
|
|
13
|
-
declare function whenNoParentIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
|
|
14
|
-
/**
|
|
15
|
-
* @since 0.3.16-canary.0
|
|
16
|
-
*/
|
|
17
|
-
declare function whenAnyAncestorIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
|
|
18
|
-
/**
|
|
19
|
-
* @since 0.3.16-canary.0
|
|
20
|
-
*/
|
|
21
|
-
declare function whenNoAncestorIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
|
|
22
|
-
/**
|
|
23
|
-
* @since 0.3.16-canary.0
|
|
24
|
-
*/
|
|
25
|
-
declare function whenParentNamed(name: string): (constraintContext: ConstraintContext) => boolean;
|
|
26
|
-
/**
|
|
27
|
-
* @since 0.3.16-canary.0
|
|
28
|
-
*/
|
|
29
|
-
declare function whenAnyAncestorNamed(name: string): (constraintContext: ConstraintContext) => boolean;
|
|
30
|
-
/**
|
|
31
|
-
* @since 0.3.16-canary.0
|
|
32
|
-
*/
|
|
33
|
-
declare function whenParentTagged(tag: string, value: unknown): (constraintContext: ConstraintContext) => boolean;
|
|
34
|
-
/**
|
|
35
|
-
* @since 0.3.16-canary.0
|
|
36
|
-
*/
|
|
37
|
-
declare function whenAnyAncestorTagged(tag: string, value: unknown): (constraintContext: ConstraintContext) => boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Matches when the direct parent slot carries **all** of the given tag pairs.
|
|
40
|
-
* Equivalent to AND-composing multiple `whenParentTagged` calls but evaluates
|
|
41
|
-
* in a single predicate invocation — no intermediate closure allocations.
|
|
42
|
-
*
|
|
43
|
-
* @since 0.3.16-canary.1
|
|
44
|
-
*/
|
|
45
|
-
declare function whenParentTaggedAll(tags: ReadonlyArray<BindingTag>): (constraintContext: ConstraintContext) => boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Matches when at least one ancestor slot carries **all** of the given tag pairs.
|
|
48
|
-
* Equivalent to AND-composing multiple `whenAnyAncestorTagged` calls but evaluates
|
|
49
|
-
* in a single predicate invocation — no intermediate closure allocations.
|
|
50
|
-
*
|
|
51
|
-
* @since 0.3.16-canary.1
|
|
52
|
-
*/
|
|
53
|
-
declare function whenAnyAncestorTaggedAll(tags: ReadonlyArray<BindingTag>): (constraintContext: ConstraintContext) => boolean;
|
|
54
|
-
//#endregion
|
|
55
|
-
export { whenAnyAncestorIs, whenAnyAncestorNamed, whenAnyAncestorTagged, whenAnyAncestorTaggedAll, whenNoAncestorIs, whenNoParentIs, whenParentIs, whenParentNamed, whenParentTagged, whenParentTaggedAll };
|
package/dist/constraints.mjs
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { tokenName } from "./token.mjs";
|
|
2
|
-
//#region src/constraints.ts
|
|
3
|
-
function tokenNameOf(token) {
|
|
4
|
-
return tokenName(token);
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* @since 0.3.16-canary.0
|
|
8
|
-
*/
|
|
9
|
-
function whenParentIs(token) {
|
|
10
|
-
const tokenDisplayName = tokenNameOf(token);
|
|
11
|
-
return (constraintContext) => constraintContext.parent !== void 0 && constraintContext.parent.tokenName === tokenDisplayName;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* @since 0.3.16-canary.0
|
|
15
|
-
*/
|
|
16
|
-
function whenNoParentIs(token) {
|
|
17
|
-
const tokenDisplayName = tokenNameOf(token);
|
|
18
|
-
return (constraintContext) => constraintContext.parent === void 0 || constraintContext.parent.tokenName !== tokenDisplayName;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* @since 0.3.16-canary.0
|
|
22
|
-
*/
|
|
23
|
-
function whenAnyAncestorIs(token) {
|
|
24
|
-
const tokenDisplayName = tokenNameOf(token);
|
|
25
|
-
return (constraintContext) => constraintContext.ancestors.some((ancestorFrame) => ancestorFrame.tokenName === tokenDisplayName);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* @since 0.3.16-canary.0
|
|
29
|
-
*/
|
|
30
|
-
function whenNoAncestorIs(token) {
|
|
31
|
-
const tokenDisplayName = tokenNameOf(token);
|
|
32
|
-
return (constraintContext) => constraintContext.ancestors.every((ancestorFrame) => ancestorFrame.tokenName !== tokenDisplayName);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* @since 0.3.16-canary.0
|
|
36
|
-
*/
|
|
37
|
-
function whenParentNamed(name) {
|
|
38
|
-
return (constraintContext) => constraintContext.parent !== void 0 && constraintContext.parent.slot.name === name;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* @since 0.3.16-canary.0
|
|
42
|
-
*/
|
|
43
|
-
function whenAnyAncestorNamed(name) {
|
|
44
|
-
return (constraintContext) => constraintContext.ancestors.some((ancestorFrame) => ancestorFrame.slot.name === name);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* @since 0.3.16-canary.0
|
|
48
|
-
*/
|
|
49
|
-
function whenParentTagged(tag, value) {
|
|
50
|
-
return (constraintContext) => constraintContext.parent !== void 0 && constraintContext.parent.slot.tags.some(([tagKey, tagValue]) => tagKey === tag && Object.is(tagValue, value));
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* @since 0.3.16-canary.0
|
|
54
|
-
*/
|
|
55
|
-
function whenAnyAncestorTagged(tag, value) {
|
|
56
|
-
return (constraintContext) => constraintContext.ancestors.some((ancestorFrame) => ancestorFrame.slot.tags.some(([tagKey, tagValue]) => tagKey === tag && Object.is(tagValue, value)));
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Matches when the direct parent slot carries **all** of the given tag pairs.
|
|
60
|
-
* Equivalent to AND-composing multiple `whenParentTagged` calls but evaluates
|
|
61
|
-
* in a single predicate invocation — no intermediate closure allocations.
|
|
62
|
-
*
|
|
63
|
-
* @since 0.3.16-canary.1
|
|
64
|
-
*/
|
|
65
|
-
function whenParentTaggedAll(tags) {
|
|
66
|
-
return (constraintContext) => {
|
|
67
|
-
const { parent } = constraintContext;
|
|
68
|
-
if (parent === void 0) return false;
|
|
69
|
-
const { tags: parentTags } = parent.slot;
|
|
70
|
-
return tags.every(([tagKey, tagValue]) => parentTags.some(([otherKey, otherValue]) => otherKey === tagKey && Object.is(otherValue, tagValue)));
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Matches when at least one ancestor slot carries **all** of the given tag pairs.
|
|
75
|
-
* Equivalent to AND-composing multiple `whenAnyAncestorTagged` calls but evaluates
|
|
76
|
-
* in a single predicate invocation — no intermediate closure allocations.
|
|
77
|
-
*
|
|
78
|
-
* @since 0.3.16-canary.1
|
|
79
|
-
*/
|
|
80
|
-
function whenAnyAncestorTaggedAll(tags) {
|
|
81
|
-
return (constraintContext) => constraintContext.ancestors.some((frame) => {
|
|
82
|
-
const { tags: frameTags } = frame.slot;
|
|
83
|
-
return tags.every(([tagKey, tagValue]) => frameTags.some(([otherKey, otherValue]) => otherKey === tagKey && Object.is(otherValue, tagValue)));
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
//#endregion
|
|
87
|
-
export { whenAnyAncestorIs, whenAnyAncestorNamed, whenAnyAncestorTagged, whenAnyAncestorTaggedAll, whenNoAncestorIs, whenNoParentIs, whenParentIs, whenParentNamed, whenParentTagged, whenParentTaggedAll };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|