ts-ioc-container 72.2.0 → 72.3.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.
Files changed (58) hide show
  1. package/README.md +242 -0
  2. package/cjm/container/Container.js +3 -0
  3. package/cjm/container/EmptyContainer.js +3 -0
  4. package/cjm/feature/IFeatureFlags.js +6 -0
  5. package/cjm/index.js +11 -2
  6. package/cjm/token/BindableToken.js +63 -0
  7. package/cjm/token/GroupAliasToken.js +5 -50
  8. package/cjm/token/MultiVariantFeatureToken.js +84 -0
  9. package/cjm/token/SingleAliasToken.js +5 -50
  10. package/cjm/token/SingleToken.js +5 -50
  11. package/cjm/token/ToggleFeatureToken.js +10 -0
  12. package/esm/container/Container.js +3 -0
  13. package/esm/container/EmptyContainer.js +3 -0
  14. package/esm/feature/IFeatureFlags.js +3 -0
  15. package/esm/index.js +4 -0
  16. package/esm/token/BindableToken.js +59 -0
  17. package/esm/token/GroupAliasToken.js +5 -50
  18. package/esm/token/MultiVariantFeatureToken.js +80 -0
  19. package/esm/token/SingleAliasToken.js +5 -50
  20. package/esm/token/SingleToken.js +5 -50
  21. package/esm/token/ToggleFeatureToken.js +6 -0
  22. package/lib/container/Container.ts +4 -0
  23. package/lib/container/EmptyContainer.ts +4 -0
  24. package/lib/container/IContainer.ts +3 -0
  25. package/lib/feature/IFeatureFlags.ts +44 -0
  26. package/lib/index.ts +16 -0
  27. package/lib/registration/IRegistration.ts +12 -5
  28. package/lib/token/BindableToken.ts +137 -0
  29. package/lib/token/GroupAliasToken.ts +10 -69
  30. package/lib/token/MultiVariantFeatureToken.ts +160 -0
  31. package/lib/token/SingleAliasToken.ts +11 -67
  32. package/lib/token/SingleToken.ts +9 -67
  33. package/lib/token/ToggleFeatureToken.ts +27 -0
  34. package/package.json +3 -3
  35. package/typings/container/Container.d.ts +1 -0
  36. package/typings/container/Container.d.ts.map +1 -1
  37. package/typings/container/EmptyContainer.d.ts +1 -0
  38. package/typings/container/EmptyContainer.d.ts.map +1 -1
  39. package/typings/container/IContainer.d.ts +2 -0
  40. package/typings/container/IContainer.d.ts.map +1 -1
  41. package/typings/feature/IFeatureFlags.d.ts +42 -0
  42. package/typings/feature/IFeatureFlags.d.ts.map +1 -0
  43. package/typings/index.d.ts +4 -0
  44. package/typings/index.d.ts.map +1 -1
  45. package/typings/registration/IRegistration.d.ts +12 -5
  46. package/typings/registration/IRegistration.d.ts.map +1 -1
  47. package/typings/token/BindableToken.d.ts +80 -0
  48. package/typings/token/BindableToken.d.ts.map +1 -0
  49. package/typings/token/GroupAliasToken.d.ts +9 -24
  50. package/typings/token/GroupAliasToken.d.ts.map +1 -1
  51. package/typings/token/MultiVariantFeatureToken.d.ts +79 -0
  52. package/typings/token/MultiVariantFeatureToken.d.ts.map +1 -0
  53. package/typings/token/SingleAliasToken.d.ts +10 -22
  54. package/typings/token/SingleAliasToken.d.ts.map +1 -1
  55. package/typings/token/SingleToken.d.ts +8 -22
  56. package/typings/token/SingleToken.d.ts.map +1 -1
  57. package/typings/token/ToggleFeatureToken.d.ts +25 -0
  58. package/typings/token/ToggleFeatureToken.d.ts.map +1 -0
@@ -1,91 +1,32 @@
1
- import { DependencyKey, IContainer } from '../container/IContainer';
2
- import { forwardArgs, InjectionToken } from './InjectionToken';
3
- import { IRegistration } from '../registration/IRegistration';
4
- import { BindToken } from './BindToken';
5
- import { ArgsFn, ResolveOptions } from '../provider/IProvider';
6
- import { Serializable } from '../utils/basic';
1
+ import { type DependencyKey, type IContainer } from '../container/IContainer';
2
+ import { BindableToken } from './BindableToken';
3
+ import { type IRegistration } from '../registration/IRegistration';
4
+ import { type ResolveOptions } from '../provider/IProvider';
7
5
 
8
6
  /**
9
- * A token for every dependency registered under an alias. As a `bindTo(...)`
7
+ * A token for every dependency registered under an alias. As a `@register(...)`
10
8
  * target it adds the alias; resolving returns all matches as an array.
11
9
  *
12
10
  * @example
13
11
  * const IMiddlewareToken = toGroupAlias<IMiddleware>('IMiddleware');
14
12
  *
15
- * @register(bindTo(IMiddlewareToken))
13
+ * @register(IMiddlewareToken)
16
14
  * class Auth implements IMiddleware {}
17
15
  *
18
16
  * IMiddlewareToken.resolve(scope); // IMiddleware[]
19
17
  */
20
- export class GroupAliasToken<T = any> extends InjectionToken<T[]> implements BindToken<T>, Serializable {
21
- private readonly _getArgsFn: ArgsFn;
22
- private readonly _isLazy: boolean;
23
-
24
- constructor(
25
- readonly token: DependencyKey,
26
- {
27
- getArgsFn = forwardArgs,
28
- isLazy = false,
29
- tags = [],
30
- }: { getArgsFn?: ArgsFn; isLazy?: boolean; tags?: string[] } = {},
31
- ) {
32
- super(tags);
33
- this._getArgsFn = getArgsFn;
34
- this._isLazy = isLazy;
35
- }
36
-
18
+ export class GroupAliasToken<T = any> extends BindableToken<T, T[]> {
37
19
  select<R>(fn: (target: T[]) => R[]) {
38
20
  return (s: IContainer) => fn(this.resolve(s));
39
21
  }
40
22
 
41
- resolve(s: IContainer, { args = [], lazy }: ResolveOptions = {}): T[] {
42
- return s.resolveByAlias(this.token, {
43
- args: this._getArgsFn({ scope: s, args }),
44
- lazy: this._isLazy || lazy,
45
- });
23
+ resolve(s: IContainer, options?: ResolveOptions): T[] {
24
+ return s.resolveByAlias(this.token, this.toResolveOptions(s, options));
46
25
  }
47
26
 
48
- bindTo(r: IRegistration<T>) {
27
+ protected bindKey(r: IRegistration<T>) {
49
28
  r.bindToAlias(this.token);
50
29
  }
51
-
52
- args(...newArgs: unknown[]) {
53
- const parentFn = this._getArgsFn;
54
- return new GroupAliasToken<T>(this.token, {
55
- getArgsFn: (options) => [...parentFn(options), ...newArgs],
56
- isLazy: this._isLazy,
57
- tags: this.getTags(),
58
- });
59
- }
60
-
61
- argsFn(fn: (s: IContainer) => unknown[]) {
62
- const parentFn = this._getArgsFn;
63
- return new GroupAliasToken<T>(this.token, {
64
- getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
65
- isLazy: this._isLazy,
66
- tags: this.getTags(),
67
- });
68
- }
69
-
70
- lazy() {
71
- return new GroupAliasToken<T>(this.token, {
72
- getArgsFn: this._getArgsFn,
73
- isLazy: true,
74
- tags: this.getTags(),
75
- });
76
- }
77
-
78
- addTags(...tags: string[]): GroupAliasToken<T> {
79
- return new GroupAliasToken<T>(this.token, {
80
- getArgsFn: this._getArgsFn,
81
- isLazy: this._isLazy,
82
- tags: [...this.getTags(), ...tags],
83
- });
84
- }
85
-
86
- toString(): string {
87
- return this.token.toString();
88
- }
89
30
  }
90
31
 
91
32
  /** Creates a {@link GroupAliasToken} for `token`. */
@@ -0,0 +1,160 @@
1
+ import { type DependencyKey, type IContainer } from '../container/IContainer';
2
+ import { forwardArgs, InjectionToken } from './InjectionToken';
3
+ import { type ArgsFn, type ResolveOptions } from '../provider/IProvider';
4
+ import { type Serializable } from '../utils/basic';
5
+ import { ProxyRegistry } from '../utils/ProxyRegistry';
6
+ import { DependencyNotFoundError } from '../errors/DependencyNotFoundError';
7
+ import {
8
+ type FeatureContext,
9
+ type IFeatureFlags,
10
+ IFeatureContextToken,
11
+ IFeatureFlagsToken,
12
+ } from '../feature/IFeatureFlags';
13
+
14
+ export type FeatureTokenOptions = { getArgsFn?: ArgsFn; isLazy?: boolean; tags?: string[] };
15
+
16
+ /** What a feature token reads from its flag: whether it is on, and the named variant served, if any. */
17
+ export type FeatureEvaluation<V extends string = string> = { enabled: boolean; variant?: V };
18
+
19
+ /**
20
+ * A dependency switched by a multi-variant feature flag. The implementations
21
+ * decide where they belong - a bindable token declares itself
22
+ *
23
+ * - a named variant with `variantOf(feature, name)`: used while the flag serves `name`;
24
+ * - the primary variant with `primaryVariantOf(feature)`: used while the flag is
25
+ * on and no named variant implementation matches;
26
+ * - the fallback with `fallbackOf(feature)`: used otherwise - the flag is off,
27
+ * or its client throws.
28
+ *
29
+ * A flag always has a fallback: resolving a feature without one registered fails.
30
+ *
31
+ * `flag` is the flag's name on the flag service. `V` narrows the variant names
32
+ * implementations may claim. The flag client comes from `IFeatureFlagsToken`
33
+ * and the context from `IFeatureContextToken`, both resolved from the resolving
34
+ * scope, on every resolution.
35
+ *
36
+ * Subclasses change only how the served variant is evaluated - see
37
+ * `ToggleFeatureToken`, the on/off case.
38
+ *
39
+ * @example
40
+ * const CheckoutButtonToken = new MultiVariantFeatureToken<IButton, 'blue' | 'green'>('checkout-button');
41
+ *
42
+ * @register(new SingleToken<IButton>('GreyButton').fallbackOf(CheckoutButtonToken))
43
+ * class GreyButton implements IButton {}
44
+ *
45
+ * @register(new SingleToken<IButton>('BlueButton').variantOf(CheckoutButtonToken, 'blue'))
46
+ * class BlueButton implements IButton {}
47
+ *
48
+ * @register(new SingleToken<IButton>('GreenButton').primaryVariantOf(CheckoutButtonToken))
49
+ * class GreenButton implements IButton {}
50
+ */
51
+ export class MultiVariantFeatureToken<T = any, V extends string = string>
52
+ extends InjectionToken<T>
53
+ implements Serializable
54
+ {
55
+ private readonly _getArgsFn: ArgsFn;
56
+ private readonly _isLazy: boolean;
57
+
58
+ constructor(
59
+ readonly flag: string,
60
+ { getArgsFn = forwardArgs, isLazy = false, tags = [] }: FeatureTokenOptions = {},
61
+ ) {
62
+ super(tags);
63
+ this._getArgsFn = getArgsFn;
64
+ this._isLazy = isLazy;
65
+ }
66
+
67
+ /** The alias an implementation of the variant `name` is bound to. Declare it with `token.variantOf(feature, name)`. */
68
+ variantAlias(name: V): DependencyKey {
69
+ return `feature:${this.flag}:variant:${name}`;
70
+ }
71
+
72
+ /** The alias the primary variant is bound to. Declare it with `token.primaryVariantOf(feature)`. */
73
+ primaryAlias(): DependencyKey {
74
+ return `feature:${this.flag}:primary`;
75
+ }
76
+
77
+ /** The alias the fallback is bound to. Declare it with `token.fallbackOf(feature)`. */
78
+ fallbackAlias(): DependencyKey {
79
+ return `feature:${this.flag}:fallback`;
80
+ }
81
+
82
+ /**
83
+ * @throws {DependencyNotFoundError} when the flag has no fallback, or the flag client, the feature context or the selected implementation cannot be resolved.
84
+ * @throws {ContainerDisposedError} when `s` has already been disposed.
85
+ */
86
+ resolve(s: IContainer, { args = [], lazy }: ResolveOptions = {}): T {
87
+ const resolveSelected = () =>
88
+ s.resolveOneByAlias<T>(this.selectAlias(s), { args: this._getArgsFn({ scope: s, args }) });
89
+ return ProxyRegistry.getInstance().toLazyIf(resolveSelected as () => T & object, this._isLazy || lazy);
90
+ }
91
+
92
+ args(...newArgs: unknown[]): this {
93
+ const parentFn = this._getArgsFn;
94
+ return this.copy({ getArgsFn: (options) => [...parentFn(options), ...newArgs] });
95
+ }
96
+
97
+ argsFn(fn: (s: IContainer) => unknown[]): this {
98
+ const parentFn = this._getArgsFn;
99
+ return this.copy({ getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)] });
100
+ }
101
+
102
+ lazy(): this {
103
+ return this.copy({ isLazy: true });
104
+ }
105
+
106
+ addTags(...tags: string[]): this {
107
+ return this.copy({ tags: [...this.getTags(), ...tags] });
108
+ }
109
+
110
+ toString(): string {
111
+ return this.flag;
112
+ }
113
+
114
+ /** Whether the flag is on for `context`, and the named variant it serves, if any. */
115
+ protected evaluate(flags: IFeatureFlags, context: FeatureContext): FeatureEvaluation<V> {
116
+ const served = flags.getVariant(this.flag, context);
117
+ return served.enabled
118
+ ? { enabled: true, variant: served.name as V }
119
+ : { enabled: flags.isEnabled(this.flag, context) };
120
+ }
121
+
122
+ private copy(overrides: FeatureTokenOptions): this {
123
+ const Self = this.constructor as new (flag: string, options: FeatureTokenOptions) => this;
124
+ return new Self(this.flag, {
125
+ getArgsFn: this._getArgsFn,
126
+ isLazy: this._isLazy,
127
+ tags: this.getTags(),
128
+ ...overrides,
129
+ });
130
+ }
131
+
132
+ /**
133
+ * The alias of the served variant's implementation, or of the fallback.
134
+ *
135
+ * @throws {DependencyNotFoundError} when the flag has no fallback, or the flag client or the feature context cannot be resolved.
136
+ */
137
+ private selectAlias(s: IContainer): DependencyKey {
138
+ const fallback = this.fallbackAlias();
139
+ if (!s.hasAlias(fallback)) {
140
+ throw new DependencyNotFoundError(
141
+ `Feature flag "${this.flag}" has no fallback: a flag always has one. ` +
142
+ `Register it with @register(token.fallbackOf(feature)) in this scope or a parent.`,
143
+ );
144
+ }
145
+
146
+ const flags = IFeatureFlagsToken.resolve(s);
147
+ const context = IFeatureContextToken.resolve(s);
148
+ let served: FeatureEvaluation<V> = { enabled: false };
149
+ try {
150
+ served = this.evaluate(flags, context);
151
+ } catch {
152
+ // A flag always has a fallback: a failing client serves it.
153
+ }
154
+ const candidates = [
155
+ served.variant === undefined ? undefined : this.variantAlias(served.variant),
156
+ served.enabled ? this.primaryAlias() : undefined,
157
+ ];
158
+ return candidates.find((alias) => alias !== undefined && s.hasAlias(alias)) ?? fallback;
159
+ }
160
+ }
@@ -1,83 +1,27 @@
1
- import { DependencyKey, IContainer } from '../container/IContainer';
2
- import { forwardArgs, InjectionToken } from './InjectionToken';
3
- import { IRegistration } from '../registration/IRegistration';
4
- import { BindToken } from './BindToken';
5
- import { ArgsFn, ResolveOptions } from '../provider/IProvider';
6
- import { Serializable } from '../utils/basic';
1
+ import { type DependencyKey, type IContainer } from '../container/IContainer';
2
+ import { BindableToken } from './BindableToken';
3
+ import { type IRegistration } from '../registration/IRegistration';
4
+ import { type ResolveOptions } from '../provider/IProvider';
7
5
 
8
6
  /**
9
7
  * Like {@link GroupAliasToken}, but resolves exactly one dependency registered
10
8
  * under the alias, and throws `DependencyNotFoundError` when there is none.
11
9
  */
12
- export class SingleAliasToken<T = any> extends InjectionToken<T> implements BindToken<T>, Serializable {
13
- private readonly _getArgsFn: ArgsFn;
14
- private readonly _isLazy: boolean;
15
-
16
- constructor(
17
- readonly token: DependencyKey,
18
- {
19
- getArgsFn = forwardArgs,
20
- isLazy = false,
21
- tags = [],
22
- }: { getArgsFn?: ArgsFn; isLazy?: boolean; tags?: string[] } = {},
23
- ) {
24
- super(tags);
25
- this._getArgsFn = getArgsFn;
26
- this._isLazy = isLazy;
27
- }
28
-
10
+ export class SingleAliasToken<T = any> extends BindableToken<T> {
29
11
  select<R>(fn: (target: T) => R) {
30
12
  return (s: IContainer) => fn(this.resolve(s));
31
13
  }
32
14
 
33
- resolve(s: IContainer, { args = [], lazy }: ResolveOptions = {}): T {
34
- return s.resolveOneByAlias(this.token, {
35
- args: this._getArgsFn({ scope: s, args }),
36
- lazy: this._isLazy || lazy,
37
- });
15
+ /**
16
+ * @throws {DependencyNotFoundError} when no accessible registration carries the alias.
17
+ */
18
+ resolve(s: IContainer, options?: ResolveOptions): T {
19
+ return s.resolveOneByAlias(this.token, this.toResolveOptions(s, options));
38
20
  }
39
21
 
40
- bindTo(r: IRegistration<T>) {
22
+ protected bindKey(r: IRegistration<T>) {
41
23
  r.bindToAlias(this.token);
42
24
  }
43
-
44
- args(...newArgs: unknown[]) {
45
- const parentFn = this._getArgsFn;
46
- return new SingleAliasToken<T>(this.token, {
47
- getArgsFn: (options) => [...parentFn(options), ...newArgs],
48
- isLazy: this._isLazy,
49
- tags: this.getTags(),
50
- });
51
- }
52
-
53
- argsFn(fn: (s: IContainer) => unknown[]) {
54
- const parentFn = this._getArgsFn;
55
- return new SingleAliasToken<T>(this.token, {
56
- getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
57
- isLazy: this._isLazy,
58
- tags: this.getTags(),
59
- });
60
- }
61
-
62
- lazy() {
63
- return new SingleAliasToken<T>(this.token, {
64
- getArgsFn: this._getArgsFn,
65
- isLazy: true,
66
- tags: this.getTags(),
67
- });
68
- }
69
-
70
- addTags(...tags: string[]): SingleAliasToken<T> {
71
- return new SingleAliasToken<T>(this.token, {
72
- getArgsFn: this._getArgsFn,
73
- isLazy: this._isLazy,
74
- tags: [...this.getTags(), ...tags],
75
- });
76
- }
77
-
78
- toString(): string {
79
- return this.token.toString();
80
- }
81
25
  }
82
26
 
83
27
  /** Creates a {@link SingleAliasToken} for `token`. */
@@ -1,8 +1,7 @@
1
- import { DependencyKey, IContainer } from '../container/IContainer';
2
- import { forwardArgs, InjectionToken } from './InjectionToken';
3
- import { IRegistration } from '../registration/IRegistration';
4
- import { ArgsFn, ResolveOptions } from '../provider/IProvider';
5
- import { Serializable } from '../utils/basic';
1
+ import { type IContainer } from '../container/IContainer';
2
+ import { BindableToken } from './BindableToken';
3
+ import { type IRegistration } from '../registration/IRegistration';
4
+ import { type ResolveOptions } from '../provider/IProvider';
6
5
 
7
6
  /**
8
7
  * A typed handle for one dependency key - the usual way to name a dependency.
@@ -12,7 +11,7 @@ import { Serializable } from '../utils/basic';
12
11
  * @example
13
12
  * const ILoggerToken = new SingleToken<ILogger>('ILogger');
14
13
  *
15
- * @register(bindTo(ILoggerToken))
14
+ * @register(ILoggerToken)
16
15
  * class Logger implements ILogger {}
17
16
  *
18
17
  * class App {
@@ -21,73 +20,16 @@ import { Serializable } from '../utils/basic';
21
20
  * ILoggerToken.resolve(scope);
22
21
  * ILoggerToken.args('prefix').lazy().resolve(scope);
23
22
  */
24
- export class SingleToken<T = any> extends InjectionToken<T> implements Serializable {
25
- private readonly _getArgsFn: ArgsFn;
26
- private readonly _isLazy: boolean;
27
-
28
- constructor(
29
- public token: DependencyKey,
30
- {
31
- getArgsFn = forwardArgs,
32
- isLazy = false,
33
- tags = [],
34
- }: { getArgsFn?: ArgsFn; isLazy?: boolean; tags?: string[] } = {},
35
- ) {
36
- super(tags);
37
- this._getArgsFn = getArgsFn;
38
- this._isLazy = isLazy;
39
- }
40
-
23
+ export class SingleToken<T = any> extends BindableToken<T> {
41
24
  select<R>(fn: (target: T) => R) {
42
25
  return (s: IContainer) => fn(this.resolve(s));
43
26
  }
44
27
 
45
- resolve(s: IContainer, { args = [], lazy }: ResolveOptions = {}): T {
46
- return s.resolve(this.token, {
47
- args: this._getArgsFn({ scope: s, args }),
48
- lazy: this._isLazy || lazy,
49
- });
28
+ resolve(s: IContainer, options?: ResolveOptions): T {
29
+ return s.resolve(this.token, this.toResolveOptions(s, options));
50
30
  }
51
31
 
52
- bindTo(r: IRegistration<T>) {
32
+ protected bindKey(r: IRegistration<T>) {
53
33
  r.bindToKey(this.token);
54
34
  }
55
-
56
- args(...newArgs: unknown[]) {
57
- const parentFn = this._getArgsFn;
58
- return new SingleToken<T>(this.token, {
59
- getArgsFn: (options) => [...parentFn(options), ...newArgs],
60
- isLazy: this._isLazy,
61
- tags: this.getTags(),
62
- });
63
- }
64
-
65
- argsFn(fn: (s: IContainer) => unknown[]) {
66
- const parentFn = this._getArgsFn;
67
- return new SingleToken<T>(this.token, {
68
- getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
69
- isLazy: this._isLazy,
70
- tags: this.getTags(),
71
- });
72
- }
73
-
74
- lazy() {
75
- return new SingleToken<T>(this.token, {
76
- getArgsFn: this._getArgsFn,
77
- isLazy: true,
78
- tags: this.getTags(),
79
- });
80
- }
81
-
82
- addTags(...tags: string[]): SingleToken<T> {
83
- return new SingleToken<T>(this.token, {
84
- getArgsFn: this._getArgsFn,
85
- isLazy: this._isLazy,
86
- tags: [...this.getTags(), ...tags],
87
- });
88
- }
89
-
90
- toString(): string {
91
- return this.token.toString();
92
- }
93
35
  }
@@ -0,0 +1,27 @@
1
+ import { type FeatureEvaluation, MultiVariantFeatureToken } from './MultiVariantFeatureToken';
2
+ import { type FeatureContext, type IFeatureFlags } from '../feature/IFeatureFlags';
3
+
4
+ /**
5
+ * The on/off case of {@link MultiVariantFeatureToken}: a flag with no named
6
+ * variants, only a primary one, served while `isEnabled` says so. Everything
7
+ * else - the fallback, the context, args and laziness - is the multi-variant
8
+ * token's.
9
+ *
10
+ * @example
11
+ * const PaymentGatewayToken = new ToggleFeatureToken<IPaymentGateway>('new-checkout');
12
+ *
13
+ * @register(new SingleToken<IPaymentGateway>('LegacyGateway').fallbackOf(PaymentGatewayToken))
14
+ * class LegacyGateway implements IPaymentGateway {}
15
+ *
16
+ * @register(new SingleToken<IPaymentGateway>('StripeGateway').primaryVariantOf(PaymentGatewayToken))
17
+ * class StripeGateway implements IPaymentGateway {}
18
+ *
19
+ * class Checkout {
20
+ * constructor(@inject(by(PaymentGatewayToken)) gateway: IPaymentGateway) {}
21
+ * }
22
+ */
23
+ export class ToggleFeatureToken<T = any> extends MultiVariantFeatureToken<T, never> {
24
+ protected override evaluate(flags: IFeatureFlags, context: FeatureContext): FeatureEvaluation<never> {
25
+ return { enabled: flags.isEnabled(this.flag, context) };
26
+ }
27
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "72.2.0",
3
+ "version": "72.3.1",
4
4
  "description": "Fast, lightweight TypeScript dependency injection container with a clean API, scoped lifecycles, decorators, tokens, hooks, lazy injection, customizable providers, and no global container objects.",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -79,7 +79,7 @@
79
79
  "reflect-metadata": "^0.2.2",
80
80
  "tsyringe": "^4.10.0",
81
81
  "typescript": "5.8.3",
82
- "unplugin-swc": "^1.5.9",
82
+ "unplugin-swc": "^1.6.0",
83
83
  "vite": "^6.4.1",
84
84
  "vitest": "^4.1.11"
85
85
  },
@@ -90,7 +90,7 @@
90
90
  "build:cjm": "node ../scripts/build.mjs cjm",
91
91
  "build:esm": "node ../scripts/build.mjs esm",
92
92
  "build:types": "node ../scripts/build.mjs types",
93
- "generate:docs": "../scripts/generate-readme/generate-readme.ts && git add README.md",
93
+ "generate:docs": "../scripts/generate-readme/generate-readme.ts",
94
94
  "build": "pnpm run build:cjm && pnpm run build:esm && pnpm run build:types",
95
95
  "test": "vitest run",
96
96
  "test:spec": "vitest run __tests__/specs",
@@ -80,6 +80,7 @@ export declare class Container implements IContainer {
80
80
  getRegistrations(): IRegistration[];
81
81
  getInjector(): IInjector;
82
82
  hasRegistration(key: DependencyKey): boolean;
83
+ hasAlias(alias: DependencyKey): boolean;
83
84
  addInstance(instance: Instance): void;
84
85
  getScopes(): IContainer[];
85
86
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../lib/container/Container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../lib/container/Container.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,7 @@ export declare class EmptyContainer implements IContainer {
49
49
  addTags(...tags: Tag[]): void;
50
50
  getRegistrations(): never[];
51
51
  hasRegistration(key: DependencyKey): boolean;
52
+ hasAlias(alias: DependencyKey): boolean;
52
53
  removeScope(): void;
53
54
  /**
54
55
  * @throws {MethodNotImplementedError} always — the empty container cannot use modules.
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyContainer.d.ts","sourceRoot":"","sources":["../../lib/container/EmptyContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,GAAG,EACT,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,WAAW,CAAC,QAAQ,EAAE,QAAQ;IAE9B,SAAS;IAIT,SAAS;IAIT,YAAY;IAIZ,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIxC;;OAEG;IACH,WAAW,IAAI,UAAU;IAIzB;;OAEG;IACH,WAAW,IAAI,SAAS;IAIxB;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAI/C;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAIpD;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO;IAIzB;;OAEG;IACH,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI7B,gBAAgB;IAIhB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI5C,WAAW,IAAI,IAAI;IAEnB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIzC;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,aAAa,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,CAAC;IAQ/E,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,CAAC,EAAE;IAI1E;;OAEG;IACH,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,CAAC;IAM1E;;OAEG;IACH,IAAI,YAAY,IAAI,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,CAE5C;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,CAE7C;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,WAAW,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAEpE;CACF"}
1
+ {"version":3,"file":"EmptyContainer.d.ts","sourceRoot":"","sources":["../../lib/container/EmptyContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,GAAG,EACT,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,WAAW,CAAC,QAAQ,EAAE,QAAQ;IAE9B,SAAS;IAIT,SAAS;IAIT,YAAY;IAIZ,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIxC;;OAEG;IACH,WAAW,IAAI,UAAU;IAIzB;;OAEG;IACH,WAAW,IAAI,SAAS;IAIxB;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAI/C;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAIpD;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO;IAIzB;;OAEG;IACH,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI7B,gBAAgB;IAIhB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI5C,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAIvC,WAAW,IAAI,IAAI;IAEnB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIzC;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,aAAa,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,CAAC;IAQ/E,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,CAAC,EAAE;IAI1E;;OAEG;IACH,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,CAAC;IAM1E;;OAEG;IACH,IAAI,YAAY,IAAI,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,CAE5C;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,CAE7C;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,WAAW,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAEpE;CACF"}
@@ -90,6 +90,8 @@ export interface IContainer extends Tagged {
90
90
  getRegistrations(): IRegistration[];
91
91
  /** Whether a provider is registered under `key` in this scope (parents are not checked). */
92
92
  hasRegistration(key: DependencyKey): boolean;
93
+ /** Whether a provider carrying `alias` is registered in this scope or a parent. Never throws for a missing alias. */
94
+ hasAlias(alias: DependencyKey): boolean;
93
95
  /**
94
96
  * Resolves a key, or constructs a class with the injector. Takes a key or a
95
97
  * class, not a token: for a token call `token.resolve(scope)`.
@@ -1 +1 @@
1
- {"version":3,"file":"IContainer.d.ts","sourceRoot":"","sources":["../../lib/container/IContainer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IContainer.d.ts","sourceRoot":"","sources":["../../lib/container/IContainer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { SingleToken } from '../token/SingleToken.js';
2
+ /**
3
+ * What a flag is evaluated for - usually the current user. Shaped after the
4
+ * Unleash context, so an Unleash client accepts it as is.
5
+ */
6
+ export type FeatureContext = {
7
+ userId?: string;
8
+ sessionId?: string;
9
+ remoteAddress?: string;
10
+ environment?: string;
11
+ properties?: Record<string, string | number | undefined>;
12
+ [key: string]: unknown;
13
+ };
14
+ /** A variant served for a flag. Unleash reports `{ name: 'disabled', enabled: false }` for a flag that is off. */
15
+ export type FeatureVariant = {
16
+ name: string;
17
+ enabled: boolean;
18
+ };
19
+ /**
20
+ * The flag client feature tokens ask: `getVariant` for a
21
+ * `MultiVariantFeatureToken`, `isEnabled` for a `ToggleFeatureToken`.
22
+ * Synchronous, because resolution is. An Unleash client satisfies it
23
+ * structurally - register the instance itself; an asynchronous client
24
+ * (OpenFeature server SDK) needs an adapter which evaluates ahead of time and
25
+ * answers from that snapshot.
26
+ *
27
+ * @example
28
+ * container.addRegistration(Registration.fromValue(unleash).bindTo(IFeatureFlagsToken));
29
+ */
30
+ export interface IFeatureFlags {
31
+ isEnabled(name: string, context?: FeatureContext): boolean;
32
+ getVariant(name: string, context?: FeatureContext): FeatureVariant;
33
+ }
34
+ /** Where feature tokens find the flag client. */
35
+ export declare const IFeatureFlagsToken: SingleToken<IFeatureFlags>;
36
+ /**
37
+ * Where feature tokens find the context to evaluate a flag for. Register it
38
+ * in the scope that knows the user (e.g. `request`); register `{}` for flags
39
+ * that do not depend on one.
40
+ */
41
+ export declare const IFeatureContextToken: SingleToken<FeatureContext>;
42
+ //# sourceMappingURL=IFeatureFlags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IFeatureFlags.d.ts","sourceRoot":"","sources":["../../lib/feature/IFeatureFlags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,kHAAkH;AAClH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAE3D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC;CACpE;AAED,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,4BAAkD,CAAC;AAElF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,6BAAqD,CAAC"}
@@ -32,10 +32,14 @@ export { type Injectable, toToken, argToToken } from './token/toToken.js';
32
32
  export { GroupAliasToken, toGroupAlias } from './token/GroupAliasToken.js';
33
33
  export { SingleAliasToken, toSingleAlias } from './token/SingleAliasToken.js';
34
34
  export { ClassToken } from './token/ClassToken.js';
35
+ export { BindableToken, type BindableTokenOptions } from './token/BindableToken.js';
35
36
  export { SingleToken } from './token/SingleToken.js';
36
37
  export { FunctionToken } from './token/FunctionToken.js';
37
38
  export { ConstantToken } from './token/ConstantToken.js';
38
39
  export { type InstancePredicate, GroupInstanceToken } from './token/GroupInstanceToken.js';
40
+ export { MultiVariantFeatureToken, type FeatureTokenOptions, type FeatureEvaluation, } from './token/MultiVariantFeatureToken.js';
41
+ export { ToggleFeatureToken } from './token/ToggleFeatureToken.js';
42
+ export { type IFeatureFlags, type FeatureContext, type FeatureVariant, IFeatureFlagsToken, IFeatureContextToken, } from './feature/IFeatureFlags.js';
39
43
  export { resolveConstructor } from './metadata/target.js';
40
44
  export { addClassMeta, getClassMeta, addClassLabel, getClassLabels, addClassTag, getClassTags, createComposeClassDecorator, } from './metadata/class.js';
41
45
  export { addParamMeta, getParamMeta, addParamLabel, getParamLabels, addParamTag, getParamTags, createComposeParameterDecorator, } from './metadata/parameter.js';