brandi 3.1.0 → 4.0.2

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/README.md CHANGED
@@ -42,7 +42,8 @@ Brandi has no dependencies, but requires the following globals in order to work:
42
42
 
43
43
  ### Production
44
44
 
45
- By default, Brandi will be in development mode. The development mode includes warnings about common mistakes.
45
+ By default, Brandi will be in development mode. The development mode includes warnings about common mistakes
46
+ and `capture()/resotre()` `Container` methods.
46
47
 
47
48
  Don't forget to set `process.env.NODE_ENV` to `production` when deploying your application.
48
49
 
package/lib/brandi.js CHANGED
@@ -80,9 +80,17 @@ var InstanceResolutionScopedBinding = class extends InstanceBinding {
80
80
  }
81
81
  };
82
82
  var InstanceSingletonScopedBinding = class extends InstanceBinding {
83
- constructor() {
84
- super(...arguments);
83
+ constructor(impl) {
84
+ super(impl);
85
+ this.impl = impl;
85
86
  this.scope = Scope.Singleton;
87
+ if (process.env.NODE_ENV !== "production") {
88
+ this.clone = () => {
89
+ const binding = new InstanceSingletonScopedBinding(this.impl);
90
+ binding.cache = this.cache;
91
+ return binding;
92
+ };
93
+ }
86
94
  }
87
95
  };
88
96
  var InstanceTransientScopedBinding = class extends InstanceBinding {
@@ -121,6 +129,20 @@ var _BindingsVault = class {
121
129
  constructor() {
122
130
  this.parent = null;
123
131
  this.map = new Map();
132
+ if (process.env.NODE_ENV !== "production") {
133
+ this.copy = () => this.from((prev) => {
134
+ const next = new Map();
135
+ prev.forEach((binding, key) => {
136
+ var _a, _b;
137
+ if (binding instanceof _BindingsVault) {
138
+ next.set(key, binding.copy());
139
+ } else {
140
+ next.set(key, (_b = (_a = binding.clone) == null ? void 0 : _a.call(binding)) != null ? _b : binding);
141
+ }
142
+ });
143
+ return next;
144
+ });
145
+ }
124
146
  }
125
147
  set(binding, token2, condition = _BindingsVault.notag) {
126
148
  const current = this.map.get(token2.__s);
@@ -172,14 +194,17 @@ var _BindingsVault = class {
172
194
  }
173
195
  return null;
174
196
  }
175
- clone() {
197
+ from(callback) {
176
198
  const vault = new _BindingsVault();
177
199
  vault.parent = this.parent;
178
- this.map.forEach((value, key) => {
179
- vault.map.set(key, new Map(value));
200
+ this.map.forEach((bindings, key) => {
201
+ vault.map.set(key, callback(bindings));
180
202
  });
181
203
  return vault;
182
204
  }
205
+ clone() {
206
+ return this.from((prev) => new Map(prev));
207
+ }
183
208
  };
184
209
  var BindingsVault = _BindingsVault;
185
210
  BindingsVault.notag = tag("NO_TAG");
@@ -295,8 +320,20 @@ var ResolutionCache = class {
295
320
  // src/container/Container.ts
296
321
  var Container = class extends DependencyModule {
297
322
  constructor() {
298
- super(...arguments);
323
+ super();
299
324
  this.snapshot = null;
325
+ if (process.env.NODE_ENV !== "production") {
326
+ this.capture = () => {
327
+ this.snapshot = this.vault.copy();
328
+ };
329
+ this.restore = () => {
330
+ if (this.snapshot) {
331
+ this.vault = this.snapshot.copy();
332
+ } else {
333
+ console.error("Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?");
334
+ }
335
+ };
336
+ }
300
337
  }
301
338
  extend(container) {
302
339
  this.vault.parent = container === null ? null : container.vault;
@@ -307,16 +344,6 @@ var Container = class extends DependencyModule {
307
344
  container.vault = this.vault.clone();
308
345
  return container;
309
346
  }
310
- capture() {
311
- this.snapshot = this.vault.clone();
312
- }
313
- restore() {
314
- if (this.snapshot) {
315
- this.vault = this.snapshot.clone();
316
- } else if (process.env.NODE_ENV !== "production") {
317
- console.error("Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?");
318
- }
319
- }
320
347
  get(token2, conditions) {
321
348
  return this.resolveToken(token2, conditions);
322
349
  }
@@ -339,8 +366,8 @@ var Container = class extends DependencyModule {
339
366
  });
340
367
  }
341
368
  if (isInstanceContainerScopedBinding(binding)) {
342
- return this.resolveCache(binding, cache, () => binding.cache.get(this), (instance) => {
343
- binding.cache.set(this, instance);
369
+ return this.resolveCache(binding, cache, () => binding.cache.get(this.vault), (instance) => {
370
+ binding.cache.set(this.vault, instance);
344
371
  });
345
372
  }
346
373
  if (isInstanceResolutionScopedBinding(binding)) {
package/lib/brandi.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/registries/callableRegistry.ts", "../src/registries/injectsRegistry.ts", "../src/registries/tagsRegistry.ts", "../src/container/bindings/Binding.ts", "../src/container/bindings/ConstantBinding.ts", "../src/container/bindings/FactoryBinding.ts", "../src/container/bindings/InstanceBinding.ts", "../src/pointers/tag.ts", "../src/pointers/token.ts", "../src/container/BindingsVault.ts", "../src/container/syntax/FromSyntax.ts", "../src/container/syntax/ScopeSyntax.ts", "../src/container/syntax/TypeSyntax.ts", "../src/container/syntax/BindOrUseSyntax.ts", "../src/container/syntax/WhenSyntax.ts", "../src/container/DependencyModule.ts", "../src/container/ResolutionCache.ts", "../src/container/Container.ts", "../src/container/createContainer.ts", "../src/container/createDependencyModule.ts", "../src/registrators/injected.ts", "../src/registrators/tagged.ts"],
4
- "sourcesContent": ["export {\n Container,\n DependencyModule,\n createContainer,\n createDependencyModule,\n} from './container';\nexport type {\n Tag,\n Token,\n TokenType,\n TokenTypeMap,\n TokenValue,\n RequiredToken,\n OptionalToken,\n} from './pointers';\nexport { tag, token } from './pointers';\nexport { injected, tagged } from './registrators';\nexport type { AsyncFactory, Factory, ResolutionCondition } from './types';\n", "import { UnknownCreator } from '../types';\n\nexport const callableRegistry = new Map<UnknownCreator, boolean>();\n", "import { TokenValue } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const injectsRegistry = new Map<UnknownCreator, TokenValue[]>();\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const tagsRegistry = new Map<UnknownCreator, Tag[]>();\n", "export enum Type {\n Constant,\n Instance,\n Factory,\n}\n\nexport enum Scope {\n Container,\n Resolution,\n Singleton,\n Transient,\n}\n\nexport interface Binding {\n readonly impl: unknown;\n readonly type: Type;\n}\n", "import { Binding, Type } from './Binding';\n\nexport class ConstantBinding implements Binding {\n public readonly type = Type.Constant;\n\n constructor(public readonly impl: unknown) {}\n}\n", "import { UnknownCreator } from '../../types';\n\nimport { Binding, Type } from './Binding';\n\nexport type FactoryInitializer = (\n instance: unknown,\n ...args: unknown[]\n) => unknown;\n\nexport class FactoryBinding implements Binding {\n public readonly type = Type.Factory;\n\n constructor(\n public readonly impl: {\n creator: UnknownCreator;\n initializer?: FactoryInitializer;\n },\n ) {}\n}\n\nexport const isFactoryBinding = (binding: Binding): binding is FactoryBinding =>\n binding.type === Type.Factory;\n", "import { UnknownCreator } from '../../types';\n\nimport type { Container } from '../Container';\n\nimport { Binding, Scope, Type } from './Binding';\n\nexport abstract class InstanceBinding implements Binding {\n public readonly type = Type.Instance;\n\n public abstract readonly scope: Scope;\n\n constructor(public readonly impl: UnknownCreator) {}\n}\n\nexport class InstanceContainerScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Container;\n\n public readonly cache = new WeakMap<Container, unknown>();\n}\n\nexport class InstanceResolutionScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Resolution;\n}\n\nexport class InstanceSingletonScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Singleton;\n\n public cache?: unknown;\n}\n\nexport class InstanceTransientScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Transient;\n}\n\nexport const isInstanceBinding = (\n binding: Binding,\n): binding is InstanceBinding => binding.type === Type.Instance;\n\nexport const isInstanceContainerScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceContainerScopedBinding =>\n binding.scope === Scope.Container;\n\nexport const isInstanceResolutionScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceResolutionScopedBinding =>\n binding.scope === Scope.Resolution;\n\nexport const isInstanceSingletonScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceSingletonScopedBinding =>\n binding.scope === Scope.Singleton;\n", "export type Tag = symbol & { __tag__: true };\n\n/**\n * @description\n * Creates a unique tag.\n *\n * @param {string} description - a description of the tag to be used in logs and error messages.\n * @returns `Tag`.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tagdescription\n */\nexport const tag = (description: string): Tag => Symbol(description) as Tag;\n", "export interface TokenValue<T = unknown> {\n /**\n * @description Token type.\n */\n __t: T;\n\n /**\n * @description Description of token.\n */\n __d: string;\n\n /**\n * @description Unique symbol.\n */\n\n __s: symbol;\n\n /**\n * @description Is binding by token optional.\n */\n __o: boolean;\n}\n\nexport interface RequiredToken<T = unknown> extends TokenValue<T> {\n __o: false;\n}\n\nexport interface OptionalToken<T = unknown> extends TokenValue<T> {\n __o: true;\n}\n\nexport interface Token<T = unknown> extends RequiredToken<T> {\n optional: OptionalToken<T>;\n}\n\nexport type TokenType<T extends TokenValue> = T extends RequiredToken\n ? T['__t']\n : T['__t'] | undefined;\n\nexport type TokenTypeMap<T> = {\n [K in keyof T]: T[K] extends Token ? TokenType<T[K]> : TokenTypeMap<T[K]>;\n};\n\nexport type ToToken<T> = undefined extends T\n ? OptionalToken<Exclude<T, undefined>>\n : RequiredToken<T>;\n\n/**\n * @description\n * Creates a unique token with the type.\n *\n * @param {string} description - a description of the token to be used in logs and error messages.\n * @returns a unique `Token<T>` token with the type.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tokentdescription\n */\nexport const token = <T>(description: string): Token<T> => {\n const s = Symbol(description);\n return {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: false,\n optional: {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: true,\n },\n };\n};\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { Token, TokenValue, tag as createTag } from '../pointers';\n\nimport { Binding } from './bindings';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class BindingsVault {\n private static notag = createTag('NO_TAG');\n\n public parent: BindingsVault | null = null;\n\n private readonly map = new Map<\n symbol,\n Map<ResolutionCondition, Binding | BindingsVault>\n >();\n\n public set(\n binding: Binding | BindingsVault,\n token: Token,\n condition: ResolutionCondition = BindingsVault.notag,\n ): void {\n const current = this.map.get(token.__s);\n\n if (current) current.set(condition, binding);\n else\n this.map.set(\n token.__s,\n new Map<ResolutionCondition, Binding | BindingsVault>().set(\n condition,\n binding,\n ),\n );\n }\n\n private find(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | BindingsVault | undefined {\n const bindings = this.map.get(token.__s);\n\n if (bindings === undefined) return undefined;\n\n if (target) {\n const targetBinding = bindings.get(target);\n if (targetBinding) return targetBinding;\n }\n\n if (\n process.env.NODE_ENV !== 'production' &&\n conditions &&\n conditions.reduce(\n (acc, condition) => (bindings.has(condition) ? acc + 1 : acc),\n 0,\n ) > 1\n ) {\n const conditionsDisplayString = conditions\n .map((condition) =>\n typeof condition === 'function'\n ? condition.name\n : `tag(${condition.description})`,\n )\n .join(', ');\n\n console.warn(\n 'Warning: ' +\n `When resolving a binding by '${token.__d}' token with [${conditionsDisplayString}] conditions, ` +\n 'more than one binding was found. ' +\n \"In this case, Brandi resolves the binding by the first tag assigned by 'tagged(target, ...tags)' function \" +\n \"or, if you explicitly passed conditions through 'Container.get(token, conditions)' method, \" +\n 'by the first resolved condition. ' +\n 'Try to avoid such implicit logic.',\n );\n }\n\n if (conditions) {\n for (let i = 0, len = conditions.length; i < len; i += 1) {\n const binding = bindings.get(conditions[i]!);\n if (binding) return binding;\n }\n }\n\n return bindings.get(BindingsVault.notag);\n }\n\n private resolve(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const binding = this.find(token, conditions, target);\n\n if (binding === undefined)\n return this.parent\n ? this.parent.resolve(token, cache, conditions, target)\n : null;\n\n if (binding instanceof BindingsVault) {\n cache.vaults.push(binding);\n return binding.resolve(token, cache, conditions, target);\n }\n\n return binding;\n }\n\n public get(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const ownBinding = this.resolve(token, cache, conditions, target);\n\n if (ownBinding) return ownBinding;\n\n for (let i = 0, v = cache.vaults, len = v.length; i < len; i += 1) {\n const cacheBinding = v[i]!.resolve(token, cache, conditions, target);\n if (cacheBinding) return cacheBinding;\n }\n\n return null;\n }\n\n public clone(): BindingsVault {\n const vault = new BindingsVault();\n vault.parent = this.parent;\n\n this.map.forEach((value, key) => {\n vault.map.set(\n key,\n new Map<ResolutionCondition, Binding | BindingsVault>(value),\n );\n });\n\n return vault;\n }\n}\n", "import { ResolutionCondition } from '../../types';\nimport { Token } from '../../pointers';\n\nimport { BindingsVault } from '../BindingsVault';\nimport type { DependencyModule } from '../DependencyModule';\n\nimport type { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class FromSyntax {\n constructor(\n private readonly vault: BindingsVault,\n private readonly tokens: Token[],\n private readonly getVault: (target: BindOrUseSyntax) => BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Uses bindings from the dependency module.\n *\n * @param dependencyModule - the dependency module from which the tokens will be used.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public from(dependencyModule: DependencyModule): void {\n const { tokens } = this;\n for (let i = 0, len = tokens.length; i < len; i += 1) {\n this.vault.set(\n this.getVault(dependencyModule),\n tokens[i]!,\n this.condition,\n );\n }\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n InstanceContainerScopedBinding,\n InstanceResolutionScopedBinding,\n InstanceSingletonScopedBinding,\n InstanceTransientScopedBinding,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nexport class ScopeSyntax {\n private readonly warningTimeout?: NodeJS.Timeout;\n\n constructor(\n private readonly vault: BindingsVault,\n private readonly impl: UnknownCreator,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n this.warningTimeout = setTimeout(() => {\n console.warn(\n `Warning: did you forget to set a scope for '${this.token.__d}' token binding? ` +\n \"Call 'inTransientScope()', 'inSingletonScope()', 'inContainerScope()' or 'inResolutionScope()'.\",\n );\n });\n }\n }\n\n /**\n * @description\n * The container will return the same instance with each getting.\n * This is similar to being a singleton, however if the container has a child container or a clone,\n * that child container or clone will get an instance unique to it.\n *\n * @link https://brandi.js.org/reference/binding-scopes#incontainerscope\n */\n public inContainerScope(): void {\n this.set(InstanceContainerScopedBinding);\n }\n\n /**\n * @description\n * The same instance will be got for each getting of this dependency during a single resolution chain.\n *\n * @link https://brandi.js.org/reference/binding-scopes#inresolutionscope\n */\n public inResolutionScope(): void {\n this.set(InstanceResolutionScopedBinding);\n }\n\n /**\n * @description\n * Each getting will return the same instance.\n *\n * @link https://brandi.js.org/reference/binding-scopes#insingletonscope\n */\n public inSingletonScope(): void {\n this.set(InstanceSingletonScopedBinding);\n }\n\n /**\n * @description\n * New instance will be created with each getting.\n *\n * @link https://brandi.js.org/reference/binding-scopes#intransientscope\n */\n public inTransientScope(): void {\n this.set(InstanceTransientScopedBinding);\n }\n\n private set(\n Ctor:\n | typeof InstanceContainerScopedBinding\n | typeof InstanceResolutionScopedBinding\n | typeof InstanceSingletonScopedBinding\n | typeof InstanceTransientScopedBinding,\n ): void {\n if (process.env.NODE_ENV !== 'production')\n clearTimeout(this.warningTimeout!);\n\n this.vault.set(new Ctor(this.impl), this.token, this.condition);\n }\n}\n", "import {\n AsyncFactory,\n Factory,\n ResolutionCondition,\n UnknownCreator,\n} from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n ConstantBinding,\n FactoryBinding,\n FactoryInitializer,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nimport { ScopeSyntax } from './ScopeSyntax';\n\nexport class TypeSyntax<Dependency> {\n constructor(\n private readonly vault: BindingsVault,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to the constant value.\n *\n * @param value - the value that will be bound to the token.\n *\n * @link https://brandi.js.org/reference/binding-types#toconstantvalue\n */\n public toConstant(value: Dependency): void {\n this.vault.set(new ConstantBinding(value), this.token, this.condition);\n }\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Promise<Instance>>\n : never,\n initializer?: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => unknown\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Instance>\n : never,\n initializer: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => Promise<unknown>\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory<InitializerReturnType>(\n creator: Dependency extends Factory<infer Instance, never[]>\n ? Instance extends Promise<unknown>\n ? never\n : UnknownCreator<Instance>\n : never,\n initializer?: Dependency extends Factory<infer Instance, infer Arguments>\n ? InitializerReturnType extends Promise<unknown>\n ? never\n : (instance: Instance, ...args: Arguments) => InitializerReturnType\n : never,\n ): void;\n\n public toFactory(\n creator: UnknownCreator,\n initializer?: FactoryInitializer,\n ): void {\n this.vault.set(\n new FactoryBinding({ creator, initializer }),\n this.token,\n this.condition,\n );\n }\n\n /**\n * @description\n * Binds the token to an instance in one of the scopes.\n *\n * @param creator - the instance creator that will be bound to the token.\n *\n * @returns\n * Scope syntax:\n * - `inSingletonScope()`\n * - `inTransientScope()`\n * - `inContainerScope()`\n * - `inResolutionScope()`\n *\n * @link https://brandi.js.org/reference/binding-types#toinstancecreator\n */\n public toInstance(creator: UnknownCreator<Dependency>): ScopeSyntax {\n return new ScopeSyntax(this.vault, creator, this.token, this.condition);\n }\n}\n", "import { Token, TokenType } from '../../pointers';\nimport { ResolutionCondition } from '../../types';\n\nimport { BindingsVault } from '../BindingsVault';\n\nimport { FromSyntax } from './FromSyntax';\nimport { TypeSyntax } from './TypeSyntax';\n\nexport class BindOrUseSyntax {\n protected static vault(target: BindOrUseSyntax) {\n return target.vault;\n }\n\n constructor(\n protected vault: BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to an implementation.\n *\n * @param token - a token to be bound.\n *\n * @returns\n * Binding Type syntax:\n * - `toConstant(value)`\n * - `toInstance(creator)`\n * - `toFactory(creator, [initializer])`\n *\n * @link https://brandi.js.org/reference/container#bindtoken\n */\n public bind<T extends Token>(token: T): TypeSyntax<TokenType<T>> {\n return new TypeSyntax<TokenType<T>>(this.vault, token, this.condition);\n }\n\n /**\n * @description\n * Uses bindings from a dependency module.\n *\n * @param tokens - tokens to be used from a dependency module.\n * @returns `.from(module)` syntax.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public use(...tokens: Token[]): FromSyntax {\n return new FromSyntax(\n this.vault,\n tokens,\n BindOrUseSyntax.vault,\n this.condition,\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\n\nimport { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class WhenSyntax extends BindOrUseSyntax {\n /**\n * @description\n * Creates a conditional binding.\n *\n * @param condition - a condition.\n * @returns `bind` or `use` syntax.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\n public when(condition: ResolutionCondition): BindOrUseSyntax {\n return new BindOrUseSyntax(this.vault, condition);\n }\n}\n", "import { BindingsVault } from './BindingsVault';\nimport { WhenSyntax } from './syntax';\n\nexport class DependencyModule extends WhenSyntax {\n constructor() {\n super(new BindingsVault());\n }\n}\n", "import { Binding } from './bindings';\nimport type { BindingsVault } from './BindingsVault';\n\nexport class ResolutionCache {\n constructor(\n public readonly instances = new Map<Binding, unknown>(),\n public readonly vaults: BindingsVault[] = [],\n ) {}\n\n public split(): ResolutionCache {\n return new ResolutionCache(this.instances, this.vaults.slice());\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { TokenType, TokenValue } from '../pointers';\nimport { callableRegistry, injectsRegistry, tagsRegistry } from '../registries';\n\nimport {\n Binding,\n FactoryInitializer,\n InstanceBinding,\n isFactoryBinding,\n isInstanceBinding,\n isInstanceContainerScopedBinding,\n isInstanceResolutionScopedBinding,\n isInstanceSingletonScopedBinding,\n} from './bindings';\nimport { BindingsVault } from './BindingsVault';\nimport { DependencyModule } from './DependencyModule';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class Container extends DependencyModule {\n private snapshot: BindingsVault | null = null;\n\n /**\n * @description\n * Sets the parent container.\n *\n * @param container - a `Container` or `null` that will be set as the parent container.\n * @returns `this`.\n *\n * @link https://brandi.js.org/reference/container#extendcontainer\n */\n public extend(container: Container | null): this {\n this.vault.parent = container === null ? null : container.vault;\n return this;\n }\n\n /**\n * @description\n * Creates an unlinked clone of the container.\n *\n * @returns `Container`.\n *\n * @link https://brandi.js.org/reference/container#clone\n */\n public clone(): Container {\n const container = new Container();\n container.vault = this.vault.clone();\n return container;\n }\n\n /**\n * @description\n * Captures (snapshots) the current container state.\n *\n * @link https://brandi.js.org/reference/container#capture\n */\n public capture(): void {\n this.snapshot = this.vault.clone();\n }\n\n /**\n * @description\n * Restores the captured container state.\n *\n * @link https://brandi.js.org/reference/container#restore\n */\n public restore(): void {\n if (this.snapshot) {\n this.vault = this.snapshot.clone();\n } else if (process.env.NODE_ENV !== 'production') {\n console.error(\n \"Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?\",\n );\n }\n }\n\n /**\n * @description\n * Gets a dependency bound to the token.\n *\n * @param token - token for which a dependence will be got.\n * @returns `TokenType<TokenValue>`.\n *\n * @link https://brandi.js.org/reference/container#gettoken\n */\n public get<T extends TokenValue>(token: T): TokenType<T>;\n\n /**\n * @access package\n * @deprecated\n * `conditions` argument is added for internal use.\n * Use it if you really understand that it is necessary.\n */\n public get<T extends TokenValue>(\n token: T,\n conditions: ResolutionCondition[],\n ): TokenType<T>;\n\n public get<T extends TokenValue>(\n token: T,\n conditions?: ResolutionCondition[],\n ): TokenType<T> {\n return this.resolveToken(token, conditions) as TokenType<T>;\n }\n\n private resolveTokens(\n tokens: TokenValue[],\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): unknown[] {\n return tokens.map((token) =>\n this.resolveToken(token, conditions, target, cache.split()),\n );\n }\n\n private resolveToken(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n cache: ResolutionCache = new ResolutionCache(),\n ): unknown {\n const binding = this.vault.get(token, cache, conditions, target);\n\n if (binding) return this.resolveBinding(binding, cache);\n if (token.__o) return undefined;\n\n throw new Error(`No matching bindings found for '${token.__d}' token.`);\n }\n\n private resolveBinding(binding: Binding, cache: ResolutionCache): unknown {\n if (isInstanceBinding(binding)) {\n if (isInstanceSingletonScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache,\n (instance) => {\n // eslint-disable-next-line no-param-reassign\n binding.cache = instance;\n },\n );\n }\n\n if (isInstanceContainerScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache.get(this),\n (instance) => {\n binding.cache.set(this, instance);\n },\n );\n }\n\n if (isInstanceResolutionScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => cache.instances.get(binding),\n (instance) => {\n cache.instances.set(binding, instance);\n },\n );\n }\n\n return this.createInstance(binding.impl, cache);\n }\n\n if (isFactoryBinding(binding)) {\n return (...args: unknown[]) => {\n const instance = this.createInstance(binding.impl.creator, cache);\n\n return instance instanceof Promise\n ? instance.then((i) =>\n Container.resolveInitialization(\n i,\n args,\n binding.impl.initializer,\n ),\n )\n : Container.resolveInitialization(\n instance,\n args,\n binding.impl.initializer,\n );\n };\n }\n\n return binding.impl;\n }\n\n private resolveCache(\n binding: InstanceBinding,\n cache: ResolutionCache,\n getCache: () => unknown,\n setCache: (instance: unknown) => void,\n ) {\n const instanceCache = getCache();\n\n if (instanceCache !== undefined) return instanceCache;\n\n const instance = this.createInstance(binding.impl, cache);\n setCache(instance);\n return instance;\n }\n\n private createInstance(\n creator: UnknownCreator,\n cache: ResolutionCache,\n ): unknown {\n const parameters = this.getParameters(creator, cache);\n const isCallable = callableRegistry.get(creator);\n\n if (isCallable !== undefined) {\n return isCallable\n ? // @ts-expect-error: This expression is not callable.\n creator(...parameters)\n : // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n new creator(...parameters);\n }\n\n try {\n // @ts-expect-error: This expression is not callable.\n const instance = creator(...parameters);\n callableRegistry.set(creator, true);\n return instance;\n } catch {\n // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n const instance = new creator(...parameters);\n callableRegistry.set(creator, false);\n return instance;\n }\n }\n\n private getParameters(\n target: UnknownCreator,\n cache: ResolutionCache,\n ): unknown[] {\n const injects = injectsRegistry.get(target);\n\n if (injects)\n return this.resolveTokens(\n injects,\n cache,\n tagsRegistry.get(target),\n target,\n );\n\n if (target.length === 0) return [];\n\n throw new Error(\n `Missing required 'injected' registration of '${target.name}'`,\n );\n }\n\n private static resolveInitialization<T>(\n instance: T,\n args: unknown[],\n initializer?: FactoryInitializer,\n ) {\n const initialization = initializer?.(instance, ...args);\n return initialization instanceof Promise\n ? initialization.then(() => instance)\n : instance;\n }\n}\n", "import { Container } from './Container';\n\n/**\n * @description\n * Alias for `new Container()`.\n *\n * @example\n * <caption>Example usage of `createContainer()`.</caption>\n *\n * const container = createContainer();\n * console.log(container instanceof Container); // \u2192 true\n *\n * @link https://brandi.js.org/reference/container#createcontainer\n */\nexport const createContainer = () => new Container();\n", "import { DependencyModule } from './DependencyModule';\n\n/**\n * @description\n * Alias for `new DependencyModule()`.\n *\n * @example\n * <caption>Example usage of `createDependencyModule()`.</caption>\n *\n * const dependencyModule = createDependencyModule();\n * console.log(dependencyModule instanceof DependencyModule); // \u2192 true\n *\n * @link https://brandi.js.org/reference/dependency-modules#createdependencymodule\n */\nexport const createDependencyModule = () => new DependencyModule();\n", "import { ToToken, TokenValue } from '../pointers';\nimport { UnknownCreator, UnknownCreatorParameters } from '../types';\nimport { injectsRegistry } from '../registries';\n\ntype ToTokens<T extends unknown[]> = {\n [K in keyof T]-?: ToToken<T[K]>;\n};\n\n/**\n * @description\n * Registers target injections.\n *\n * @param target - constructor or function whose dependencies will be injected.\n * @param ...tokens - dependency tokens.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#injectedtarget-tokens\n */\nexport const injected = <T extends UnknownCreator>(\n target: T,\n ...tokens: ToTokens<UnknownCreatorParameters<T>> extends TokenValue[]\n ? ToTokens<UnknownCreatorParameters<T>>\n : never\n) => {\n injectsRegistry.set(target, tokens);\n return target;\n};\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\nimport { tagsRegistry } from '../registries';\n\n/**\n * @description\n * Tags target.\n *\n * @param target - constructor or function that will be tagged.\n * @param ...tags - tags.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\nexport const tagged = <T extends UnknownCreator>(\n target: T,\n ...tags: Tag[]\n): T => {\n tagsRegistry.set(target, tags);\n return target;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export {\n Container,\n DependencyModule,\n createContainer,\n createDependencyModule,\n} from './container';\nexport type {\n Tag,\n Token,\n TokenType,\n TokenTypeMap,\n TokenValue,\n RequiredToken,\n OptionalToken,\n} from './pointers';\nexport { tag, token } from './pointers';\nexport { injected, tagged } from './registrators';\nexport type { AsyncFactory, Factory, ResolutionCondition } from './types';\n", "import { UnknownCreator } from '../types';\n\nexport const callableRegistry = new Map<UnknownCreator, boolean>();\n", "import { TokenValue } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const injectsRegistry = new Map<UnknownCreator, TokenValue[]>();\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const tagsRegistry = new Map<UnknownCreator, Tag[]>();\n", "export enum Type {\n Constant,\n Instance,\n Factory,\n}\n\nexport enum Scope {\n Container,\n Resolution,\n Singleton,\n Transient,\n}\n\nexport interface Binding {\n readonly impl: unknown;\n readonly type: Type;\n\n clone?: () => Binding;\n}\n", "import { Binding, Type } from './Binding';\n\nexport class ConstantBinding implements Binding {\n public readonly type = Type.Constant;\n\n constructor(public readonly impl: unknown) {}\n}\n", "import { UnknownCreator } from '../../types';\n\nimport { Binding, Type } from './Binding';\n\nexport type FactoryInitializer = (\n instance: unknown,\n ...args: unknown[]\n) => unknown;\n\nexport class FactoryBinding implements Binding {\n public readonly type = Type.Factory;\n\n constructor(\n public readonly impl: {\n creator: UnknownCreator;\n initializer?: FactoryInitializer;\n },\n ) {}\n}\n\nexport const isFactoryBinding = (binding: Binding): binding is FactoryBinding =>\n binding.type === Type.Factory;\n", "import { UnknownCreator } from '../../types';\n\nimport type { BindingsVault } from '../BindingsVault';\n\nimport { Binding, Scope, Type } from './Binding';\n\nexport abstract class InstanceBinding implements Binding {\n public readonly type = Type.Instance;\n\n public abstract readonly scope: Scope;\n\n constructor(public readonly impl: UnknownCreator) {}\n}\n\nexport class InstanceContainerScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Container;\n\n public readonly cache = new WeakMap<BindingsVault, unknown>();\n}\n\nexport class InstanceResolutionScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Resolution;\n}\n\nexport class InstanceSingletonScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Singleton;\n\n public cache?: unknown;\n\n public clone?(): InstanceSingletonScopedBinding;\n\n constructor(public readonly impl: UnknownCreator) {\n super(impl);\n\n if (process.env.NODE_ENV !== 'production') {\n this.clone = (): InstanceSingletonScopedBinding => {\n const binding = new InstanceSingletonScopedBinding(this.impl);\n binding.cache = this.cache;\n return binding;\n };\n }\n }\n}\n\nexport class InstanceTransientScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Transient;\n}\n\nexport const isInstanceBinding = (\n binding: Binding,\n): binding is InstanceBinding => binding.type === Type.Instance;\n\nexport const isInstanceContainerScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceContainerScopedBinding =>\n binding.scope === Scope.Container;\n\nexport const isInstanceResolutionScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceResolutionScopedBinding =>\n binding.scope === Scope.Resolution;\n\nexport const isInstanceSingletonScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceSingletonScopedBinding =>\n binding.scope === Scope.Singleton;\n", "export type Tag = symbol & { __tag__: true };\n\n/**\n * @description\n * Creates a unique tag.\n *\n * @param {string} description - a description of the tag to be used in logs and error messages.\n * @returns `Tag`.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tagdescription\n */\nexport const tag = (description: string): Tag => Symbol(description) as Tag;\n", "export interface TokenValue<T = unknown> {\n /**\n * @description Token type.\n */\n __t: T;\n\n /**\n * @description Description of token.\n */\n __d: string;\n\n /**\n * @description Unique symbol.\n */\n\n __s: symbol;\n\n /**\n * @description Is binding by token optional.\n */\n __o: boolean;\n}\n\nexport interface RequiredToken<T = unknown> extends TokenValue<T> {\n __o: false;\n}\n\nexport interface OptionalToken<T = unknown> extends TokenValue<T> {\n __o: true;\n}\n\nexport interface Token<T = unknown> extends RequiredToken<T> {\n optional: OptionalToken<T>;\n}\n\nexport type TokenType<T extends TokenValue> = T extends RequiredToken\n ? T['__t']\n : T['__t'] | undefined;\n\nexport type TokenTypeMap<T> = {\n [K in keyof T]: T[K] extends Token ? TokenType<T[K]> : TokenTypeMap<T[K]>;\n};\n\nexport type ToToken<T> = undefined extends T\n ? OptionalToken<Exclude<T, undefined>>\n : RequiredToken<T>;\n\n/**\n * @description\n * Creates a unique token with the type.\n *\n * @param {string} description - a description of the token to be used in logs and error messages.\n * @returns a unique `Token<T>` token with the type.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tokentdescription\n */\nexport const token = <T>(description: string): Token<T> => {\n const s = Symbol(description);\n return {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: false,\n optional: {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: true,\n },\n };\n};\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { Token, TokenValue, tag as createTag } from '../pointers';\n\nimport { Binding } from './bindings';\nimport { ResolutionCache } from './ResolutionCache';\n\ntype BindingsMap = Map<ResolutionCondition, Binding | BindingsVault>;\n\nexport class BindingsVault {\n private static notag = createTag('NO_TAG');\n\n public parent: BindingsVault | null = null;\n\n private readonly map = new Map<symbol, BindingsMap>();\n\n public copy?(): BindingsVault;\n\n constructor() {\n if (process.env.NODE_ENV !== 'production') {\n this.copy = (): BindingsVault =>\n this.from((prev) => {\n const next = new Map<ResolutionCondition, Binding | BindingsVault>();\n prev.forEach((binding, key) => {\n if (binding instanceof BindingsVault) {\n next.set(key, binding.copy!());\n } else {\n next.set(key, binding.clone?.() ?? binding);\n }\n });\n return next;\n });\n }\n }\n\n public set(\n binding: Binding | BindingsVault,\n token: Token,\n condition: ResolutionCondition = BindingsVault.notag,\n ): void {\n const current = this.map.get(token.__s);\n\n if (current) current.set(condition, binding);\n else\n this.map.set(\n token.__s,\n new Map<ResolutionCondition, Binding | BindingsVault>().set(\n condition,\n binding,\n ),\n );\n }\n\n private find(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | BindingsVault | undefined {\n const bindings = this.map.get(token.__s);\n\n if (bindings === undefined) return undefined;\n\n if (target) {\n const targetBinding = bindings.get(target);\n if (targetBinding) return targetBinding;\n }\n\n if (\n process.env.NODE_ENV !== 'production' &&\n conditions &&\n conditions.reduce(\n (acc, condition) => (bindings.has(condition) ? acc + 1 : acc),\n 0,\n ) > 1\n ) {\n const conditionsDisplayString = conditions\n .map((condition) =>\n typeof condition === 'function'\n ? condition.name\n : `tag(${condition.description})`,\n )\n .join(', ');\n\n console.warn(\n 'Warning: ' +\n `When resolving a binding by '${token.__d}' token with [${conditionsDisplayString}] conditions, ` +\n 'more than one binding was found. ' +\n \"In this case, Brandi resolves the binding by the first tag assigned by 'tagged(target, ...tags)' function \" +\n \"or, if you explicitly passed conditions through 'Container.get(token, conditions)' method, \" +\n 'by the first resolved condition. ' +\n 'Try to avoid such implicit logic.',\n );\n }\n\n if (conditions) {\n for (let i = 0, len = conditions.length; i < len; i += 1) {\n const binding = bindings.get(conditions[i]!);\n if (binding) return binding;\n }\n }\n\n return bindings.get(BindingsVault.notag);\n }\n\n private resolve(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const binding = this.find(token, conditions, target);\n\n if (binding === undefined)\n return this.parent\n ? this.parent.resolve(token, cache, conditions, target)\n : null;\n\n if (binding instanceof BindingsVault) {\n cache.vaults.push(binding);\n return binding.resolve(token, cache, conditions, target);\n }\n\n return binding;\n }\n\n public get(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const ownBinding = this.resolve(token, cache, conditions, target);\n\n if (ownBinding) return ownBinding;\n\n for (let i = 0, v = cache.vaults, len = v.length; i < len; i += 1) {\n const cacheBinding = v[i]!.resolve(token, cache, conditions, target);\n if (cacheBinding) return cacheBinding;\n }\n\n return null;\n }\n\n private from(\n callback: (bindings: BindingsMap) => BindingsMap,\n ): BindingsVault {\n const vault = new BindingsVault();\n vault.parent = this.parent;\n\n this.map.forEach((bindings, key) => {\n vault.map.set(key, callback(bindings));\n });\n\n return vault;\n }\n\n public clone(): BindingsVault {\n return this.from(\n (prev) => new Map<ResolutionCondition, Binding | BindingsVault>(prev),\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\nimport { Token } from '../../pointers';\n\nimport { BindingsVault } from '../BindingsVault';\nimport type { DependencyModule } from '../DependencyModule';\n\nimport type { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class FromSyntax {\n constructor(\n private readonly vault: BindingsVault,\n private readonly tokens: Token[],\n private readonly getVault: (target: BindOrUseSyntax) => BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Uses bindings from the dependency module.\n *\n * @param dependencyModule - the dependency module from which the tokens will be used.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public from(dependencyModule: DependencyModule): void {\n const { tokens } = this;\n for (let i = 0, len = tokens.length; i < len; i += 1) {\n this.vault.set(\n this.getVault(dependencyModule),\n tokens[i]!,\n this.condition,\n );\n }\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n InstanceContainerScopedBinding,\n InstanceResolutionScopedBinding,\n InstanceSingletonScopedBinding,\n InstanceTransientScopedBinding,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nexport class ScopeSyntax {\n private readonly warningTimeout?: NodeJS.Timeout;\n\n constructor(\n private readonly vault: BindingsVault,\n private readonly impl: UnknownCreator,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n this.warningTimeout = setTimeout(() => {\n console.warn(\n `Warning: did you forget to set a scope for '${this.token.__d}' token binding? ` +\n \"Call 'inTransientScope()', 'inSingletonScope()', 'inContainerScope()' or 'inResolutionScope()'.\",\n );\n });\n }\n }\n\n /**\n * @description\n * The container will return the same instance with each getting.\n * This is similar to being a singleton, however if the container has a child container or a clone,\n * that child container or clone will get an instance unique to it.\n *\n * @link https://brandi.js.org/reference/binding-scopes#incontainerscope\n */\n public inContainerScope(): void {\n this.set(InstanceContainerScopedBinding);\n }\n\n /**\n * @description\n * The same instance will be got for each getting of this dependency during a single resolution chain.\n *\n * @link https://brandi.js.org/reference/binding-scopes#inresolutionscope\n */\n public inResolutionScope(): void {\n this.set(InstanceResolutionScopedBinding);\n }\n\n /**\n * @description\n * Each getting will return the same instance.\n *\n * @link https://brandi.js.org/reference/binding-scopes#insingletonscope\n */\n public inSingletonScope(): void {\n this.set(InstanceSingletonScopedBinding);\n }\n\n /**\n * @description\n * New instance will be created with each getting.\n *\n * @link https://brandi.js.org/reference/binding-scopes#intransientscope\n */\n public inTransientScope(): void {\n this.set(InstanceTransientScopedBinding);\n }\n\n private set(\n Ctor:\n | typeof InstanceContainerScopedBinding\n | typeof InstanceResolutionScopedBinding\n | typeof InstanceSingletonScopedBinding\n | typeof InstanceTransientScopedBinding,\n ): void {\n if (process.env.NODE_ENV !== 'production')\n clearTimeout(this.warningTimeout!);\n\n this.vault.set(new Ctor(this.impl), this.token, this.condition);\n }\n}\n", "import {\n AsyncFactory,\n Factory,\n ResolutionCondition,\n UnknownCreator,\n} from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n ConstantBinding,\n FactoryBinding,\n FactoryInitializer,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nimport { ScopeSyntax } from './ScopeSyntax';\n\nexport class TypeSyntax<Dependency> {\n constructor(\n private readonly vault: BindingsVault,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to the constant value.\n *\n * @param value - the value that will be bound to the token.\n *\n * @link https://brandi.js.org/reference/binding-types#toconstantvalue\n */\n public toConstant(value: Dependency): void {\n this.vault.set(new ConstantBinding(value), this.token, this.condition);\n }\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Promise<Instance>>\n : never,\n initializer?: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => unknown\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Instance>\n : never,\n initializer: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => Promise<unknown>\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory<InitializerReturnType>(\n creator: Dependency extends Factory<infer Instance, never[]>\n ? Instance extends Promise<unknown>\n ? never\n : UnknownCreator<Instance>\n : never,\n initializer?: Dependency extends Factory<infer Instance, infer Arguments>\n ? InitializerReturnType extends Promise<unknown>\n ? never\n : (instance: Instance, ...args: Arguments) => InitializerReturnType\n : never,\n ): void;\n\n public toFactory(\n creator: UnknownCreator,\n initializer?: FactoryInitializer,\n ): void {\n this.vault.set(\n new FactoryBinding({ creator, initializer }),\n this.token,\n this.condition,\n );\n }\n\n /**\n * @description\n * Binds the token to an instance in one of the scopes.\n *\n * @param creator - the instance creator that will be bound to the token.\n *\n * @returns\n * Scope syntax:\n * - `inSingletonScope()`\n * - `inTransientScope()`\n * - `inContainerScope()`\n * - `inResolutionScope()`\n *\n * @link https://brandi.js.org/reference/binding-types#toinstancecreator\n */\n public toInstance(creator: UnknownCreator<Dependency>): ScopeSyntax {\n return new ScopeSyntax(this.vault, creator, this.token, this.condition);\n }\n}\n", "import { Token, TokenType } from '../../pointers';\nimport { ResolutionCondition } from '../../types';\n\nimport { BindingsVault } from '../BindingsVault';\n\nimport { FromSyntax } from './FromSyntax';\nimport { TypeSyntax } from './TypeSyntax';\n\nexport class BindOrUseSyntax {\n protected static vault(target: BindOrUseSyntax) {\n return target.vault;\n }\n\n constructor(\n protected vault: BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to an implementation.\n *\n * @param token - a token to be bound.\n *\n * @returns\n * Binding Type syntax:\n * - `toConstant(value)`\n * - `toInstance(creator)`\n * - `toFactory(creator, [initializer])`\n *\n * @link https://brandi.js.org/reference/container#bindtoken\n */\n public bind<T extends Token>(token: T): TypeSyntax<TokenType<T>> {\n return new TypeSyntax<TokenType<T>>(this.vault, token, this.condition);\n }\n\n /**\n * @description\n * Uses bindings from a dependency module.\n *\n * @param tokens - tokens to be used from a dependency module.\n * @returns `.from(module)` syntax.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public use(...tokens: Token[]): FromSyntax {\n return new FromSyntax(\n this.vault,\n tokens,\n BindOrUseSyntax.vault,\n this.condition,\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\n\nimport { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class WhenSyntax extends BindOrUseSyntax {\n /**\n * @description\n * Creates a conditional binding.\n *\n * @param condition - a condition.\n * @returns `bind` or `use` syntax.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\n public when(condition: ResolutionCondition): BindOrUseSyntax {\n return new BindOrUseSyntax(this.vault, condition);\n }\n}\n", "import { BindingsVault } from './BindingsVault';\nimport { WhenSyntax } from './syntax';\n\nexport class DependencyModule extends WhenSyntax {\n constructor() {\n super(new BindingsVault());\n }\n}\n", "import { Binding } from './bindings';\nimport type { BindingsVault } from './BindingsVault';\n\nexport class ResolutionCache {\n constructor(\n public readonly instances = new Map<Binding, unknown>(),\n public readonly vaults: BindingsVault[] = [],\n ) {}\n\n public split(): ResolutionCache {\n return new ResolutionCache(this.instances, this.vaults.slice());\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { TokenType, TokenValue } from '../pointers';\nimport { callableRegistry, injectsRegistry, tagsRegistry } from '../registries';\n\nimport {\n Binding,\n FactoryInitializer,\n InstanceBinding,\n isFactoryBinding,\n isInstanceBinding,\n isInstanceContainerScopedBinding,\n isInstanceResolutionScopedBinding,\n isInstanceSingletonScopedBinding,\n} from './bindings';\nimport { BindingsVault } from './BindingsVault';\nimport { DependencyModule } from './DependencyModule';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class Container extends DependencyModule {\n private snapshot: BindingsVault | null = null;\n\n /**\n * @description\n * Captures (snapshots) the current container state.\n *\n * @link https://brandi.js.org/reference/container#capture\n */\n public capture?(): void;\n\n /**\n * @description\n * Restores the captured container state.\n *\n * @link https://brandi.js.org/reference/container#restore\n */\n public restore?(): void;\n\n constructor() {\n super();\n\n if (process.env.NODE_ENV !== 'production') {\n this.capture = (): void => {\n this.snapshot = this.vault.copy!();\n };\n\n this.restore = (): void => {\n if (this.snapshot) {\n this.vault = this.snapshot.copy!();\n } else {\n console.error(\n \"Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?\",\n );\n }\n };\n }\n }\n\n /**\n * @description\n * Sets the parent container.\n *\n * @param container - a `Container` or `null` that will be set as the parent container.\n * @returns `this`.\n *\n * @link https://brandi.js.org/reference/container#extendcontainer\n */\n public extend(container: Container | null): this {\n this.vault.parent = container === null ? null : container.vault;\n return this;\n }\n\n /**\n * @description\n * Creates an unlinked clone of the container.\n *\n * @returns `Container`.\n *\n * @link https://brandi.js.org/reference/container#clone\n */\n public clone(): Container {\n const container = new Container();\n container.vault = this.vault.clone();\n return container;\n }\n\n /**\n * @description\n * Gets a dependency bound to the token.\n *\n * @param token - token for which a dependence will be got.\n * @returns `TokenType<TokenValue>`.\n *\n * @link https://brandi.js.org/reference/container#gettoken\n */\n public get<T extends TokenValue>(token: T): TokenType<T>;\n\n /**\n * @access package\n * @deprecated\n * `conditions` argument is added for internal use.\n * Use it if you really understand that it is necessary.\n */\n public get<T extends TokenValue>(\n token: T,\n conditions: ResolutionCondition[],\n ): TokenType<T>;\n\n public get<T extends TokenValue>(\n token: T,\n conditions?: ResolutionCondition[],\n ): TokenType<T> {\n return this.resolveToken(token, conditions) as TokenType<T>;\n }\n\n private resolveTokens(\n tokens: TokenValue[],\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): unknown[] {\n return tokens.map((token) =>\n this.resolveToken(token, conditions, target, cache.split()),\n );\n }\n\n private resolveToken(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n cache: ResolutionCache = new ResolutionCache(),\n ): unknown {\n const binding = this.vault.get(token, cache, conditions, target);\n\n if (binding) return this.resolveBinding(binding, cache);\n if (token.__o) return undefined;\n\n throw new Error(`No matching bindings found for '${token.__d}' token.`);\n }\n\n private resolveBinding(binding: Binding, cache: ResolutionCache): unknown {\n if (isInstanceBinding(binding)) {\n if (isInstanceSingletonScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache,\n (instance) => {\n // eslint-disable-next-line no-param-reassign\n binding.cache = instance;\n },\n );\n }\n\n if (isInstanceContainerScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache.get(this.vault),\n (instance) => {\n binding.cache.set(this.vault, instance);\n },\n );\n }\n\n if (isInstanceResolutionScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => cache.instances.get(binding),\n (instance) => {\n cache.instances.set(binding, instance);\n },\n );\n }\n\n return this.createInstance(binding.impl, cache);\n }\n\n if (isFactoryBinding(binding)) {\n return (...args: unknown[]) => {\n const instance = this.createInstance(binding.impl.creator, cache);\n\n return instance instanceof Promise\n ? instance.then((i) =>\n Container.resolveInitialization(\n i,\n args,\n binding.impl.initializer,\n ),\n )\n : Container.resolveInitialization(\n instance,\n args,\n binding.impl.initializer,\n );\n };\n }\n\n return binding.impl;\n }\n\n private resolveCache(\n binding: InstanceBinding,\n cache: ResolutionCache,\n getCache: () => unknown,\n setCache: (instance: unknown) => void,\n ) {\n const instanceCache = getCache();\n\n if (instanceCache !== undefined) return instanceCache;\n\n const instance = this.createInstance(binding.impl, cache);\n setCache(instance);\n return instance;\n }\n\n private createInstance(\n creator: UnknownCreator,\n cache: ResolutionCache,\n ): unknown {\n const parameters = this.getParameters(creator, cache);\n const isCallable = callableRegistry.get(creator);\n\n if (isCallable !== undefined) {\n return isCallable\n ? // @ts-expect-error: This expression is not callable.\n creator(...parameters)\n : // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n new creator(...parameters);\n }\n\n try {\n // @ts-expect-error: This expression is not callable.\n const instance = creator(...parameters);\n callableRegistry.set(creator, true);\n return instance;\n } catch {\n // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n const instance = new creator(...parameters);\n callableRegistry.set(creator, false);\n return instance;\n }\n }\n\n private getParameters(\n target: UnknownCreator,\n cache: ResolutionCache,\n ): unknown[] {\n const injects = injectsRegistry.get(target);\n\n if (injects)\n return this.resolveTokens(\n injects,\n cache,\n tagsRegistry.get(target),\n target,\n );\n\n if (target.length === 0) return [];\n\n throw new Error(\n `Missing required 'injected' registration of '${target.name}'`,\n );\n }\n\n private static resolveInitialization<T>(\n instance: T,\n args: unknown[],\n initializer?: FactoryInitializer,\n ) {\n const initialization = initializer?.(instance, ...args);\n return initialization instanceof Promise\n ? initialization.then(() => instance)\n : instance;\n }\n}\n", "import { Container } from './Container';\n\n/**\n * @description\n * Alias for `new Container()`.\n *\n * @example\n * <caption>Example usage of `createContainer()`.</caption>\n *\n * const container = createContainer();\n * console.log(container instanceof Container); // \u2192 true\n *\n * @link https://brandi.js.org/reference/container#createcontainer\n */\nexport const createContainer = () => new Container();\n", "import { DependencyModule } from './DependencyModule';\n\n/**\n * @description\n * Alias for `new DependencyModule()`.\n *\n * @example\n * <caption>Example usage of `createDependencyModule()`.</caption>\n *\n * const dependencyModule = createDependencyModule();\n * console.log(dependencyModule instanceof DependencyModule); // \u2192 true\n *\n * @link https://brandi.js.org/reference/dependency-modules#createdependencymodule\n */\nexport const createDependencyModule = () => new DependencyModule();\n", "import { ToToken, TokenValue } from '../pointers';\nimport { UnknownCreator, UnknownCreatorParameters } from '../types';\nimport { injectsRegistry } from '../registries';\n\ntype ToTokens<T extends unknown[]> = {\n [K in keyof T]-?: ToToken<T[K]>;\n};\n\n/**\n * @description\n * Registers target injections.\n *\n * @param target - constructor or function whose dependencies will be injected.\n * @param ...tokens - dependency tokens.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#injectedtarget-tokens\n */\nexport const injected = <T extends UnknownCreator>(\n target: T,\n ...tokens: ToTokens<UnknownCreatorParameters<T>> extends TokenValue[]\n ? ToTokens<UnknownCreatorParameters<T>>\n : never\n) => {\n injectsRegistry.set(target, tokens);\n return target;\n};\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\nimport { tagsRegistry } from '../registries';\n\n/**\n * @description\n * Tags target.\n *\n * @param target - constructor or function that will be tagged.\n * @param ...tags - tags.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\nexport const tagged = <T extends UnknownCreator>(\n target: T,\n ...tags: Tag[]\n): T => {\n tagsRegistry.set(target, tags);\n return target;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/lib/brandi.mjs CHANGED
@@ -60,9 +60,17 @@ var InstanceResolutionScopedBinding = class extends InstanceBinding {
60
60
  }
61
61
  };
62
62
  var InstanceSingletonScopedBinding = class extends InstanceBinding {
63
- constructor() {
64
- super(...arguments);
63
+ constructor(impl) {
64
+ super(impl);
65
+ this.impl = impl;
65
66
  this.scope = Scope.Singleton;
67
+ if (process.env.NODE_ENV !== "production") {
68
+ this.clone = () => {
69
+ const binding = new InstanceSingletonScopedBinding(this.impl);
70
+ binding.cache = this.cache;
71
+ return binding;
72
+ };
73
+ }
66
74
  }
67
75
  };
68
76
  var InstanceTransientScopedBinding = class extends InstanceBinding {
@@ -101,6 +109,20 @@ var _BindingsVault = class {
101
109
  constructor() {
102
110
  this.parent = null;
103
111
  this.map = new Map();
112
+ if (process.env.NODE_ENV !== "production") {
113
+ this.copy = () => this.from((prev) => {
114
+ const next = new Map();
115
+ prev.forEach((binding, key) => {
116
+ var _a, _b;
117
+ if (binding instanceof _BindingsVault) {
118
+ next.set(key, binding.copy());
119
+ } else {
120
+ next.set(key, (_b = (_a = binding.clone) == null ? void 0 : _a.call(binding)) != null ? _b : binding);
121
+ }
122
+ });
123
+ return next;
124
+ });
125
+ }
104
126
  }
105
127
  set(binding, token2, condition = _BindingsVault.notag) {
106
128
  const current = this.map.get(token2.__s);
@@ -152,14 +174,17 @@ var _BindingsVault = class {
152
174
  }
153
175
  return null;
154
176
  }
155
- clone() {
177
+ from(callback) {
156
178
  const vault = new _BindingsVault();
157
179
  vault.parent = this.parent;
158
- this.map.forEach((value, key) => {
159
- vault.map.set(key, new Map(value));
180
+ this.map.forEach((bindings, key) => {
181
+ vault.map.set(key, callback(bindings));
160
182
  });
161
183
  return vault;
162
184
  }
185
+ clone() {
186
+ return this.from((prev) => new Map(prev));
187
+ }
163
188
  };
164
189
  var BindingsVault = _BindingsVault;
165
190
  BindingsVault.notag = tag("NO_TAG");
@@ -275,8 +300,20 @@ var ResolutionCache = class {
275
300
  // src/container/Container.ts
276
301
  var Container = class extends DependencyModule {
277
302
  constructor() {
278
- super(...arguments);
303
+ super();
279
304
  this.snapshot = null;
305
+ if (process.env.NODE_ENV !== "production") {
306
+ this.capture = () => {
307
+ this.snapshot = this.vault.copy();
308
+ };
309
+ this.restore = () => {
310
+ if (this.snapshot) {
311
+ this.vault = this.snapshot.copy();
312
+ } else {
313
+ console.error("Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?");
314
+ }
315
+ };
316
+ }
280
317
  }
281
318
  extend(container) {
282
319
  this.vault.parent = container === null ? null : container.vault;
@@ -287,16 +324,6 @@ var Container = class extends DependencyModule {
287
324
  container.vault = this.vault.clone();
288
325
  return container;
289
326
  }
290
- capture() {
291
- this.snapshot = this.vault.clone();
292
- }
293
- restore() {
294
- if (this.snapshot) {
295
- this.vault = this.snapshot.clone();
296
- } else if (process.env.NODE_ENV !== "production") {
297
- console.error("Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?");
298
- }
299
- }
300
327
  get(token2, conditions) {
301
328
  return this.resolveToken(token2, conditions);
302
329
  }
@@ -319,8 +346,8 @@ var Container = class extends DependencyModule {
319
346
  });
320
347
  }
321
348
  if (isInstanceContainerScopedBinding(binding)) {
322
- return this.resolveCache(binding, cache, () => binding.cache.get(this), (instance) => {
323
- binding.cache.set(this, instance);
349
+ return this.resolveCache(binding, cache, () => binding.cache.get(this.vault), (instance) => {
350
+ binding.cache.set(this.vault, instance);
324
351
  });
325
352
  }
326
353
  if (isInstanceResolutionScopedBinding(binding)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/registries/callableRegistry.ts", "../src/registries/injectsRegistry.ts", "../src/registries/tagsRegistry.ts", "../src/container/bindings/Binding.ts", "../src/container/bindings/ConstantBinding.ts", "../src/container/bindings/FactoryBinding.ts", "../src/container/bindings/InstanceBinding.ts", "../src/pointers/tag.ts", "../src/pointers/token.ts", "../src/container/BindingsVault.ts", "../src/container/syntax/FromSyntax.ts", "../src/container/syntax/ScopeSyntax.ts", "../src/container/syntax/TypeSyntax.ts", "../src/container/syntax/BindOrUseSyntax.ts", "../src/container/syntax/WhenSyntax.ts", "../src/container/DependencyModule.ts", "../src/container/ResolutionCache.ts", "../src/container/Container.ts", "../src/container/createContainer.ts", "../src/container/createDependencyModule.ts", "../src/registrators/injected.ts", "../src/registrators/tagged.ts"],
4
- "sourcesContent": ["import { UnknownCreator } from '../types';\n\nexport const callableRegistry = new Map<UnknownCreator, boolean>();\n", "import { TokenValue } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const injectsRegistry = new Map<UnknownCreator, TokenValue[]>();\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const tagsRegistry = new Map<UnknownCreator, Tag[]>();\n", "export enum Type {\n Constant,\n Instance,\n Factory,\n}\n\nexport enum Scope {\n Container,\n Resolution,\n Singleton,\n Transient,\n}\n\nexport interface Binding {\n readonly impl: unknown;\n readonly type: Type;\n}\n", "import { Binding, Type } from './Binding';\n\nexport class ConstantBinding implements Binding {\n public readonly type = Type.Constant;\n\n constructor(public readonly impl: unknown) {}\n}\n", "import { UnknownCreator } from '../../types';\n\nimport { Binding, Type } from './Binding';\n\nexport type FactoryInitializer = (\n instance: unknown,\n ...args: unknown[]\n) => unknown;\n\nexport class FactoryBinding implements Binding {\n public readonly type = Type.Factory;\n\n constructor(\n public readonly impl: {\n creator: UnknownCreator;\n initializer?: FactoryInitializer;\n },\n ) {}\n}\n\nexport const isFactoryBinding = (binding: Binding): binding is FactoryBinding =>\n binding.type === Type.Factory;\n", "import { UnknownCreator } from '../../types';\n\nimport type { Container } from '../Container';\n\nimport { Binding, Scope, Type } from './Binding';\n\nexport abstract class InstanceBinding implements Binding {\n public readonly type = Type.Instance;\n\n public abstract readonly scope: Scope;\n\n constructor(public readonly impl: UnknownCreator) {}\n}\n\nexport class InstanceContainerScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Container;\n\n public readonly cache = new WeakMap<Container, unknown>();\n}\n\nexport class InstanceResolutionScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Resolution;\n}\n\nexport class InstanceSingletonScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Singleton;\n\n public cache?: unknown;\n}\n\nexport class InstanceTransientScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Transient;\n}\n\nexport const isInstanceBinding = (\n binding: Binding,\n): binding is InstanceBinding => binding.type === Type.Instance;\n\nexport const isInstanceContainerScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceContainerScopedBinding =>\n binding.scope === Scope.Container;\n\nexport const isInstanceResolutionScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceResolutionScopedBinding =>\n binding.scope === Scope.Resolution;\n\nexport const isInstanceSingletonScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceSingletonScopedBinding =>\n binding.scope === Scope.Singleton;\n", "export type Tag = symbol & { __tag__: true };\n\n/**\n * @description\n * Creates a unique tag.\n *\n * @param {string} description - a description of the tag to be used in logs and error messages.\n * @returns `Tag`.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tagdescription\n */\nexport const tag = (description: string): Tag => Symbol(description) as Tag;\n", "export interface TokenValue<T = unknown> {\n /**\n * @description Token type.\n */\n __t: T;\n\n /**\n * @description Description of token.\n */\n __d: string;\n\n /**\n * @description Unique symbol.\n */\n\n __s: symbol;\n\n /**\n * @description Is binding by token optional.\n */\n __o: boolean;\n}\n\nexport interface RequiredToken<T = unknown> extends TokenValue<T> {\n __o: false;\n}\n\nexport interface OptionalToken<T = unknown> extends TokenValue<T> {\n __o: true;\n}\n\nexport interface Token<T = unknown> extends RequiredToken<T> {\n optional: OptionalToken<T>;\n}\n\nexport type TokenType<T extends TokenValue> = T extends RequiredToken\n ? T['__t']\n : T['__t'] | undefined;\n\nexport type TokenTypeMap<T> = {\n [K in keyof T]: T[K] extends Token ? TokenType<T[K]> : TokenTypeMap<T[K]>;\n};\n\nexport type ToToken<T> = undefined extends T\n ? OptionalToken<Exclude<T, undefined>>\n : RequiredToken<T>;\n\n/**\n * @description\n * Creates a unique token with the type.\n *\n * @param {string} description - a description of the token to be used in logs and error messages.\n * @returns a unique `Token<T>` token with the type.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tokentdescription\n */\nexport const token = <T>(description: string): Token<T> => {\n const s = Symbol(description);\n return {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: false,\n optional: {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: true,\n },\n };\n};\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { Token, TokenValue, tag as createTag } from '../pointers';\n\nimport { Binding } from './bindings';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class BindingsVault {\n private static notag = createTag('NO_TAG');\n\n public parent: BindingsVault | null = null;\n\n private readonly map = new Map<\n symbol,\n Map<ResolutionCondition, Binding | BindingsVault>\n >();\n\n public set(\n binding: Binding | BindingsVault,\n token: Token,\n condition: ResolutionCondition = BindingsVault.notag,\n ): void {\n const current = this.map.get(token.__s);\n\n if (current) current.set(condition, binding);\n else\n this.map.set(\n token.__s,\n new Map<ResolutionCondition, Binding | BindingsVault>().set(\n condition,\n binding,\n ),\n );\n }\n\n private find(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | BindingsVault | undefined {\n const bindings = this.map.get(token.__s);\n\n if (bindings === undefined) return undefined;\n\n if (target) {\n const targetBinding = bindings.get(target);\n if (targetBinding) return targetBinding;\n }\n\n if (\n process.env.NODE_ENV !== 'production' &&\n conditions &&\n conditions.reduce(\n (acc, condition) => (bindings.has(condition) ? acc + 1 : acc),\n 0,\n ) > 1\n ) {\n const conditionsDisplayString = conditions\n .map((condition) =>\n typeof condition === 'function'\n ? condition.name\n : `tag(${condition.description})`,\n )\n .join(', ');\n\n console.warn(\n 'Warning: ' +\n `When resolving a binding by '${token.__d}' token with [${conditionsDisplayString}] conditions, ` +\n 'more than one binding was found. ' +\n \"In this case, Brandi resolves the binding by the first tag assigned by 'tagged(target, ...tags)' function \" +\n \"or, if you explicitly passed conditions through 'Container.get(token, conditions)' method, \" +\n 'by the first resolved condition. ' +\n 'Try to avoid such implicit logic.',\n );\n }\n\n if (conditions) {\n for (let i = 0, len = conditions.length; i < len; i += 1) {\n const binding = bindings.get(conditions[i]!);\n if (binding) return binding;\n }\n }\n\n return bindings.get(BindingsVault.notag);\n }\n\n private resolve(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const binding = this.find(token, conditions, target);\n\n if (binding === undefined)\n return this.parent\n ? this.parent.resolve(token, cache, conditions, target)\n : null;\n\n if (binding instanceof BindingsVault) {\n cache.vaults.push(binding);\n return binding.resolve(token, cache, conditions, target);\n }\n\n return binding;\n }\n\n public get(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const ownBinding = this.resolve(token, cache, conditions, target);\n\n if (ownBinding) return ownBinding;\n\n for (let i = 0, v = cache.vaults, len = v.length; i < len; i += 1) {\n const cacheBinding = v[i]!.resolve(token, cache, conditions, target);\n if (cacheBinding) return cacheBinding;\n }\n\n return null;\n }\n\n public clone(): BindingsVault {\n const vault = new BindingsVault();\n vault.parent = this.parent;\n\n this.map.forEach((value, key) => {\n vault.map.set(\n key,\n new Map<ResolutionCondition, Binding | BindingsVault>(value),\n );\n });\n\n return vault;\n }\n}\n", "import { ResolutionCondition } from '../../types';\nimport { Token } from '../../pointers';\n\nimport { BindingsVault } from '../BindingsVault';\nimport type { DependencyModule } from '../DependencyModule';\n\nimport type { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class FromSyntax {\n constructor(\n private readonly vault: BindingsVault,\n private readonly tokens: Token[],\n private readonly getVault: (target: BindOrUseSyntax) => BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Uses bindings from the dependency module.\n *\n * @param dependencyModule - the dependency module from which the tokens will be used.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public from(dependencyModule: DependencyModule): void {\n const { tokens } = this;\n for (let i = 0, len = tokens.length; i < len; i += 1) {\n this.vault.set(\n this.getVault(dependencyModule),\n tokens[i]!,\n this.condition,\n );\n }\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n InstanceContainerScopedBinding,\n InstanceResolutionScopedBinding,\n InstanceSingletonScopedBinding,\n InstanceTransientScopedBinding,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nexport class ScopeSyntax {\n private readonly warningTimeout?: NodeJS.Timeout;\n\n constructor(\n private readonly vault: BindingsVault,\n private readonly impl: UnknownCreator,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n this.warningTimeout = setTimeout(() => {\n console.warn(\n `Warning: did you forget to set a scope for '${this.token.__d}' token binding? ` +\n \"Call 'inTransientScope()', 'inSingletonScope()', 'inContainerScope()' or 'inResolutionScope()'.\",\n );\n });\n }\n }\n\n /**\n * @description\n * The container will return the same instance with each getting.\n * This is similar to being a singleton, however if the container has a child container or a clone,\n * that child container or clone will get an instance unique to it.\n *\n * @link https://brandi.js.org/reference/binding-scopes#incontainerscope\n */\n public inContainerScope(): void {\n this.set(InstanceContainerScopedBinding);\n }\n\n /**\n * @description\n * The same instance will be got for each getting of this dependency during a single resolution chain.\n *\n * @link https://brandi.js.org/reference/binding-scopes#inresolutionscope\n */\n public inResolutionScope(): void {\n this.set(InstanceResolutionScopedBinding);\n }\n\n /**\n * @description\n * Each getting will return the same instance.\n *\n * @link https://brandi.js.org/reference/binding-scopes#insingletonscope\n */\n public inSingletonScope(): void {\n this.set(InstanceSingletonScopedBinding);\n }\n\n /**\n * @description\n * New instance will be created with each getting.\n *\n * @link https://brandi.js.org/reference/binding-scopes#intransientscope\n */\n public inTransientScope(): void {\n this.set(InstanceTransientScopedBinding);\n }\n\n private set(\n Ctor:\n | typeof InstanceContainerScopedBinding\n | typeof InstanceResolutionScopedBinding\n | typeof InstanceSingletonScopedBinding\n | typeof InstanceTransientScopedBinding,\n ): void {\n if (process.env.NODE_ENV !== 'production')\n clearTimeout(this.warningTimeout!);\n\n this.vault.set(new Ctor(this.impl), this.token, this.condition);\n }\n}\n", "import {\n AsyncFactory,\n Factory,\n ResolutionCondition,\n UnknownCreator,\n} from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n ConstantBinding,\n FactoryBinding,\n FactoryInitializer,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nimport { ScopeSyntax } from './ScopeSyntax';\n\nexport class TypeSyntax<Dependency> {\n constructor(\n private readonly vault: BindingsVault,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to the constant value.\n *\n * @param value - the value that will be bound to the token.\n *\n * @link https://brandi.js.org/reference/binding-types#toconstantvalue\n */\n public toConstant(value: Dependency): void {\n this.vault.set(new ConstantBinding(value), this.token, this.condition);\n }\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Promise<Instance>>\n : never,\n initializer?: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => unknown\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Instance>\n : never,\n initializer: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => Promise<unknown>\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory<InitializerReturnType>(\n creator: Dependency extends Factory<infer Instance, never[]>\n ? Instance extends Promise<unknown>\n ? never\n : UnknownCreator<Instance>\n : never,\n initializer?: Dependency extends Factory<infer Instance, infer Arguments>\n ? InitializerReturnType extends Promise<unknown>\n ? never\n : (instance: Instance, ...args: Arguments) => InitializerReturnType\n : never,\n ): void;\n\n public toFactory(\n creator: UnknownCreator,\n initializer?: FactoryInitializer,\n ): void {\n this.vault.set(\n new FactoryBinding({ creator, initializer }),\n this.token,\n this.condition,\n );\n }\n\n /**\n * @description\n * Binds the token to an instance in one of the scopes.\n *\n * @param creator - the instance creator that will be bound to the token.\n *\n * @returns\n * Scope syntax:\n * - `inSingletonScope()`\n * - `inTransientScope()`\n * - `inContainerScope()`\n * - `inResolutionScope()`\n *\n * @link https://brandi.js.org/reference/binding-types#toinstancecreator\n */\n public toInstance(creator: UnknownCreator<Dependency>): ScopeSyntax {\n return new ScopeSyntax(this.vault, creator, this.token, this.condition);\n }\n}\n", "import { Token, TokenType } from '../../pointers';\nimport { ResolutionCondition } from '../../types';\n\nimport { BindingsVault } from '../BindingsVault';\n\nimport { FromSyntax } from './FromSyntax';\nimport { TypeSyntax } from './TypeSyntax';\n\nexport class BindOrUseSyntax {\n protected static vault(target: BindOrUseSyntax) {\n return target.vault;\n }\n\n constructor(\n protected vault: BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to an implementation.\n *\n * @param token - a token to be bound.\n *\n * @returns\n * Binding Type syntax:\n * - `toConstant(value)`\n * - `toInstance(creator)`\n * - `toFactory(creator, [initializer])`\n *\n * @link https://brandi.js.org/reference/container#bindtoken\n */\n public bind<T extends Token>(token: T): TypeSyntax<TokenType<T>> {\n return new TypeSyntax<TokenType<T>>(this.vault, token, this.condition);\n }\n\n /**\n * @description\n * Uses bindings from a dependency module.\n *\n * @param tokens - tokens to be used from a dependency module.\n * @returns `.from(module)` syntax.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public use(...tokens: Token[]): FromSyntax {\n return new FromSyntax(\n this.vault,\n tokens,\n BindOrUseSyntax.vault,\n this.condition,\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\n\nimport { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class WhenSyntax extends BindOrUseSyntax {\n /**\n * @description\n * Creates a conditional binding.\n *\n * @param condition - a condition.\n * @returns `bind` or `use` syntax.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\n public when(condition: ResolutionCondition): BindOrUseSyntax {\n return new BindOrUseSyntax(this.vault, condition);\n }\n}\n", "import { BindingsVault } from './BindingsVault';\nimport { WhenSyntax } from './syntax';\n\nexport class DependencyModule extends WhenSyntax {\n constructor() {\n super(new BindingsVault());\n }\n}\n", "import { Binding } from './bindings';\nimport type { BindingsVault } from './BindingsVault';\n\nexport class ResolutionCache {\n constructor(\n public readonly instances = new Map<Binding, unknown>(),\n public readonly vaults: BindingsVault[] = [],\n ) {}\n\n public split(): ResolutionCache {\n return new ResolutionCache(this.instances, this.vaults.slice());\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { TokenType, TokenValue } from '../pointers';\nimport { callableRegistry, injectsRegistry, tagsRegistry } from '../registries';\n\nimport {\n Binding,\n FactoryInitializer,\n InstanceBinding,\n isFactoryBinding,\n isInstanceBinding,\n isInstanceContainerScopedBinding,\n isInstanceResolutionScopedBinding,\n isInstanceSingletonScopedBinding,\n} from './bindings';\nimport { BindingsVault } from './BindingsVault';\nimport { DependencyModule } from './DependencyModule';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class Container extends DependencyModule {\n private snapshot: BindingsVault | null = null;\n\n /**\n * @description\n * Sets the parent container.\n *\n * @param container - a `Container` or `null` that will be set as the parent container.\n * @returns `this`.\n *\n * @link https://brandi.js.org/reference/container#extendcontainer\n */\n public extend(container: Container | null): this {\n this.vault.parent = container === null ? null : container.vault;\n return this;\n }\n\n /**\n * @description\n * Creates an unlinked clone of the container.\n *\n * @returns `Container`.\n *\n * @link https://brandi.js.org/reference/container#clone\n */\n public clone(): Container {\n const container = new Container();\n container.vault = this.vault.clone();\n return container;\n }\n\n /**\n * @description\n * Captures (snapshots) the current container state.\n *\n * @link https://brandi.js.org/reference/container#capture\n */\n public capture(): void {\n this.snapshot = this.vault.clone();\n }\n\n /**\n * @description\n * Restores the captured container state.\n *\n * @link https://brandi.js.org/reference/container#restore\n */\n public restore(): void {\n if (this.snapshot) {\n this.vault = this.snapshot.clone();\n } else if (process.env.NODE_ENV !== 'production') {\n console.error(\n \"Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?\",\n );\n }\n }\n\n /**\n * @description\n * Gets a dependency bound to the token.\n *\n * @param token - token for which a dependence will be got.\n * @returns `TokenType<TokenValue>`.\n *\n * @link https://brandi.js.org/reference/container#gettoken\n */\n public get<T extends TokenValue>(token: T): TokenType<T>;\n\n /**\n * @access package\n * @deprecated\n * `conditions` argument is added for internal use.\n * Use it if you really understand that it is necessary.\n */\n public get<T extends TokenValue>(\n token: T,\n conditions: ResolutionCondition[],\n ): TokenType<T>;\n\n public get<T extends TokenValue>(\n token: T,\n conditions?: ResolutionCondition[],\n ): TokenType<T> {\n return this.resolveToken(token, conditions) as TokenType<T>;\n }\n\n private resolveTokens(\n tokens: TokenValue[],\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): unknown[] {\n return tokens.map((token) =>\n this.resolveToken(token, conditions, target, cache.split()),\n );\n }\n\n private resolveToken(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n cache: ResolutionCache = new ResolutionCache(),\n ): unknown {\n const binding = this.vault.get(token, cache, conditions, target);\n\n if (binding) return this.resolveBinding(binding, cache);\n if (token.__o) return undefined;\n\n throw new Error(`No matching bindings found for '${token.__d}' token.`);\n }\n\n private resolveBinding(binding: Binding, cache: ResolutionCache): unknown {\n if (isInstanceBinding(binding)) {\n if (isInstanceSingletonScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache,\n (instance) => {\n // eslint-disable-next-line no-param-reassign\n binding.cache = instance;\n },\n );\n }\n\n if (isInstanceContainerScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache.get(this),\n (instance) => {\n binding.cache.set(this, instance);\n },\n );\n }\n\n if (isInstanceResolutionScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => cache.instances.get(binding),\n (instance) => {\n cache.instances.set(binding, instance);\n },\n );\n }\n\n return this.createInstance(binding.impl, cache);\n }\n\n if (isFactoryBinding(binding)) {\n return (...args: unknown[]) => {\n const instance = this.createInstance(binding.impl.creator, cache);\n\n return instance instanceof Promise\n ? instance.then((i) =>\n Container.resolveInitialization(\n i,\n args,\n binding.impl.initializer,\n ),\n )\n : Container.resolveInitialization(\n instance,\n args,\n binding.impl.initializer,\n );\n };\n }\n\n return binding.impl;\n }\n\n private resolveCache(\n binding: InstanceBinding,\n cache: ResolutionCache,\n getCache: () => unknown,\n setCache: (instance: unknown) => void,\n ) {\n const instanceCache = getCache();\n\n if (instanceCache !== undefined) return instanceCache;\n\n const instance = this.createInstance(binding.impl, cache);\n setCache(instance);\n return instance;\n }\n\n private createInstance(\n creator: UnknownCreator,\n cache: ResolutionCache,\n ): unknown {\n const parameters = this.getParameters(creator, cache);\n const isCallable = callableRegistry.get(creator);\n\n if (isCallable !== undefined) {\n return isCallable\n ? // @ts-expect-error: This expression is not callable.\n creator(...parameters)\n : // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n new creator(...parameters);\n }\n\n try {\n // @ts-expect-error: This expression is not callable.\n const instance = creator(...parameters);\n callableRegistry.set(creator, true);\n return instance;\n } catch {\n // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n const instance = new creator(...parameters);\n callableRegistry.set(creator, false);\n return instance;\n }\n }\n\n private getParameters(\n target: UnknownCreator,\n cache: ResolutionCache,\n ): unknown[] {\n const injects = injectsRegistry.get(target);\n\n if (injects)\n return this.resolveTokens(\n injects,\n cache,\n tagsRegistry.get(target),\n target,\n );\n\n if (target.length === 0) return [];\n\n throw new Error(\n `Missing required 'injected' registration of '${target.name}'`,\n );\n }\n\n private static resolveInitialization<T>(\n instance: T,\n args: unknown[],\n initializer?: FactoryInitializer,\n ) {\n const initialization = initializer?.(instance, ...args);\n return initialization instanceof Promise\n ? initialization.then(() => instance)\n : instance;\n }\n}\n", "import { Container } from './Container';\n\n/**\n * @description\n * Alias for `new Container()`.\n *\n * @example\n * <caption>Example usage of `createContainer()`.</caption>\n *\n * const container = createContainer();\n * console.log(container instanceof Container); // \u2192 true\n *\n * @link https://brandi.js.org/reference/container#createcontainer\n */\nexport const createContainer = () => new Container();\n", "import { DependencyModule } from './DependencyModule';\n\n/**\n * @description\n * Alias for `new DependencyModule()`.\n *\n * @example\n * <caption>Example usage of `createDependencyModule()`.</caption>\n *\n * const dependencyModule = createDependencyModule();\n * console.log(dependencyModule instanceof DependencyModule); // \u2192 true\n *\n * @link https://brandi.js.org/reference/dependency-modules#createdependencymodule\n */\nexport const createDependencyModule = () => new DependencyModule();\n", "import { ToToken, TokenValue } from '../pointers';\nimport { UnknownCreator, UnknownCreatorParameters } from '../types';\nimport { injectsRegistry } from '../registries';\n\ntype ToTokens<T extends unknown[]> = {\n [K in keyof T]-?: ToToken<T[K]>;\n};\n\n/**\n * @description\n * Registers target injections.\n *\n * @param target - constructor or function whose dependencies will be injected.\n * @param ...tokens - dependency tokens.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#injectedtarget-tokens\n */\nexport const injected = <T extends UnknownCreator>(\n target: T,\n ...tokens: ToTokens<UnknownCreatorParameters<T>> extends TokenValue[]\n ? ToTokens<UnknownCreatorParameters<T>>\n : never\n) => {\n injectsRegistry.set(target, tokens);\n return target;\n};\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\nimport { tagsRegistry } from '../registries';\n\n/**\n * @description\n * Tags target.\n *\n * @param target - constructor or function that will be tagged.\n * @param ...tags - tags.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\nexport const tagged = <T extends UnknownCreator>(\n target: T,\n ...tags: Tag[]\n): T => {\n tagsRegistry.set(target, tags);\n return target;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { UnknownCreator } from '../types';\n\nexport const callableRegistry = new Map<UnknownCreator, boolean>();\n", "import { TokenValue } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const injectsRegistry = new Map<UnknownCreator, TokenValue[]>();\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const tagsRegistry = new Map<UnknownCreator, Tag[]>();\n", "export enum Type {\n Constant,\n Instance,\n Factory,\n}\n\nexport enum Scope {\n Container,\n Resolution,\n Singleton,\n Transient,\n}\n\nexport interface Binding {\n readonly impl: unknown;\n readonly type: Type;\n\n clone?: () => Binding;\n}\n", "import { Binding, Type } from './Binding';\n\nexport class ConstantBinding implements Binding {\n public readonly type = Type.Constant;\n\n constructor(public readonly impl: unknown) {}\n}\n", "import { UnknownCreator } from '../../types';\n\nimport { Binding, Type } from './Binding';\n\nexport type FactoryInitializer = (\n instance: unknown,\n ...args: unknown[]\n) => unknown;\n\nexport class FactoryBinding implements Binding {\n public readonly type = Type.Factory;\n\n constructor(\n public readonly impl: {\n creator: UnknownCreator;\n initializer?: FactoryInitializer;\n },\n ) {}\n}\n\nexport const isFactoryBinding = (binding: Binding): binding is FactoryBinding =>\n binding.type === Type.Factory;\n", "import { UnknownCreator } from '../../types';\n\nimport type { BindingsVault } from '../BindingsVault';\n\nimport { Binding, Scope, Type } from './Binding';\n\nexport abstract class InstanceBinding implements Binding {\n public readonly type = Type.Instance;\n\n public abstract readonly scope: Scope;\n\n constructor(public readonly impl: UnknownCreator) {}\n}\n\nexport class InstanceContainerScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Container;\n\n public readonly cache = new WeakMap<BindingsVault, unknown>();\n}\n\nexport class InstanceResolutionScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Resolution;\n}\n\nexport class InstanceSingletonScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Singleton;\n\n public cache?: unknown;\n\n public clone?(): InstanceSingletonScopedBinding;\n\n constructor(public readonly impl: UnknownCreator) {\n super(impl);\n\n if (process.env.NODE_ENV !== 'production') {\n this.clone = (): InstanceSingletonScopedBinding => {\n const binding = new InstanceSingletonScopedBinding(this.impl);\n binding.cache = this.cache;\n return binding;\n };\n }\n }\n}\n\nexport class InstanceTransientScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Transient;\n}\n\nexport const isInstanceBinding = (\n binding: Binding,\n): binding is InstanceBinding => binding.type === Type.Instance;\n\nexport const isInstanceContainerScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceContainerScopedBinding =>\n binding.scope === Scope.Container;\n\nexport const isInstanceResolutionScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceResolutionScopedBinding =>\n binding.scope === Scope.Resolution;\n\nexport const isInstanceSingletonScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceSingletonScopedBinding =>\n binding.scope === Scope.Singleton;\n", "export type Tag = symbol & { __tag__: true };\n\n/**\n * @description\n * Creates a unique tag.\n *\n * @param {string} description - a description of the tag to be used in logs and error messages.\n * @returns `Tag`.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tagdescription\n */\nexport const tag = (description: string): Tag => Symbol(description) as Tag;\n", "export interface TokenValue<T = unknown> {\n /**\n * @description Token type.\n */\n __t: T;\n\n /**\n * @description Description of token.\n */\n __d: string;\n\n /**\n * @description Unique symbol.\n */\n\n __s: symbol;\n\n /**\n * @description Is binding by token optional.\n */\n __o: boolean;\n}\n\nexport interface RequiredToken<T = unknown> extends TokenValue<T> {\n __o: false;\n}\n\nexport interface OptionalToken<T = unknown> extends TokenValue<T> {\n __o: true;\n}\n\nexport interface Token<T = unknown> extends RequiredToken<T> {\n optional: OptionalToken<T>;\n}\n\nexport type TokenType<T extends TokenValue> = T extends RequiredToken\n ? T['__t']\n : T['__t'] | undefined;\n\nexport type TokenTypeMap<T> = {\n [K in keyof T]: T[K] extends Token ? TokenType<T[K]> : TokenTypeMap<T[K]>;\n};\n\nexport type ToToken<T> = undefined extends T\n ? OptionalToken<Exclude<T, undefined>>\n : RequiredToken<T>;\n\n/**\n * @description\n * Creates a unique token with the type.\n *\n * @param {string} description - a description of the token to be used in logs and error messages.\n * @returns a unique `Token<T>` token with the type.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tokentdescription\n */\nexport const token = <T>(description: string): Token<T> => {\n const s = Symbol(description);\n return {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: false,\n optional: {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: true,\n },\n };\n};\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { Token, TokenValue, tag as createTag } from '../pointers';\n\nimport { Binding } from './bindings';\nimport { ResolutionCache } from './ResolutionCache';\n\ntype BindingsMap = Map<ResolutionCondition, Binding | BindingsVault>;\n\nexport class BindingsVault {\n private static notag = createTag('NO_TAG');\n\n public parent: BindingsVault | null = null;\n\n private readonly map = new Map<symbol, BindingsMap>();\n\n public copy?(): BindingsVault;\n\n constructor() {\n if (process.env.NODE_ENV !== 'production') {\n this.copy = (): BindingsVault =>\n this.from((prev) => {\n const next = new Map<ResolutionCondition, Binding | BindingsVault>();\n prev.forEach((binding, key) => {\n if (binding instanceof BindingsVault) {\n next.set(key, binding.copy!());\n } else {\n next.set(key, binding.clone?.() ?? binding);\n }\n });\n return next;\n });\n }\n }\n\n public set(\n binding: Binding | BindingsVault,\n token: Token,\n condition: ResolutionCondition = BindingsVault.notag,\n ): void {\n const current = this.map.get(token.__s);\n\n if (current) current.set(condition, binding);\n else\n this.map.set(\n token.__s,\n new Map<ResolutionCondition, Binding | BindingsVault>().set(\n condition,\n binding,\n ),\n );\n }\n\n private find(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | BindingsVault | undefined {\n const bindings = this.map.get(token.__s);\n\n if (bindings === undefined) return undefined;\n\n if (target) {\n const targetBinding = bindings.get(target);\n if (targetBinding) return targetBinding;\n }\n\n if (\n process.env.NODE_ENV !== 'production' &&\n conditions &&\n conditions.reduce(\n (acc, condition) => (bindings.has(condition) ? acc + 1 : acc),\n 0,\n ) > 1\n ) {\n const conditionsDisplayString = conditions\n .map((condition) =>\n typeof condition === 'function'\n ? condition.name\n : `tag(${condition.description})`,\n )\n .join(', ');\n\n console.warn(\n 'Warning: ' +\n `When resolving a binding by '${token.__d}' token with [${conditionsDisplayString}] conditions, ` +\n 'more than one binding was found. ' +\n \"In this case, Brandi resolves the binding by the first tag assigned by 'tagged(target, ...tags)' function \" +\n \"or, if you explicitly passed conditions through 'Container.get(token, conditions)' method, \" +\n 'by the first resolved condition. ' +\n 'Try to avoid such implicit logic.',\n );\n }\n\n if (conditions) {\n for (let i = 0, len = conditions.length; i < len; i += 1) {\n const binding = bindings.get(conditions[i]!);\n if (binding) return binding;\n }\n }\n\n return bindings.get(BindingsVault.notag);\n }\n\n private resolve(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const binding = this.find(token, conditions, target);\n\n if (binding === undefined)\n return this.parent\n ? this.parent.resolve(token, cache, conditions, target)\n : null;\n\n if (binding instanceof BindingsVault) {\n cache.vaults.push(binding);\n return binding.resolve(token, cache, conditions, target);\n }\n\n return binding;\n }\n\n public get(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const ownBinding = this.resolve(token, cache, conditions, target);\n\n if (ownBinding) return ownBinding;\n\n for (let i = 0, v = cache.vaults, len = v.length; i < len; i += 1) {\n const cacheBinding = v[i]!.resolve(token, cache, conditions, target);\n if (cacheBinding) return cacheBinding;\n }\n\n return null;\n }\n\n private from(\n callback: (bindings: BindingsMap) => BindingsMap,\n ): BindingsVault {\n const vault = new BindingsVault();\n vault.parent = this.parent;\n\n this.map.forEach((bindings, key) => {\n vault.map.set(key, callback(bindings));\n });\n\n return vault;\n }\n\n public clone(): BindingsVault {\n return this.from(\n (prev) => new Map<ResolutionCondition, Binding | BindingsVault>(prev),\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\nimport { Token } from '../../pointers';\n\nimport { BindingsVault } from '../BindingsVault';\nimport type { DependencyModule } from '../DependencyModule';\n\nimport type { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class FromSyntax {\n constructor(\n private readonly vault: BindingsVault,\n private readonly tokens: Token[],\n private readonly getVault: (target: BindOrUseSyntax) => BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Uses bindings from the dependency module.\n *\n * @param dependencyModule - the dependency module from which the tokens will be used.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public from(dependencyModule: DependencyModule): void {\n const { tokens } = this;\n for (let i = 0, len = tokens.length; i < len; i += 1) {\n this.vault.set(\n this.getVault(dependencyModule),\n tokens[i]!,\n this.condition,\n );\n }\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n InstanceContainerScopedBinding,\n InstanceResolutionScopedBinding,\n InstanceSingletonScopedBinding,\n InstanceTransientScopedBinding,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nexport class ScopeSyntax {\n private readonly warningTimeout?: NodeJS.Timeout;\n\n constructor(\n private readonly vault: BindingsVault,\n private readonly impl: UnknownCreator,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n this.warningTimeout = setTimeout(() => {\n console.warn(\n `Warning: did you forget to set a scope for '${this.token.__d}' token binding? ` +\n \"Call 'inTransientScope()', 'inSingletonScope()', 'inContainerScope()' or 'inResolutionScope()'.\",\n );\n });\n }\n }\n\n /**\n * @description\n * The container will return the same instance with each getting.\n * This is similar to being a singleton, however if the container has a child container or a clone,\n * that child container or clone will get an instance unique to it.\n *\n * @link https://brandi.js.org/reference/binding-scopes#incontainerscope\n */\n public inContainerScope(): void {\n this.set(InstanceContainerScopedBinding);\n }\n\n /**\n * @description\n * The same instance will be got for each getting of this dependency during a single resolution chain.\n *\n * @link https://brandi.js.org/reference/binding-scopes#inresolutionscope\n */\n public inResolutionScope(): void {\n this.set(InstanceResolutionScopedBinding);\n }\n\n /**\n * @description\n * Each getting will return the same instance.\n *\n * @link https://brandi.js.org/reference/binding-scopes#insingletonscope\n */\n public inSingletonScope(): void {\n this.set(InstanceSingletonScopedBinding);\n }\n\n /**\n * @description\n * New instance will be created with each getting.\n *\n * @link https://brandi.js.org/reference/binding-scopes#intransientscope\n */\n public inTransientScope(): void {\n this.set(InstanceTransientScopedBinding);\n }\n\n private set(\n Ctor:\n | typeof InstanceContainerScopedBinding\n | typeof InstanceResolutionScopedBinding\n | typeof InstanceSingletonScopedBinding\n | typeof InstanceTransientScopedBinding,\n ): void {\n if (process.env.NODE_ENV !== 'production')\n clearTimeout(this.warningTimeout!);\n\n this.vault.set(new Ctor(this.impl), this.token, this.condition);\n }\n}\n", "import {\n AsyncFactory,\n Factory,\n ResolutionCondition,\n UnknownCreator,\n} from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n ConstantBinding,\n FactoryBinding,\n FactoryInitializer,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nimport { ScopeSyntax } from './ScopeSyntax';\n\nexport class TypeSyntax<Dependency> {\n constructor(\n private readonly vault: BindingsVault,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to the constant value.\n *\n * @param value - the value that will be bound to the token.\n *\n * @link https://brandi.js.org/reference/binding-types#toconstantvalue\n */\n public toConstant(value: Dependency): void {\n this.vault.set(new ConstantBinding(value), this.token, this.condition);\n }\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Promise<Instance>>\n : never,\n initializer?: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => unknown\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Instance>\n : never,\n initializer: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => Promise<unknown>\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory<InitializerReturnType>(\n creator: Dependency extends Factory<infer Instance, never[]>\n ? Instance extends Promise<unknown>\n ? never\n : UnknownCreator<Instance>\n : never,\n initializer?: Dependency extends Factory<infer Instance, infer Arguments>\n ? InitializerReturnType extends Promise<unknown>\n ? never\n : (instance: Instance, ...args: Arguments) => InitializerReturnType\n : never,\n ): void;\n\n public toFactory(\n creator: UnknownCreator,\n initializer?: FactoryInitializer,\n ): void {\n this.vault.set(\n new FactoryBinding({ creator, initializer }),\n this.token,\n this.condition,\n );\n }\n\n /**\n * @description\n * Binds the token to an instance in one of the scopes.\n *\n * @param creator - the instance creator that will be bound to the token.\n *\n * @returns\n * Scope syntax:\n * - `inSingletonScope()`\n * - `inTransientScope()`\n * - `inContainerScope()`\n * - `inResolutionScope()`\n *\n * @link https://brandi.js.org/reference/binding-types#toinstancecreator\n */\n public toInstance(creator: UnknownCreator<Dependency>): ScopeSyntax {\n return new ScopeSyntax(this.vault, creator, this.token, this.condition);\n }\n}\n", "import { Token, TokenType } from '../../pointers';\nimport { ResolutionCondition } from '../../types';\n\nimport { BindingsVault } from '../BindingsVault';\n\nimport { FromSyntax } from './FromSyntax';\nimport { TypeSyntax } from './TypeSyntax';\n\nexport class BindOrUseSyntax {\n protected static vault(target: BindOrUseSyntax) {\n return target.vault;\n }\n\n constructor(\n protected vault: BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to an implementation.\n *\n * @param token - a token to be bound.\n *\n * @returns\n * Binding Type syntax:\n * - `toConstant(value)`\n * - `toInstance(creator)`\n * - `toFactory(creator, [initializer])`\n *\n * @link https://brandi.js.org/reference/container#bindtoken\n */\n public bind<T extends Token>(token: T): TypeSyntax<TokenType<T>> {\n return new TypeSyntax<TokenType<T>>(this.vault, token, this.condition);\n }\n\n /**\n * @description\n * Uses bindings from a dependency module.\n *\n * @param tokens - tokens to be used from a dependency module.\n * @returns `.from(module)` syntax.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public use(...tokens: Token[]): FromSyntax {\n return new FromSyntax(\n this.vault,\n tokens,\n BindOrUseSyntax.vault,\n this.condition,\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\n\nimport { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class WhenSyntax extends BindOrUseSyntax {\n /**\n * @description\n * Creates a conditional binding.\n *\n * @param condition - a condition.\n * @returns `bind` or `use` syntax.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\n public when(condition: ResolutionCondition): BindOrUseSyntax {\n return new BindOrUseSyntax(this.vault, condition);\n }\n}\n", "import { BindingsVault } from './BindingsVault';\nimport { WhenSyntax } from './syntax';\n\nexport class DependencyModule extends WhenSyntax {\n constructor() {\n super(new BindingsVault());\n }\n}\n", "import { Binding } from './bindings';\nimport type { BindingsVault } from './BindingsVault';\n\nexport class ResolutionCache {\n constructor(\n public readonly instances = new Map<Binding, unknown>(),\n public readonly vaults: BindingsVault[] = [],\n ) {}\n\n public split(): ResolutionCache {\n return new ResolutionCache(this.instances, this.vaults.slice());\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { TokenType, TokenValue } from '../pointers';\nimport { callableRegistry, injectsRegistry, tagsRegistry } from '../registries';\n\nimport {\n Binding,\n FactoryInitializer,\n InstanceBinding,\n isFactoryBinding,\n isInstanceBinding,\n isInstanceContainerScopedBinding,\n isInstanceResolutionScopedBinding,\n isInstanceSingletonScopedBinding,\n} from './bindings';\nimport { BindingsVault } from './BindingsVault';\nimport { DependencyModule } from './DependencyModule';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class Container extends DependencyModule {\n private snapshot: BindingsVault | null = null;\n\n /**\n * @description\n * Captures (snapshots) the current container state.\n *\n * @link https://brandi.js.org/reference/container#capture\n */\n public capture?(): void;\n\n /**\n * @description\n * Restores the captured container state.\n *\n * @link https://brandi.js.org/reference/container#restore\n */\n public restore?(): void;\n\n constructor() {\n super();\n\n if (process.env.NODE_ENV !== 'production') {\n this.capture = (): void => {\n this.snapshot = this.vault.copy!();\n };\n\n this.restore = (): void => {\n if (this.snapshot) {\n this.vault = this.snapshot.copy!();\n } else {\n console.error(\n \"Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?\",\n );\n }\n };\n }\n }\n\n /**\n * @description\n * Sets the parent container.\n *\n * @param container - a `Container` or `null` that will be set as the parent container.\n * @returns `this`.\n *\n * @link https://brandi.js.org/reference/container#extendcontainer\n */\n public extend(container: Container | null): this {\n this.vault.parent = container === null ? null : container.vault;\n return this;\n }\n\n /**\n * @description\n * Creates an unlinked clone of the container.\n *\n * @returns `Container`.\n *\n * @link https://brandi.js.org/reference/container#clone\n */\n public clone(): Container {\n const container = new Container();\n container.vault = this.vault.clone();\n return container;\n }\n\n /**\n * @description\n * Gets a dependency bound to the token.\n *\n * @param token - token for which a dependence will be got.\n * @returns `TokenType<TokenValue>`.\n *\n * @link https://brandi.js.org/reference/container#gettoken\n */\n public get<T extends TokenValue>(token: T): TokenType<T>;\n\n /**\n * @access package\n * @deprecated\n * `conditions` argument is added for internal use.\n * Use it if you really understand that it is necessary.\n */\n public get<T extends TokenValue>(\n token: T,\n conditions: ResolutionCondition[],\n ): TokenType<T>;\n\n public get<T extends TokenValue>(\n token: T,\n conditions?: ResolutionCondition[],\n ): TokenType<T> {\n return this.resolveToken(token, conditions) as TokenType<T>;\n }\n\n private resolveTokens(\n tokens: TokenValue[],\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): unknown[] {\n return tokens.map((token) =>\n this.resolveToken(token, conditions, target, cache.split()),\n );\n }\n\n private resolveToken(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n cache: ResolutionCache = new ResolutionCache(),\n ): unknown {\n const binding = this.vault.get(token, cache, conditions, target);\n\n if (binding) return this.resolveBinding(binding, cache);\n if (token.__o) return undefined;\n\n throw new Error(`No matching bindings found for '${token.__d}' token.`);\n }\n\n private resolveBinding(binding: Binding, cache: ResolutionCache): unknown {\n if (isInstanceBinding(binding)) {\n if (isInstanceSingletonScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache,\n (instance) => {\n // eslint-disable-next-line no-param-reassign\n binding.cache = instance;\n },\n );\n }\n\n if (isInstanceContainerScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache.get(this.vault),\n (instance) => {\n binding.cache.set(this.vault, instance);\n },\n );\n }\n\n if (isInstanceResolutionScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => cache.instances.get(binding),\n (instance) => {\n cache.instances.set(binding, instance);\n },\n );\n }\n\n return this.createInstance(binding.impl, cache);\n }\n\n if (isFactoryBinding(binding)) {\n return (...args: unknown[]) => {\n const instance = this.createInstance(binding.impl.creator, cache);\n\n return instance instanceof Promise\n ? instance.then((i) =>\n Container.resolveInitialization(\n i,\n args,\n binding.impl.initializer,\n ),\n )\n : Container.resolveInitialization(\n instance,\n args,\n binding.impl.initializer,\n );\n };\n }\n\n return binding.impl;\n }\n\n private resolveCache(\n binding: InstanceBinding,\n cache: ResolutionCache,\n getCache: () => unknown,\n setCache: (instance: unknown) => void,\n ) {\n const instanceCache = getCache();\n\n if (instanceCache !== undefined) return instanceCache;\n\n const instance = this.createInstance(binding.impl, cache);\n setCache(instance);\n return instance;\n }\n\n private createInstance(\n creator: UnknownCreator,\n cache: ResolutionCache,\n ): unknown {\n const parameters = this.getParameters(creator, cache);\n const isCallable = callableRegistry.get(creator);\n\n if (isCallable !== undefined) {\n return isCallable\n ? // @ts-expect-error: This expression is not callable.\n creator(...parameters)\n : // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n new creator(...parameters);\n }\n\n try {\n // @ts-expect-error: This expression is not callable.\n const instance = creator(...parameters);\n callableRegistry.set(creator, true);\n return instance;\n } catch {\n // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n const instance = new creator(...parameters);\n callableRegistry.set(creator, false);\n return instance;\n }\n }\n\n private getParameters(\n target: UnknownCreator,\n cache: ResolutionCache,\n ): unknown[] {\n const injects = injectsRegistry.get(target);\n\n if (injects)\n return this.resolveTokens(\n injects,\n cache,\n tagsRegistry.get(target),\n target,\n );\n\n if (target.length === 0) return [];\n\n throw new Error(\n `Missing required 'injected' registration of '${target.name}'`,\n );\n }\n\n private static resolveInitialization<T>(\n instance: T,\n args: unknown[],\n initializer?: FactoryInitializer,\n ) {\n const initialization = initializer?.(instance, ...args);\n return initialization instanceof Promise\n ? initialization.then(() => instance)\n : instance;\n }\n}\n", "import { Container } from './Container';\n\n/**\n * @description\n * Alias for `new Container()`.\n *\n * @example\n * <caption>Example usage of `createContainer()`.</caption>\n *\n * const container = createContainer();\n * console.log(container instanceof Container); // \u2192 true\n *\n * @link https://brandi.js.org/reference/container#createcontainer\n */\nexport const createContainer = () => new Container();\n", "import { DependencyModule } from './DependencyModule';\n\n/**\n * @description\n * Alias for `new DependencyModule()`.\n *\n * @example\n * <caption>Example usage of `createDependencyModule()`.</caption>\n *\n * const dependencyModule = createDependencyModule();\n * console.log(dependencyModule instanceof DependencyModule); // \u2192 true\n *\n * @link https://brandi.js.org/reference/dependency-modules#createdependencymodule\n */\nexport const createDependencyModule = () => new DependencyModule();\n", "import { ToToken, TokenValue } from '../pointers';\nimport { UnknownCreator, UnknownCreatorParameters } from '../types';\nimport { injectsRegistry } from '../registries';\n\ntype ToTokens<T extends unknown[]> = {\n [K in keyof T]-?: ToToken<T[K]>;\n};\n\n/**\n * @description\n * Registers target injections.\n *\n * @param target - constructor or function whose dependencies will be injected.\n * @param ...tokens - dependency tokens.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#injectedtarget-tokens\n */\nexport const injected = <T extends UnknownCreator>(\n target: T,\n ...tokens: ToTokens<UnknownCreatorParameters<T>> extends TokenValue[]\n ? ToTokens<UnknownCreatorParameters<T>>\n : never\n) => {\n injectsRegistry.set(target, tokens);\n return target;\n};\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\nimport { tagsRegistry } from '../registries';\n\n/**\n * @description\n * Tags target.\n *\n * @param target - constructor or function that will be tagged.\n * @param ...tags - tags.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\nexport const tagged = <T extends UnknownCreator>(\n target: T,\n ...tags: Tag[]\n): T => {\n tagsRegistry.set(target, tags);\n return target;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -60,9 +60,17 @@ var InstanceResolutionScopedBinding = class extends InstanceBinding {
60
60
  }
61
61
  };
62
62
  var InstanceSingletonScopedBinding = class extends InstanceBinding {
63
- constructor() {
64
- super(...arguments);
63
+ constructor(impl) {
64
+ super(impl);
65
+ this.impl = impl;
65
66
  this.scope = Scope.Singleton;
67
+ if (process.env.NODE_ENV !== "production") {
68
+ this.clone = () => {
69
+ const binding = new InstanceSingletonScopedBinding(this.impl);
70
+ binding.cache = this.cache;
71
+ return binding;
72
+ };
73
+ }
66
74
  }
67
75
  };
68
76
  var InstanceTransientScopedBinding = class extends InstanceBinding {
@@ -101,6 +109,19 @@ var _BindingsVault = class {
101
109
  constructor() {
102
110
  this.parent = null;
103
111
  this.map = new Map();
112
+ if (process.env.NODE_ENV !== "production") {
113
+ this.copy = () => this.from((prev) => {
114
+ const next = new Map();
115
+ prev.forEach((binding, key) => {
116
+ if (binding instanceof _BindingsVault) {
117
+ next.set(key, binding.copy());
118
+ } else {
119
+ next.set(key, binding.clone?.() ?? binding);
120
+ }
121
+ });
122
+ return next;
123
+ });
124
+ }
104
125
  }
105
126
  set(binding, token2, condition = _BindingsVault.notag) {
106
127
  const current = this.map.get(token2.__s);
@@ -152,14 +173,17 @@ var _BindingsVault = class {
152
173
  }
153
174
  return null;
154
175
  }
155
- clone() {
176
+ from(callback) {
156
177
  const vault = new _BindingsVault();
157
178
  vault.parent = this.parent;
158
- this.map.forEach((value, key) => {
159
- vault.map.set(key, new Map(value));
179
+ this.map.forEach((bindings, key) => {
180
+ vault.map.set(key, callback(bindings));
160
181
  });
161
182
  return vault;
162
183
  }
184
+ clone() {
185
+ return this.from((prev) => new Map(prev));
186
+ }
163
187
  };
164
188
  var BindingsVault = _BindingsVault;
165
189
  BindingsVault.notag = tag("NO_TAG");
@@ -275,8 +299,20 @@ var ResolutionCache = class {
275
299
  // src/container/Container.ts
276
300
  var Container = class extends DependencyModule {
277
301
  constructor() {
278
- super(...arguments);
302
+ super();
279
303
  this.snapshot = null;
304
+ if (process.env.NODE_ENV !== "production") {
305
+ this.capture = () => {
306
+ this.snapshot = this.vault.copy();
307
+ };
308
+ this.restore = () => {
309
+ if (this.snapshot) {
310
+ this.vault = this.snapshot.copy();
311
+ } else {
312
+ console.error("Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?");
313
+ }
314
+ };
315
+ }
280
316
  }
281
317
  extend(container) {
282
318
  this.vault.parent = container === null ? null : container.vault;
@@ -287,16 +323,6 @@ var Container = class extends DependencyModule {
287
323
  container.vault = this.vault.clone();
288
324
  return container;
289
325
  }
290
- capture() {
291
- this.snapshot = this.vault.clone();
292
- }
293
- restore() {
294
- if (this.snapshot) {
295
- this.vault = this.snapshot.clone();
296
- } else if (process.env.NODE_ENV !== "production") {
297
- console.error("Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?");
298
- }
299
- }
300
326
  get(token2, conditions) {
301
327
  return this.resolveToken(token2, conditions);
302
328
  }
@@ -319,8 +345,8 @@ var Container = class extends DependencyModule {
319
345
  });
320
346
  }
321
347
  if (isInstanceContainerScopedBinding(binding)) {
322
- return this.resolveCache(binding, cache, () => binding.cache.get(this), (instance) => {
323
- binding.cache.set(this, instance);
348
+ return this.resolveCache(binding, cache, () => binding.cache.get(this.vault), (instance) => {
349
+ binding.cache.set(this.vault, instance);
324
350
  });
325
351
  }
326
352
  if (isInstanceResolutionScopedBinding(binding)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/registries/callableRegistry.ts", "../src/registries/injectsRegistry.ts", "../src/registries/tagsRegistry.ts", "../src/container/bindings/Binding.ts", "../src/container/bindings/ConstantBinding.ts", "../src/container/bindings/FactoryBinding.ts", "../src/container/bindings/InstanceBinding.ts", "../src/pointers/tag.ts", "../src/pointers/token.ts", "../src/container/BindingsVault.ts", "../src/container/syntax/FromSyntax.ts", "../src/container/syntax/ScopeSyntax.ts", "../src/container/syntax/TypeSyntax.ts", "../src/container/syntax/BindOrUseSyntax.ts", "../src/container/syntax/WhenSyntax.ts", "../src/container/DependencyModule.ts", "../src/container/ResolutionCache.ts", "../src/container/Container.ts", "../src/container/createContainer.ts", "../src/container/createDependencyModule.ts", "../src/registrators/injected.ts", "../src/registrators/tagged.ts"],
4
- "sourcesContent": ["import { UnknownCreator } from '../types';\n\nexport const callableRegistry = new Map<UnknownCreator, boolean>();\n", "import { TokenValue } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const injectsRegistry = new Map<UnknownCreator, TokenValue[]>();\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const tagsRegistry = new Map<UnknownCreator, Tag[]>();\n", "export enum Type {\n Constant,\n Instance,\n Factory,\n}\n\nexport enum Scope {\n Container,\n Resolution,\n Singleton,\n Transient,\n}\n\nexport interface Binding {\n readonly impl: unknown;\n readonly type: Type;\n}\n", "import { Binding, Type } from './Binding';\n\nexport class ConstantBinding implements Binding {\n public readonly type = Type.Constant;\n\n constructor(public readonly impl: unknown) {}\n}\n", "import { UnknownCreator } from '../../types';\n\nimport { Binding, Type } from './Binding';\n\nexport type FactoryInitializer = (\n instance: unknown,\n ...args: unknown[]\n) => unknown;\n\nexport class FactoryBinding implements Binding {\n public readonly type = Type.Factory;\n\n constructor(\n public readonly impl: {\n creator: UnknownCreator;\n initializer?: FactoryInitializer;\n },\n ) {}\n}\n\nexport const isFactoryBinding = (binding: Binding): binding is FactoryBinding =>\n binding.type === Type.Factory;\n", "import { UnknownCreator } from '../../types';\n\nimport type { Container } from '../Container';\n\nimport { Binding, Scope, Type } from './Binding';\n\nexport abstract class InstanceBinding implements Binding {\n public readonly type = Type.Instance;\n\n public abstract readonly scope: Scope;\n\n constructor(public readonly impl: UnknownCreator) {}\n}\n\nexport class InstanceContainerScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Container;\n\n public readonly cache = new WeakMap<Container, unknown>();\n}\n\nexport class InstanceResolutionScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Resolution;\n}\n\nexport class InstanceSingletonScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Singleton;\n\n public cache?: unknown;\n}\n\nexport class InstanceTransientScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Transient;\n}\n\nexport const isInstanceBinding = (\n binding: Binding,\n): binding is InstanceBinding => binding.type === Type.Instance;\n\nexport const isInstanceContainerScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceContainerScopedBinding =>\n binding.scope === Scope.Container;\n\nexport const isInstanceResolutionScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceResolutionScopedBinding =>\n binding.scope === Scope.Resolution;\n\nexport const isInstanceSingletonScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceSingletonScopedBinding =>\n binding.scope === Scope.Singleton;\n", "export type Tag = symbol & { __tag__: true };\n\n/**\n * @description\n * Creates a unique tag.\n *\n * @param {string} description - a description of the tag to be used in logs and error messages.\n * @returns `Tag`.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tagdescription\n */\nexport const tag = (description: string): Tag => Symbol(description) as Tag;\n", "export interface TokenValue<T = unknown> {\n /**\n * @description Token type.\n */\n __t: T;\n\n /**\n * @description Description of token.\n */\n __d: string;\n\n /**\n * @description Unique symbol.\n */\n\n __s: symbol;\n\n /**\n * @description Is binding by token optional.\n */\n __o: boolean;\n}\n\nexport interface RequiredToken<T = unknown> extends TokenValue<T> {\n __o: false;\n}\n\nexport interface OptionalToken<T = unknown> extends TokenValue<T> {\n __o: true;\n}\n\nexport interface Token<T = unknown> extends RequiredToken<T> {\n optional: OptionalToken<T>;\n}\n\nexport type TokenType<T extends TokenValue> = T extends RequiredToken\n ? T['__t']\n : T['__t'] | undefined;\n\nexport type TokenTypeMap<T> = {\n [K in keyof T]: T[K] extends Token ? TokenType<T[K]> : TokenTypeMap<T[K]>;\n};\n\nexport type ToToken<T> = undefined extends T\n ? OptionalToken<Exclude<T, undefined>>\n : RequiredToken<T>;\n\n/**\n * @description\n * Creates a unique token with the type.\n *\n * @param {string} description - a description of the token to be used in logs and error messages.\n * @returns a unique `Token<T>` token with the type.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tokentdescription\n */\nexport const token = <T>(description: string): Token<T> => {\n const s = Symbol(description);\n return {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: false,\n optional: {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: true,\n },\n };\n};\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { Token, TokenValue, tag as createTag } from '../pointers';\n\nimport { Binding } from './bindings';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class BindingsVault {\n private static notag = createTag('NO_TAG');\n\n public parent: BindingsVault | null = null;\n\n private readonly map = new Map<\n symbol,\n Map<ResolutionCondition, Binding | BindingsVault>\n >();\n\n public set(\n binding: Binding | BindingsVault,\n token: Token,\n condition: ResolutionCondition = BindingsVault.notag,\n ): void {\n const current = this.map.get(token.__s);\n\n if (current) current.set(condition, binding);\n else\n this.map.set(\n token.__s,\n new Map<ResolutionCondition, Binding | BindingsVault>().set(\n condition,\n binding,\n ),\n );\n }\n\n private find(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | BindingsVault | undefined {\n const bindings = this.map.get(token.__s);\n\n if (bindings === undefined) return undefined;\n\n if (target) {\n const targetBinding = bindings.get(target);\n if (targetBinding) return targetBinding;\n }\n\n if (\n process.env.NODE_ENV !== 'production' &&\n conditions &&\n conditions.reduce(\n (acc, condition) => (bindings.has(condition) ? acc + 1 : acc),\n 0,\n ) > 1\n ) {\n const conditionsDisplayString = conditions\n .map((condition) =>\n typeof condition === 'function'\n ? condition.name\n : `tag(${condition.description})`,\n )\n .join(', ');\n\n console.warn(\n 'Warning: ' +\n `When resolving a binding by '${token.__d}' token with [${conditionsDisplayString}] conditions, ` +\n 'more than one binding was found. ' +\n \"In this case, Brandi resolves the binding by the first tag assigned by 'tagged(target, ...tags)' function \" +\n \"or, if you explicitly passed conditions through 'Container.get(token, conditions)' method, \" +\n 'by the first resolved condition. ' +\n 'Try to avoid such implicit logic.',\n );\n }\n\n if (conditions) {\n for (let i = 0, len = conditions.length; i < len; i += 1) {\n const binding = bindings.get(conditions[i]!);\n if (binding) return binding;\n }\n }\n\n return bindings.get(BindingsVault.notag);\n }\n\n private resolve(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const binding = this.find(token, conditions, target);\n\n if (binding === undefined)\n return this.parent\n ? this.parent.resolve(token, cache, conditions, target)\n : null;\n\n if (binding instanceof BindingsVault) {\n cache.vaults.push(binding);\n return binding.resolve(token, cache, conditions, target);\n }\n\n return binding;\n }\n\n public get(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const ownBinding = this.resolve(token, cache, conditions, target);\n\n if (ownBinding) return ownBinding;\n\n for (let i = 0, v = cache.vaults, len = v.length; i < len; i += 1) {\n const cacheBinding = v[i]!.resolve(token, cache, conditions, target);\n if (cacheBinding) return cacheBinding;\n }\n\n return null;\n }\n\n public clone(): BindingsVault {\n const vault = new BindingsVault();\n vault.parent = this.parent;\n\n this.map.forEach((value, key) => {\n vault.map.set(\n key,\n new Map<ResolutionCondition, Binding | BindingsVault>(value),\n );\n });\n\n return vault;\n }\n}\n", "import { ResolutionCondition } from '../../types';\nimport { Token } from '../../pointers';\n\nimport { BindingsVault } from '../BindingsVault';\nimport type { DependencyModule } from '../DependencyModule';\n\nimport type { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class FromSyntax {\n constructor(\n private readonly vault: BindingsVault,\n private readonly tokens: Token[],\n private readonly getVault: (target: BindOrUseSyntax) => BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Uses bindings from the dependency module.\n *\n * @param dependencyModule - the dependency module from which the tokens will be used.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public from(dependencyModule: DependencyModule): void {\n const { tokens } = this;\n for (let i = 0, len = tokens.length; i < len; i += 1) {\n this.vault.set(\n this.getVault(dependencyModule),\n tokens[i]!,\n this.condition,\n );\n }\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n InstanceContainerScopedBinding,\n InstanceResolutionScopedBinding,\n InstanceSingletonScopedBinding,\n InstanceTransientScopedBinding,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nexport class ScopeSyntax {\n private readonly warningTimeout?: NodeJS.Timeout;\n\n constructor(\n private readonly vault: BindingsVault,\n private readonly impl: UnknownCreator,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n this.warningTimeout = setTimeout(() => {\n console.warn(\n `Warning: did you forget to set a scope for '${this.token.__d}' token binding? ` +\n \"Call 'inTransientScope()', 'inSingletonScope()', 'inContainerScope()' or 'inResolutionScope()'.\",\n );\n });\n }\n }\n\n /**\n * @description\n * The container will return the same instance with each getting.\n * This is similar to being a singleton, however if the container has a child container or a clone,\n * that child container or clone will get an instance unique to it.\n *\n * @link https://brandi.js.org/reference/binding-scopes#incontainerscope\n */\n public inContainerScope(): void {\n this.set(InstanceContainerScopedBinding);\n }\n\n /**\n * @description\n * The same instance will be got for each getting of this dependency during a single resolution chain.\n *\n * @link https://brandi.js.org/reference/binding-scopes#inresolutionscope\n */\n public inResolutionScope(): void {\n this.set(InstanceResolutionScopedBinding);\n }\n\n /**\n * @description\n * Each getting will return the same instance.\n *\n * @link https://brandi.js.org/reference/binding-scopes#insingletonscope\n */\n public inSingletonScope(): void {\n this.set(InstanceSingletonScopedBinding);\n }\n\n /**\n * @description\n * New instance will be created with each getting.\n *\n * @link https://brandi.js.org/reference/binding-scopes#intransientscope\n */\n public inTransientScope(): void {\n this.set(InstanceTransientScopedBinding);\n }\n\n private set(\n Ctor:\n | typeof InstanceContainerScopedBinding\n | typeof InstanceResolutionScopedBinding\n | typeof InstanceSingletonScopedBinding\n | typeof InstanceTransientScopedBinding,\n ): void {\n if (process.env.NODE_ENV !== 'production')\n clearTimeout(this.warningTimeout!);\n\n this.vault.set(new Ctor(this.impl), this.token, this.condition);\n }\n}\n", "import {\n AsyncFactory,\n Factory,\n ResolutionCondition,\n UnknownCreator,\n} from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n ConstantBinding,\n FactoryBinding,\n FactoryInitializer,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nimport { ScopeSyntax } from './ScopeSyntax';\n\nexport class TypeSyntax<Dependency> {\n constructor(\n private readonly vault: BindingsVault,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to the constant value.\n *\n * @param value - the value that will be bound to the token.\n *\n * @link https://brandi.js.org/reference/binding-types#toconstantvalue\n */\n public toConstant(value: Dependency): void {\n this.vault.set(new ConstantBinding(value), this.token, this.condition);\n }\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Promise<Instance>>\n : never,\n initializer?: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => unknown\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Instance>\n : never,\n initializer: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => Promise<unknown>\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory<InitializerReturnType>(\n creator: Dependency extends Factory<infer Instance, never[]>\n ? Instance extends Promise<unknown>\n ? never\n : UnknownCreator<Instance>\n : never,\n initializer?: Dependency extends Factory<infer Instance, infer Arguments>\n ? InitializerReturnType extends Promise<unknown>\n ? never\n : (instance: Instance, ...args: Arguments) => InitializerReturnType\n : never,\n ): void;\n\n public toFactory(\n creator: UnknownCreator,\n initializer?: FactoryInitializer,\n ): void {\n this.vault.set(\n new FactoryBinding({ creator, initializer }),\n this.token,\n this.condition,\n );\n }\n\n /**\n * @description\n * Binds the token to an instance in one of the scopes.\n *\n * @param creator - the instance creator that will be bound to the token.\n *\n * @returns\n * Scope syntax:\n * - `inSingletonScope()`\n * - `inTransientScope()`\n * - `inContainerScope()`\n * - `inResolutionScope()`\n *\n * @link https://brandi.js.org/reference/binding-types#toinstancecreator\n */\n public toInstance(creator: UnknownCreator<Dependency>): ScopeSyntax {\n return new ScopeSyntax(this.vault, creator, this.token, this.condition);\n }\n}\n", "import { Token, TokenType } from '../../pointers';\nimport { ResolutionCondition } from '../../types';\n\nimport { BindingsVault } from '../BindingsVault';\n\nimport { FromSyntax } from './FromSyntax';\nimport { TypeSyntax } from './TypeSyntax';\n\nexport class BindOrUseSyntax {\n protected static vault(target: BindOrUseSyntax) {\n return target.vault;\n }\n\n constructor(\n protected vault: BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to an implementation.\n *\n * @param token - a token to be bound.\n *\n * @returns\n * Binding Type syntax:\n * - `toConstant(value)`\n * - `toInstance(creator)`\n * - `toFactory(creator, [initializer])`\n *\n * @link https://brandi.js.org/reference/container#bindtoken\n */\n public bind<T extends Token>(token: T): TypeSyntax<TokenType<T>> {\n return new TypeSyntax<TokenType<T>>(this.vault, token, this.condition);\n }\n\n /**\n * @description\n * Uses bindings from a dependency module.\n *\n * @param tokens - tokens to be used from a dependency module.\n * @returns `.from(module)` syntax.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public use(...tokens: Token[]): FromSyntax {\n return new FromSyntax(\n this.vault,\n tokens,\n BindOrUseSyntax.vault,\n this.condition,\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\n\nimport { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class WhenSyntax extends BindOrUseSyntax {\n /**\n * @description\n * Creates a conditional binding.\n *\n * @param condition - a condition.\n * @returns `bind` or `use` syntax.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\n public when(condition: ResolutionCondition): BindOrUseSyntax {\n return new BindOrUseSyntax(this.vault, condition);\n }\n}\n", "import { BindingsVault } from './BindingsVault';\nimport { WhenSyntax } from './syntax';\n\nexport class DependencyModule extends WhenSyntax {\n constructor() {\n super(new BindingsVault());\n }\n}\n", "import { Binding } from './bindings';\nimport type { BindingsVault } from './BindingsVault';\n\nexport class ResolutionCache {\n constructor(\n public readonly instances = new Map<Binding, unknown>(),\n public readonly vaults: BindingsVault[] = [],\n ) {}\n\n public split(): ResolutionCache {\n return new ResolutionCache(this.instances, this.vaults.slice());\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { TokenType, TokenValue } from '../pointers';\nimport { callableRegistry, injectsRegistry, tagsRegistry } from '../registries';\n\nimport {\n Binding,\n FactoryInitializer,\n InstanceBinding,\n isFactoryBinding,\n isInstanceBinding,\n isInstanceContainerScopedBinding,\n isInstanceResolutionScopedBinding,\n isInstanceSingletonScopedBinding,\n} from './bindings';\nimport { BindingsVault } from './BindingsVault';\nimport { DependencyModule } from './DependencyModule';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class Container extends DependencyModule {\n private snapshot: BindingsVault | null = null;\n\n /**\n * @description\n * Sets the parent container.\n *\n * @param container - a `Container` or `null` that will be set as the parent container.\n * @returns `this`.\n *\n * @link https://brandi.js.org/reference/container#extendcontainer\n */\n public extend(container: Container | null): this {\n this.vault.parent = container === null ? null : container.vault;\n return this;\n }\n\n /**\n * @description\n * Creates an unlinked clone of the container.\n *\n * @returns `Container`.\n *\n * @link https://brandi.js.org/reference/container#clone\n */\n public clone(): Container {\n const container = new Container();\n container.vault = this.vault.clone();\n return container;\n }\n\n /**\n * @description\n * Captures (snapshots) the current container state.\n *\n * @link https://brandi.js.org/reference/container#capture\n */\n public capture(): void {\n this.snapshot = this.vault.clone();\n }\n\n /**\n * @description\n * Restores the captured container state.\n *\n * @link https://brandi.js.org/reference/container#restore\n */\n public restore(): void {\n if (this.snapshot) {\n this.vault = this.snapshot.clone();\n } else if (process.env.NODE_ENV !== 'production') {\n console.error(\n \"Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?\",\n );\n }\n }\n\n /**\n * @description\n * Gets a dependency bound to the token.\n *\n * @param token - token for which a dependence will be got.\n * @returns `TokenType<TokenValue>`.\n *\n * @link https://brandi.js.org/reference/container#gettoken\n */\n public get<T extends TokenValue>(token: T): TokenType<T>;\n\n /**\n * @access package\n * @deprecated\n * `conditions` argument is added for internal use.\n * Use it if you really understand that it is necessary.\n */\n public get<T extends TokenValue>(\n token: T,\n conditions: ResolutionCondition[],\n ): TokenType<T>;\n\n public get<T extends TokenValue>(\n token: T,\n conditions?: ResolutionCondition[],\n ): TokenType<T> {\n return this.resolveToken(token, conditions) as TokenType<T>;\n }\n\n private resolveTokens(\n tokens: TokenValue[],\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): unknown[] {\n return tokens.map((token) =>\n this.resolveToken(token, conditions, target, cache.split()),\n );\n }\n\n private resolveToken(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n cache: ResolutionCache = new ResolutionCache(),\n ): unknown {\n const binding = this.vault.get(token, cache, conditions, target);\n\n if (binding) return this.resolveBinding(binding, cache);\n if (token.__o) return undefined;\n\n throw new Error(`No matching bindings found for '${token.__d}' token.`);\n }\n\n private resolveBinding(binding: Binding, cache: ResolutionCache): unknown {\n if (isInstanceBinding(binding)) {\n if (isInstanceSingletonScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache,\n (instance) => {\n // eslint-disable-next-line no-param-reassign\n binding.cache = instance;\n },\n );\n }\n\n if (isInstanceContainerScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache.get(this),\n (instance) => {\n binding.cache.set(this, instance);\n },\n );\n }\n\n if (isInstanceResolutionScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => cache.instances.get(binding),\n (instance) => {\n cache.instances.set(binding, instance);\n },\n );\n }\n\n return this.createInstance(binding.impl, cache);\n }\n\n if (isFactoryBinding(binding)) {\n return (...args: unknown[]) => {\n const instance = this.createInstance(binding.impl.creator, cache);\n\n return instance instanceof Promise\n ? instance.then((i) =>\n Container.resolveInitialization(\n i,\n args,\n binding.impl.initializer,\n ),\n )\n : Container.resolveInitialization(\n instance,\n args,\n binding.impl.initializer,\n );\n };\n }\n\n return binding.impl;\n }\n\n private resolveCache(\n binding: InstanceBinding,\n cache: ResolutionCache,\n getCache: () => unknown,\n setCache: (instance: unknown) => void,\n ) {\n const instanceCache = getCache();\n\n if (instanceCache !== undefined) return instanceCache;\n\n const instance = this.createInstance(binding.impl, cache);\n setCache(instance);\n return instance;\n }\n\n private createInstance(\n creator: UnknownCreator,\n cache: ResolutionCache,\n ): unknown {\n const parameters = this.getParameters(creator, cache);\n const isCallable = callableRegistry.get(creator);\n\n if (isCallable !== undefined) {\n return isCallable\n ? // @ts-expect-error: This expression is not callable.\n creator(...parameters)\n : // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n new creator(...parameters);\n }\n\n try {\n // @ts-expect-error: This expression is not callable.\n const instance = creator(...parameters);\n callableRegistry.set(creator, true);\n return instance;\n } catch {\n // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n const instance = new creator(...parameters);\n callableRegistry.set(creator, false);\n return instance;\n }\n }\n\n private getParameters(\n target: UnknownCreator,\n cache: ResolutionCache,\n ): unknown[] {\n const injects = injectsRegistry.get(target);\n\n if (injects)\n return this.resolveTokens(\n injects,\n cache,\n tagsRegistry.get(target),\n target,\n );\n\n if (target.length === 0) return [];\n\n throw new Error(\n `Missing required 'injected' registration of '${target.name}'`,\n );\n }\n\n private static resolveInitialization<T>(\n instance: T,\n args: unknown[],\n initializer?: FactoryInitializer,\n ) {\n const initialization = initializer?.(instance, ...args);\n return initialization instanceof Promise\n ? initialization.then(() => instance)\n : instance;\n }\n}\n", "import { Container } from './Container';\n\n/**\n * @description\n * Alias for `new Container()`.\n *\n * @example\n * <caption>Example usage of `createContainer()`.</caption>\n *\n * const container = createContainer();\n * console.log(container instanceof Container); // \u2192 true\n *\n * @link https://brandi.js.org/reference/container#createcontainer\n */\nexport const createContainer = () => new Container();\n", "import { DependencyModule } from './DependencyModule';\n\n/**\n * @description\n * Alias for `new DependencyModule()`.\n *\n * @example\n * <caption>Example usage of `createDependencyModule()`.</caption>\n *\n * const dependencyModule = createDependencyModule();\n * console.log(dependencyModule instanceof DependencyModule); // \u2192 true\n *\n * @link https://brandi.js.org/reference/dependency-modules#createdependencymodule\n */\nexport const createDependencyModule = () => new DependencyModule();\n", "import { ToToken, TokenValue } from '../pointers';\nimport { UnknownCreator, UnknownCreatorParameters } from '../types';\nimport { injectsRegistry } from '../registries';\n\ntype ToTokens<T extends unknown[]> = {\n [K in keyof T]-?: ToToken<T[K]>;\n};\n\n/**\n * @description\n * Registers target injections.\n *\n * @param target - constructor or function whose dependencies will be injected.\n * @param ...tokens - dependency tokens.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#injectedtarget-tokens\n */\nexport const injected = <T extends UnknownCreator>(\n target: T,\n ...tokens: ToTokens<UnknownCreatorParameters<T>> extends TokenValue[]\n ? ToTokens<UnknownCreatorParameters<T>>\n : never\n) => {\n injectsRegistry.set(target, tokens);\n return target;\n};\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\nimport { tagsRegistry } from '../registries';\n\n/**\n * @description\n * Tags target.\n *\n * @param target - constructor or function that will be tagged.\n * @param ...tags - tags.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\nexport const tagged = <T extends UnknownCreator>(\n target: T,\n ...tags: Tag[]\n): T => {\n tagsRegistry.set(target, tags);\n return target;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { UnknownCreator } from '../types';\n\nexport const callableRegistry = new Map<UnknownCreator, boolean>();\n", "import { TokenValue } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const injectsRegistry = new Map<UnknownCreator, TokenValue[]>();\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\n\nexport const tagsRegistry = new Map<UnknownCreator, Tag[]>();\n", "export enum Type {\n Constant,\n Instance,\n Factory,\n}\n\nexport enum Scope {\n Container,\n Resolution,\n Singleton,\n Transient,\n}\n\nexport interface Binding {\n readonly impl: unknown;\n readonly type: Type;\n\n clone?: () => Binding;\n}\n", "import { Binding, Type } from './Binding';\n\nexport class ConstantBinding implements Binding {\n public readonly type = Type.Constant;\n\n constructor(public readonly impl: unknown) {}\n}\n", "import { UnknownCreator } from '../../types';\n\nimport { Binding, Type } from './Binding';\n\nexport type FactoryInitializer = (\n instance: unknown,\n ...args: unknown[]\n) => unknown;\n\nexport class FactoryBinding implements Binding {\n public readonly type = Type.Factory;\n\n constructor(\n public readonly impl: {\n creator: UnknownCreator;\n initializer?: FactoryInitializer;\n },\n ) {}\n}\n\nexport const isFactoryBinding = (binding: Binding): binding is FactoryBinding =>\n binding.type === Type.Factory;\n", "import { UnknownCreator } from '../../types';\n\nimport type { BindingsVault } from '../BindingsVault';\n\nimport { Binding, Scope, Type } from './Binding';\n\nexport abstract class InstanceBinding implements Binding {\n public readonly type = Type.Instance;\n\n public abstract readonly scope: Scope;\n\n constructor(public readonly impl: UnknownCreator) {}\n}\n\nexport class InstanceContainerScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Container;\n\n public readonly cache = new WeakMap<BindingsVault, unknown>();\n}\n\nexport class InstanceResolutionScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Resolution;\n}\n\nexport class InstanceSingletonScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Singleton;\n\n public cache?: unknown;\n\n public clone?(): InstanceSingletonScopedBinding;\n\n constructor(public readonly impl: UnknownCreator) {\n super(impl);\n\n if (process.env.NODE_ENV !== 'production') {\n this.clone = (): InstanceSingletonScopedBinding => {\n const binding = new InstanceSingletonScopedBinding(this.impl);\n binding.cache = this.cache;\n return binding;\n };\n }\n }\n}\n\nexport class InstanceTransientScopedBinding extends InstanceBinding {\n public readonly scope = Scope.Transient;\n}\n\nexport const isInstanceBinding = (\n binding: Binding,\n): binding is InstanceBinding => binding.type === Type.Instance;\n\nexport const isInstanceContainerScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceContainerScopedBinding =>\n binding.scope === Scope.Container;\n\nexport const isInstanceResolutionScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceResolutionScopedBinding =>\n binding.scope === Scope.Resolution;\n\nexport const isInstanceSingletonScopedBinding = (\n binding: InstanceBinding,\n): binding is InstanceSingletonScopedBinding =>\n binding.scope === Scope.Singleton;\n", "export type Tag = symbol & { __tag__: true };\n\n/**\n * @description\n * Creates a unique tag.\n *\n * @param {string} description - a description of the tag to be used in logs and error messages.\n * @returns `Tag`.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tagdescription\n */\nexport const tag = (description: string): Tag => Symbol(description) as Tag;\n", "export interface TokenValue<T = unknown> {\n /**\n * @description Token type.\n */\n __t: T;\n\n /**\n * @description Description of token.\n */\n __d: string;\n\n /**\n * @description Unique symbol.\n */\n\n __s: symbol;\n\n /**\n * @description Is binding by token optional.\n */\n __o: boolean;\n}\n\nexport interface RequiredToken<T = unknown> extends TokenValue<T> {\n __o: false;\n}\n\nexport interface OptionalToken<T = unknown> extends TokenValue<T> {\n __o: true;\n}\n\nexport interface Token<T = unknown> extends RequiredToken<T> {\n optional: OptionalToken<T>;\n}\n\nexport type TokenType<T extends TokenValue> = T extends RequiredToken\n ? T['__t']\n : T['__t'] | undefined;\n\nexport type TokenTypeMap<T> = {\n [K in keyof T]: T[K] extends Token ? TokenType<T[K]> : TokenTypeMap<T[K]>;\n};\n\nexport type ToToken<T> = undefined extends T\n ? OptionalToken<Exclude<T, undefined>>\n : RequiredToken<T>;\n\n/**\n * @description\n * Creates a unique token with the type.\n *\n * @param {string} description - a description of the token to be used in logs and error messages.\n * @returns a unique `Token<T>` token with the type.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#tokentdescription\n */\nexport const token = <T>(description: string): Token<T> => {\n const s = Symbol(description);\n return {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: false,\n optional: {\n __t: (null as unknown) as T,\n __d: description,\n __s: s,\n __o: true,\n },\n };\n};\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { Token, TokenValue, tag as createTag } from '../pointers';\n\nimport { Binding } from './bindings';\nimport { ResolutionCache } from './ResolutionCache';\n\ntype BindingsMap = Map<ResolutionCondition, Binding | BindingsVault>;\n\nexport class BindingsVault {\n private static notag = createTag('NO_TAG');\n\n public parent: BindingsVault | null = null;\n\n private readonly map = new Map<symbol, BindingsMap>();\n\n public copy?(): BindingsVault;\n\n constructor() {\n if (process.env.NODE_ENV !== 'production') {\n this.copy = (): BindingsVault =>\n this.from((prev) => {\n const next = new Map<ResolutionCondition, Binding | BindingsVault>();\n prev.forEach((binding, key) => {\n if (binding instanceof BindingsVault) {\n next.set(key, binding.copy!());\n } else {\n next.set(key, binding.clone?.() ?? binding);\n }\n });\n return next;\n });\n }\n }\n\n public set(\n binding: Binding | BindingsVault,\n token: Token,\n condition: ResolutionCondition = BindingsVault.notag,\n ): void {\n const current = this.map.get(token.__s);\n\n if (current) current.set(condition, binding);\n else\n this.map.set(\n token.__s,\n new Map<ResolutionCondition, Binding | BindingsVault>().set(\n condition,\n binding,\n ),\n );\n }\n\n private find(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | BindingsVault | undefined {\n const bindings = this.map.get(token.__s);\n\n if (bindings === undefined) return undefined;\n\n if (target) {\n const targetBinding = bindings.get(target);\n if (targetBinding) return targetBinding;\n }\n\n if (\n process.env.NODE_ENV !== 'production' &&\n conditions &&\n conditions.reduce(\n (acc, condition) => (bindings.has(condition) ? acc + 1 : acc),\n 0,\n ) > 1\n ) {\n const conditionsDisplayString = conditions\n .map((condition) =>\n typeof condition === 'function'\n ? condition.name\n : `tag(${condition.description})`,\n )\n .join(', ');\n\n console.warn(\n 'Warning: ' +\n `When resolving a binding by '${token.__d}' token with [${conditionsDisplayString}] conditions, ` +\n 'more than one binding was found. ' +\n \"In this case, Brandi resolves the binding by the first tag assigned by 'tagged(target, ...tags)' function \" +\n \"or, if you explicitly passed conditions through 'Container.get(token, conditions)' method, \" +\n 'by the first resolved condition. ' +\n 'Try to avoid such implicit logic.',\n );\n }\n\n if (conditions) {\n for (let i = 0, len = conditions.length; i < len; i += 1) {\n const binding = bindings.get(conditions[i]!);\n if (binding) return binding;\n }\n }\n\n return bindings.get(BindingsVault.notag);\n }\n\n private resolve(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const binding = this.find(token, conditions, target);\n\n if (binding === undefined)\n return this.parent\n ? this.parent.resolve(token, cache, conditions, target)\n : null;\n\n if (binding instanceof BindingsVault) {\n cache.vaults.push(binding);\n return binding.resolve(token, cache, conditions, target);\n }\n\n return binding;\n }\n\n public get(\n token: TokenValue,\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): Binding | null {\n const ownBinding = this.resolve(token, cache, conditions, target);\n\n if (ownBinding) return ownBinding;\n\n for (let i = 0, v = cache.vaults, len = v.length; i < len; i += 1) {\n const cacheBinding = v[i]!.resolve(token, cache, conditions, target);\n if (cacheBinding) return cacheBinding;\n }\n\n return null;\n }\n\n private from(\n callback: (bindings: BindingsMap) => BindingsMap,\n ): BindingsVault {\n const vault = new BindingsVault();\n vault.parent = this.parent;\n\n this.map.forEach((bindings, key) => {\n vault.map.set(key, callback(bindings));\n });\n\n return vault;\n }\n\n public clone(): BindingsVault {\n return this.from(\n (prev) => new Map<ResolutionCondition, Binding | BindingsVault>(prev),\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\nimport { Token } from '../../pointers';\n\nimport { BindingsVault } from '../BindingsVault';\nimport type { DependencyModule } from '../DependencyModule';\n\nimport type { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class FromSyntax {\n constructor(\n private readonly vault: BindingsVault,\n private readonly tokens: Token[],\n private readonly getVault: (target: BindOrUseSyntax) => BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Uses bindings from the dependency module.\n *\n * @param dependencyModule - the dependency module from which the tokens will be used.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public from(dependencyModule: DependencyModule): void {\n const { tokens } = this;\n for (let i = 0, len = tokens.length; i < len; i += 1) {\n this.vault.set(\n this.getVault(dependencyModule),\n tokens[i]!,\n this.condition,\n );\n }\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n InstanceContainerScopedBinding,\n InstanceResolutionScopedBinding,\n InstanceSingletonScopedBinding,\n InstanceTransientScopedBinding,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nexport class ScopeSyntax {\n private readonly warningTimeout?: NodeJS.Timeout;\n\n constructor(\n private readonly vault: BindingsVault,\n private readonly impl: UnknownCreator,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n this.warningTimeout = setTimeout(() => {\n console.warn(\n `Warning: did you forget to set a scope for '${this.token.__d}' token binding? ` +\n \"Call 'inTransientScope()', 'inSingletonScope()', 'inContainerScope()' or 'inResolutionScope()'.\",\n );\n });\n }\n }\n\n /**\n * @description\n * The container will return the same instance with each getting.\n * This is similar to being a singleton, however if the container has a child container or a clone,\n * that child container or clone will get an instance unique to it.\n *\n * @link https://brandi.js.org/reference/binding-scopes#incontainerscope\n */\n public inContainerScope(): void {\n this.set(InstanceContainerScopedBinding);\n }\n\n /**\n * @description\n * The same instance will be got for each getting of this dependency during a single resolution chain.\n *\n * @link https://brandi.js.org/reference/binding-scopes#inresolutionscope\n */\n public inResolutionScope(): void {\n this.set(InstanceResolutionScopedBinding);\n }\n\n /**\n * @description\n * Each getting will return the same instance.\n *\n * @link https://brandi.js.org/reference/binding-scopes#insingletonscope\n */\n public inSingletonScope(): void {\n this.set(InstanceSingletonScopedBinding);\n }\n\n /**\n * @description\n * New instance will be created with each getting.\n *\n * @link https://brandi.js.org/reference/binding-scopes#intransientscope\n */\n public inTransientScope(): void {\n this.set(InstanceTransientScopedBinding);\n }\n\n private set(\n Ctor:\n | typeof InstanceContainerScopedBinding\n | typeof InstanceResolutionScopedBinding\n | typeof InstanceSingletonScopedBinding\n | typeof InstanceTransientScopedBinding,\n ): void {\n if (process.env.NODE_ENV !== 'production')\n clearTimeout(this.warningTimeout!);\n\n this.vault.set(new Ctor(this.impl), this.token, this.condition);\n }\n}\n", "import {\n AsyncFactory,\n Factory,\n ResolutionCondition,\n UnknownCreator,\n} from '../../types';\nimport { Token } from '../../pointers';\n\nimport {\n ConstantBinding,\n FactoryBinding,\n FactoryInitializer,\n} from '../bindings';\nimport { BindingsVault } from '../BindingsVault';\n\nimport { ScopeSyntax } from './ScopeSyntax';\n\nexport class TypeSyntax<Dependency> {\n constructor(\n private readonly vault: BindingsVault,\n private readonly token: Token,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to the constant value.\n *\n * @param value - the value that will be bound to the token.\n *\n * @link https://brandi.js.org/reference/binding-types#toconstantvalue\n */\n public toConstant(value: Dependency): void {\n this.vault.set(new ConstantBinding(value), this.token, this.condition);\n }\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Promise<Instance>>\n : never,\n initializer?: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => unknown\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory(\n creator: Dependency extends AsyncFactory<infer Instance, never[]>\n ? UnknownCreator<Instance>\n : never,\n initializer: Dependency extends AsyncFactory<\n infer Instance,\n infer Arguments\n >\n ? (instance: Instance, ...args: Arguments) => Promise<unknown>\n : never,\n ): void;\n\n /**\n * @description\n * Binds the token to the factory.\n *\n * @param creator - the instance creator which the factory will use;\n * @param [initializer] - optional function called after the instance is created.\n *\n * @link https://brandi.js.org/reference/binding-types#tofactorycreator-initializer\n */\n public toFactory<InitializerReturnType>(\n creator: Dependency extends Factory<infer Instance, never[]>\n ? Instance extends Promise<unknown>\n ? never\n : UnknownCreator<Instance>\n : never,\n initializer?: Dependency extends Factory<infer Instance, infer Arguments>\n ? InitializerReturnType extends Promise<unknown>\n ? never\n : (instance: Instance, ...args: Arguments) => InitializerReturnType\n : never,\n ): void;\n\n public toFactory(\n creator: UnknownCreator,\n initializer?: FactoryInitializer,\n ): void {\n this.vault.set(\n new FactoryBinding({ creator, initializer }),\n this.token,\n this.condition,\n );\n }\n\n /**\n * @description\n * Binds the token to an instance in one of the scopes.\n *\n * @param creator - the instance creator that will be bound to the token.\n *\n * @returns\n * Scope syntax:\n * - `inSingletonScope()`\n * - `inTransientScope()`\n * - `inContainerScope()`\n * - `inResolutionScope()`\n *\n * @link https://brandi.js.org/reference/binding-types#toinstancecreator\n */\n public toInstance(creator: UnknownCreator<Dependency>): ScopeSyntax {\n return new ScopeSyntax(this.vault, creator, this.token, this.condition);\n }\n}\n", "import { Token, TokenType } from '../../pointers';\nimport { ResolutionCondition } from '../../types';\n\nimport { BindingsVault } from '../BindingsVault';\n\nimport { FromSyntax } from './FromSyntax';\nimport { TypeSyntax } from './TypeSyntax';\n\nexport class BindOrUseSyntax {\n protected static vault(target: BindOrUseSyntax) {\n return target.vault;\n }\n\n constructor(\n protected vault: BindingsVault,\n private readonly condition?: ResolutionCondition,\n ) {}\n\n /**\n * @description\n * Binds the token to an implementation.\n *\n * @param token - a token to be bound.\n *\n * @returns\n * Binding Type syntax:\n * - `toConstant(value)`\n * - `toInstance(creator)`\n * - `toFactory(creator, [initializer])`\n *\n * @link https://brandi.js.org/reference/container#bindtoken\n */\n public bind<T extends Token>(token: T): TypeSyntax<TokenType<T>> {\n return new TypeSyntax<TokenType<T>>(this.vault, token, this.condition);\n }\n\n /**\n * @description\n * Uses bindings from a dependency module.\n *\n * @param tokens - tokens to be used from a dependency module.\n * @returns `.from(module)` syntax.\n *\n * @link https://brandi.js.org/reference/container#usetokensfrommodule\n */\n public use(...tokens: Token[]): FromSyntax {\n return new FromSyntax(\n this.vault,\n tokens,\n BindOrUseSyntax.vault,\n this.condition,\n );\n }\n}\n", "import { ResolutionCondition } from '../../types';\n\nimport { BindOrUseSyntax } from './BindOrUseSyntax';\n\nexport class WhenSyntax extends BindOrUseSyntax {\n /**\n * @description\n * Creates a conditional binding.\n *\n * @param condition - a condition.\n * @returns `bind` or `use` syntax.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\n public when(condition: ResolutionCondition): BindOrUseSyntax {\n return new BindOrUseSyntax(this.vault, condition);\n }\n}\n", "import { BindingsVault } from './BindingsVault';\nimport { WhenSyntax } from './syntax';\n\nexport class DependencyModule extends WhenSyntax {\n constructor() {\n super(new BindingsVault());\n }\n}\n", "import { Binding } from './bindings';\nimport type { BindingsVault } from './BindingsVault';\n\nexport class ResolutionCache {\n constructor(\n public readonly instances = new Map<Binding, unknown>(),\n public readonly vaults: BindingsVault[] = [],\n ) {}\n\n public split(): ResolutionCache {\n return new ResolutionCache(this.instances, this.vaults.slice());\n }\n}\n", "import { ResolutionCondition, UnknownCreator } from '../types';\nimport { TokenType, TokenValue } from '../pointers';\nimport { callableRegistry, injectsRegistry, tagsRegistry } from '../registries';\n\nimport {\n Binding,\n FactoryInitializer,\n InstanceBinding,\n isFactoryBinding,\n isInstanceBinding,\n isInstanceContainerScopedBinding,\n isInstanceResolutionScopedBinding,\n isInstanceSingletonScopedBinding,\n} from './bindings';\nimport { BindingsVault } from './BindingsVault';\nimport { DependencyModule } from './DependencyModule';\nimport { ResolutionCache } from './ResolutionCache';\n\nexport class Container extends DependencyModule {\n private snapshot: BindingsVault | null = null;\n\n /**\n * @description\n * Captures (snapshots) the current container state.\n *\n * @link https://brandi.js.org/reference/container#capture\n */\n public capture?(): void;\n\n /**\n * @description\n * Restores the captured container state.\n *\n * @link https://brandi.js.org/reference/container#restore\n */\n public restore?(): void;\n\n constructor() {\n super();\n\n if (process.env.NODE_ENV !== 'production') {\n this.capture = (): void => {\n this.snapshot = this.vault.copy!();\n };\n\n this.restore = (): void => {\n if (this.snapshot) {\n this.vault = this.snapshot.copy!();\n } else {\n console.error(\n \"Error: It looks like a trying to restore a non-captured container state. Did you forget to call 'capture()' method?\",\n );\n }\n };\n }\n }\n\n /**\n * @description\n * Sets the parent container.\n *\n * @param container - a `Container` or `null` that will be set as the parent container.\n * @returns `this`.\n *\n * @link https://brandi.js.org/reference/container#extendcontainer\n */\n public extend(container: Container | null): this {\n this.vault.parent = container === null ? null : container.vault;\n return this;\n }\n\n /**\n * @description\n * Creates an unlinked clone of the container.\n *\n * @returns `Container`.\n *\n * @link https://brandi.js.org/reference/container#clone\n */\n public clone(): Container {\n const container = new Container();\n container.vault = this.vault.clone();\n return container;\n }\n\n /**\n * @description\n * Gets a dependency bound to the token.\n *\n * @param token - token for which a dependence will be got.\n * @returns `TokenType<TokenValue>`.\n *\n * @link https://brandi.js.org/reference/container#gettoken\n */\n public get<T extends TokenValue>(token: T): TokenType<T>;\n\n /**\n * @access package\n * @deprecated\n * `conditions` argument is added for internal use.\n * Use it if you really understand that it is necessary.\n */\n public get<T extends TokenValue>(\n token: T,\n conditions: ResolutionCondition[],\n ): TokenType<T>;\n\n public get<T extends TokenValue>(\n token: T,\n conditions?: ResolutionCondition[],\n ): TokenType<T> {\n return this.resolveToken(token, conditions) as TokenType<T>;\n }\n\n private resolveTokens(\n tokens: TokenValue[],\n cache: ResolutionCache,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n ): unknown[] {\n return tokens.map((token) =>\n this.resolveToken(token, conditions, target, cache.split()),\n );\n }\n\n private resolveToken(\n token: TokenValue,\n conditions?: ResolutionCondition[],\n target?: UnknownCreator,\n cache: ResolutionCache = new ResolutionCache(),\n ): unknown {\n const binding = this.vault.get(token, cache, conditions, target);\n\n if (binding) return this.resolveBinding(binding, cache);\n if (token.__o) return undefined;\n\n throw new Error(`No matching bindings found for '${token.__d}' token.`);\n }\n\n private resolveBinding(binding: Binding, cache: ResolutionCache): unknown {\n if (isInstanceBinding(binding)) {\n if (isInstanceSingletonScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache,\n (instance) => {\n // eslint-disable-next-line no-param-reassign\n binding.cache = instance;\n },\n );\n }\n\n if (isInstanceContainerScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => binding.cache.get(this.vault),\n (instance) => {\n binding.cache.set(this.vault, instance);\n },\n );\n }\n\n if (isInstanceResolutionScopedBinding(binding)) {\n return this.resolveCache(\n binding,\n cache,\n () => cache.instances.get(binding),\n (instance) => {\n cache.instances.set(binding, instance);\n },\n );\n }\n\n return this.createInstance(binding.impl, cache);\n }\n\n if (isFactoryBinding(binding)) {\n return (...args: unknown[]) => {\n const instance = this.createInstance(binding.impl.creator, cache);\n\n return instance instanceof Promise\n ? instance.then((i) =>\n Container.resolveInitialization(\n i,\n args,\n binding.impl.initializer,\n ),\n )\n : Container.resolveInitialization(\n instance,\n args,\n binding.impl.initializer,\n );\n };\n }\n\n return binding.impl;\n }\n\n private resolveCache(\n binding: InstanceBinding,\n cache: ResolutionCache,\n getCache: () => unknown,\n setCache: (instance: unknown) => void,\n ) {\n const instanceCache = getCache();\n\n if (instanceCache !== undefined) return instanceCache;\n\n const instance = this.createInstance(binding.impl, cache);\n setCache(instance);\n return instance;\n }\n\n private createInstance(\n creator: UnknownCreator,\n cache: ResolutionCache,\n ): unknown {\n const parameters = this.getParameters(creator, cache);\n const isCallable = callableRegistry.get(creator);\n\n if (isCallable !== undefined) {\n return isCallable\n ? // @ts-expect-error: This expression is not callable.\n creator(...parameters)\n : // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n new creator(...parameters);\n }\n\n try {\n // @ts-expect-error: This expression is not callable.\n const instance = creator(...parameters);\n callableRegistry.set(creator, true);\n return instance;\n } catch {\n // @ts-expect-error: This expression is not constructable.\n // eslint-disable-next-line new-cap\n const instance = new creator(...parameters);\n callableRegistry.set(creator, false);\n return instance;\n }\n }\n\n private getParameters(\n target: UnknownCreator,\n cache: ResolutionCache,\n ): unknown[] {\n const injects = injectsRegistry.get(target);\n\n if (injects)\n return this.resolveTokens(\n injects,\n cache,\n tagsRegistry.get(target),\n target,\n );\n\n if (target.length === 0) return [];\n\n throw new Error(\n `Missing required 'injected' registration of '${target.name}'`,\n );\n }\n\n private static resolveInitialization<T>(\n instance: T,\n args: unknown[],\n initializer?: FactoryInitializer,\n ) {\n const initialization = initializer?.(instance, ...args);\n return initialization instanceof Promise\n ? initialization.then(() => instance)\n : instance;\n }\n}\n", "import { Container } from './Container';\n\n/**\n * @description\n * Alias for `new Container()`.\n *\n * @example\n * <caption>Example usage of `createContainer()`.</caption>\n *\n * const container = createContainer();\n * console.log(container instanceof Container); // \u2192 true\n *\n * @link https://brandi.js.org/reference/container#createcontainer\n */\nexport const createContainer = () => new Container();\n", "import { DependencyModule } from './DependencyModule';\n\n/**\n * @description\n * Alias for `new DependencyModule()`.\n *\n * @example\n * <caption>Example usage of `createDependencyModule()`.</caption>\n *\n * const dependencyModule = createDependencyModule();\n * console.log(dependencyModule instanceof DependencyModule); // \u2192 true\n *\n * @link https://brandi.js.org/reference/dependency-modules#createdependencymodule\n */\nexport const createDependencyModule = () => new DependencyModule();\n", "import { ToToken, TokenValue } from '../pointers';\nimport { UnknownCreator, UnknownCreatorParameters } from '../types';\nimport { injectsRegistry } from '../registries';\n\ntype ToTokens<T extends unknown[]> = {\n [K in keyof T]-?: ToToken<T[K]>;\n};\n\n/**\n * @description\n * Registers target injections.\n *\n * @param target - constructor or function whose dependencies will be injected.\n * @param ...tokens - dependency tokens.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/pointers-and-registrators#injectedtarget-tokens\n */\nexport const injected = <T extends UnknownCreator>(\n target: T,\n ...tokens: ToTokens<UnknownCreatorParameters<T>> extends TokenValue[]\n ? ToTokens<UnknownCreatorParameters<T>>\n : never\n) => {\n injectsRegistry.set(target, tokens);\n return target;\n};\n", "import { Tag } from '../pointers';\nimport { UnknownCreator } from '../types';\nimport { tagsRegistry } from '../registries';\n\n/**\n * @description\n * Tags target.\n *\n * @param target - constructor or function that will be tagged.\n * @param ...tags - tags.\n * @returns the `target` first argument.\n *\n * @link https://brandi.js.org/reference/conditional-bindings\n */\nexport const tagged = <T extends UnknownCreator>(\n target: T,\n ...tags: Tag[]\n): T => {\n tagsRegistry.set(target, tags);\n return target;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,9 +6,12 @@ export declare class BindingsVault {
6
6
  private static notag;
7
7
  parent: BindingsVault | null;
8
8
  private readonly map;
9
+ copy?(): BindingsVault;
10
+ constructor();
9
11
  set(binding: Binding | BindingsVault, token: Token, condition?: ResolutionCondition): void;
10
12
  private find;
11
13
  private resolve;
12
14
  get(token: TokenValue, cache: ResolutionCache, conditions?: ResolutionCondition[], target?: UnknownCreator): Binding | null;
15
+ private from;
13
16
  clone(): BindingsVault;
14
17
  }
@@ -3,6 +3,21 @@ import { TokenType, TokenValue } from '../pointers';
3
3
  import { DependencyModule } from './DependencyModule';
4
4
  export declare class Container extends DependencyModule {
5
5
  private snapshot;
6
+ /**
7
+ * @description
8
+ * Captures (snapshots) the current container state.
9
+ *
10
+ * @link https://brandi.js.org/reference/container#capture
11
+ */
12
+ capture?(): void;
13
+ /**
14
+ * @description
15
+ * Restores the captured container state.
16
+ *
17
+ * @link https://brandi.js.org/reference/container#restore
18
+ */
19
+ restore?(): void;
20
+ constructor();
6
21
  /**
7
22
  * @description
8
23
  * Sets the parent container.
@@ -22,20 +37,6 @@ export declare class Container extends DependencyModule {
22
37
  * @link https://brandi.js.org/reference/container#clone
23
38
  */
24
39
  clone(): Container;
25
- /**
26
- * @description
27
- * Captures (snapshots) the current container state.
28
- *
29
- * @link https://brandi.js.org/reference/container#capture
30
- */
31
- capture(): void;
32
- /**
33
- * @description
34
- * Restores the captured container state.
35
- *
36
- * @link https://brandi.js.org/reference/container#restore
37
- */
38
- restore(): void;
39
40
  /**
40
41
  * @description
41
42
  * Gets a dependency bound to the token.
@@ -12,4 +12,5 @@ export declare enum Scope {
12
12
  export interface Binding {
13
13
  readonly impl: unknown;
14
14
  readonly type: Type;
15
+ clone?: () => Binding;
15
16
  }
@@ -1,5 +1,5 @@
1
1
  import { UnknownCreator } from '../../types';
2
- import type { Container } from '../Container';
2
+ import type { BindingsVault } from '../BindingsVault';
3
3
  import { Binding, Scope, Type } from './Binding';
4
4
  export declare abstract class InstanceBinding implements Binding {
5
5
  readonly impl: UnknownCreator;
@@ -9,14 +9,17 @@ export declare abstract class InstanceBinding implements Binding {
9
9
  }
10
10
  export declare class InstanceContainerScopedBinding extends InstanceBinding {
11
11
  readonly scope = Scope.Container;
12
- readonly cache: WeakMap<Container, unknown>;
12
+ readonly cache: WeakMap<BindingsVault, unknown>;
13
13
  }
14
14
  export declare class InstanceResolutionScopedBinding extends InstanceBinding {
15
15
  readonly scope = Scope.Resolution;
16
16
  }
17
17
  export declare class InstanceSingletonScopedBinding extends InstanceBinding {
18
+ readonly impl: UnknownCreator;
18
19
  readonly scope = Scope.Singleton;
19
20
  cache?: unknown;
21
+ clone?(): InstanceSingletonScopedBinding;
22
+ constructor(impl: UnknownCreator);
20
23
  }
21
24
  export declare class InstanceTransientScopedBinding extends InstanceBinding {
22
25
  readonly scope = Scope.Transient;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brandi",
3
- "version": "3.1.0",
3
+ "version": "4.0.2",
4
4
  "description": "The dependency injection container.",
5
5
  "main": "./lib/brandi.js",
6
6
  "module": "./lib/brandi.mjs",