@decohere/crucible 0.0.1-dev.7 → 0.0.1-dev.71

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.
@@ -24,4 +24,4 @@ function getExistingMeta(target) {
24
24
  return meta;
25
25
  }
26
26
 
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lTWV0YSwgZ2V0TWV0YSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEluamVjdGlvbk1ldGFkYXRhID0gTWFwPG51bWJlciwgSW5qZWN0aW9uVG9rZW4+O1xuXG5leHBvcnQgdHlwZSBJbmplY3Rpb25Ub2tlbiA9IHtcblx0a2V5OiBzdHJpbmcgfCBzeW1ib2w7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG5cdHJldHVybiAodGFyZ2V0OiBvYmplY3QsIF9wcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZ2V0RXhpc3RpbmdNZXRhKHRhcmdldCk7XG5cdFx0bWV0YWRhdGEuc2V0KGlkeCwgeyBrZXkgfSk7XG5cdFx0ZGVmaW5lTWV0YShDcnVjaWJsZU1ldGEuaW5qZWN0dG9rZW4sIG1ldGFkYXRhLCB0YXJnZXQpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01ldGEodGFyZ2V0OiBvYmplY3QpIHtcblx0Y29uc3QgbWV0YSA9XG5cdFx0Z2V0TWV0YTxNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj4+KENydWNpYmxlTWV0YS5pbmplY3R0b2tlbiwgdGFyZ2V0KSA/P1xuXHRcdG5ldyBNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj4oKTtcblx0cmV0dXJuIG1ldGE7XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0Iiwia2V5IiwidGFyZ2V0IiwiX3Byb3BlcnR5S2V5IiwiaWR4IiwibWV0YWRhdGEiLCJnZXRFeGlzdGluZ01ldGEiLCJzZXQiLCJkZWZpbmVNZXRhIiwiQ3J1Y2libGVNZXRhIiwiaW5qZWN0dG9rZW4iLCJtZXRhIiwiZ2V0TWV0YSIsIk1hcCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFTZ0JBOzs7ZUFBQUE7Ozs0QkFUb0I7dUJBQ1A7QUFRdEIsU0FBU0EsT0FBT0MsR0FBb0I7SUFDMUMsT0FBTyxDQUFDQyxRQUFnQkMsY0FBMkNDO1FBQ2xFLE1BQU1DLFdBQVdDLGdCQUFnQko7UUFDakNHLFNBQVNFLEdBQUcsQ0FBQ0gsS0FBSztZQUFFSDtRQUFJO1FBQ3hCTyxJQUFBQSxzQkFBVSxFQUFDQyxtQkFBWSxDQUFDQyxXQUFXLEVBQUVMLFVBQVVIO0lBQ2hEO0FBQ0Q7QUFFQSxTQUFTSSxnQkFBZ0JKLE1BQWM7SUFDdEMsTUFBTVMsT0FDTEMsSUFBQUEsbUJBQU8sRUFBOEJILG1CQUFZLENBQUNDLFdBQVcsRUFBRVIsV0FDL0QsSUFBSVc7SUFDTCxPQUFPRjtBQUNSIn0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RhYmxlLCBkZWZpbmVNZXRhLCBnZXRNZXRhIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDcnVjaWJsZU1ldGEgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcblxuZXhwb3J0IHR5cGUgSW5qZWN0aW9uTWV0YWRhdGEgPSBNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj47XG5cbmV4cG9ydCB0eXBlIEluamVjdGlvblRva2VuID0ge1xuXHRrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGU7XG59O1xuXG4vKipcbiAqIEJpbmQgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdG8gYSByZWdpc3RyYXRpb24ga2V5LlxuICogQSBjbGFzcyB1c2VzIGBDbGFzcy5uYW1lYCAoc2FtZSBrZXkgYXMgYHJlZ2lzdGVyU2luZ2xldG9uKENsYXNzKWApLlxuICogUHJlZmVyIHRoZSBjbGFzcyBvdmVyIGEgbmFtZSBzdHJpbmcuIFVzZSBhIHN5bWJvbCBvciBzdHJpbmcgd2hlbiB0aGUga2V5IGlzIG5vdCB0aGUgY2xhc3MgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUpIHtcblx0cmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgX3Byb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsIGlkeDogbnVtYmVyKSA9PiB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBnZXRFeGlzdGluZ01ldGEodGFyZ2V0KTtcblx0XHRtZXRhZGF0YS5zZXQoaWR4LCB7IGtleSB9KTtcblx0XHRkZWZpbmVNZXRhKENydWNpYmxlTWV0YS5pbmplY3R0b2tlbiwgbWV0YWRhdGEsIHRhcmdldCk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldEV4aXN0aW5nTWV0YSh0YXJnZXQ6IG9iamVjdCkge1xuXHRjb25zdCBtZXRhID1cblx0XHRnZXRNZXRhPE1hcDxudW1iZXIsIEluamVjdGlvblRva2VuPj4oQ3J1Y2libGVNZXRhLmluamVjdHRva2VuLCB0YXJnZXQpID8/XG5cdFx0bmV3IE1hcDxudW1iZXIsIEluamVjdGlvblRva2VuPigpO1xuXHRyZXR1cm4gbWV0YTtcbn1cbiJdLCJuYW1lcyI6WyJpbmplY3QiLCJrZXkiLCJ0YXJnZXQiLCJfcHJvcGVydHlLZXkiLCJpZHgiLCJtZXRhZGF0YSIsImdldEV4aXN0aW5nTWV0YSIsInNldCIsImRlZmluZU1ldGEiLCJDcnVjaWJsZU1ldGEiLCJpbmplY3R0b2tlbiIsIm1ldGEiLCJnZXRNZXRhIiwiTWFwIl0sIm1hcHBpbmdzIjoiOzs7OytCQWNnQkE7OztlQUFBQTs7OzRCQWR3Qzt1QkFDM0I7QUFhdEIsU0FBU0EsT0FBT0MsR0FBb0M7SUFDMUQsT0FBTyxDQUFDQyxRQUFnQkMsY0FBMkNDO1FBQ2xFLE1BQU1DLFdBQVdDLGdCQUFnQko7UUFDakNHLFNBQVNFLEdBQUcsQ0FBQ0gsS0FBSztZQUFFSDtRQUFJO1FBQ3hCTyxJQUFBQSxzQkFBVSxFQUFDQyxtQkFBWSxDQUFDQyxXQUFXLEVBQUVMLFVBQVVIO0lBQ2hEO0FBQ0Q7QUFFQSxTQUFTSSxnQkFBZ0JKLE1BQWM7SUFDdEMsTUFBTVMsT0FDTEMsSUFBQUEsbUJBQU8sRUFBOEJILG1CQUFZLENBQUNDLFdBQVcsRUFBRVIsV0FDL0QsSUFBSVc7SUFDTCxPQUFPRjtBQUNSIn0=
@@ -16,53 +16,54 @@ class CrucibleBuilder {
16
16
  constructor(options){
17
17
  this.serviceRegistry = options?.serviceRegistry ?? new _serviceregistry.ServiceRegistry();
18
18
  }
19
+ get override() {
20
+ return this.createRegistrar(true);
21
+ }
19
22
  registerType(type, scope = _const.Scopes.transient) {
20
- const registration = this.serviceRegistry.registerType(scope, {
21
- typeOrKey: type.name,
22
- typeOrInstance: type
23
- });
24
- return registration;
23
+ return this.register(false)(scope)(type.name, type);
25
24
  }
26
25
  registerTypes(scopeOrType, ...types) {
27
- const registrations = Array.of();
28
- const isScope = typeof scopeOrType !== "function";
29
- const scope = isScope ? scopeOrType : _const.Scopes.transient;
30
- const allTypes = isScope ? types : [
31
- scopeOrType,
32
- ...types
33
- ];
34
- for (const type of allTypes){
35
- const registration = this.registerType(type, scope);
36
- registrations.push(registration);
37
- }
38
- return registrations;
26
+ return this.registerMany(false, scopeOrType, types);
39
27
  }
40
28
  registerTransient(typeOrKey, type) {
41
- const registration = this.serviceRegistry.registerType(_const.Scopes.transient, {
42
- typeOrKey,
43
- typeOrInstance: type
44
- });
45
- return registration;
29
+ return this.register(false)(_const.Scopes.transient)(typeOrKey, type);
46
30
  }
47
31
  registerSingleton(typeOrKey, typeOrInstance) {
48
- const registration = this.serviceRegistry.registerType(_const.Scopes.singleton, {
49
- typeOrKey,
50
- typeOrInstance
51
- });
52
- return registration;
32
+ return this.register(false)(_const.Scopes.singleton)(typeOrKey, typeOrInstance);
53
33
  }
54
34
  registerRequestScoped(typeOrKey, type) {
55
- const registration = this.serviceRegistry.registerType(_const.Scopes.request, {
56
- typeOrKey,
57
- typeOrInstance: type
58
- });
59
- return registration;
35
+ return this.register(false)(_const.Scopes.request)(typeOrKey, type);
60
36
  }
61
37
  build() {
62
38
  return new _crucible.Crucible({
63
39
  serviceRegistry: this.serviceRegistry
64
40
  });
65
41
  }
42
+ register = (override)=>(scope)=>(typeOrKey, typeOrInstance)=>this.serviceRegistry.registerType(scope, {
43
+ typeOrKey,
44
+ typeOrInstance,
45
+ override
46
+ });
47
+ registerMany(override, scopeOrType, types) {
48
+ const bind = this.register(override);
49
+ const isScope = typeof scopeOrType !== "function";
50
+ const scope = isScope ? scopeOrType : _const.Scopes.transient;
51
+ const allTypes = isScope ? types : [
52
+ scopeOrType,
53
+ ...types
54
+ ];
55
+ return allTypes.map((type)=>bind(scope)(type.name, type));
56
+ }
57
+ createRegistrar(override) {
58
+ const bind = this.register(override);
59
+ return {
60
+ registerType: (type, scope = _const.Scopes.transient)=>bind(scope)(type.name, type),
61
+ registerTypes: (scopeOrType, ...types)=>this.registerMany(override, scopeOrType, types),
62
+ registerTransient: (typeOrKey, type)=>bind(_const.Scopes.transient)(typeOrKey, type),
63
+ registerSingleton: (typeOrKey, typeOrInstance)=>bind(_const.Scopes.singleton)(typeOrKey, typeOrInstance),
64
+ registerRequestScoped: (typeOrKey, type)=>bind(_const.Scopes.request)(typeOrKey, type)
65
+ };
66
+ }
66
67
  }
67
68
 
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBTY29wZXMgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZVJlZ2lzdHJhdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvc2VydmljZS1yZWdpc3RyYXRpb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGFpbmVyQnVpbGRlciwgU2NvcGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXMuanNcIjtcbmltcG9ydCB7IENydWNpYmxlIH0gZnJvbSBcIi4vY3J1Y2libGUuanNcIjtcbmltcG9ydCB7IFNlcnZpY2VSZWdpc3RyeSB9IGZyb20gXCIuL3NlcnZpY2UtcmVnaXN0cnkuanNcIjtcblxudHlwZSBDb250YWluZXJCdWlsZGVyT3B0aW9ucyA9IHtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGVCdWlsZGVyIGltcGxlbWVudHMgQ29udGFpbmVyQnVpbGRlciB7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29udGFpbmVyQnVpbGRlck9wdGlvbnMpIHtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG9wdGlvbnM/LnNlcnZpY2VSZWdpc3RyeSA/PyBuZXcgU2VydmljZVJlZ2lzdHJ5KCk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJUeXBlKHR5cGU6IENvbnN0cnVjdGFibGUsIHNjb3BlOiBTY29wZSA9IFNjb3Blcy50cmFuc2llbnQpIHtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnNlcnZpY2VSZWdpc3RyeS5yZWdpc3RlclR5cGUoc2NvcGUsIHtcblx0XHRcdHR5cGVPcktleTogdHlwZS5uYW1lLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHR5cGUsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKC4uLnR5cGVzOiBDb25zdHJ1Y3RhYmxlW10pOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW107XG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKHNjb3BlOiBTY29wZSwgLi4udHlwZXM6IENvbnN0cnVjdGFibGVbXSk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXTtcblx0cHVibGljIHJlZ2lzdGVyVHlwZXMoXG5cdFx0c2NvcGVPclR5cGU6IFNjb3BlIHwgQ29uc3RydWN0YWJsZSxcblx0XHQuLi50eXBlczogQ29uc3RydWN0YWJsZVtdXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9ucyA9IEFycmF5Lm9mPFNlcnZpY2VSZWdpc3RyYXRpb24+KCk7XG5cblx0XHRjb25zdCBpc1Njb3BlID0gdHlwZW9mIHNjb3BlT3JUeXBlICE9PSBcImZ1bmN0aW9uXCI7XG5cdFx0Y29uc3Qgc2NvcGUgPSBpc1Njb3BlID8gc2NvcGVPclR5cGUgOiBTY29wZXMudHJhbnNpZW50O1xuXHRcdGNvbnN0IGFsbFR5cGVzID0gaXNTY29wZSA/IHR5cGVzIDogW3Njb3BlT3JUeXBlLCAuLi50eXBlc107XG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIGFsbFR5cGVzKSB7XG5cdFx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdGVyVHlwZSh0eXBlLCBzY29wZSk7XG5cdFx0XHRyZWdpc3RyYXRpb25zLnB1c2gocmVnaXN0cmF0aW9uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9ucztcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudChcblx0XHRrZXk6IHN0cmluZyB8IHN5bWJvbCxcblx0XHR0eXBlOiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlLFxuXHQpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJUcmFuc2llbnQodHlwZTogQ29uc3RydWN0YWJsZSk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudCh0eXBlT3JLZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUsIHR5cGU/OiBDb25zdHJ1Y3RhYmxlKSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy50cmFuc2llbnQsIHtcblx0XHRcdHR5cGVPcktleSxcblx0XHRcdHR5cGVPckluc3RhbmNlOiB0eXBlLFxuXHRcdH0pO1xuXHRcdHJldHVybiByZWdpc3RyYXRpb247XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJTaW5nbGV0b24oXG5cdFx0a2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlIHwgb2JqZWN0LFxuXHRcdGluc3RhbmNlOiBvYmplY3QsXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogQ29uc3RydWN0YWJsZSk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbih0eXBlOiBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSxcblx0XHR0eXBlT3JJbnN0YW5jZT86IENvbnN0cnVjdGFibGUgfCBvYmplY3QsXG5cdCkge1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuc2VydmljZVJlZ2lzdHJ5LnJlZ2lzdGVyVHlwZShTY29wZXMuc2luZ2xldG9uLCB7XG5cdFx0XHR0eXBlT3JLZXksXG5cdFx0XHR0eXBlT3JJbnN0YW5jZSxcblx0XHR9KTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPih0eXBlOiAoKSA9PiBUKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogKCkgPT4gVCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclJlcXVlc3RTY29wZWQoa2V5OiBzdHJpbmcgfCBzeW1ib2wsIHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0XHR0eXBlPzogQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0KSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy5yZXF1ZXN0LCB7XG5cdFx0XHR0eXBlT3JLZXksXG5cdFx0XHR0eXBlT3JJbnN0YW5jZTogdHlwZSxcblx0XHR9KTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIGJ1aWxkKCk6IENydWNpYmxlIHtcblx0XHRyZXR1cm4gbmV3IENydWNpYmxlKHsgc2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkNydWNpYmxlQnVpbGRlciIsInNlcnZpY2VSZWdpc3RyeSIsIm9wdGlvbnMiLCJTZXJ2aWNlUmVnaXN0cnkiLCJyZWdpc3RlclR5cGUiLCJ0eXBlIiwic2NvcGUiLCJTY29wZXMiLCJ0cmFuc2llbnQiLCJyZWdpc3RyYXRpb24iLCJ0eXBlT3JLZXkiLCJuYW1lIiwidHlwZU9ySW5zdGFuY2UiLCJyZWdpc3RlclR5cGVzIiwic2NvcGVPclR5cGUiLCJ0eXBlcyIsInJlZ2lzdHJhdGlvbnMiLCJBcnJheSIsIm9mIiwiaXNTY29wZSIsImFsbFR5cGVzIiwicHVzaCIsInJlZ2lzdGVyVHJhbnNpZW50IiwicmVnaXN0ZXJTaW5nbGV0b24iLCJzaW5nbGV0b24iLCJyZWdpc3RlclJlcXVlc3RTY29wZWQiLCJyZXF1ZXN0IiwiYnVpbGQiLCJDcnVjaWJsZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFXYUE7OztlQUFBQTs7O3VCQVZVOzBCQUdFO2lDQUNPO0FBTXpCLE1BQU1BO0lBQ0pDLGdCQUFpQztJQUN6QyxZQUFtQkMsT0FBaUMsQ0FBRTtRQUNyRCxJQUFJLENBQUNELGVBQWUsR0FBR0MsU0FBU0QsbUJBQW1CLElBQUlFLGdDQUFlO0lBQ3ZFO0lBRU9DLGFBQWFDLElBQW1CLEVBQUVDLFFBQWVDLGFBQU0sQ0FBQ0MsU0FBUyxFQUFFO1FBQ3pFLE1BQU1DLGVBQWUsSUFBSSxDQUFDUixlQUFlLENBQUNHLFlBQVksQ0FBQ0UsT0FBTztZQUM3REksV0FBV0wsS0FBS00sSUFBSTtZQUNwQkMsZ0JBQWdCUDtRQUNqQjtRQUNBLE9BQU9JO0lBQ1I7SUFJT0ksY0FDTkMsV0FBa0MsRUFDbEMsR0FBR0MsS0FBc0IsRUFDRDtRQUN4QixNQUFNQyxnQkFBZ0JDLE1BQU1DLEVBQUU7UUFFOUIsTUFBTUMsVUFBVSxPQUFPTCxnQkFBZ0I7UUFDdkMsTUFBTVIsUUFBUWEsVUFBVUwsY0FBY1AsYUFBTSxDQUFDQyxTQUFTO1FBQ3RELE1BQU1ZLFdBQVdELFVBQVVKLFFBQVE7WUFBQ0Q7ZUFBZ0JDO1NBQU07UUFDMUQsS0FBSyxNQUFNVixRQUFRZSxTQUFVO1lBQzVCLE1BQU1YLGVBQWUsSUFBSSxDQUFDTCxZQUFZLENBQUNDLE1BQU1DO1lBQzdDVSxjQUFjSyxJQUFJLENBQUNaO1FBQ3BCO1FBRUEsT0FBT087SUFDUjtJQU9PTSxrQkFBa0JaLFNBQTBDLEVBQUVMLElBQW9CLEVBQUU7UUFDMUYsTUFBTUksZUFBZSxJQUFJLENBQUNSLGVBQWUsQ0FBQ0csWUFBWSxDQUFDRyxhQUFNLENBQUNDLFNBQVMsRUFBRTtZQUN4RUU7WUFDQUUsZ0JBQWdCUDtRQUNqQjtRQUNBLE9BQU9JO0lBQ1I7SUFRT2Msa0JBQ05iLFNBQTBDLEVBQzFDRSxjQUF1QyxFQUN0QztRQUNELE1BQU1ILGVBQWUsSUFBSSxDQUFDUixlQUFlLENBQUNHLFlBQVksQ0FBQ0csYUFBTSxDQUFDaUIsU0FBUyxFQUFFO1lBQ3hFZDtZQUNBRTtRQUNEO1FBQ0EsT0FBT0g7SUFDUjtJQU1PZ0Isc0JBQ05mLFNBQXlELEVBQ3pETCxJQUFtQyxFQUNsQztRQUNELE1BQU1JLGVBQWUsSUFBSSxDQUFDUixlQUFlLENBQUNHLFlBQVksQ0FBQ0csYUFBTSxDQUFDbUIsT0FBTyxFQUFFO1lBQ3RFaEI7WUFDQUUsZ0JBQWdCUDtRQUNqQjtRQUNBLE9BQU9JO0lBQ1I7SUFFT2tCLFFBQWtCO1FBQ3hCLE9BQU8sSUFBSUMsa0JBQVEsQ0FBQztZQUFFM0IsaUJBQWlCLElBQUksQ0FBQ0EsZUFBZTtRQUFDO0lBQzdEO0FBQ0QifQ==
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBTY29wZXMgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZVJlZ2lzdHJhdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvc2VydmljZS1yZWdpc3RyYXRpb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGFpbmVyQnVpbGRlciwgQ29udGFpbmVyUmVnaXN0cmFyLCBTY29wZSB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgQ3J1Y2libGUgfSBmcm9tIFwiLi9jcnVjaWJsZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlclR5cGVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENvbnRhaW5lckJ1aWxkZXJPcHRpb25zID0ge1xuXHRzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeTtcbn07XG5cbnR5cGUgUmVnaXN0ZXJGbiA9IChcblx0dHlwZU9yS2V5OiBSZWdpc3RlclR5cGVPcHRpb25zW1widHlwZU9yS2V5XCJdLFxuXHR0eXBlT3JJbnN0YW5jZT86IFJlZ2lzdGVyVHlwZU9wdGlvbnNbXCJ0eXBlT3JJbnN0YW5jZVwiXSxcbikgPT4gU2VydmljZVJlZ2lzdHJhdGlvbjtcblxuZXhwb3J0IGNsYXNzIENydWNpYmxlQnVpbGRlciBpbXBsZW1lbnRzIENvbnRhaW5lckJ1aWxkZXIge1xuXHRwcml2YXRlIHNlcnZpY2VSZWdpc3RyeTogU2VydmljZVJlZ2lzdHJ5O1xuXHRwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9ucz86IENvbnRhaW5lckJ1aWxkZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkgPSBvcHRpb25zPy5zZXJ2aWNlUmVnaXN0cnkgPz8gbmV3IFNlcnZpY2VSZWdpc3RyeSgpO1xuXHR9XG5cblx0cHVibGljIGdldCBvdmVycmlkZSgpOiBDb250YWluZXJSZWdpc3RyYXIge1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZVJlZ2lzdHJhcih0cnVlKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGUodHlwZTogQ29uc3RydWN0YWJsZSwgc2NvcGU6IFNjb3BlID0gU2NvcGVzLnRyYW5zaWVudCkge1xuXHRcdHJldHVybiB0aGlzLnJlZ2lzdGVyKGZhbHNlKShzY29wZSkodHlwZS5uYW1lLCB0eXBlKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKC4uLnR5cGVzOiBDb25zdHJ1Y3RhYmxlW10pOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW107XG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKHNjb3BlOiBTY29wZSwgLi4udHlwZXM6IENvbnN0cnVjdGFibGVbXSk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXTtcblx0cHVibGljIHJlZ2lzdGVyVHlwZXMoXG5cdFx0c2NvcGVPclR5cGU6IFNjb3BlIHwgQ29uc3RydWN0YWJsZSxcblx0XHQuLi50eXBlczogQ29uc3RydWN0YWJsZVtdXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXSB7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0ZXJNYW55KGZhbHNlLCBzY29wZU9yVHlwZSwgdHlwZXMpO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyVHJhbnNpZW50KFxuXHRcdGtleTogc3RyaW5nIHwgc3ltYm9sLFxuXHRcdHR5cGU6IENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGUsXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudCh0eXBlOiBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyVHJhbnNpZW50KHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSwgdHlwZT86IENvbnN0cnVjdGFibGUpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWdpc3RlcihmYWxzZSkoU2NvcGVzLnRyYW5zaWVudCkodHlwZU9yS2V5LCB0eXBlKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbihcblx0XHRrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUgfCBvYmplY3QsXG5cdFx0aW5zdGFuY2U6IG9iamVjdCxcblx0KTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKGtleTogc3RyaW5nIHwgc3ltYm9sLCB0eXBlOiBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJTaW5nbGV0b24oXG5cdFx0dHlwZU9yS2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlLFxuXHRcdHR5cGVPckluc3RhbmNlPzogQ29uc3RydWN0YWJsZSB8IG9iamVjdCxcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0ZXIoZmFsc2UpKFNjb3Blcy5zaW5nbGV0b24pKHR5cGVPcktleSwgdHlwZU9ySW5zdGFuY2UpO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPih0eXBlOiAoKSA9PiBUKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogKCkgPT4gVCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclJlcXVlc3RTY29wZWQoa2V5OiBzdHJpbmcgfCBzeW1ib2wsIHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0XHR0eXBlPzogQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0ZXIoZmFsc2UpKFNjb3Blcy5yZXF1ZXN0KSh0eXBlT3JLZXksIHR5cGUpO1xuXHR9XG5cblx0cHVibGljIGJ1aWxkKCk6IENydWNpYmxlIHtcblx0XHRyZXR1cm4gbmV3IENydWNpYmxlKHsgc2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSB9KTtcblx0fVxuXG5cdHByaXZhdGUgcmVnaXN0ZXIgPVxuXHRcdChvdmVycmlkZTogYm9vbGVhbikgPT5cblx0XHQoc2NvcGU6IFNjb3BlKTogUmVnaXN0ZXJGbiA9PlxuXHRcdCh0eXBlT3JLZXksIHR5cGVPckluc3RhbmNlKSA9PlxuXHRcdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKHNjb3BlLCB7XG5cdFx0XHRcdHR5cGVPcktleSxcblx0XHRcdFx0dHlwZU9ySW5zdGFuY2UsXG5cdFx0XHRcdG92ZXJyaWRlLFxuXHRcdFx0fSk7XG5cblx0cHJpdmF0ZSByZWdpc3Rlck1hbnkoXG5cdFx0b3ZlcnJpZGU6IGJvb2xlYW4sXG5cdFx0c2NvcGVPclR5cGU6IFNjb3BlIHwgQ29uc3RydWN0YWJsZSxcblx0XHR0eXBlczogQ29uc3RydWN0YWJsZVtdLFxuXHQpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW10ge1xuXHRcdGNvbnN0IGJpbmQgPSB0aGlzLnJlZ2lzdGVyKG92ZXJyaWRlKTtcblx0XHRjb25zdCBpc1Njb3BlID0gdHlwZW9mIHNjb3BlT3JUeXBlICE9PSBcImZ1bmN0aW9uXCI7XG5cdFx0Y29uc3Qgc2NvcGUgPSBpc1Njb3BlID8gc2NvcGVPclR5cGUgOiBTY29wZXMudHJhbnNpZW50O1xuXHRcdGNvbnN0IGFsbFR5cGVzID0gaXNTY29wZSA/IHR5cGVzIDogW3Njb3BlT3JUeXBlLCAuLi50eXBlc107XG5cdFx0cmV0dXJuIGFsbFR5cGVzLm1hcCgodHlwZSkgPT4gYmluZChzY29wZSkodHlwZS5uYW1lLCB0eXBlKSk7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVJlZ2lzdHJhcihvdmVycmlkZTogYm9vbGVhbik6IENvbnRhaW5lclJlZ2lzdHJhciB7XG5cdFx0Y29uc3QgYmluZCA9IHRoaXMucmVnaXN0ZXIob3ZlcnJpZGUpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZWdpc3RlclR5cGU6ICh0eXBlLCBzY29wZSA9IFNjb3Blcy50cmFuc2llbnQpID0+IGJpbmQoc2NvcGUpKHR5cGUubmFtZSwgdHlwZSksXG5cdFx0XHRyZWdpc3RlclR5cGVzOiAoKHNjb3BlT3JUeXBlLCAuLi50eXBlcykgPT5cblx0XHRcdFx0dGhpcy5yZWdpc3Rlck1hbnkoXG5cdFx0XHRcdFx0b3ZlcnJpZGUsXG5cdFx0XHRcdFx0c2NvcGVPclR5cGUsXG5cdFx0XHRcdFx0dHlwZXMsXG5cdFx0XHRcdCkpIGFzIENvbnRhaW5lclJlZ2lzdHJhcltcInJlZ2lzdGVyVHlwZXNcIl0sXG5cdFx0XHRyZWdpc3RlclRyYW5zaWVudDogKCh0eXBlT3JLZXksIHR5cGU/KSA9PlxuXHRcdFx0XHRiaW5kKFNjb3Blcy50cmFuc2llbnQpKHR5cGVPcktleSwgdHlwZSkpIGFzIENvbnRhaW5lclJlZ2lzdHJhcltcInJlZ2lzdGVyVHJhbnNpZW50XCJdLFxuXHRcdFx0cmVnaXN0ZXJTaW5nbGV0b246ICgodHlwZU9yS2V5LCB0eXBlT3JJbnN0YW5jZT8pID0+XG5cdFx0XHRcdGJpbmQoU2NvcGVzLnNpbmdsZXRvbikoXG5cdFx0XHRcdFx0dHlwZU9yS2V5LFxuXHRcdFx0XHRcdHR5cGVPckluc3RhbmNlLFxuXHRcdFx0XHQpKSBhcyBDb250YWluZXJSZWdpc3RyYXJbXCJyZWdpc3RlclNpbmdsZXRvblwiXSxcblx0XHRcdHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDogKCh0eXBlT3JLZXksIHR5cGU/KSA9PlxuXHRcdFx0XHRiaW5kKFNjb3Blcy5yZXF1ZXN0KSh0eXBlT3JLZXksIHR5cGUpKSBhcyBDb250YWluZXJSZWdpc3RyYXJbXCJyZWdpc3RlclJlcXVlc3RTY29wZWRcIl0sXG5cdFx0fTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkNydWNpYmxlQnVpbGRlciIsInNlcnZpY2VSZWdpc3RyeSIsIm9wdGlvbnMiLCJTZXJ2aWNlUmVnaXN0cnkiLCJvdmVycmlkZSIsImNyZWF0ZVJlZ2lzdHJhciIsInJlZ2lzdGVyVHlwZSIsInR5cGUiLCJzY29wZSIsIlNjb3BlcyIsInRyYW5zaWVudCIsInJlZ2lzdGVyIiwibmFtZSIsInJlZ2lzdGVyVHlwZXMiLCJzY29wZU9yVHlwZSIsInR5cGVzIiwicmVnaXN0ZXJNYW55IiwicmVnaXN0ZXJUcmFuc2llbnQiLCJ0eXBlT3JLZXkiLCJyZWdpc3RlclNpbmdsZXRvbiIsInR5cGVPckluc3RhbmNlIiwic2luZ2xldG9uIiwicmVnaXN0ZXJSZXF1ZXN0U2NvcGVkIiwicmVxdWVzdCIsImJ1aWxkIiwiQ3J1Y2libGUiLCJiaW5kIiwiaXNTY29wZSIsImFsbFR5cGVzIiwibWFwIl0sIm1hcHBpbmdzIjoiOzs7OytCQWlCYUE7OztlQUFBQTs7O3VCQWhCVTswQkFHRTtpQ0FFTztBQVd6QixNQUFNQTtJQUNKQyxnQkFBaUM7SUFDekMsWUFBbUJDLE9BQWlDLENBQUU7UUFDckQsSUFBSSxDQUFDRCxlQUFlLEdBQUdDLFNBQVNELG1CQUFtQixJQUFJRSxnQ0FBZTtJ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
@@ -18,6 +18,7 @@ class Crucible {
18
18
  key;
19
19
  instances = new Map();
20
20
  serviceRegistry;
21
+ parent;
21
22
  rootScope;
22
23
  scopes = new Map();
23
24
  logger = _scribe.scribe.logger(Crucible.name);
@@ -26,7 +27,8 @@ class Crucible {
26
27
  this.key = options?.key;
27
28
  this.serviceRegistry = new _serviceregistry.ServiceRegistry(options?.serviceRegistry);
28
29
  this.registerLifetimeScope();
29
- this.rootScope = options?.rootScope ?? this;
30
+ this.parent = options?.parent;
31
+ this.rootScope = options?.parent?.rootScope ?? this;
30
32
  }
31
33
  resolveMany(resolveRequest) {
32
34
  const key = new _registrationkeymodel.RegistrationKey(resolveRequest);
@@ -52,28 +54,41 @@ class Crucible {
52
54
  return service;
53
55
  }
54
56
  beginScope(name) {
55
- if (this.scopes.has(name)) {
57
+ if (this.isDisposed) {
58
+ throw new Error("This container has been disposed");
59
+ }
60
+ if (name != null && this.scopes.has(name)) {
56
61
  throw new _errors.DuplicateScopeError(`Cannot create duplicate scope. Scope with ${name} is already created and has not been disposed.`);
57
62
  }
58
63
  const scope = new Crucible({
59
64
  key: name,
60
65
  serviceRegistry: this.serviceRegistry,
61
- rootScope: this
66
+ parent: this
62
67
  });
63
- this.scopes.set(name, scope);
68
+ if (name != null) {
69
+ this.scopes.set(name, scope);
70
+ }
64
71
  return scope;
65
72
  }
66
73
  [Symbol.dispose]() {
67
74
  if (this.isDisposed) {
68
75
  return;
69
76
  }
70
- this.dispose();
77
+ this.disposeSync();
71
78
  }
72
- dispose() {
79
+ async [Symbol.asyncDispose]() {
80
+ if (this.isDisposed) {
81
+ return;
82
+ }
83
+ await this.disposeAsync();
84
+ }
85
+ disposeSync() {
73
86
  if (this.isDisposed) {
74
87
  return;
75
88
  }
76
89
  this.isDisposed = true;
90
+ this.parent?.releaseScope(this.key);
91
+ this.scopes.clear();
77
92
  for (const [, inst] of this.instances){
78
93
  if (inst === this) {
79
94
  continue;
@@ -81,6 +96,24 @@ class Crucible {
81
96
  inst[Symbol.dispose]?.();
82
97
  }
83
98
  }
99
+ async disposeAsync() {
100
+ if (this.isDisposed) {
101
+ return;
102
+ }
103
+ this.isDisposed = true;
104
+ this.parent?.releaseScope(this.key);
105
+ this.scopes.clear();
106
+ for (const [, inst] of this.instances){
107
+ if (inst === this) {
108
+ continue;
109
+ }
110
+ if (Symbol.asyncDispose in inst) {
111
+ await inst[Symbol.asyncDispose]();
112
+ } else {
113
+ inst[Symbol.dispose]?.();
114
+ }
115
+ }
116
+ }
84
117
  getRegistrationFrom(key) {
85
118
  const registration = this.serviceRegistry.getRegistration(key.value);
86
119
  return registration;
@@ -98,7 +131,7 @@ class Crucible {
98
131
  }
99
132
  getOrCreateInstance(registration) {
100
133
  if (this.isDisposed) {
101
- throw new Error("This continer has been disposed");
134
+ throw new Error("This container has been disposed");
102
135
  }
103
136
  const { key, type, isInstance } = registration;
104
137
  const cacheKey = isInstance ? key.value : type;
@@ -132,12 +165,18 @@ class Crucible {
132
165
  }
133
166
  return resolved;
134
167
  }
168
+ releaseScope(name) {
169
+ if (name == null) {
170
+ return;
171
+ }
172
+ this.scopes.delete(name);
173
+ }
135
174
  registerLifetimeScope() {
136
- this.serviceRegistry.registerType(_const.Scopes.request, {
175
+ this.serviceRegistry.replaceType(_const.Scopes.request, {
137
176
  typeOrKey: _const.LifetimeScopeToken,
138
177
  typeOrInstance: this
139
178
  });
140
179
  }
141
180
  }
142
181
 
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHR0eXBlIENvbnN0cnVjdGFibGUsXG5cdHR5cGUgRnVuY3Rpb25UeXBlLFxuXHRnZXRNZXRhLFxuXHRpc0FycmF5VHlwZSxcblx0aXNDb25zdHJ1Y3RhYmxlLFxuXHRSZWZsZWN0aW9uTWV0YSxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhLCBMaWZldGltZVNjb3BlVG9rZW4sIFNjb3BlcyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25NZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbktleSB9IGZyb20gXCIuLi9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVnaXN0cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZXJ2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRHVwbGljYXRlU2NvcGVFcnJvciwgUmVzb2x2ZUVycm9yIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGFpbmVyLCBMaWZldGltZVNjb3BlLCBSZXNvbHZlUmVxdWVzdCB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENydWNpYmxlT3B0aW9ucyA9IHtcblx0a2V5Pzogc3RyaW5nO1xuXHRyb290U2NvcGU/OiBDcnVjaWJsZTtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGUgaW1wbGVtZW50cyBJQ29udGFpbmVyIHtcblx0cHVibGljIGtleTogc3RyaW5nO1xuXHRwcm90ZWN0ZWQgaW5zdGFuY2VzID0gbmV3IE1hcDx1bmtub3duLCBvYmplY3Q+KCk7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHByaXZhdGUgcm9vdFNjb3BlOiBDcnVjaWJsZTtcblx0cHJpdmF0ZSBzY29wZXMgPSBuZXcgTWFwPHN0cmluZywgTGlmZXRpbWVTY29wZT4oKTtcblx0cHJpdmF0ZSBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKENydWNpYmxlLm5hbWUpO1xuXHRwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDcnVjaWJsZU9wdGlvbnMpIHtcblx0XHR0aGlzLmtleSA9IG9wdGlvbnM/LmtleTtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG5ldyBTZXJ2aWNlUmVnaXN0cnkob3B0aW9ucz8uc2VydmljZVJlZ2lzdHJ5KTtcblx0XHR0aGlzLnJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpO1xuXHRcdHRoaXMucm9vdFNjb3BlID0gb3B0aW9ucz8ucm9vdFNjb3BlID8/IHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZU1hbnk8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ocmVzb2x2ZVJlcXVlc3Q6IFJlc29sdmVSZXF1ZXN0PFQ+KTogVFtdIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb25zID0gdGhpcy5nZXRSZWdpc3RyYXRpb25Gcm9tKGtleSkgPz8gW107XG5cblx0XHRjb25zdCBzZXJ2aWNlcyA9IEFycmF5Lm9mPFQ+KCk7XG5cdFx0Zm9yIChjb25zdCByZWdpc3RyYXRpb24gb2YgcmVnaXN0cmF0aW9ucykge1xuXHRcdFx0Y29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVJlZ2lzdHJhdGlvbjxUPihyZWdpc3RyYXRpb24pO1xuXHRcdFx0c2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlcnZpY2VzO1xuXHR9XG5cblx0cHVibGljIHJlc29sdmU8VCBleHRlbmRzIG9iamVjdCB8IG9iamVjdFtdPihyZXNvbHZlUmVxdWVzdDogUmVzb2x2ZVJlcXVlc3Q8VD4pOiBUIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmdldFJlZ2lzdHJhdGlvbkZyb20oa2V5KTtcblx0XHRpZiAocmVnaXN0cmF0aW9uID09IG51bGwpIHtcblx0XHRcdHRoaXMubG9nZ2VyLndhcm4oYENhbm5vdCByZXNvbHZlIGRlcGVuZGVuY3kgJHtrZXkudG9TdHJpbmcoKX1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChyZWdpc3RyYXRpb24ubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhyb3cgbmV3IFJlc29sdmVFcnJvcihcblx0XHRcdFx0YFRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyByZWdpc3RlcmVkIHdpdGgga2V5ICR7a2V5LnRvU3RyaW5nKCl9LiBVc2UgcmVzb2x2ZU1hbnkgdG8gcmVzb2x2ZSBhbGwgaW1wbGVtZW50YXRpb25zLmAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlcnZpY2UgPSB0aGlzLnJlc29sdmVSZWdpc3RyYXRpb248VD4ocmVnaXN0cmF0aW9uWzBdKTtcblx0XHRyZXR1cm4gc2VydmljZTtcblx0fVxuXG5cdHB1YmxpYyBiZWdpblNjb3BlKG5hbWU/OiBzdHJpbmcpIHtcblx0XHRpZiAodGhpcy5zY29wZXMuaGFzKG5hbWUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRHVwbGljYXRlU2NvcGVFcnJvcihcblx0XHRcdFx0YENhbm5vdCBjcmVhdGUgZHVwbGljYXRlIHNjb3BlLiBTY29wZSB3aXRoICR7bmFtZX0gaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBoYXMgbm90IGJlZW4gZGlzcG9zZWQuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2NvcGUgPSBuZXcgQ3J1Y2libGUoe1xuXHRcdFx0a2V5OiBuYW1lLFxuXHRcdFx0c2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSxcblx0XHRcdHJvb3RTY29wZTogdGhpcyxcblx0XHR9KTtcblxuXHRcdHRoaXMuc2NvcGVzLnNldChuYW1lLCBzY29wZSk7XG5cdFx0cmV0dXJuIHNjb3BlO1xuXHR9XG5cblx0cHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0XHRmb3IgKGNvbnN0IFssIGluc3RdIG9mIHRoaXMuaW5zdGFuY2VzKSB7XG5cdFx0XHRpZiAoaW5zdCA9PT0gdGhpcykge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGluc3RbU3ltYm9sLmRpc3Bvc2VdPy4oKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldFJlZ2lzdHJhdGlvbkZyb20oa2V5OiBSZWdpc3RyYXRpb25LZXkpIHtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnNlcnZpY2VSZWdpc3RyeS5nZXRSZWdpc3RyYXRpb24oa2V5LnZhbHVlKTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUmVnaXN0cmF0aW9uPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGNvbnN0IHsgc2NvcGUgfSA9IHJlZ2lzdHJhdGlvbjtcblx0XHRzd2l0Y2ggKHNjb3BlKSB7XG5cdFx0XHRjYXNlIFNjb3Blcy50cmFuc2llbnQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRjYXNlIFNjb3Blcy5zaW5nbGV0b246XG5cdFx0XHRcdHJldHVybiB0aGlzLnJvb3RTY29wZS5nZXRPckNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRjYXNlIFNjb3Blcy5yZXF1ZXN0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRPckNyZWF0ZUluc3RhbmNlPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udGluZXIgaGFzIGJlZW4gZGlzcG9zZWRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHsga2V5LCB0eXBlLCBpc0luc3RhbmNlIH0gPSByZWdpc3RyYXRpb247XG5cdFx0Y29uc3QgY2FjaGVLZXkgPSBpc0luc3RhbmNlID8ga2V5LnZhbHVlIDogdHlwZTtcblx0XHRjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGNhY2hlS2V5KTtcblx0XHRpZiAoZXhpc3RpbmdJbnN0YW5jZSAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZXhpc3RpbmdJbnN0YW5jZSBhcyBUO1xuXHRcdH1cblxuXHRcdGNvbnN0IGluc3RhbmNlID0gaXNJbnN0YW5jZSA/ICh0eXBlIGFzIFQpIDogdGhpcy5jcmVhdGVJbnN0YW5jZTxUPihyZWdpc3RyYXRpb24pO1xuXHRcdHRoaXMuaW5zdGFuY2VzLnNldChjYWNoZUtleSwgaW5zdGFuY2UpO1xuXHRcdHJldHVybiBpbnN0YW5jZTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlSW5zdGFuY2U8VCBleHRlbmRzIG9iamVjdD4ocmVnaXN0cmF0aW9uOiBTZXJ2aWNlUmVnaXN0cmF0aW9uKTogVCB7XG5cdFx0Y29uc3QgdHlwZSA9IHJlZ2lzdHJhdGlvbi50eXBlIGFzIENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGU7XG5cdFx0Y29uc3QgY2FuQ29uc3RydWN0ID0gaXNDb25zdHJ1Y3RhYmxlKHR5cGUpO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLnJlc29sdmVEZXBlbmRlbmNpZXModHlwZSk7XG5cdFx0Y29uc3QgaW5zdCA9IChjYW5Db25zdHJ1Y3QgPyBuZXcgdHlwZSguLi5kZXBzKSA6IHR5cGUoKSkgYXMgVDtcblx0XHRyZXR1cm4gaW5zdDtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZURlcGVuZGVuY2llcyh0eXBlOiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlKTogdW5rbm93bltdIHtcblx0XHRjb25zdCBwYXJhbXMgPSBnZXRNZXRhPEFycmF5PENvbnN0cnVjdGFibGU+PihSZWZsZWN0aW9uTWV0YS5wYXJhbXR5cGVzLCB0eXBlKSA/PyBbXTtcblxuXHRcdGNvbnN0IGluamVjdFRva2VucyA9XG5cdFx0XHRnZXRNZXRhPEluamVjdGlvbk1ldGFkYXRhPihDcnVjaWJsZU1ldGEuaW5qZWN0dG9rZW4sIHR5cGUpID8/IG5ldyBNYXAoKTtcblxuXHRcdC8vVE9ETzogcHV0IGEgdHJ5IGNhdGNoIGhlcmUgc28gd2UgY2FuIHRocm93IHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG5cdFx0bGV0IHJlc29sdmVkID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHRva2VuID0gaW5qZWN0VG9rZW5zLmdldChpKT8ua2V5ID8/IHBhcmFtc1tpXS5uYW1lO1xuXHRcdFx0Y29uc3QgZGVwID0gaXNBcnJheVR5cGUocGFyYW1zW2ldKSA/IHRoaXMucmVzb2x2ZU1hbnkodG9rZW4pIDogdGhpcy5yZXNvbHZlKHRva2VuKTtcblx0XHRcdHJlc29sdmVkID0gWy4uLnJlc29sdmVkLCBkZXBdO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpIHtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeS5yZWdpc3RlclR5cGUoU2NvcGVzLnJlcXVlc3QsIHtcblx0XHRcdHR5cGVPcktleTogTGlmZXRpbWVTY29wZVRva2VuLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHRoaXMsXG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDcnVjaWJsZSIsImtleSIsImluc3RhbmNlcyIsIk1hcCIsInNlcnZpY2VSZWdpc3RyeSIsInJvb3RTY29wZSIsInNjb3BlcyIsImxvZ2dlciIsInNjcmliZSIsIm5hbWUiLCJpc0Rpc3Bvc2VkIiwib3B0aW9ucyIsIlNlcnZpY2VSZWdpc3RyeSIsInJlZ2lzdGVyTGlmZXRpbWVTY29wZSIsInJlc29sdmVNYW55IiwicmVzb2x2ZVJlcXVlc3QiLCJSZWdpc3RyYXRpb25LZXkiLCJyZWdpc3RyYXRpb25zIiwiZ2V0UmVnaXN0cmF0aW9uRnJvbSIsInNlcnZpY2VzIiwiQXJyYXkiLCJvZiIsInJlZ2lzdHJhdGlvbiIsInNlcnZpY2UiLCJyZXNvbHZlUmVnaXN0cmF0aW9uIiwicHVzaCIsInJlc29sdmUiLCJ3YXJuIiwidG9TdHJpbmciLCJsZW5ndGgiLCJSZXNvbHZlRXJyb3IiLCJiZWdpblNjb3BlIiwiaGFzIiwiRHVwbGljYXRlU2NvcGVFcnJvciIsInNjb3BlIiwic2V0IiwiU3ltYm9sIiwiZGlzcG9zZSIsImluc3QiLCJnZXRSZWdpc3RyYXRpb24iLCJ2YWx1ZSIsIlNjb3BlcyIsInRyYW5zaWVudCIsImNyZWF0ZUluc3RhbmNlIiwic2luZ2xldG9uIiwiZ2V0T3JDcmVhdGVJbnN0YW5jZSIsInJlcXVlc3QiLCJFcnJvciIsInR5cGUiLCJpc0luc3RhbmNlIiwiY2FjaGVLZXkiLCJleGlzdGluZ0luc3RhbmNlIiwiZ2V0IiwiaW5zdGFuY2UiLCJjYW5Db25zdHJ1Y3QiLCJpc0NvbnN0cnVjdGFibGUiLCJkZXBzIiwicmVzb2x2ZURlcGVuZGVuY2llcyIsInBhcmFtcyIsImdldE1ldGEiLCJSZWZsZWN0aW9uTWV0YSIsInBhcmFtdHlwZXMiLCJpbmplY3RUb2tlbnMiLCJDcnVjaWJsZU1ldGEiLCJpbmplY3R0b2tlbiIsInJlc29sdmVkIiwiaSIsInRva2VuIiwiZGVwIiwiaXNBcnJheVR5cGUiLCJyZWdpc3RlclR5cGUiLCJ0eXBlT3JLZXkiLCJMaWZldGltZVNjb3BlVG9rZW4iLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF1QmFBOzs7ZUFBQUE7Ozs0QkFoQk47d0JBQ2dCO3VCQUNrQztzQ0FFekI7d0JBRWtCO2lDQUVsQjtBQVF6QixNQUFNQTtJQUNMQyxJQUFZO0lBQ1RDLFlBQVksSUFBSUMsTUFBdUI7SUFDekNDLGdCQUFpQztJQUNqQ0MsVUFBb0I7SUFDcEJDLFNBQVMsSUFBSUgsTUFBNkI7SUFDMUNJLFNBQVNDLGNBQU0sQ0FBQ0QsTUFBTSxDQUFDUCxTQUFTUyxJQUFJLEVBQUU7SUFDdENDLGFBQWEsTUFBTTtJQUMzQixZQUFtQkMsT0FBeUIsQ0FBRTtRQUM3QyxJQUFJLENBQUNWLEdBQUcsR0FBR1UsU0FBU1Y7UUFDcEIsSUFBSSxDQUFDRyxlQUFlLEdBQUcsSUFBSVEsZ0NBQWUsQ0FBQ0QsU0FBU1A7UUFDcEQsSUFBSSxDQUFDUyxxQkFBcUI7UUFDMUIsSUFBSSxDQUFDUixTQUFTLEdBQUdNLFNBQVNOLGFBQWEsSUFBSTtJQUM1QztJQUVPUyxZQUF1Q0MsY0FBaUMsRUFBTztRQUNyRixNQUFNZCxNQUFNLElBQUllLHFDQUFlLENBQUNEO1FBQ2hDLE1B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
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHR0eXBlIENvbnN0cnVjdGFibGUsXG5cdHR5cGUgRnVuY3Rpb25UeXBlLFxuXHRnZXRNZXRhLFxuXHRpc0FycmF5VHlwZSxcblx0aXNDb25zdHJ1Y3RhYmxlLFxuXHRSZWZsZWN0aW9uTWV0YSxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhLCBMaWZldGltZVNjb3BlVG9rZW4sIFNjb3BlcyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25NZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbktleSB9IGZyb20gXCIuLi9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVnaXN0cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZXJ2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRHVwbGljYXRlU2NvcGVFcnJvciwgUmVzb2x2ZUVycm9yIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGFpbmVyLCBMaWZldGltZVNjb3BlLCBSZXNvbHZlUmVxdWVzdCB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENydWNpYmxlT3B0aW9ucyA9IHtcblx0a2V5Pzogc3RyaW5nO1xuXHRwYXJlbnQ/OiBDcnVjaWJsZTtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGUgaW1wbGVtZW50cyBJQ29udGFpbmVyIHtcblx0cHVibGljIGtleTogc3RyaW5nO1xuXHRwcm90ZWN0ZWQgaW5zdGFuY2VzID0gbmV3IE1hcDx1bmtub3duLCBvYmplY3Q+KCk7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHByaXZhdGUgcGFyZW50PzogQ3J1Y2libGU7XG5cdHByaXZhdGUgcm9vdFNjb3BlOiBDcnVjaWJsZTtcblx0cHJpdmF0ZSBzY29wZXMgPSBuZXcgTWFwPHN0cmluZywgTGlmZXRpbWVTY29wZT4oKTtcblx0cHJpdmF0ZSBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKENydWNpYmxlLm5hbWUpO1xuXHRwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDcnVjaWJsZU9wdGlvbnMpIHtcblx0XHR0aGlzLmtleSA9IG9wdGlvbnM/LmtleTtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG5ldyBTZXJ2aWNlUmVnaXN0cnkob3B0aW9ucz8uc2VydmljZVJlZ2lzdHJ5KTtcblx0XHR0aGlzLnJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpO1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucz8ucGFyZW50O1xuXHRcdHRoaXMucm9vdFNjb3BlID0gb3B0aW9ucz8ucGFyZW50Py5yb290U2NvcGUgPz8gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlTWFueTxUIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PihyZXNvbHZlUmVxdWVzdDogUmVzb2x2ZVJlcXVlc3Q8VD4pOiBUW10ge1xuXHRcdGNvbnN0IGtleSA9IG5ldyBSZWdpc3RyYXRpb25LZXkocmVzb2x2ZVJlcXVlc3QpO1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbnMgPSB0aGlzLmdldFJlZ2lzdHJhdGlvbkZyb20oa2V5KSA/PyBbXTtcblxuXHRcdGNvbnN0IHNlcnZpY2VzID0gQXJyYXkub2Y8VD4oKTtcblx0XHRmb3IgKGNvbnN0IHJlZ2lzdHJhdGlvbiBvZiByZWdpc3RyYXRpb25zKSB7XG5cdFx0XHRjb25zdCBzZXJ2aWNlID0gdGhpcy5yZXNvbHZlUmVnaXN0cmF0aW9uPFQ+KHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRzZXJ2aWNlcy5wdXNoKHNlcnZpY2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VydmljZXM7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZTxUIGV4dGVuZHMgb2JqZWN0IHwgb2JqZWN0W10+KHJlc29sdmVSZXF1ZXN0OiBSZXNvbHZlUmVxdWVzdDxUPik6IFQge1xuXHRcdGNvbnN0IGtleSA9IG5ldyBSZWdpc3RyYXRpb25LZXkocmVzb2x2ZVJlcXVlc3QpO1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuZ2V0UmVnaXN0cmF0aW9uRnJvbShrZXkpO1xuXHRcdGlmIChyZWdpc3RyYXRpb24gPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5sb2dnZXIud2FybihgQ2Fubm90IHJlc29sdmUgZGVwZW5kZW5jeSAke2tleS50b1N0cmluZygpfWApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHJlZ2lzdHJhdGlvbi5sZW5ndGggPiAxKSB7XG5cdFx0XHR0aHJvdyBuZXcgUmVzb2x2ZUVycm9yKFxuXHRcdFx0XHRgVGhlcmUgYXJlIG11bHRpcGxlIHNlcnZpY2VzIHJlZ2lzdGVyZWQgd2l0aCBrZXkgJHtrZXkudG9TdHJpbmcoKX0uIFVzZSByZXNvbHZlTWFueSB0byByZXNvbHZlIGFsbCBpbXBsZW1lbnRhdGlvbnMuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVJlZ2lzdHJhdGlvbjxUPihyZWdpc3RyYXRpb25bMF0pO1xuXHRcdHJldHVybiBzZXJ2aWNlO1xuXHR9XG5cblx0cHVibGljIGJlZ2luU2NvcGUobmFtZT86IHN0cmluZykge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udGFpbmVyIGhhcyBiZWVuIGRpc3Bvc2VkXCIpO1xuXHRcdH1cblx0XHRpZiAobmFtZSAhPSBudWxsICYmIHRoaXMuc2NvcGVzLmhhcyhuYW1lKSkge1xuXHRcdFx0dGhyb3cgbmV3IER1cGxpY2F0ZVNjb3BlRXJyb3IoXG5cdFx0XHRcdGBDYW5ub3QgY3JlYXRlIGR1cGxpY2F0ZSBzY29wZS4gU2NvcGUgd2l0aCAke25hbWV9IGlzIGFscmVhZHkgY3JlYXRlZCBhbmQgaGFzIG5vdCBiZWVuIGRpc3Bvc2VkLmAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNjb3BlID0gbmV3IENydWNpYmxlKHtcblx0XHRcdGtleTogbmFtZSxcblx0XHRcdHNlcnZpY2VSZWdpc3RyeTogdGhpcy5zZXJ2aWNlUmVnaXN0cnksXG5cdFx0XHRwYXJlbnQ6IHRoaXMsXG5cdFx0fSk7XG5cblx0XHRpZiAobmFtZSAhPSBudWxsKSB7XG5cdFx0XHR0aGlzLnNjb3Blcy5zZXQobmFtZSwgc2NvcGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2NvcGU7XG5cdH1cblxuXHRwdWJsaWMgW1N5bWJvbC5kaXNwb3NlXSgpIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuZGlzcG9zZVN5bmMoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VBc3luYygpO1xuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlU3luYygpIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnBhcmVudD8ucmVsZWFzZVNjb3BlKHRoaXMua2V5KTtcblx0XHR0aGlzLnNjb3Blcy5jbGVhcigpO1xuXHRcdGZvciAoY29uc3QgWywgaW5zdF0gb2YgdGhpcy5pbnN0YW5jZXMpIHtcblx0XHRcdGlmIChpbnN0ID09PSB0aGlzKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aW5zdFtTeW1ib2wuZGlzcG9zZV0/LigpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUFzeW5jKCkge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMucGFyZW50Py5yZWxlYXNlU2NvcGUodGhpcy5rZXkpO1xuXHRcdHRoaXMuc2NvcGVzLmNsZWFyKCk7XG5cdFx0Zm9yIChjb25zdCBbLCBpbnN0XSBvZiB0aGlzLmluc3RhbmNlcykge1xuXHRcdFx0aWYgKGluc3QgPT09IHRoaXMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoU3ltYm9sLmFzeW5jRGlzcG9zZSBpbiBpbnN0KSB7XG5cdFx0XHRcdGF3YWl0IChpbnN0IGFzIEFzeW5jRGlzcG9zYWJsZSlbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdChpbnN0IGFzIFBhcnRpYWw8RGlzcG9zYWJsZT4pW1N5bWJvbC5kaXNwb3NlXT8uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZWdpc3RyYXRpb25Gcm9tKGtleTogUmVnaXN0cmF0aW9uS2V5KSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkuZ2V0UmVnaXN0cmF0aW9uKGtleS52YWx1ZSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVJlZ2lzdHJhdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRjb25zdCB7IHNjb3BlIH0gPSByZWdpc3RyYXRpb247XG5cdFx0c3dpdGNoIChzY29wZSkge1xuXHRcdFx0Y2FzZSBTY29wZXMudHJhbnNpZW50OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMuc2luZ2xldG9uOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5yb290U2NvcGUuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMucmVxdWVzdDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0T3JDcmVhdGVJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRhaW5lciBoYXMgYmVlbiBkaXNwb3NlZFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgeyBrZXksIHR5cGUsIGlzSW5zdGFuY2UgfSA9IHJlZ2lzdHJhdGlvbjtcblx0XHRjb25zdCBjYWNoZUtleSA9IGlzSW5zdGFuY2UgPyBrZXkudmFsdWUgOiB0eXBlO1xuXHRcdGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQoY2FjaGVLZXkpO1xuXHRcdGlmIChleGlzdGluZ0luc3RhbmNlICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBleGlzdGluZ0luc3RhbmNlIGFzIFQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5zdGFuY2UgPSBpc0luc3RhbmNlID8gKHR5cGUgYXMgVCkgOiB0aGlzLmNyZWF0ZUluc3RhbmNlPFQ+KHJlZ2lzdHJhdGlvbik7XG5cdFx0dGhpcy5pbnN0YW5jZXMuc2V0KGNhY2hlS2V5LCBpbnN0YW5jZSk7XG5cdFx0cmV0dXJuIGluc3RhbmNlO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRjb25zdCB0eXBlID0gcmVnaXN0cmF0aW9uLnR5cGUgYXMgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZTtcblx0XHRjb25zdCBjYW5Db25zdHJ1Y3QgPSBpc0NvbnN0cnVjdGFibGUodHlwZSk7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMucmVzb2x2ZURlcGVuZGVuY2llcyh0eXBlKTtcblx0XHRjb25zdCBpbnN0ID0gKGNhbkNvbnN0cnVjdCA/IG5ldyB0eXBlKC4uLmRlcHMpIDogdHlwZSgpKSBhcyBUO1xuXHRcdHJldHVybiBpbnN0O1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlRGVwZW5kZW5jaWVzKHR5cGU6IENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGUpOiB1bmtub3duW10ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IGdldE1ldGE8QXJyYXk8Q29uc3RydWN0YWJsZT4+KFJlZmxlY3Rpb25NZXRhLnBhcmFtdHlwZXMsIHR5cGUpID8/IFtdO1xuXG5cdFx0Y29uc3QgaW5qZWN0VG9rZW5zID1cblx0XHRcdGdldE1ldGE8SW5qZWN0aW9uTWV0YWRhdGE+KENydWNpYmxlTWV0YS5pbmplY3R0b2tlbiwgdHlwZSkgPz8gbmV3IE1hcCgpO1xuXG5cdFx0Ly9UT0RPOiBwdXQgYSB0cnkgY2F0Y2ggaGVyZSBzbyB3ZSBjYW4gdGhyb3cgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2Vcblx0XHRsZXQgcmVzb2x2ZWQgPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgdG9rZW4gPSBpbmplY3RUb2tlbnMuZ2V0KGkpPy5rZXkgPz8gcGFyYW1zW2ldLm5hbWU7XG5cdFx0XHRjb25zdCBkZXAgPSBpc0FycmF5VHlwZShwYXJhbXNbaV0pID8gdGhpcy5yZXNvbHZlTWFueSh0b2tlbikgOiB0aGlzLnJlc29sdmUodG9rZW4pO1xuXHRcdFx0cmVzb2x2ZWQgPSBbLi4ucmVzb2x2ZWQsIGRlcF07XG5cdFx0fVxuXHRcdHJldHVybiByZXNvbHZlZDtcblx0fVxuXG5cdHByaXZhdGUgcmVsZWFzZVNjb3BlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdGlmIChuYW1lID09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5zY29wZXMuZGVsZXRlKG5hbWUpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckxpZmV0aW1lU2NvcGUoKSB7XG5cdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVwbGFjZVR5cGUoU2NvcGVzLnJlcXVlc3QsIHtcblx0XHRcdHR5cGVPcktleTogTGlmZXRpbWVTY29wZVRva2VuLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHRoaXMsXG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDcnVjaWJsZSIsImtleSIsImluc3RhbmNlcyIsIk1hcCIsInNlcnZpY2VSZWdpc3RyeSIsInBhcmVudCIsInJvb3RTY29wZSIsInNjb3BlcyIsImxvZ2dlciIsInNjcmliZSIsIm5hbWUiLCJpc0Rpc3Bvc2VkIiwib3B0aW9ucyIsIlNlcnZpY2VSZWdpc3RyeSIsInJlZ2lzdGVyTGlmZXRpbWVTY29wZSIsInJlc29sdmVNYW55IiwicmVzb2x2ZVJlcXVlc3QiLCJSZWdpc3RyYXRpb25LZXkiLCJyZWdpc3RyYXRpb25zIiwiZ2V0UmVnaXN0cmF0aW9uRnJvbSIsInNlcnZpY2VzIiwiQXJyYXkiLCJvZiIsInJlZ2lzdHJhdGlvbiIsInNlcnZpY2UiLCJyZXNvbHZlUmVnaXN0cmF0aW9uIiwicHVzaCIsInJlc29sdmUiLCJ3YXJuIiwidG9TdHJpbmciLCJsZW5ndGgiLCJSZXNvbHZlRXJyb3IiLCJiZWdpblNjb3BlIiwiRXJyb3IiLCJoYXMiLCJEdXBsaWNhdGVTY29wZUVycm9yIiwic2NvcGUiLCJzZXQiLCJTeW1ib2wiLCJkaXNwb3NlIiwiZGlzcG9zZVN5bmMiLCJhc3luY0Rpc3Bvc2UiLCJkaXNwb3NlQXN5bmMiLCJyZWxlYXNlU2NvcGUiLCJjbGVhciIsImluc3QiLCJnZXRSZWdpc3RyYXRpb24iLCJ2YWx1ZSIsIlNjb3BlcyIsInRyYW5zaWVudCIsImNyZWF0ZUluc3RhbmNlIiwic2luZ2xldG9uIiwiZ2V0T3JDcmVhdGVJbnN0YW5jZSIsInJlcXVlc3QiLCJ0eXBlIiwiaXNJbnN0YW5jZSIsImNhY2hlS2V5IiwiZXhpc3RpbmdJbnN0YW5jZSIsImdldCIsImluc3RhbmNlIiwiY2FuQ29uc3RydWN0IiwiaXNDb25zdHJ1Y3RhYmxlIiwiZGVwcyIsInJlc29sdmVEZXBlbmRlbmNpZXMiLCJwYXJhbXMiLCJnZXRNZXRhIiwiUmVmbGVjdGlvbk1ldGEiLCJwYXJhbXR5cGVzIiwiaW5qZWN0VG9rZW5zIiwiQ3J1Y2libGVNZXRhIiwiaW5qZWN0dG9rZW4iLCJyZXNvbHZlZCIsImkiLCJ0b2tlbiIsImRlcCIsImlzQXJyYXlUeXBlIiwiZGVsZXRlIiwicmVwbGFjZVR5cGUiLCJ0eXBlT3JLZXkiLCJMaWZldGltZVNjb3BlVG9rZW4iLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF1QmFBOzs7ZUFBQUE7Ozs0QkFoQk47d0JBQ2dCO3VCQUNrQztzQ0FFekI7d0JBRWtCO2lDQUVsQjtBQVF6QixNQUFNQTtJQUNMQyxJQUFZO0lBQ1RDLFlBQVksSUFBSUMsTUFBdUI7SUFDekNDLGdCQUFpQztJQUNqQ0MsT0FBa0I7SUFDbEJDLFVBQW9CO0lBQ3BCQyxTQUFTLElBQUlKLE1BQTZCO0lBQzFDSyxTQUFTQyxjQUFNLENBQUNELE1BQU0sQ0FBQ1IsU0FBU1UsSUFBSSxFQUFFO0lBQ3RDQyxhQUFhLE1BQU07SUFD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
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "ServiceRegistry", {
10
10
  });
11
11
  const _registrationkeymodel = require("../models/registration-key.model.js");
12
12
  const _serviceregistrationmodel = require("../models/service-registration.model.js");
13
+ const _errors = require("../types/errors.js");
13
14
  class ServiceRegistry {
14
15
  registrations;
15
16
  constructor(parent){
@@ -17,10 +18,22 @@ class ServiceRegistry {
17
18
  }
18
19
  registerType(scope, options) {
19
20
  const registration = this.createRegistrationFrom(scope, options);
20
- const existingRegistration = this.getRegistrations(registration.key)?.filter((reg)=>!reg.isEqual(registration)) ?? [];
21
+ const existing = this.getRegistrations(registration.key) ?? [];
22
+ const duplicate = existing.find((reg)=>reg.isEqual(registration));
23
+ if (duplicate != null && !options.override) {
24
+ throw new _errors.RegistrationError(`A service is already registered for key ${registration.key}. Use builder.override.registerSingleton() (or the matching register* method) to replace it.`);
25
+ }
26
+ const remaining = existing.filter((reg)=>!reg.isEqual(registration));
21
27
  this.setRegistration(registration.key, [
22
28
  registration,
23
- ...existingRegistration
29
+ ...remaining
30
+ ]);
31
+ return registration;
32
+ }
33
+ replaceType(scope, options) {
34
+ const registration = this.createRegistrationFrom(scope, options);
35
+ this.setRegistration(registration.key, [
36
+ registration
24
37
  ]);
25
38
  return registration;
26
39
  }
@@ -47,4 +60,4 @@ class ServiceRegistry {
47
60
  }
48
61
  }
49
62
 
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25LZXkgfSBmcm9tIFwiLi4vbW9kZWxzL3JlZ2lzdHJhdGlvbi1rZXkubW9kZWwuanNcIjtcbmltcG9ydCB7IFNlcnZpY2VSZWdpc3RyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3NlcnZpY2UtcmVnaXN0cmF0aW9uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjb3BlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFJlZ2lzdGVyVHlwZU9wdGlvbnMgPSB7XG5cdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZTtcblx0dHlwZU9ySW5zdGFuY2U/OiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlIHwgb2JqZWN0O1xufTtcblxuZXhwb3J0IGNsYXNzIFNlcnZpY2VSZWdpc3RyeSB7XG5cdHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmF0aW9uczogTWFwPHN0cmluZywgU2VydmljZVJlZ2lzdHJhdGlvbltdPjtcblx0cHVibGljIGNvbnN0cnVjdG9yKHBhcmVudD86IFNlcnZpY2VSZWdpc3RyeSkge1xuXHRcdHRoaXMucmVnaXN0cmF0aW9ucyA9IG5ldyBNYXAocGFyZW50Py5yZWdpc3RyYXRpb25zKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGUoc2NvcGU6IFNjb3BlLCBvcHRpb25zOiBSZWdpc3RlclR5cGVPcHRpb25zKSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5jcmVhdGVSZWdpc3RyYXRpb25Gcm9tKHNjb3BlLCBvcHRpb25zKTtcblx0XHRjb25zdCBleGlzdGluZ1JlZ2lzdHJhdGlvbiA9XG5cdFx0XHR0aGlzLmdldFJlZ2lzdHJhdGlvbnMocmVnaXN0cmF0aW9uLmtleSk/LmZpbHRlcigocmVnKSA9PiAhcmVnLmlzRXF1YWwocmVnaXN0cmF0aW9uKSkgPz9cblx0XHRcdFtdO1xuXG5cdFx0dGhpcy5zZXRSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uLmtleSwgW3JlZ2lzdHJhdGlvbiwgLi4uZXhpc3RpbmdSZWdpc3RyYXRpb25dKTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIGdldFJlZ2lzdHJhdGlvbihrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW10ge1xuXHRcdGNvbnN0IGtleVZhbCA9IG5ldyBSZWdpc3RyYXRpb25LZXkoa2V5KS52YWx1ZTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KGtleVZhbCk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUmVnaXN0cmF0aW9uRnJvbShzY29wZTogU2NvcGUsIG9wdGlvbnM6IFJlZ2lzdGVyVHlwZU9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHR5cGVPcktleSwgdHlwZU9ySW5zdGFuY2UgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgaXNLZXkgPSB0eXBlb2YgdHlwZU9yS2V5ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0eXBlT3JLZXkgPT09IFwic3ltYm9sXCI7XG5cdFx0Y29uc3QgaXNJbnN0YW5jZSA9IHR5cGVvZiB0eXBlT3JJbnN0YW5jZSA9PT0gXCJvYmplY3RcIjtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KCFpc0tleSA/IHR5cGVPcktleS5uYW1lIDogdHlwZU9yS2V5KTtcblx0XHRjb25zdCB0eXBlID0gaXNJbnN0YW5jZSA/IHR5cGVPckluc3RhbmNlIDogaXNLZXkgPyB0eXBlT3JJbnN0YW5jZSA6IHR5cGVPcktleTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSBuZXcgU2VydmljZVJlZ2lzdHJhdGlvbihrZXksIHR5cGUsIHNjb3BlLCBpc0luc3RhbmNlKTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZWdpc3RyYXRpb25zKGtleTogUmVnaXN0cmF0aW9uS2V5KSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBrZXkudmFsdWU7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0cmF0aW9ucy5nZXQodmFsdWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRSZWdpc3RyYXRpb24oa2V5OiBSZWdpc3RyYXRpb25LZXksIHJlZ2lzdHJhdGlvbnM6IFNlcnZpY2VSZWdpc3RyYXRpb25bXSkge1xuXHRcdHRoaXMucmVnaXN0cmF0aW9ucy5zZXQoa2V5LnZhbHVlLCByZWdpc3RyYXRpb25zKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlNlcnZpY2VSZWdpc3RyeSIsInJlZ2lzdHJhdGlvbnMiLCJwYXJlbnQiLCJNYXAiLCJyZWdpc3RlclR5cGUiLCJzY29wZSIsIm9wdGlvbnMiLCJyZWdpc3RyYXRpb24iLCJjcmVhdGVSZWdpc3RyYXRpb25Gcm9tIiwiZXhpc3RpbmdSZWdpc3RyYXRpb24iLCJnZXRSZWdpc3RyYXRpb25zIiwia2V5IiwiZmlsdGVyIiwicmVnIiwiaXNFcXVhbCIsInNldFJlZ2lzdHJhdGlvbiIsImdldFJlZ2lzdHJhdGlvbiIsImtleVZhbCIsIlJlZ2lzdHJhdGlvbktleSIsInZhbHVlIiwiZ2V0IiwidHlwZU9yS2V5IiwidHlwZU9ySW5zdGFuY2UiLCJpc0tleSIsImlzSW5zdGFuY2UiLCJuYW1lIiwidHlwZSIsIlNlcnZpY2VSZWdpc3RyYXRpb24iLCJzZXQiXSwibWFwcGluZ3MiOiI7Ozs7K0JBVWFBOzs7ZUFBQUE7OztzQ0FUbUI7MENBQ0k7QUFRN0IsTUFBTUE7SUFDS0MsY0FBa0Q7SUFDbkUsWUFBbUJDLE1BQXdCLENBQUU7UUFDNUMsSUFBSSxDQUFDRCxhQUFhLEdBQUcsSUFBSUUsSUFBSUQsUUFBUUQ7SUFDdEM7SUFFT0csYUFBYUMsS0FBWSxFQUFFQyxPQUE0QixFQUFFO1FBQy9ELE1BQU1DLGVBQWUsSUFBSSxDQUFDQyxzQkFBc0IsQ0FBQ0gsT0FBT0M7UUFDeEQsTUFBTUcsdUJBQ0wsSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ0gsYUFBYUksR0FBRyxHQUFHQyxPQUFPLENBQUNDLE1BQVEsQ0FBQ0EsSUFBSUMsT0FBTyxDQUFDUCxrQkFDdEUsRUFBRTtRQUVILElBQUksQ0FBQ1EsZUFBZSxDQUFDUixhQUFhSSxHQUFHLEVBQUU7WUFBQ0o7ZUFBaUJFO1NBQXFCO1FBQzlFLE9BQU9GO0lBQ1I7SUFFT1MsZ0JBQWdCTCxHQUFvQyxFQUF5QjtRQUNuRixNQUFNTSxTQUFTLElBQUlDLHFDQUFlLENBQUNQLEtBQUtRLEtBQUs7UUFDN0MsTUFBTVosZUFBZSxJQUFJLENBQUNOLGFBQWEsQ0FBQ21CLEdBQUcsQ0FBQ0g7UUFDNUMsT0FBT1Y7SUFDUjtJQUVRQyx1QkFBdUJILEtBQVksRUFBRUMsT0FBNEIsRUFBRTtRQUMxRSxNQUFNLEVBQUVlLFNBQVMsRUFBRUMsY0FBYyxFQUFFLEdBQUdoQjtRQUN0QyxNQUFNaUIsUUFBUSxPQUFPRixjQUFjLFlBQVksT0FBT0EsY0FBYztRQUNwRSxNQUFNRyxhQUFhLE9BQU9GLG1CQUFtQjtRQUM3QyxNQUFNWCxNQUFNLElBQUlPLHFDQUFlLENBQUMsQ0FBQ0ssUUFBUUYsVUFBVUksSUFBSSxHQUFHSjtRQUMxRCxNQUFNSyxPQUFPRixhQUFhRixpQkFBaUJDLFFBQVFELGlCQUFpQkQ7UUFDcEUsTUFBTWQsZUFBZSxJQUFJb0IsNkNBQW1CLENBQUNoQixLQUFLZSxNQUFNckIsT0FBT21CO1FBQy9ELE9BQU9qQjtJQUNSO0lBRVFHLGlCQUFpQkMsR0FBb0IsRUFBRTtRQUM5QyxNQUFNUSxRQUFRUixJQUFJUSxLQUFLO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDbEIsYUFBYSxDQUFDbUIsR0FBRyxDQUFDRDtJQUMvQjtJQUVRSixnQkFBZ0JKLEdBQW9CLEVBQUVWLGFBQW9DLEVBQUU7UUFDbkYsSUFBSSxDQUFDQSxhQUFhLENBQUMyQixHQUFHLENBQUNqQixJQUFJUSxLQUFLLEVBQUVsQjtJQUNuQztBQUNEIn0=
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25LZXkgfSBmcm9tIFwiLi4vbW9kZWxzL3JlZ2lzdHJhdGlvbi1rZXkubW9kZWwuanNcIjtcbmltcG9ydCB7IFNlcnZpY2VSZWdpc3RyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3NlcnZpY2UtcmVnaXN0cmF0aW9uLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi90eXBlcy9lcnJvcnMuanNcIjtcbmltcG9ydCB0eXBlIHsgU2NvcGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXMuanNcIjtcblxuZXhwb3J0IHR5cGUgUmVnaXN0ZXJUeXBlT3B0aW9ucyA9IHtcblx0dHlwZU9yS2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlO1xuXHR0eXBlT3JJbnN0YW5jZT86IENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGUgfCBvYmplY3Q7XG5cdG92ZXJyaWRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUmVnaXN0cnkge1xuXHRwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvbnM6IE1hcDxzdHJpbmcsIFNlcnZpY2VSZWdpc3RyYXRpb25bXT47XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBTZXJ2aWNlUmVnaXN0cnkpIHtcblx0XHR0aGlzLnJlZ2lzdHJhdGlvbnMgPSBuZXcgTWFwKHBhcmVudD8ucmVnaXN0cmF0aW9ucyk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJUeXBlKHNjb3BlOiBTY29wZSwgb3B0aW9uczogUmVnaXN0ZXJUeXBlT3B0aW9ucykge1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuY3JlYXRlUmVnaXN0cmF0aW9uRnJvbShzY29wZSwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFJlZ2lzdHJhdGlvbnMocmVnaXN0cmF0aW9uLmtleSkgPz8gW107XG5cdFx0Y29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmcuZmluZCgocmVnKSA9PiByZWcuaXNFcXVhbChyZWdpc3RyYXRpb24pKTtcblx0XHRpZiAoZHVwbGljYXRlICE9IG51bGwgJiYgIW9wdGlvbnMub3ZlcnJpZGUpIHtcblx0XHRcdHRocm93IG5ldyBSZWdpc3RyYXRpb25FcnJvcihcblx0XHRcdFx0YEEgc2VydmljZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIGtleSAke3JlZ2lzdHJhdGlvbi5rZXl9LiBVc2UgYnVpbGRlci5vdmVycmlkZS5yZWdpc3RlclNpbmdsZXRvbigpIChvciB0aGUgbWF0Y2hpbmcgcmVnaXN0ZXIqIG1ldGhvZCkgdG8gcmVwbGFjZSBpdC5gLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCByZW1haW5pbmcgPSBleGlzdGluZy5maWx0ZXIoKHJlZykgPT4gIXJlZy5pc0VxdWFsKHJlZ2lzdHJhdGlvbikpO1xuXHRcdHRoaXMuc2V0UmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbi5rZXksIFtyZWdpc3RyYXRpb24sIC4uLnJlbWFpbmluZ10pO1xuXHRcdHJldHVybiByZWdpc3RyYXRpb247XG5cdH1cblxuXHRwdWJsaWMgcmVwbGFjZVR5cGUoc2NvcGU6IFNjb3BlLCBvcHRpb25zOiBSZWdpc3RlclR5cGVPcHRpb25zKSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5jcmVhdGVSZWdpc3RyYXRpb25Gcm9tKHNjb3BlLCBvcHRpb25zKTtcblx0XHR0aGlzLnNldFJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24ua2V5LCBbcmVnaXN0cmF0aW9uXSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZWdpc3RyYXRpb24oa2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbltdIHtcblx0XHRjb25zdCBrZXlWYWwgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KGtleSkudmFsdWU7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZWdpc3RyYXRpb25zLmdldChrZXlWYWwpO1xuXHRcdHJldHVybiByZWdpc3RyYXRpb247XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVJlZ2lzdHJhdGlvbkZyb20oc2NvcGU6IFNjb3BlLCBvcHRpb25zOiBSZWdpc3RlclR5cGVPcHRpb25zKSB7XG5cdFx0Y29uc3QgeyB0eXBlT3JLZXksIHR5cGVPckluc3RhbmNlIH0gPSBvcHRpb25zO1xuXHRcdGNvbnN0IGlzS2V5ID0gdHlwZW9mIHR5cGVPcktleSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdHlwZU9yS2V5ID09PSBcInN5bWJvbFwiO1xuXHRcdGNvbnN0IGlzSW5zdGFuY2UgPSB0eXBlb2YgdHlwZU9ySW5zdGFuY2UgPT09IFwib2JqZWN0XCI7XG5cdFx0Y29uc3Qga2V5ID0gbmV3IFJlZ2lzdHJhdGlvbktleSghaXNLZXkgPyB0eXBlT3JLZXkubmFtZSA6IHR5cGVPcktleSk7XG5cdFx0Y29uc3QgdHlwZSA9IGlzSW5zdGFuY2UgPyB0eXBlT3JJbnN0YW5jZSA6IGlzS2V5ID8gdHlwZU9ySW5zdGFuY2UgOiB0eXBlT3JLZXk7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gbmV3IFNlcnZpY2VSZWdpc3RyYXRpb24oa2V5LCB0eXBlLCBzY29wZSwgaXNJbnN0YW5jZSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UmVnaXN0cmF0aW9ucyhrZXk6IFJlZ2lzdHJhdGlvbktleSkge1xuXHRcdGNvbnN0IHZhbHVlID0ga2V5LnZhbHVlO1xuXHRcdHJldHVybiB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KHZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgc2V0UmVnaXN0cmF0aW9uKGtleTogUmVnaXN0cmF0aW9uS2V5LCByZWdpc3RyYXRpb25zOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW10pIHtcblx0XHR0aGlzLnJlZ2lzdHJhdGlvbnMuc2V0KGtleS52YWx1ZSwgcmVnaXN0cmF0aW9ucyk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJTZXJ2aWNlUmVnaXN0cnkiLCJyZWdpc3RyYXRpb25zIiwicGFyZW50IiwiTWFwIiwicmVnaXN0ZXJUeXBlIiwic2NvcGUiLCJvcHRpb25zIiwicmVnaXN0cmF0aW9uIiwiY3JlYXRlUmVnaXN0cmF0aW9uRnJvbSIsImV4aXN0aW5nIiwiZ2V0UmVnaXN0cmF0aW9ucyIsImtleSIsImR1cGxpY2F0ZSIsImZpbmQiLCJyZWciLCJpc0VxdWFsIiwib3ZlcnJpZGUiLCJSZWdpc3RyYXRpb25FcnJvciIsInJlbWFpbmluZyIsImZpbHRlciIsInNldFJlZ2lzdHJhdGlvbiIsInJlcGxhY2VUeXBlIiwiZ2V0UmVnaXN0cmF0aW9uIiwia2V5VmFsIiwiUmVnaXN0cmF0aW9uS2V5IiwidmFsdWUiLCJnZXQiLCJ0eXBlT3JLZXkiLCJ0eXBlT3JJbnN0YW5jZSIsImlzS2V5IiwiaXNJbnN0YW5jZSIsIm5hbWUiLCJ0eXBlIiwiU2VydmljZVJlZ2lzdHJhdGlvbiIsInNldCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFZYUE7OztlQUFBQTs7O3NDQVhtQjswQ0FDSTt3QkFDRjtBQVMzQixNQUFNQTtJQUNLQyxjQUFrRDtJQUNuRSxZQUFtQkMsTUFBd0IsQ0FBRTtRQUM1QyxJQUFJLENBQUNELGFBQWEsR0FBRyxJQUFJRSxJQUFJRCxRQUFRRDtJQUN0QztJQUVPRyxhQUFhQyxLQUFZLEVBQUVDLE9BQTRCLEVBQUU7UUFDL0QsTUFBTUMsZUFBZSxJQUFJLENBQUNDLHNCQUFzQixDQUFDSCxPQUFPQztRQUN4RCxNQUFNRyxXQUFXLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUNILGFBQWFJLEdBQUcsS0FBSyxFQUFFO1FBQzlELE1BQU1DLFlBQVlILFNBQVNJLElBQUksQ0FBQyxDQUFDQyxNQUFRQSxJQUFJQyxPQUFPLENBQUNSO1FBQ3JELElBQUlLLGFBQWEsUUFBUSxDQUFDTixRQUFRVSxRQUFRLEVBQUU7WUFDM0MsTUFBTSxJQUFJQyx5QkFBaUIsQ0FDMUIsQ0FBQyx3Q0FBd0MsRUFBRVYsYUFBYUksR0FBRyxDQUFDLDRGQUE0RixDQUFDO1FBRTNKO1FBRUEsTUFBTU8sWUFBWVQsU0FBU1UsTUFBTSxDQUFDLENBQUNMLE1BQVEsQ0FBQ0EsSUFBSUMsT0FBTyxDQUFDUjtRQUN4RCxJQUFJLENBQUNhLGVBQWUsQ0FBQ2IsYUFBYUksR0FBRyxFQUFFO1lBQUNKO2VBQWlCVztTQUFVO1FBQ25FLE9BQU9YO0lBQ1I7SUFFT2MsWUFBWWhCLEtBQVksRUFBRUMsT0FBNEIsRUFBRTtRQUM5RCxNQUFNQyxlQUFlLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNILE9BQU9DO1FBQ3hELElBQUksQ0FBQ2MsZUFBZSxDQUFDYixhQUFhSSxHQUFHLEVBQUU7WUFBQ0o7U0FBYTtRQUNyRCxPQUFPQTtJQUNSO0lBRU9lLGdCQUFnQlgsR0FBb0MsRUFBeUI7UUFDbkYsTUFBTVksU0FBUyxJQUFJQyxxQ0FBZSxDQUFDYixLQUFLYyxLQUFLO1FBQzdDLE1BQU1sQixlQUFlLElBQUksQ0FBQ04sYUFBYSxDQUFDeUIsR0FBRyxDQUFDSDtRQUM1QyxPQUFPaEI7SUFDUjtJQUVRQyx1QkFBdUJILEtBQVksRUFBRUMsT0FBNEIsRUFBRTtRQUMxRSxNQUFNLEVBQUVxQixTQUFTLEVBQUVDLGNBQWMsRUFBRSxHQUFHdEI7UUFDdEMsTUFBTXVCLFFBQVEsT0FBT0YsY0FBYyxZQUFZLE9BQU9BLGNBQWM7UUFDcEUsTUFBTUcsYUFBYSxPQUFPRixtQkFBbUI7UUFDN0MsTUFBTWpCLE1BQU0sSUFBSWEscUNBQWUsQ0FBQyxDQUFDSyxRQUFRRixVQUFVSSxJQUFJLEdBQUdKO1FBQzFELE1BQU1LLE9BQU9GLGFBQWFGLGlCQUFpQkMsUUFBUUQsaUJBQWlCRDtRQUNwRSxNQUFNcEIsZUFBZSxJQUFJMEIsNkNBQW1CLENBQUN0QixLQUFLcUIsTUFBTTNCLE9BQU95QjtRQUMvRCxPQUFPdkI7SUFDUjtJQUVRRyxpQkFBaUJDLEdBQW9CLEVBQUU7UUFDOUMsTUFBTWMsUUFBUWQsSUFBSWMsS0FBSztRQUN2QixPQUFPLElBQUksQ0FBQ3hCLGFBQWEsQ0FBQ3lCLEdBQUcsQ0FBQ0Q7SUFDL0I7SUFFUUwsZ0JBQWdCVCxHQUFvQixFQUFFVixhQUFvQyxFQUFFO1FBQ25GLElBQUksQ0FBQ0EsYUFBYSxDQUFDaUMsR0FBRyxDQUFDdkIsSUFBSWMsS0FBSyxFQUFFeEI7SUFDbkM7QUFDRCJ9
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ _export_star(require("./errors.js"), exports);
5
6
  _export_star(require("./types.js"), exports);
6
7
  function _export_star(from, to) {
7
8
  Object.keys(from).forEach(function(k) {
@@ -17,4 +18,4 @@ function _export_star(from, to) {
17
18
  return from;
18
19
  }
19
20
 
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy90eXBlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi90eXBlcy5qc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWMifQ==
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy90eXBlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzLmpzXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBYztxQkFDQSJ9
@@ -1,6 +1,10 @@
1
1
  import { defineMeta, getMeta } from "@decohere/nexus/reflection";
2
2
  import { CrucibleMeta } from "../const.js";
3
- export function inject(key) {
3
+ /**
4
+ * Bind a constructor parameter to a registration key.
5
+ * A class uses `Class.name` (same key as `registerSingleton(Class)`).
6
+ * Prefer the class over a name string. Use a symbol or string when the key is not the class name.
7
+ */ export function inject(key) {
4
8
  return (target, _propertyKey, idx)=>{
5
9
  const metadata = getExistingMeta(target);
6
10
  metadata.set(idx, {
@@ -14,4 +18,4 @@ function getExistingMeta(target) {
14
18
  return meta;
15
19
  }
16
20
 
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lTWV0YSwgZ2V0TWV0YSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEluamVjdGlvbk1ldGFkYXRhID0gTWFwPG51bWJlciwgSW5qZWN0aW9uVG9rZW4+O1xuXG5leHBvcnQgdHlwZSBJbmplY3Rpb25Ub2tlbiA9IHtcblx0a2V5OiBzdHJpbmcgfCBzeW1ib2w7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG5cdHJldHVybiAodGFyZ2V0OiBvYmplY3QsIF9wcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZ2V0RXhpc3RpbmdNZXRhKHRhcmdldCk7XG5cdFx0bWV0YWRhdGEuc2V0KGlkeCwgeyBrZXkgfSk7XG5cdFx0ZGVmaW5lTWV0YShDcnVjaWJsZU1ldGEuaW5qZWN0dG9rZW4sIG1ldGFkYXRhLCB0YXJnZXQpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01ldGEodGFyZ2V0OiBvYmplY3QpIHtcblx0Y29uc3QgbWV0YSA9XG5cdFx0Z2V0TWV0YTxNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj4+KENydWNpYmxlTWV0YS5pbmplY3R0b2tlbiwgdGFyZ2V0KSA/P1xuXHRcdG5ldyBNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj4oKTtcblx0cmV0dXJuIG1ldGE7XG59XG4iXSwibmFtZXMiOlsiZGVmaW5lTWV0YSIsImdldE1ldGEiLCJDcnVjaWJsZU1ldGEiLCJpbmplY3QiLCJrZXkiLCJ0YXJnZXQiLCJfcHJvcGVydHlLZXkiLCJpZHgiLCJtZXRhZGF0YSIsImdldEV4aXN0aW5nTWV0YSIsInNldCIsImluamVjdHRva2VuIiwibWV0YSIsIk1hcCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxFQUFFQyxPQUFPLFFBQVEsNkJBQTZCO0FBQ2pFLFNBQVNDLFlBQVksUUFBUSxjQUFjO0FBUTNDLE9BQU8sU0FBU0MsT0FBT0MsR0FBb0I7SUFDMUMsT0FBTyxDQUFDQyxRQUFnQkMsY0FBMkNDO1FBQ2xFLE1BQU1DLFdBQVdDLGdCQUFnQko7UUFDakNHLFNBQVNFLEdBQUcsQ0FBQ0gsS0FBSztZQUFFSDtRQUFJO1FBQ3hCSixXQUFXRSxhQUFhUyxXQUFXLEVBQUVILFVBQVVIO0lBQ2hEO0FBQ0Q7QUFFQSxTQUFTSSxnQkFBZ0JKLE1BQWM7SUFDdEMsTUFBTU8sT0FDTFgsUUFBcUNDLGFBQWFTLFdBQVcsRUFBRU4sV0FDL0QsSUFBSVE7SUFDTCxPQUFPRDtBQUNSIn0=
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RhYmxlLCBkZWZpbmVNZXRhLCBnZXRNZXRhIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDcnVjaWJsZU1ldGEgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcblxuZXhwb3J0IHR5cGUgSW5qZWN0aW9uTWV0YWRhdGEgPSBNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj47XG5cbmV4cG9ydCB0eXBlIEluamVjdGlvblRva2VuID0ge1xuXHRrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGU7XG59O1xuXG4vKipcbiAqIEJpbmQgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdG8gYSByZWdpc3RyYXRpb24ga2V5LlxuICogQSBjbGFzcyB1c2VzIGBDbGFzcy5uYW1lYCAoc2FtZSBrZXkgYXMgYHJlZ2lzdGVyU2luZ2xldG9uKENsYXNzKWApLlxuICogUHJlZmVyIHRoZSBjbGFzcyBvdmVyIGEgbmFtZSBzdHJpbmcuIFVzZSBhIHN5bWJvbCBvciBzdHJpbmcgd2hlbiB0aGUga2V5IGlzIG5vdCB0aGUgY2xhc3MgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUpIHtcblx0cmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgX3Byb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsIGlkeDogbnVtYmVyKSA9PiB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBnZXRFeGlzdGluZ01ldGEodGFyZ2V0KTtcblx0XHRtZXRhZGF0YS5zZXQoaWR4LCB7IGtleSB9KTtcblx0XHRkZWZpbmVNZXRhKENydWNpYmxlTWV0YS5pbmplY3R0b2tlbiwgbWV0YWRhdGEsIHRhcmdldCk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldEV4aXN0aW5nTWV0YSh0YXJnZXQ6IG9iamVjdCkge1xuXHRjb25zdCBtZXRhID1cblx0XHRnZXRNZXRhPE1hcDxudW1iZXIsIEluamVjdGlvblRva2VuPj4oQ3J1Y2libGVNZXRhLmluamVjdHRva2VuLCB0YXJnZXQpID8/XG5cdFx0bmV3IE1hcDxudW1iZXIsIEluamVjdGlvblRva2VuPigpO1xuXHRyZXR1cm4gbWV0YTtcbn1cbiJdLCJuYW1lcyI6WyJkZWZpbmVNZXRhIiwiZ2V0TWV0YSIsIkNydWNpYmxlTWV0YSIsImluamVjdCIsImtleSIsInRhcmdldCIsIl9wcm9wZXJ0eUtleSIsImlkeCIsIm1ldGFkYXRhIiwiZ2V0RXhpc3RpbmdNZXRhIiwic2V0IiwiaW5qZWN0dG9rZW4iLCJtZXRhIiwiTWFwIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUE2QkEsVUFBVSxFQUFFQyxPQUFPLFFBQVEsNkJBQTZCO0FBQ3JGLFNBQVNDLFlBQVksUUFBUSxjQUFjO0FBUTNDOzs7O0NBSUMsR0FDRCxPQUFPLFNBQVNDLE9BQU9DLEdBQW9DO0lBQzFELE9BQU8sQ0FBQ0MsUUFBZ0JDLGNBQTJDQztRQUNsRSxNQUFNQyxXQUFXQyxnQkFBZ0JKO1FBQ2pDRyxTQUFTRSxHQUFHLENBQUNILEtBQUs7WUFBRUg7UUFBSTtRQUN4QkosV0FBV0UsYUFBYVMsV0FBVyxFQUFFSCxVQUFVSDtJQUNoRDtBQUNEO0FBRUEsU0FBU0ksZ0JBQWdCSixNQUFjO0lBQ3RDLE1BQU1PLE9BQ0xYLFFBQXFDQyxhQUFhUyxXQUFXLEVBQUVOLFdBQy9ELElBQUlRO0lBQ0wsT0FBT0Q7QUFDUiJ9
@@ -6,53 +6,54 @@ export class CrucibleBuilder {
6
6
  constructor(options){
7
7
  this.serviceRegistry = options?.serviceRegistry ?? new ServiceRegistry();
8
8
  }
9
+ get override() {
10
+ return this.createRegistrar(true);
11
+ }
9
12
  registerType(type, scope = Scopes.transient) {
10
- const registration = this.serviceRegistry.registerType(scope, {
11
- typeOrKey: type.name,
12
- typeOrInstance: type
13
- });
14
- return registration;
13
+ return this.register(false)(scope)(type.name, type);
15
14
  }
16
15
  registerTypes(scopeOrType, ...types) {
17
- const registrations = Array.of();
18
- const isScope = typeof scopeOrType !== "function";
19
- const scope = isScope ? scopeOrType : Scopes.transient;
20
- const allTypes = isScope ? types : [
21
- scopeOrType,
22
- ...types
23
- ];
24
- for (const type of allTypes){
25
- const registration = this.registerType(type, scope);
26
- registrations.push(registration);
27
- }
28
- return registrations;
16
+ return this.registerMany(false, scopeOrType, types);
29
17
  }
30
18
  registerTransient(typeOrKey, type) {
31
- const registration = this.serviceRegistry.registerType(Scopes.transient, {
32
- typeOrKey,
33
- typeOrInstance: type
34
- });
35
- return registration;
19
+ return this.register(false)(Scopes.transient)(typeOrKey, type);
36
20
  }
37
21
  registerSingleton(typeOrKey, typeOrInstance) {
38
- const registration = this.serviceRegistry.registerType(Scopes.singleton, {
39
- typeOrKey,
40
- typeOrInstance
41
- });
42
- return registration;
22
+ return this.register(false)(Scopes.singleton)(typeOrKey, typeOrInstance);
43
23
  }
44
24
  registerRequestScoped(typeOrKey, type) {
45
- const registration = this.serviceRegistry.registerType(Scopes.request, {
46
- typeOrKey,
47
- typeOrInstance: type
48
- });
49
- return registration;
25
+ return this.register(false)(Scopes.request)(typeOrKey, type);
50
26
  }
51
27
  build() {
52
28
  return new Crucible({
53
29
  serviceRegistry: this.serviceRegistry
54
30
  });
55
31
  }
32
+ register = (override)=>(scope)=>(typeOrKey, typeOrInstance)=>this.serviceRegistry.registerType(scope, {
33
+ typeOrKey,
34
+ typeOrInstance,
35
+ override
36
+ });
37
+ registerMany(override, scopeOrType, types) {
38
+ const bind = this.register(override);
39
+ const isScope = typeof scopeOrType !== "function";
40
+ const scope = isScope ? scopeOrType : Scopes.transient;
41
+ const allTypes = isScope ? types : [
42
+ scopeOrType,
43
+ ...types
44
+ ];
45
+ return allTypes.map((type)=>bind(scope)(type.name, type));
46
+ }
47
+ createRegistrar(override) {
48
+ const bind = this.register(override);
49
+ return {
50
+ registerType: (type, scope = Scopes.transient)=>bind(scope)(type.name, type),
51
+ registerTypes: (scopeOrType, ...types)=>this.registerMany(override, scopeOrType, types),
52
+ registerTransient: (typeOrKey, type)=>bind(Scopes.transient)(typeOrKey, type),
53
+ registerSingleton: (typeOrKey, typeOrInstance)=>bind(Scopes.singleton)(typeOrKey, typeOrInstance),
54
+ registerRequestScoped: (typeOrKey, type)=>bind(Scopes.request)(typeOrKey, type)
55
+ };
56
+ }
56
57
  }
57
58
 
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBTY29wZXMgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZVJlZ2lzdHJhdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvc2VydmljZS1yZWdpc3RyYXRpb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGFpbmVyQnVpbGRlciwgU2NvcGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXMuanNcIjtcbmltcG9ydCB7IENydWNpYmxlIH0gZnJvbSBcIi4vY3J1Y2libGUuanNcIjtcbmltcG9ydCB7IFNlcnZpY2VSZWdpc3RyeSB9IGZyb20gXCIuL3NlcnZpY2UtcmVnaXN0cnkuanNcIjtcblxudHlwZSBDb250YWluZXJCdWlsZGVyT3B0aW9ucyA9IHtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGVCdWlsZGVyIGltcGxlbWVudHMgQ29udGFpbmVyQnVpbGRlciB7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29udGFpbmVyQnVpbGRlck9wdGlvbnMpIHtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG9wdGlvbnM/LnNlcnZpY2VSZWdpc3RyeSA/PyBuZXcgU2VydmljZVJlZ2lzdHJ5KCk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJUeXBlKHR5cGU6IENvbnN0cnVjdGFibGUsIHNjb3BlOiBTY29wZSA9IFNjb3Blcy50cmFuc2llbnQpIHtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnNlcnZpY2VSZWdpc3RyeS5yZWdpc3RlclR5cGUoc2NvcGUsIHtcblx0XHRcdHR5cGVPcktleTogdHlwZS5uYW1lLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHR5cGUsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKC4uLnR5cGVzOiBDb25zdHJ1Y3RhYmxlW10pOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW107XG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKHNjb3BlOiBTY29wZSwgLi4udHlwZXM6IENvbnN0cnVjdGFibGVbXSk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXTtcblx0cHVibGljIHJlZ2lzdGVyVHlwZXMoXG5cdFx0c2NvcGVPclR5cGU6IFNjb3BlIHwgQ29uc3RydWN0YWJsZSxcblx0XHQuLi50eXBlczogQ29uc3RydWN0YWJsZVtdXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9ucyA9IEFycmF5Lm9mPFNlcnZpY2VSZWdpc3RyYXRpb24+KCk7XG5cblx0XHRjb25zdCBpc1Njb3BlID0gdHlwZW9mIHNjb3BlT3JUeXBlICE9PSBcImZ1bmN0aW9uXCI7XG5cdFx0Y29uc3Qgc2NvcGUgPSBpc1Njb3BlID8gc2NvcGVPclR5cGUgOiBTY29wZXMudHJhbnNpZW50O1xuXHRcdGNvbnN0IGFsbFR5cGVzID0gaXNTY29wZSA/IHR5cGVzIDogW3Njb3BlT3JUeXBlLCAuLi50eXBlc107XG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIGFsbFR5cGVzKSB7XG5cdFx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdGVyVHlwZSh0eXBlLCBzY29wZSk7XG5cdFx0XHRyZWdpc3RyYXRpb25zLnB1c2gocmVnaXN0cmF0aW9uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9ucztcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudChcblx0XHRrZXk6IHN0cmluZyB8IHN5bWJvbCxcblx0XHR0eXBlOiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlLFxuXHQpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJUcmFuc2llbnQodHlwZTogQ29uc3RydWN0YWJsZSk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudCh0eXBlT3JLZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUsIHR5cGU/OiBDb25zdHJ1Y3RhYmxlKSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy50cmFuc2llbnQsIHtcblx0XHRcdHR5cGVPcktleSxcblx0XHRcdHR5cGVPckluc3RhbmNlOiB0eXBlLFxuXHRcdH0pO1xuXHRcdHJldHVybiByZWdpc3RyYXRpb247XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJTaW5nbGV0b24oXG5cdFx0a2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlIHwgb2JqZWN0LFxuXHRcdGluc3RhbmNlOiBvYmplY3QsXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogQ29uc3RydWN0YWJsZSk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbih0eXBlOiBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSxcblx0XHR0eXBlT3JJbnN0YW5jZT86IENvbnN0cnVjdGFibGUgfCBvYmplY3QsXG5cdCkge1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuc2VydmljZVJlZ2lzdHJ5LnJlZ2lzdGVyVHlwZShTY29wZXMuc2luZ2xldG9uLCB7XG5cdFx0XHR0eXBlT3JLZXksXG5cdFx0XHR0eXBlT3JJbnN0YW5jZSxcblx0XHR9KTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPih0eXBlOiAoKSA9PiBUKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogKCkgPT4gVCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclJlcXVlc3RTY29wZWQoa2V5OiBzdHJpbmcgfCBzeW1ib2wsIHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0XHR0eXBlPzogQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0KSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy5yZXF1ZXN0LCB7XG5cdFx0XHR0eXBlT3JLZXksXG5cdFx0XHR0eXBlT3JJbnN0YW5jZTogdHlwZSxcblx0XHR9KTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIGJ1aWxkKCk6IENydWNpYmxlIHtcblx0XHRyZXR1cm4gbmV3IENydWNpYmxlKHsgc2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlNjb3BlcyIsIkNydWNpYmxlIiwiU2VydmljZVJlZ2lzdHJ5IiwiQ3J1Y2libGVCdWlsZGVyIiwic2VydmljZVJlZ2lzdHJ5Iiwib3B0aW9ucyIsInJlZ2lzdGVyVHlwZSIsInR5cGUiLCJzY29wZSIsInRyYW5zaWVudCIsInJlZ2lzdHJhdGlvbiIsInR5cGVPcktleSIsIm5hbWUiLCJ0eXBlT3JJbnN0YW5jZSIsInJlZ2lzdGVyVHlwZXMiLCJzY29wZU9yVHlwZSIsInR5cGVzIiwicmVnaXN0cmF0aW9ucyIsIkFycmF5Iiwib2YiLCJpc1Njb3BlIiwiYWxsVHlwZXMiLCJwdXNoIiwicmVnaXN0ZXJUcmFuc2llbnQiLCJyZWdpc3RlclNpbmdsZXRvbiIsInNpbmdsZXRvbiIsInJlZ2lzdGVyUmVxdWVzdFNjb3BlZCIsInJlcXVlc3QiLCJidWlsZCJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsTUFBTSxRQUFRLGNBQWM7QUFHckMsU0FBU0MsUUFBUSxRQUFRLGdCQUFnQjtBQUN6QyxTQUFTQyxlQUFlLFFBQVEsd0JBQXdCO0FBTXhELE9BQU8sTUFBTUM7SUFDSkMsZ0JBQWlDO0lBQ3pDLFlBQW1CQyxPQUFpQyxDQUFFO1FBQ3JELElBQUksQ0FBQ0QsZUFBZSxHQUFHQyxTQUFTRCxtQkFBbUIsSUFBSUY7SUFDeEQ7SUFFT0ksYUFBYUMsSUFBbUIsRUFBRUMsUUFBZVIsT0FBT1MsU0FBUyxFQUFFO1FBQ3pFLE1BQU1DLGVBQWUsSUFBSSxDQUFDTixlQUFlLENBQUNFLFlBQVksQ0FBQ0UsT0FBTztZQUM3REcsV0FBV0osS0FBS0ssSUFBSTtZQUNwQkMsZ0JBQWdCTjtRQUNqQjtRQUNBLE9BQU9HO0lBQ1I7SUFJT0ksY0FDTkMsV0FBa0MsRUFDbEMsR0FBR0MsS0FBc0IsRUFDRDtRQUN4QixNQUFNQyxnQkFBZ0JDLE1BQU1DLEVBQUU7UUFFOUIsTUFBTUMsVUFBVSxPQUFPTCxnQkFBZ0I7UUFDdkMsTUFBTVAsUUFBUVksVUFBVUwsY0FBY2YsT0FBT1MsU0FBUztRQUN0RCxNQUFNWSxXQUFXRCxVQUFVSixRQUFRO1lBQUNEO2VBQWdCQztTQUFNO1FBQzFELEtBQUssTUFBTVQsUUFBUWMsU0FBVTtZQUM1QixNQUFNWCxlQUFlLElBQUksQ0FBQ0osWUFBWSxDQUFDQyxNQUFNQztZQUM3Q1MsY0FBY0ssSUFBSSxDQUFDWjtRQUNwQjtRQUVBLE9BQU9PO0lBQ1I7SUFPT00sa0JBQWtCWixTQUEwQyxFQUFFSixJQUFvQixFQUFFO1FBQzFGLE1BQU1HLGVBQWUsSUFBSSxDQUFDTixlQUFlLENBQUNFLFlBQVksQ0FBQ04sT0FBT1MsU0FBUyxFQUFFO1lBQ3hFRTtZQUNBRSxnQkFBZ0JOO1FBQ2pCO1FBQ0EsT0FBT0c7SUFDUjtJQVFPYyxrQkFDTmIsU0FBMEMsRUFDMUNFLGNBQXVDLEVBQ3RDO1FBQ0QsTUFBTUgsZUFBZSxJQUFJLENBQUNOLGVBQWUsQ0FBQ0UsWUFBWSxDQUFDTixPQUFPeUIsU0FBUyxFQUFFO1lBQ3hFZDtZQUNBRTtRQUNEO1FBQ0EsT0FBT0g7SUFDUjtJQU1PZ0Isc0JBQ05mLFNBQXlELEVBQ3pESixJQUFtQyxFQUNsQztRQUNELE1BQU1HLGVBQWUsSUFBSSxDQUFDTixlQUFlLENBQUNFLFlBQVksQ0FBQ04sT0FBTzJCLE9BQU8sRUFBRTtZQUN0RWhCO1lBQ0FFLGdCQUFnQk47UUFDakI7UUFDQSxPQUFPRztJQUNSO0lBRU9rQixRQUFrQjtRQUN4QixPQUFPLElBQUkzQixTQUFTO1lBQUVHLGlCQUFpQixJQUFJLENBQUNBLGVBQWU7UUFBQztJQUM3RDtBQUNEIn0=
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBTY29wZXMgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZVJlZ2lzdHJhdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvc2VydmljZS1yZWdpc3RyYXRpb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGFpbmVyQnVpbGRlciwgQ29udGFpbmVyUmVnaXN0cmFyLCBTY29wZSB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgQ3J1Y2libGUgfSBmcm9tIFwiLi9jcnVjaWJsZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlclR5cGVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENvbnRhaW5lckJ1aWxkZXJPcHRpb25zID0ge1xuXHRzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeTtcbn07XG5cbnR5cGUgUmVnaXN0ZXJGbiA9IChcblx0dHlwZU9yS2V5OiBSZWdpc3RlclR5cGVPcHRpb25zW1widHlwZU9yS2V5XCJdLFxuXHR0eXBlT3JJbnN0YW5jZT86IFJlZ2lzdGVyVHlwZU9wdGlvbnNbXCJ0eXBlT3JJbnN0YW5jZVwiXSxcbikgPT4gU2VydmljZVJlZ2lzdHJhdGlvbjtcblxuZXhwb3J0IGNsYXNzIENydWNpYmxlQnVpbGRlciBpbXBsZW1lbnRzIENvbnRhaW5lckJ1aWxkZXIge1xuXHRwcml2YXRlIHNlcnZpY2VSZWdpc3RyeTogU2VydmljZVJlZ2lzdHJ5O1xuXHRwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9ucz86IENvbnRhaW5lckJ1aWxkZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkgPSBvcHRpb25zPy5zZXJ2aWNlUmVnaXN0cnkgPz8gbmV3IFNlcnZpY2VSZWdpc3RyeSgpO1xuXHR9XG5cblx0cHVibGljIGdldCBvdmVycmlkZSgpOiBDb250YWluZXJSZWdpc3RyYXIge1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZVJlZ2lzdHJhcih0cnVlKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGUodHlwZTogQ29uc3RydWN0YWJsZSwgc2NvcGU6IFNjb3BlID0gU2NvcGVzLnRyYW5zaWVudCkge1xuXHRcdHJldHVybiB0aGlzLnJlZ2lzdGVyKGZhbHNlKShzY29wZSkodHlwZS5uYW1lLCB0eXBlKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKC4uLnR5cGVzOiBDb25zdHJ1Y3RhYmxlW10pOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW107XG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKHNjb3BlOiBTY29wZSwgLi4udHlwZXM6IENvbnN0cnVjdGFibGVbXSk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXTtcblx0cHVibGljIHJlZ2lzdGVyVHlwZXMoXG5cdFx0c2NvcGVPclR5cGU6IFNjb3BlIHwgQ29uc3RydWN0YWJsZSxcblx0XHQuLi50eXBlczogQ29uc3RydWN0YWJsZVtdXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXSB7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0ZXJNYW55KGZhbHNlLCBzY29wZU9yVHlwZSwgdHlwZXMpO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyVHJhbnNpZW50KFxuXHRcdGtleTogc3RyaW5nIHwgc3ltYm9sLFxuXHRcdHR5cGU6IENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGUsXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudCh0eXBlOiBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyVHJhbnNpZW50KHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSwgdHlwZT86IENvbnN0cnVjdGFibGUpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWdpc3RlcihmYWxzZSkoU2NvcGVzLnRyYW5zaWVudCkodHlwZU9yS2V5LCB0eXBlKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbihcblx0XHRrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUgfCBvYmplY3QsXG5cdFx0aW5zdGFuY2U6IG9iamVjdCxcblx0KTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKGtleTogc3RyaW5nIHwgc3ltYm9sLCB0eXBlOiBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJTaW5nbGV0b24oXG5cdFx0dHlwZU9yS2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlLFxuXHRcdHR5cGVPckluc3RhbmNlPzogQ29uc3RydWN0YWJsZSB8IG9iamVjdCxcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0ZXIoZmFsc2UpKFNjb3Blcy5zaW5nbGV0b24pKHR5cGVPcktleSwgdHlwZU9ySW5zdGFuY2UpO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPih0eXBlOiAoKSA9PiBUKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogKCkgPT4gVCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclJlcXVlc3RTY29wZWQoa2V5OiBzdHJpbmcgfCBzeW1ib2wsIHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0XHR0eXBlPzogQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0ZXIoZmFsc2UpKFNjb3Blcy5yZXF1ZXN0KSh0eXBlT3JLZXksIHR5cGUpO1xuXHR9XG5cblx0cHVibGljIGJ1aWxkKCk6IENydWNpYmxlIHtcblx0XHRyZXR1cm4gbmV3IENydWNpYmxlKHsgc2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSB9KTtcblx0fVxuXG5cdHByaXZhdGUgcmVnaXN0ZXIgPVxuXHRcdChvdmVycmlkZTogYm9vbGVhbikgPT5cblx0XHQoc2NvcGU6IFNjb3BlKTogUmVnaXN0ZXJGbiA9PlxuXHRcdCh0eXBlT3JLZXksIHR5cGVPckluc3RhbmNlKSA9PlxuXHRcdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKHNjb3BlLCB7XG5cdFx0XHRcdHR5cGVPcktleSxcblx0XHRcdFx0dHlwZU9ySW5zdGFuY2UsXG5cdFx0XHRcdG92ZXJyaWRlLFxuXHRcdFx0fSk7XG5cblx0cHJpdmF0ZSByZWdpc3Rlck1hbnkoXG5cdFx0b3ZlcnJpZGU6IGJvb2xlYW4sXG5cdFx0c2NvcGVPclR5cGU6IFNjb3BlIHwgQ29uc3RydWN0YWJsZSxcblx0XHR0eXBlczogQ29uc3RydWN0YWJsZVtdLFxuXHQpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW10ge1xuXHRcdGNvbnN0IGJpbmQgPSB0aGlzLnJlZ2lzdGVyKG92ZXJyaWRlKTtcblx0XHRjb25zdCBpc1Njb3BlID0gdHlwZW9mIHNjb3BlT3JUeXBlICE9PSBcImZ1bmN0aW9uXCI7XG5cdFx0Y29uc3Qgc2NvcGUgPSBpc1Njb3BlID8gc2NvcGVPclR5cGUgOiBTY29wZXMudHJhbnNpZW50O1xuXHRcdGNvbnN0IGFsbFR5cGVzID0gaXNTY29wZSA/IHR5cGVzIDogW3Njb3BlT3JUeXBlLCAuLi50eXBlc107XG5cdFx0cmV0dXJuIGFsbFR5cGVzLm1hcCgodHlwZSkgPT4gYmluZChzY29wZSkodHlwZS5uYW1lLCB0eXBlKSk7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVJlZ2lzdHJhcihvdmVycmlkZTogYm9vbGVhbik6IENvbnRhaW5lclJlZ2lzdHJhciB7XG5cdFx0Y29uc3QgYmluZCA9IHRoaXMucmVnaXN0ZXIob3ZlcnJpZGUpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZWdpc3RlclR5cGU6ICh0eXBlLCBzY29wZSA9IFNjb3Blcy50cmFuc2llbnQpID0+IGJpbmQoc2NvcGUpKHR5cGUubmFtZSwgdHlwZSksXG5cdFx0XHRyZWdpc3RlclR5cGVzOiAoKHNjb3BlT3JUeXBlLCAuLi50eXBlcykgPT5cblx0XHRcdFx0dGhpcy5yZWdpc3Rlck1hbnkoXG5cdFx0XHRcdFx0b3ZlcnJpZGUsXG5cdFx0XHRcdFx0c2NvcGVPclR5cGUsXG5cdFx0XHRcdFx0dHlwZXMsXG5cdFx0XHRcdCkpIGFzIENvbnRhaW5lclJlZ2lzdHJhcltcInJlZ2lzdGVyVHlwZXNcIl0sXG5cdFx0XHRyZWdpc3RlclRyYW5zaWVudDogKCh0eXBlT3JLZXksIHR5cGU/KSA9PlxuXHRcdFx0XHRiaW5kKFNjb3Blcy50cmFuc2llbnQpKHR5cGVPcktleSwgdHlwZSkpIGFzIENvbnRhaW5lclJlZ2lzdHJhcltcInJlZ2lzdGVyVHJhbnNpZW50XCJdLFxuXHRcdFx0cmVnaXN0ZXJTaW5nbGV0b246ICgodHlwZU9yS2V5LCB0eXBlT3JJbnN0YW5jZT8pID0+XG5cdFx0XHRcdGJpbmQoU2NvcGVzLnNpbmdsZXRvbikoXG5cdFx0XHRcdFx0dHlwZU9yS2V5LFxuXHRcdFx0XHRcdHR5cGVPckluc3RhbmNlLFxuXHRcdFx0XHQpKSBhcyBDb250YWluZXJSZWdpc3RyYXJbXCJyZWdpc3RlclNpbmdsZXRvblwiXSxcblx0XHRcdHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDogKCh0eXBlT3JLZXksIHR5cGU/KSA9PlxuXHRcdFx0XHRiaW5kKFNjb3Blcy5yZXF1ZXN0KSh0eXBlT3JLZXksIHR5cGUpKSBhcyBDb250YWluZXJSZWdpc3RyYXJbXCJyZWdpc3RlclJlcXVlc3RTY29wZWRcIl0sXG5cdFx0fTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlNjb3BlcyIsIkNydWNpYmxlIiwiU2VydmljZVJlZ2lzdHJ5IiwiQ3J1Y2libGVCdWlsZGVyIiwic2VydmljZVJlZ2lzdHJ5Iiwib3B0aW9ucyIsIm92ZXJyaWRlIiwiY3JlYXRlUmVnaXN0cmFyIiwicmVnaXN0ZXJUeXBlIiwidHlwZSIsInNjb3BlIiwidHJhbnNpZW50IiwicmVnaXN0ZXIiLCJuYW1lIiwicmVnaXN0ZXJUeXBlcyIsInNjb3BlT3JUeXBlIiwidHlwZXMiLCJyZWdpc3Rlck1hbnkiLCJyZWdpc3RlclRyYW5zaWVudCIsInR5cGVPcktleSIsInJlZ2lzdGVyU2luZ2xldG9uIiwidHlwZU9ySW5zdGFuY2UiLCJzaW5nbGV0b24iLCJyZWdpc3RlclJlcXVlc3RTY29wZWQiLCJyZXF1ZXN0IiwiYnVpbGQiLCJiaW5kIiwiaXNTY29wZSIsImFsbFR5cGVzIiwibWFwIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxNQUFNLFFBQVEsY0FBYztBQUdyQyxTQUFTQyxRQUFRLFFBQVEsZ0JBQWdCO0FBRXpDLFNBQVNDLGVBQWUsUUFBUSx3QkFBd0I7QUFXeEQsT0FBTyxNQUFNQztJQUNKQyxnQkFBaUM7SUFDekMsWUFBbUJDLE9BQWlDLENBQUU7UUFDckQs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
@@ -8,6 +8,7 @@ export class Crucible {
8
8
  key;
9
9
  instances = new Map();
10
10
  serviceRegistry;
11
+ parent;
11
12
  rootScope;
12
13
  scopes = new Map();
13
14
  logger = scribe.logger(Crucible.name);
@@ -16,7 +17,8 @@ export class Crucible {
16
17
  this.key = options?.key;
17
18
  this.serviceRegistry = new ServiceRegistry(options?.serviceRegistry);
18
19
  this.registerLifetimeScope();
19
- this.rootScope = options?.rootScope ?? this;
20
+ this.parent = options?.parent;
21
+ this.rootScope = options?.parent?.rootScope ?? this;
20
22
  }
21
23
  resolveMany(resolveRequest) {
22
24
  const key = new RegistrationKey(resolveRequest);
@@ -42,28 +44,41 @@ export class Crucible {
42
44
  return service;
43
45
  }
44
46
  beginScope(name) {
45
- if (this.scopes.has(name)) {
47
+ if (this.isDisposed) {
48
+ throw new Error("This container has been disposed");
49
+ }
50
+ if (name != null && this.scopes.has(name)) {
46
51
  throw new DuplicateScopeError(`Cannot create duplicate scope. Scope with ${name} is already created and has not been disposed.`);
47
52
  }
48
53
  const scope = new Crucible({
49
54
  key: name,
50
55
  serviceRegistry: this.serviceRegistry,
51
- rootScope: this
56
+ parent: this
52
57
  });
53
- this.scopes.set(name, scope);
58
+ if (name != null) {
59
+ this.scopes.set(name, scope);
60
+ }
54
61
  return scope;
55
62
  }
56
63
  [Symbol.dispose]() {
57
64
  if (this.isDisposed) {
58
65
  return;
59
66
  }
60
- this.dispose();
67
+ this.disposeSync();
61
68
  }
62
- dispose() {
69
+ async [Symbol.asyncDispose]() {
70
+ if (this.isDisposed) {
71
+ return;
72
+ }
73
+ await this.disposeAsync();
74
+ }
75
+ disposeSync() {
63
76
  if (this.isDisposed) {
64
77
  return;
65
78
  }
66
79
  this.isDisposed = true;
80
+ this.parent?.releaseScope(this.key);
81
+ this.scopes.clear();
67
82
  for (const [, inst] of this.instances){
68
83
  if (inst === this) {
69
84
  continue;
@@ -71,6 +86,24 @@ export class Crucible {
71
86
  inst[Symbol.dispose]?.();
72
87
  }
73
88
  }
89
+ async disposeAsync() {
90
+ if (this.isDisposed) {
91
+ return;
92
+ }
93
+ this.isDisposed = true;
94
+ this.parent?.releaseScope(this.key);
95
+ this.scopes.clear();
96
+ for (const [, inst] of this.instances){
97
+ if (inst === this) {
98
+ continue;
99
+ }
100
+ if (Symbol.asyncDispose in inst) {
101
+ await inst[Symbol.asyncDispose]();
102
+ } else {
103
+ inst[Symbol.dispose]?.();
104
+ }
105
+ }
106
+ }
74
107
  getRegistrationFrom(key) {
75
108
  const registration = this.serviceRegistry.getRegistration(key.value);
76
109
  return registration;
@@ -88,7 +121,7 @@ export class Crucible {
88
121
  }
89
122
  getOrCreateInstance(registration) {
90
123
  if (this.isDisposed) {
91
- throw new Error("This continer has been disposed");
124
+ throw new Error("This container has been disposed");
92
125
  }
93
126
  const { key, type, isInstance } = registration;
94
127
  const cacheKey = isInstance ? key.value : type;
@@ -122,12 +155,18 @@ export class Crucible {
122
155
  }
123
156
  return resolved;
124
157
  }
158
+ releaseScope(name) {
159
+ if (name == null) {
160
+ return;
161
+ }
162
+ this.scopes.delete(name);
163
+ }
125
164
  registerLifetimeScope() {
126
- this.serviceRegistry.registerType(Scopes.request, {
165
+ this.serviceRegistry.replaceType(Scopes.request, {
127
166
  typeOrKey: LifetimeScopeToken,
128
167
  typeOrInstance: this
129
168
  });
130
169
  }
131
170
  }
132
171
 
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHR0eXBlIENvbnN0cnVjdGFibGUsXG5cdHR5cGUgRnVuY3Rpb25UeXBlLFxuXHRnZXRNZXRhLFxuXHRpc0FycmF5VHlwZSxcblx0aXNDb25zdHJ1Y3RhYmxlLFxuXHRSZWZsZWN0aW9uTWV0YSxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhLCBMaWZldGltZVNjb3BlVG9rZW4sIFNjb3BlcyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25NZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbktleSB9IGZyb20gXCIuLi9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVnaXN0cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZXJ2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRHVwbGljYXRlU2NvcGVFcnJvciwgUmVzb2x2ZUVycm9yIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGFpbmVyLCBMaWZldGltZVNjb3BlLCBSZXNvbHZlUmVxdWVzdCB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENydWNpYmxlT3B0aW9ucyA9IHtcblx0a2V5Pzogc3RyaW5nO1xuXHRyb290U2NvcGU/OiBDcnVjaWJsZTtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGUgaW1wbGVtZW50cyBJQ29udGFpbmVyIHtcblx0cHVibGljIGtleTogc3RyaW5nO1xuXHRwcm90ZWN0ZWQgaW5zdGFuY2VzID0gbmV3IE1hcDx1bmtub3duLCBvYmplY3Q+KCk7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHByaXZhdGUgcm9vdFNjb3BlOiBDcnVjaWJsZTtcblx0cHJpdmF0ZSBzY29wZXMgPSBuZXcgTWFwPHN0cmluZywgTGlmZXRpbWVTY29wZT4oKTtcblx0cHJpdmF0ZSBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKENydWNpYmxlLm5hbWUpO1xuXHRwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDcnVjaWJsZU9wdGlvbnMpIHtcblx0XHR0aGlzLmtleSA9IG9wdGlvbnM/LmtleTtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG5ldyBTZXJ2aWNlUmVnaXN0cnkob3B0aW9ucz8uc2VydmljZVJlZ2lzdHJ5KTtcblx0XHR0aGlzLnJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpO1xuXHRcdHRoaXMucm9vdFNjb3BlID0gb3B0aW9ucz8ucm9vdFNjb3BlID8/IHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZU1hbnk8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ocmVzb2x2ZVJlcXVlc3Q6IFJlc29sdmVSZXF1ZXN0PFQ+KTogVFtdIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb25zID0gdGhpcy5nZXRSZWdpc3RyYXRpb25Gcm9tKGtleSkgPz8gW107XG5cblx0XHRjb25zdCBzZXJ2aWNlcyA9IEFycmF5Lm9mPFQ+KCk7XG5cdFx0Zm9yIChjb25zdCByZWdpc3RyYXRpb24gb2YgcmVnaXN0cmF0aW9ucykge1xuXHRcdFx0Y29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVJlZ2lzdHJhdGlvbjxUPihyZWdpc3RyYXRpb24pO1xuXHRcdFx0c2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlcnZpY2VzO1xuXHR9XG5cblx0cHVibGljIHJlc29sdmU8VCBleHRlbmRzIG9iamVjdCB8IG9iamVjdFtdPihyZXNvbHZlUmVxdWVzdDogUmVzb2x2ZVJlcXVlc3Q8VD4pOiBUIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmdldFJlZ2lzdHJhdGlvbkZyb20oa2V5KTtcblx0XHRpZiAocmVnaXN0cmF0aW9uID09IG51bGwpIHtcblx0XHRcdHRoaXMubG9nZ2VyLndhcm4oYENhbm5vdCByZXNvbHZlIGRlcGVuZGVuY3kgJHtrZXkudG9TdHJpbmcoKX1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChyZWdpc3RyYXRpb24ubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhyb3cgbmV3IFJlc29sdmVFcnJvcihcblx0XHRcdFx0YFRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyByZWdpc3RlcmVkIHdpdGgga2V5ICR7a2V5LnRvU3RyaW5nKCl9LiBVc2UgcmVzb2x2ZU1hbnkgdG8gcmVzb2x2ZSBhbGwgaW1wbGVtZW50YXRpb25zLmAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlcnZpY2UgPSB0aGlzLnJlc29sdmVSZWdpc3RyYXRpb248VD4ocmVnaXN0cmF0aW9uWzBdKTtcblx0XHRyZXR1cm4gc2VydmljZTtcblx0fVxuXG5cdHB1YmxpYyBiZWdpblNjb3BlKG5hbWU/OiBzdHJpbmcpIHtcblx0XHRpZiAodGhpcy5zY29wZXMuaGFzKG5hbWUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRHVwbGljYXRlU2NvcGVFcnJvcihcblx0XHRcdFx0YENhbm5vdCBjcmVhdGUgZHVwbGljYXRlIHNjb3BlLiBTY29wZSB3aXRoICR7bmFtZX0gaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBoYXMgbm90IGJlZW4gZGlzcG9zZWQuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2NvcGUgPSBuZXcgQ3J1Y2libGUoe1xuXHRcdFx0a2V5OiBuYW1lLFxuXHRcdFx0c2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSxcblx0XHRcdHJvb3RTY29wZTogdGhpcyxcblx0XHR9KTtcblxuXHRcdHRoaXMuc2NvcGVzLnNldChuYW1lLCBzY29wZSk7XG5cdFx0cmV0dXJuIHNjb3BlO1xuXHR9XG5cblx0cHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0XHRmb3IgKGNvbnN0IFssIGluc3RdIG9mIHRoaXMuaW5zdGFuY2VzKSB7XG5cdFx0XHRpZiAoaW5zdCA9PT0gdGhpcykge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGluc3RbU3ltYm9sLmRpc3Bvc2VdPy4oKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldFJlZ2lzdHJhdGlvbkZyb20oa2V5OiBSZWdpc3RyYXRpb25LZXkpIHtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnNlcnZpY2VSZWdpc3RyeS5nZXRSZWdpc3RyYXRpb24oa2V5LnZhbHVlKTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUmVnaXN0cmF0aW9uPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGNvbnN0IHsgc2NvcGUgfSA9IHJlZ2lzdHJhdGlvbjtcblx0XHRzd2l0Y2ggKHNjb3BlKSB7XG5cdFx0XHRjYXNlIFNjb3Blcy50cmFuc2llbnQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRjYXNlIFNjb3Blcy5zaW5nbGV0b246XG5cdFx0XHRcdHJldHVybiB0aGlzLnJvb3RTY29wZS5nZXRPckNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRjYXNlIFNjb3Blcy5yZXF1ZXN0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRPckNyZWF0ZUluc3RhbmNlPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udGluZXIgaGFzIGJlZW4gZGlzcG9zZWRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHsga2V5LCB0eXBlLCBpc0luc3RhbmNlIH0gPSByZWdpc3RyYXRpb247XG5cdFx0Y29uc3QgY2FjaGVLZXkgPSBpc0luc3RhbmNlID8ga2V5LnZhbHVlIDogdHlwZTtcblx0XHRjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGNhY2hlS2V5KTtcblx0XHRpZiAoZXhpc3RpbmdJbnN0YW5jZSAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZXhpc3RpbmdJbnN0YW5jZSBhcyBUO1xuXHRcdH1cblxuXHRcdGNvbnN0IGluc3RhbmNlID0gaXNJbnN0YW5jZSA/ICh0eXBlIGFzIFQpIDogdGhpcy5jcmVhdGVJbnN0YW5jZTxUPihyZWdpc3RyYXRpb24pO1xuXHRcdHRoaXMuaW5zdGFuY2VzLnNldChjYWNoZUtleSwgaW5zdGFuY2UpO1xuXHRcdHJldHVybiBpbnN0YW5jZTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlSW5zdGFuY2U8VCBleHRlbmRzIG9iamVjdD4ocmVnaXN0cmF0aW9uOiBTZXJ2aWNlUmVnaXN0cmF0aW9uKTogVCB7XG5cdFx0Y29uc3QgdHlwZSA9IHJlZ2lzdHJhdGlvbi50eXBlIGFzIENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGU7XG5cdFx0Y29uc3QgY2FuQ29uc3RydWN0ID0gaXNDb25zdHJ1Y3RhYmxlKHR5cGUpO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLnJlc29sdmVEZXBlbmRlbmNpZXModHlwZSk7XG5cdFx0Y29uc3QgaW5zdCA9IChjYW5Db25zdHJ1Y3QgPyBuZXcgdHlwZSguLi5kZXBzKSA6IHR5cGUoKSkgYXMgVDtcblx0XHRyZXR1cm4gaW5zdDtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZURlcGVuZGVuY2llcyh0eXBlOiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlKTogdW5rbm93bltdIHtcblx0XHRjb25zdCBwYXJhbXMgPSBnZXRNZXRhPEFycmF5PENvbnN0cnVjdGFibGU+PihSZWZsZWN0aW9uTWV0YS5wYXJhbXR5cGVzLCB0eXBlKSA/PyBbXTtcblxuXHRcdGNvbnN0IGluamVjdFRva2VucyA9XG5cdFx0XHRnZXRNZXRhPEluamVjdGlvbk1ldGFkYXRhPihDcnVjaWJsZU1ldGEuaW5qZWN0dG9rZW4sIHR5cGUpID8/IG5ldyBNYXAoKTtcblxuXHRcdC8vVE9ETzogcHV0IGEgdHJ5IGNhdGNoIGhlcmUgc28gd2UgY2FuIHRocm93IHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG5cdFx0bGV0IHJlc29sdmVkID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHRva2VuID0gaW5qZWN0VG9rZW5zLmdldChpKT8ua2V5ID8/IHBhcmFtc1tpXS5uYW1lO1xuXHRcdFx0Y29uc3QgZGVwID0gaXNBcnJheVR5cGUocGFyYW1zW2ldKSA/IHRoaXMucmVzb2x2ZU1hbnkodG9rZW4pIDogdGhpcy5yZXNvbHZlKHRva2VuKTtcblx0XHRcdHJlc29sdmVkID0gWy4uLnJlc29sdmVkLCBkZXBdO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpIHtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeS5yZWdpc3RlclR5cGUoU2NvcGVzLnJlcXVlc3QsIHtcblx0XHRcdHR5cGVPcktleTogTGlmZXRpbWVTY29wZVRva2VuLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHRoaXMsXG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJnZXRNZXRhIiwiaXNBcnJheVR5cGUiLCJpc0NvbnN0cnVjdGFibGUiLCJSZWZsZWN0aW9uTWV0YSIsInNjcmliZSIsIkNydWNpYmxlTWV0YSIsIkxpZmV0aW1lU2NvcGVUb2tlbiIsIlNjb3BlcyIsIlJlZ2lzdHJhdGlvbktleSIsIkR1cGxpY2F0ZVNjb3BlRXJyb3IiLCJSZXNvbHZlRXJyb3IiLCJTZXJ2aWNlUmVnaXN0cnkiLCJDcnVjaWJsZSIsImtleSIsImluc3RhbmNlcyIsIk1hcCIsInNlcnZpY2VSZWdpc3RyeSIsInJvb3RTY29wZSIsInNjb3BlcyIsImxvZ2dlciIsIm5hbWUiLCJpc0Rpc3Bvc2VkIiwib3B0aW9ucyIsInJlZ2lzdGVyTGlmZXRpbWVTY29wZSIsInJlc29sdmVNYW55IiwicmVzb2x2ZVJlcXVlc3QiLCJyZWdpc3RyYXRpb25zIiwiZ2V0UmVnaXN0cmF0aW9uRnJvbSIsInNlcnZpY2VzIiwiQXJyYXkiLCJvZiIsInJlZ2lzdHJhdGlvbiIsInNlcnZpY2UiLCJyZXNvbHZlUmVnaXN0cmF0aW9uIiwicHVzaCIsInJlc29sdmUiLCJ3YXJuIiwidG9TdHJpbmciLCJsZW5ndGgiLCJiZWdpblNjb3BlIiwiaGFzIiwic2NvcGUiLCJzZXQiLCJTeW1ib2wiLCJkaXNwb3NlIiwiaW5zdCIsImdldFJlZ2lzdHJhdGlvbiIsInZhbHVlIiwidHJhbnNpZW50IiwiY3JlYXRlSW5zdGFuY2UiLCJzaW5nbGV0b24iLCJnZXRPckNyZWF0ZUluc3RhbmNlIiwicmVxdWVzdCIsIkVycm9yIiwidHlwZSIsImlzSW5zdGFuY2UiLCJjYWNoZUtleSIsImV4aXN0aW5nSW5zdGFuY2UiLCJnZXQiLCJpbnN0YW5jZSIsImNhbkNvbnN0cnVjdCIsImRlcHMiLCJyZXNvbHZlRGVwZW5kZW5jaWVzIiwicGFyYW1zIiwicGFyYW10eXBlcyIsImluamVjdFRva2VucyIsImluamVjdHRva2VuIiwicmVzb2x2ZWQiLCJpIiwidG9rZW4iLCJkZXAiLCJyZWdpc3RlclR5cGUiLCJ0eXBlT3JLZXkiLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FHQ0EsT0FBTyxFQUNQQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsY0FBYyxRQUNSLDZCQUE2QjtBQUNwQyxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLFlBQVksRUFBRUMsa0JBQWtCLEVBQUVDLE1BQU0sUUFBUSxjQUFjO0FBRXZFLFNBQVNDLGVBQWUsUUFBUSxzQ0FBc0M7QUFFdEUsU0FBU0MsbUJBQW1CLEVBQUVDLFlBQVksUUFBUSxxQkFBcUI7QUFFdkUsU0FBU0MsZUFBZSxRQUFRLHdCQUF3QjtBQVF4RCxPQUFPLE1BQU1DO0lBQ0xDLElBQVk7SUFDVEMsWUFBWSxJQUFJQyxNQUF1QjtJQUN6Q0MsZ0JBQWlDO0lBQ2pDQyxVQUFvQjtJQUNwQkMsU0FBUyxJQUFJSCxNQUE2QjtJQUMxQ0ksU0FBU2YsT0FBT2UsTUFBTSxDQUFDUCxTQUFTUSxJQUFJLEVBQUU7SUFDdENDLGFBQWEsTUFBTTtJQUMzQixZQUFtQkMsT0FBeUIsQ0FBRTtRQUM3QyxJQUFJLENBQUNULEdBQUcsR0FBR1MsU0FBU1Q7UUFDcEIsSUFBSSxDQUFD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
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHR0eXBlIENvbnN0cnVjdGFibGUsXG5cdHR5cGUgRnVuY3Rpb25UeXBlLFxuXHRnZXRNZXRhLFxuXHRpc0FycmF5VHlwZSxcblx0aXNDb25zdHJ1Y3RhYmxlLFxuXHRSZWZsZWN0aW9uTWV0YSxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhLCBMaWZldGltZVNjb3BlVG9rZW4sIFNjb3BlcyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25NZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbktleSB9IGZyb20gXCIuLi9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVnaXN0cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZXJ2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRHVwbGljYXRlU2NvcGVFcnJvciwgUmVzb2x2ZUVycm9yIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGFpbmVyLCBMaWZldGltZVNjb3BlLCBSZXNvbHZlUmVxdWVzdCB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENydWNpYmxlT3B0aW9ucyA9IHtcblx0a2V5Pzogc3RyaW5nO1xuXHRwYXJlbnQ/OiBDcnVjaWJsZTtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGUgaW1wbGVtZW50cyBJQ29udGFpbmVyIHtcblx0cHVibGljIGtleTogc3RyaW5nO1xuXHRwcm90ZWN0ZWQgaW5zdGFuY2VzID0gbmV3IE1hcDx1bmtub3duLCBvYmplY3Q+KCk7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHByaXZhdGUgcGFyZW50PzogQ3J1Y2libGU7XG5cdHByaXZhdGUgcm9vdFNjb3BlOiBDcnVjaWJsZTtcblx0cHJpdmF0ZSBzY29wZXMgPSBuZXcgTWFwPHN0cmluZywgTGlmZXRpbWVTY29wZT4oKTtcblx0cHJpdmF0ZSBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKENydWNpYmxlLm5hbWUpO1xuXHRwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDcnVjaWJsZU9wdGlvbnMpIHtcblx0XHR0aGlzLmtleSA9IG9wdGlvbnM/LmtleTtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG5ldyBTZXJ2aWNlUmVnaXN0cnkob3B0aW9ucz8uc2VydmljZVJlZ2lzdHJ5KTtcblx0XHR0aGlzLnJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpO1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucz8ucGFyZW50O1xuXHRcdHRoaXMucm9vdFNjb3BlID0gb3B0aW9ucz8ucGFyZW50Py5yb290U2NvcGUgPz8gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlTWFueTxUIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PihyZXNvbHZlUmVxdWVzdDogUmVzb2x2ZVJlcXVlc3Q8VD4pOiBUW10ge1xuXHRcdGNvbnN0IGtleSA9IG5ldyBSZWdpc3RyYXRpb25LZXkocmVzb2x2ZVJlcXVlc3QpO1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbnMgPSB0aGlzLmdldFJlZ2lzdHJhdGlvbkZyb20oa2V5KSA/PyBbXTtcblxuXHRcdGNvbnN0IHNlcnZpY2VzID0gQXJyYXkub2Y8VD4oKTtcblx0XHRmb3IgKGNvbnN0IHJlZ2lzdHJhdGlvbiBvZiByZWdpc3RyYXRpb25zKSB7XG5cdFx0XHRjb25zdCBzZXJ2aWNlID0gdGhpcy5yZXNvbHZlUmVnaXN0cmF0aW9uPFQ+KHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRzZXJ2aWNlcy5wdXNoKHNlcnZpY2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VydmljZXM7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZTxUIGV4dGVuZHMgb2JqZWN0IHwgb2JqZWN0W10+KHJlc29sdmVSZXF1ZXN0OiBSZXNvbHZlUmVxdWVzdDxUPik6IFQge1xuXHRcdGNvbnN0IGtleSA9IG5ldyBSZWdpc3RyYXRpb25LZXkocmVzb2x2ZVJlcXVlc3QpO1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuZ2V0UmVnaXN0cmF0aW9uRnJvbShrZXkpO1xuXHRcdGlmIChyZWdpc3RyYXRpb24gPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5sb2dnZXIud2FybihgQ2Fubm90IHJlc29sdmUgZGVwZW5kZW5jeSAke2tleS50b1N0cmluZygpfWApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHJlZ2lzdHJhdGlvbi5sZW5ndGggPiAxKSB7XG5cdFx0XHR0aHJvdyBuZXcgUmVzb2x2ZUVycm9yKFxuXHRcdFx0XHRgVGhlcmUgYXJlIG11bHRpcGxlIHNlcnZpY2VzIHJlZ2lzdGVyZWQgd2l0aCBrZXkgJHtrZXkudG9TdHJpbmcoKX0uIFVzZSByZXNvbHZlTWFueSB0byByZXNvbHZlIGFsbCBpbXBsZW1lbnRhdGlvbnMuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVJlZ2lzdHJhdGlvbjxUPihyZWdpc3RyYXRpb25bMF0pO1xuXHRcdHJldHVybiBzZXJ2aWNlO1xuXHR9XG5cblx0cHVibGljIGJlZ2luU2NvcGUobmFtZT86IHN0cmluZykge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udGFpbmVyIGhhcyBiZWVuIGRpc3Bvc2VkXCIpO1xuXHRcdH1cblx0XHRpZiAobmFtZSAhPSBudWxsICYmIHRoaXMuc2NvcGVzLmhhcyhuYW1lKSkge1xuXHRcdFx0dGhyb3cgbmV3IER1cGxpY2F0ZVNjb3BlRXJyb3IoXG5cdFx0XHRcdGBDYW5ub3QgY3JlYXRlIGR1cGxpY2F0ZSBzY29wZS4gU2NvcGUgd2l0aCAke25hbWV9IGlzIGFscmVhZHkgY3JlYXRlZCBhbmQgaGFzIG5vdCBiZWVuIGRpc3Bvc2VkLmAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNjb3BlID0gbmV3IENydWNpYmxlKHtcblx0XHRcdGtleTogbmFtZSxcblx0XHRcdHNlcnZpY2VSZWdpc3RyeTogdGhpcy5zZXJ2aWNlUmVnaXN0cnksXG5cdFx0XHRwYXJlbnQ6IHRoaXMsXG5cdFx0fSk7XG5cblx0XHRpZiAobmFtZSAhPSBudWxsKSB7XG5cdFx0XHR0aGlzLnNjb3Blcy5zZXQobmFtZSwgc2NvcGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2NvcGU7XG5cdH1cblxuXHRwdWJsaWMgW1N5bWJvbC5kaXNwb3NlXSgpIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuZGlzcG9zZVN5bmMoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VBc3luYygpO1xuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlU3luYygpIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnBhcmVudD8ucmVsZWFzZVNjb3BlKHRoaXMua2V5KTtcblx0XHR0aGlzLnNjb3Blcy5jbGVhcigpO1xuXHRcdGZvciAoY29uc3QgWywgaW5zdF0gb2YgdGhpcy5pbnN0YW5jZXMpIHtcblx0XHRcdGlmIChpbnN0ID09PSB0aGlzKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aW5zdFtTeW1ib2wuZGlzcG9zZV0/LigpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUFzeW5jKCkge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMucGFyZW50Py5yZWxlYXNlU2NvcGUodGhpcy5rZXkpO1xuXHRcdHRoaXMuc2NvcGVzLmNsZWFyKCk7XG5cdFx0Zm9yIChjb25zdCBbLCBpbnN0XSBvZiB0aGlzLmluc3RhbmNlcykge1xuXHRcdFx0aWYgKGluc3QgPT09IHRoaXMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoU3ltYm9sLmFzeW5jRGlzcG9zZSBpbiBpbnN0KSB7XG5cdFx0XHRcdGF3YWl0IChpbnN0IGFzIEFzeW5jRGlzcG9zYWJsZSlbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdChpbnN0IGFzIFBhcnRpYWw8RGlzcG9zYWJsZT4pW1N5bWJvbC5kaXNwb3NlXT8uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZWdpc3RyYXRpb25Gcm9tKGtleTogUmVnaXN0cmF0aW9uS2V5KSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkuZ2V0UmVnaXN0cmF0aW9uKGtleS52YWx1ZSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVJlZ2lzdHJhdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRjb25zdCB7IHNjb3BlIH0gPSByZWdpc3RyYXRpb247XG5cdFx0c3dpdGNoIChzY29wZSkge1xuXHRcdFx0Y2FzZSBTY29wZXMudHJhbnNpZW50OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMuc2luZ2xldG9uOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5yb290U2NvcGUuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMucmVxdWVzdDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0T3JDcmVhdGVJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRhaW5lciBoYXMgYmVlbiBkaXNwb3NlZFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgeyBrZXksIHR5cGUsIGlzSW5zdGFuY2UgfSA9IHJlZ2lzdHJhdGlvbjtcblx0XHRjb25zdCBjYWNoZUtleSA9IGlzSW5zdGFuY2UgPyBrZXkudmFsdWUgOiB0eXBlO1xuXHRcdGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQoY2FjaGVLZXkpO1xuXHRcdGlmIChleGlzdGluZ0luc3RhbmNlICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBleGlzdGluZ0luc3RhbmNlIGFzIFQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5zdGFuY2UgPSBpc0luc3RhbmNlID8gKHR5cGUgYXMgVCkgOiB0aGlzLmNyZWF0ZUluc3RhbmNlPFQ+KHJlZ2lzdHJhdGlvbik7XG5cdFx0dGhpcy5pbnN0YW5jZXMuc2V0KGNhY2hlS2V5LCBpbnN0YW5jZSk7XG5cdFx0cmV0dXJuIGluc3RhbmNlO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRjb25zdCB0eXBlID0gcmVnaXN0cmF0aW9uLnR5cGUgYXMgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZTtcblx0XHRjb25zdCBjYW5Db25zdHJ1Y3QgPSBpc0NvbnN0cnVjdGFibGUodHlwZSk7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMucmVzb2x2ZURlcGVuZGVuY2llcyh0eXBlKTtcblx0XHRjb25zdCBpbnN0ID0gKGNhbkNvbnN0cnVjdCA/IG5ldyB0eXBlKC4uLmRlcHMpIDogdHlwZSgpKSBhcyBUO1xuXHRcdHJldHVybiBpbnN0O1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlRGVwZW5kZW5jaWVzKHR5cGU6IENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGUpOiB1bmtub3duW10ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IGdldE1ldGE8QXJyYXk8Q29uc3RydWN0YWJsZT4+KFJlZmxlY3Rpb25NZXRhLnBhcmFtdHlwZXMsIHR5cGUpID8/IFtdO1xuXG5cdFx0Y29uc3QgaW5qZWN0VG9rZW5zID1cblx0XHRcdGdldE1ldGE8SW5qZWN0aW9uTWV0YWRhdGE+KENydWNpYmxlTWV0YS5pbmplY3R0b2tlbiwgdHlwZSkgPz8gbmV3IE1hcCgpO1xuXG5cdFx0Ly9UT0RPOiBwdXQgYSB0cnkgY2F0Y2ggaGVyZSBzbyB3ZSBjYW4gdGhyb3cgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2Vcblx0XHRsZXQgcmVzb2x2ZWQgPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgdG9rZW4gPSBpbmplY3RUb2tlbnMuZ2V0KGkpPy5rZXkgPz8gcGFyYW1zW2ldLm5hbWU7XG5cdFx0XHRjb25zdCBkZXAgPSBpc0FycmF5VHlwZShwYXJhbXNbaV0pID8gdGhpcy5yZXNvbHZlTWFueSh0b2tlbikgOiB0aGlzLnJlc29sdmUodG9rZW4pO1xuXHRcdFx0cmVzb2x2ZWQgPSBbLi4ucmVzb2x2ZWQsIGRlcF07XG5cdFx0fVxuXHRcdHJldHVybiByZXNvbHZlZDtcblx0fVxuXG5cdHByaXZhdGUgcmVsZWFzZVNjb3BlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdGlmIChuYW1lID09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5zY29wZXMuZGVsZXRlKG5hbWUpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckxpZmV0aW1lU2NvcGUoKSB7XG5cdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVwbGFjZVR5cGUoU2NvcGVzLnJlcXVlc3QsIHtcblx0XHRcdHR5cGVPcktleTogTGlmZXRpbWVTY29wZVRva2VuLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHRoaXMsXG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJnZXRNZXRhIiwiaXNBcnJheVR5cGUiLCJpc0NvbnN0cnVjdGFibGUiLCJSZWZsZWN0aW9uTWV0YSIsInNjcmliZSIsIkNydWNpYmxlTWV0YSIsIkxpZmV0aW1lU2NvcGVUb2tlbiIsIlNjb3BlcyIsIlJlZ2lzdHJhdGlvbktleSIsIkR1cGxpY2F0ZVNjb3BlRXJyb3IiLCJSZXNvbHZlRXJyb3IiLCJTZXJ2aWNlUmVnaXN0cnkiLCJDcnVjaWJsZSIsImtleSIsImluc3RhbmNlcyIsIk1hcCIsInNlcnZpY2VSZWdpc3RyeSIsInBhcmVudCIsInJvb3RTY29wZSIsInNjb3BlcyIsImxvZ2dlciIsIm5hbWUiLCJpc0Rpc3Bvc2VkIiwib3B0aW9ucyIsInJlZ2lzdGVyTGlmZXRpbWVTY29wZSIsInJlc29sdmVNYW55IiwicmVzb2x2ZVJlcXVlc3QiLCJyZWdpc3RyYXRpb25zIiwiZ2V0UmVnaXN0cmF0aW9uRnJvbSIsInNlcnZpY2VzIiwiQXJyYXkiLCJvZiIsInJlZ2lzdHJhdGlvbiIsInNlcnZpY2UiLCJyZXNvbHZlUmVnaXN0cmF0aW9uIiwicHVzaCIsInJlc29sdmUiLCJ3YXJuIiwidG9TdHJpbmciLCJsZW5ndGgiLCJiZWdpblNjb3BlIiwiRXJyb3IiLCJoYXMiLCJzY29wZSIsInNldCIsIlN5bWJvbCIsImRpc3Bvc2UiLCJkaXNwb3NlU3luYyIsImFzeW5jRGlzcG9zZSIsImRpc3Bvc2VBc3luYyIsInJlbGVhc2VTY29wZSIsImNsZWFyIiwiaW5zdCIsImdldFJlZ2lzdHJhdGlvbiIsInZhbHVlIiwidHJhbnNpZW50IiwiY3JlYXRlSW5zdGFuY2UiLCJzaW5nbGV0b24iLCJnZXRPckNyZWF0ZUluc3RhbmNlIiwicmVxdWVzdCIsInR5cGUiLCJpc0luc3RhbmNlIiwiY2FjaGVLZXkiLCJleGlzdGluZ0luc3RhbmNlIiwiZ2V0IiwiaW5zdGFuY2UiLCJjYW5Db25zdHJ1Y3QiLCJkZXBzIiwicmVzb2x2ZURlcGVuZGVuY2llcyIsInBhcmFtcyIsInBhcmFtdHlwZXMiLCJpbmplY3RUb2tlbnMiLCJpbmplY3R0b2tlbiIsInJlc29sdmVkIiwiaSIsInRva2VuIiwiZGVwIiwiZGVsZXRlIiwicmVwbGFjZVR5cGUiLCJ0eXBlT3JLZXkiLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FHQ0EsT0FBTyxFQUNQQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsY0FBYyxRQUNSLDZCQUE2QjtBQUNwQyxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLFlBQVksRUFBRUMsa0JBQWtCLEVBQUVDLE1BQU0sUUFBUSxjQUFjO0FBRXZFLFNBQVNDLGVBQWUsUUFBUSxzQ0FBc0M7QUFFdEUsU0FBU0MsbUJBQW1CLEVBQUVDLFlBQVksUUFBUSxxQkFBcUI7QUFFdkUsU0FBU0MsZUFBZSxRQUFRLHdCQUF3QjtBQVF4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
@@ -1,5 +1,6 @@
1
1
  import { RegistrationKey } from "../models/registration-key.model.js";
2
2
  import { ServiceRegistration } from "../models/service-registration.model.js";
3
+ import { RegistrationError } from "../types/errors.js";
3
4
  export class ServiceRegistry {
4
5
  registrations;
5
6
  constructor(parent){
@@ -7,10 +8,22 @@ export class ServiceRegistry {
7
8
  }
8
9
  registerType(scope, options) {
9
10
  const registration = this.createRegistrationFrom(scope, options);
10
- const existingRegistration = this.getRegistrations(registration.key)?.filter((reg)=>!reg.isEqual(registration)) ?? [];
11
+ const existing = this.getRegistrations(registration.key) ?? [];
12
+ const duplicate = existing.find((reg)=>reg.isEqual(registration));
13
+ if (duplicate != null && !options.override) {
14
+ throw new RegistrationError(`A service is already registered for key ${registration.key}. Use builder.override.registerSingleton() (or the matching register* method) to replace it.`);
15
+ }
16
+ const remaining = existing.filter((reg)=>!reg.isEqual(registration));
11
17
  this.setRegistration(registration.key, [
12
18
  registration,
13
- ...existingRegistration
19
+ ...remaining
20
+ ]);
21
+ return registration;
22
+ }
23
+ replaceType(scope, options) {
24
+ const registration = this.createRegistrationFrom(scope, options);
25
+ this.setRegistration(registration.key, [
26
+ registration
14
27
  ]);
15
28
  return registration;
16
29
  }
@@ -37,4 +50,4 @@ export class ServiceRegistry {
37
50
  }
38
51
  }
39
52
 
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25LZXkgfSBmcm9tIFwiLi4vbW9kZWxzL3JlZ2lzdHJhdGlvbi1rZXkubW9kZWwuanNcIjtcbmltcG9ydCB7IFNlcnZpY2VSZWdpc3RyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3NlcnZpY2UtcmVnaXN0cmF0aW9uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjb3BlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFJlZ2lzdGVyVHlwZU9wdGlvbnMgPSB7XG5cdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZTtcblx0dHlwZU9ySW5zdGFuY2U/OiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlIHwgb2JqZWN0O1xufTtcblxuZXhwb3J0IGNsYXNzIFNlcnZpY2VSZWdpc3RyeSB7XG5cdHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmF0aW9uczogTWFwPHN0cmluZywgU2VydmljZVJlZ2lzdHJhdGlvbltdPjtcblx0cHVibGljIGNvbnN0cnVjdG9yKHBhcmVudD86IFNlcnZpY2VSZWdpc3RyeSkge1xuXHRcdHRoaXMucmVnaXN0cmF0aW9ucyA9IG5ldyBNYXAocGFyZW50Py5yZWdpc3RyYXRpb25zKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGUoc2NvcGU6IFNjb3BlLCBvcHRpb25zOiBSZWdpc3RlclR5cGVPcHRpb25zKSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5jcmVhdGVSZWdpc3RyYXRpb25Gcm9tKHNjb3BlLCBvcHRpb25zKTtcblx0XHRjb25zdCBleGlzdGluZ1JlZ2lzdHJhdGlvbiA9XG5cdFx0XHR0aGlzLmdldFJlZ2lzdHJhdGlvbnMocmVnaXN0cmF0aW9uLmtleSk/LmZpbHRlcigocmVnKSA9PiAhcmVnLmlzRXF1YWwocmVnaXN0cmF0aW9uKSkgPz9cblx0XHRcdFtdO1xuXG5cdFx0dGhpcy5zZXRSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uLmtleSwgW3JlZ2lzdHJhdGlvbiwgLi4uZXhpc3RpbmdSZWdpc3RyYXRpb25dKTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIGdldFJlZ2lzdHJhdGlvbihrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW10ge1xuXHRcdGNvbnN0IGtleVZhbCA9IG5ldyBSZWdpc3RyYXRpb25LZXkoa2V5KS52YWx1ZTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KGtleVZhbCk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUmVnaXN0cmF0aW9uRnJvbShzY29wZTogU2NvcGUsIG9wdGlvbnM6IFJlZ2lzdGVyVHlwZU9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHR5cGVPcktleSwgdHlwZU9ySW5zdGFuY2UgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgaXNLZXkgPSB0eXBlb2YgdHlwZU9yS2V5ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0eXBlT3JLZXkgPT09IFwic3ltYm9sXCI7XG5cdFx0Y29uc3QgaXNJbnN0YW5jZSA9IHR5cGVvZiB0eXBlT3JJbnN0YW5jZSA9PT0gXCJvYmplY3RcIjtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KCFpc0tleSA/IHR5cGVPcktleS5uYW1lIDogdHlwZU9yS2V5KTtcblx0XHRjb25zdCB0eXBlID0gaXNJbnN0YW5jZSA/IHR5cGVPckluc3RhbmNlIDogaXNLZXkgPyB0eXBlT3JJbnN0YW5jZSA6IHR5cGVPcktleTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSBuZXcgU2VydmljZVJlZ2lzdHJhdGlvbihrZXksIHR5cGUsIHNjb3BlLCBpc0luc3RhbmNlKTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZWdpc3RyYXRpb25zKGtleTogUmVnaXN0cmF0aW9uS2V5KSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBrZXkudmFsdWU7XG5cdFx0cmV0dXJuIHRoaXMucmVnaXN0cmF0aW9ucy5nZXQodmFsdWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRSZWdpc3RyYXRpb24oa2V5OiBSZWdpc3RyYXRpb25LZXksIHJlZ2lzdHJhdGlvbnM6IFNlcnZpY2VSZWdpc3RyYXRpb25bXSkge1xuXHRcdHRoaXMucmVnaXN0cmF0aW9ucy5zZXQoa2V5LnZhbHVlLCByZWdpc3RyYXRpb25zKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlJlZ2lzdHJhdGlvbktleSIsIlNlcnZpY2VSZWdpc3RyYXRpb24iLCJTZXJ2aWNlUmVnaXN0cnkiLCJyZWdpc3RyYXRpb25zIiwicGFyZW50IiwiTWFwIiwicmVnaXN0ZXJUeXBlIiwic2NvcGUiLCJvcHRpb25zIiwicmVnaXN0cmF0aW9uIiwiY3JlYXRlUmVnaXN0cmF0aW9uRnJvbSIsImV4aXN0aW5nUmVnaXN0cmF0aW9uIiwiZ2V0UmVnaXN0cmF0aW9ucyIsImtleSIsImZpbHRlciIsInJlZyIsImlzRXF1YWwiLCJzZXRSZWdpc3RyYXRpb24iLCJnZXRSZWdpc3RyYXRpb24iLCJrZXlWYWwiLCJ2YWx1ZSIsImdldCIsInR5cGVPcktleSIsInR5cGVPckluc3RhbmNlIiwiaXNLZXkiLCJpc0luc3RhbmNlIiwibmFtZSIsInR5cGUiLCJzZXQiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLGVBQWUsUUFBUSxzQ0FBc0M7QUFDdEUsU0FBU0MsbUJBQW1CLFFBQVEsMENBQTBDO0FBUTlFLE9BQU8sTUFBTUM7SUFDS0MsY0FBa0Q7SUFDbkUsWUFBbUJDLE1BQXdCLENBQUU7UUFDNUMsSUFBSSxDQUFDRCxhQUFhLEdBQUcsSUFBSUUsSUFBSUQsUUFBUUQ7SUFDdEM7SUFFT0csYUFBYUMsS0FBWSxFQUFFQyxPQUE0QixFQUFFO1FBQy9ELE1BQU1DLGVBQWUsSUFBSSxDQUFDQyxzQkFBc0IsQ0FBQ0gsT0FBT0M7UUFDeEQsTUFBTUcsdUJBQ0wsSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ0gsYUFBYUksR0FBRyxHQUFHQyxPQUFPLENBQUNDLE1BQVEsQ0FBQ0EsSUFBSUMsT0FBTyxDQUFDUCxrQkFDdEUsRUFBRTtRQUVILElBQUksQ0FBQ1EsZUFBZSxDQUFDUixhQUFhSSxHQUFHLEVBQUU7WUFBQ0o7ZUFBaUJFO1NBQXFCO1FBQzlFLE9BQU9GO0lBQ1I7SUFFT1MsZ0JBQWdCTCxHQUFvQyxFQUF5QjtRQUNuRixNQUFNTSxTQUFTLElBQUluQixnQkFBZ0JhLEtBQUtPLEtBQUs7UUFDN0MsTUFBTVgsZUFBZSxJQUFJLENBQUNOLGFBQWEsQ0FBQ2tCLEdBQUcsQ0FBQ0Y7UUFDNUMsT0FBT1Y7SUFDUjtJQUVRQyx1QkFBdUJILEtBQVksRUFBRUMsT0FBNEIsRUFBRTtRQUMxRSxNQUFNLEVBQUVjLFNBQVMsRUFBRUMsY0FBYyxFQUFFLEdBQUdmO1FBQ3RDLE1BQU1nQixRQUFRLE9BQU9GLGNBQWMsWUFBWSxPQUFPQSxjQUFjO1FBQ3BFLE1BQU1HLGFBQWEsT0FBT0YsbUJBQW1CO1FBQzdDLE1BQU1WLE1BQU0sSUFBSWIsZ0JBQWdCLENBQUN3QixRQUFRRixVQUFVSSxJQUFJLEdBQUdKO1FBQzFELE1BQU1LLE9BQU9GLGFBQWFGLGlCQUFpQkMsUUFBUUQsaUJBQWlCRDtRQUNwRSxNQUFNYixlQUFlLElBQUlSLG9CQUFvQlksS0FBS2MsTUFBTXBCLE9BQU9rQjtRQUMvRCxPQUFPaEI7SUFDUjtJQUVRRyxpQkFBaUJDLEdBQW9CLEVBQUU7UUFDOUMsTUFBTU8sUUFBUVAsSUFBSU8sS0FBSztRQUN2QixPQUFPLElBQUksQ0FBQ2pCLGFBQWEsQ0FBQ2tCLEdBQUcsQ0FBQ0Q7SUFDL0I7SUFFUUgsZ0JBQWdCSixHQUFvQixFQUFFVixhQUFvQyxFQUFFO1FBQ25GLElBQUksQ0FBQ0EsYUFBYSxDQUFDeUIsR0FBRyxDQUFDZixJQUFJTyxLQUFLLEVBQUVqQjtJQUNuQztBQUNEIn0=
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25LZXkgfSBmcm9tIFwiLi4vbW9kZWxzL3JlZ2lzdHJhdGlvbi1rZXkubW9kZWwuanNcIjtcbmltcG9ydCB7IFNlcnZpY2VSZWdpc3RyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3NlcnZpY2UtcmVnaXN0cmF0aW9uLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi90eXBlcy9lcnJvcnMuanNcIjtcbmltcG9ydCB0eXBlIHsgU2NvcGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXMuanNcIjtcblxuZXhwb3J0IHR5cGUgUmVnaXN0ZXJUeXBlT3B0aW9ucyA9IHtcblx0dHlwZU9yS2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlO1xuXHR0eXBlT3JJbnN0YW5jZT86IENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGUgfCBvYmplY3Q7XG5cdG92ZXJyaWRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUmVnaXN0cnkge1xuXHRwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvbnM6IE1hcDxzdHJpbmcsIFNlcnZpY2VSZWdpc3RyYXRpb25bXT47XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBTZXJ2aWNlUmVnaXN0cnkpIHtcblx0XHR0aGlzLnJlZ2lzdHJhdGlvbnMgPSBuZXcgTWFwKHBhcmVudD8ucmVnaXN0cmF0aW9ucyk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJUeXBlKHNjb3BlOiBTY29wZSwgb3B0aW9uczogUmVnaXN0ZXJUeXBlT3B0aW9ucykge1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuY3JlYXRlUmVnaXN0cmF0aW9uRnJvbShzY29wZSwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFJlZ2lzdHJhdGlvbnMocmVnaXN0cmF0aW9uLmtleSkgPz8gW107XG5cdFx0Y29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmcuZmluZCgocmVnKSA9PiByZWcuaXNFcXVhbChyZWdpc3RyYXRpb24pKTtcblx0XHRpZiAoZHVwbGljYXRlICE9IG51bGwgJiYgIW9wdGlvbnMub3ZlcnJpZGUpIHtcblx0XHRcdHRocm93IG5ldyBSZWdpc3RyYXRpb25FcnJvcihcblx0XHRcdFx0YEEgc2VydmljZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIGtleSAke3JlZ2lzdHJhdGlvbi5rZXl9LiBVc2UgYnVpbGRlci5vdmVycmlkZS5yZWdpc3RlclNpbmdsZXRvbigpIChvciB0aGUgbWF0Y2hpbmcgcmVnaXN0ZXIqIG1ldGhvZCkgdG8gcmVwbGFjZSBpdC5gLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCByZW1haW5pbmcgPSBleGlzdGluZy5maWx0ZXIoKHJlZykgPT4gIXJlZy5pc0VxdWFsKHJlZ2lzdHJhdGlvbikpO1xuXHRcdHRoaXMuc2V0UmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbi5rZXksIFtyZWdpc3RyYXRpb24sIC4uLnJlbWFpbmluZ10pO1xuXHRcdHJldHVybiByZWdpc3RyYXRpb247XG5cdH1cblxuXHRwdWJsaWMgcmVwbGFjZVR5cGUoc2NvcGU6IFNjb3BlLCBvcHRpb25zOiBSZWdpc3RlclR5cGVPcHRpb25zKSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5jcmVhdGVSZWdpc3RyYXRpb25Gcm9tKHNjb3BlLCBvcHRpb25zKTtcblx0XHR0aGlzLnNldFJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24ua2V5LCBbcmVnaXN0cmF0aW9uXSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZWdpc3RyYXRpb24oa2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbltdIHtcblx0XHRjb25zdCBrZXlWYWwgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KGtleSkudmFsdWU7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZWdpc3RyYXRpb25zLmdldChrZXlWYWwpO1xuXHRcdHJldHVybiByZWdpc3RyYXRpb247XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVJlZ2lzdHJhdGlvbkZyb20oc2NvcGU6IFNjb3BlLCBvcHRpb25zOiBSZWdpc3RlclR5cGVPcHRpb25zKSB7XG5cdFx0Y29uc3QgeyB0eXBlT3JLZXksIHR5cGVPckluc3RhbmNlIH0gPSBvcHRpb25zO1xuXHRcdGNvbnN0IGlzS2V5ID0gdHlwZW9mIHR5cGVPcktleSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdHlwZU9yS2V5ID09PSBcInN5bWJvbFwiO1xuXHRcdGNvbnN0IGlzSW5zdGFuY2UgPSB0eXBlb2YgdHlwZU9ySW5zdGFuY2UgPT09IFwib2JqZWN0XCI7XG5cdFx0Y29uc3Qga2V5ID0gbmV3IFJlZ2lzdHJhdGlvbktleSghaXNLZXkgPyB0eXBlT3JLZXkubmFtZSA6IHR5cGVPcktleSk7XG5cdFx0Y29uc3QgdHlwZSA9IGlzSW5zdGFuY2UgPyB0eXBlT3JJbnN0YW5jZSA6IGlzS2V5ID8gdHlwZU9ySW5zdGFuY2UgOiB0eXBlT3JLZXk7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gbmV3IFNlcnZpY2VSZWdpc3RyYXRpb24oa2V5LCB0eXBlLCBzY29wZSwgaXNJbnN0YW5jZSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UmVnaXN0cmF0aW9ucyhrZXk6IFJlZ2lzdHJhdGlvbktleSkge1xuXHRcdGNvbnN0IHZhbHVlID0ga2V5LnZhbHVlO1xuXHRcdHJldHVybiB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KHZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgc2V0UmVnaXN0cmF0aW9uKGtleTogUmVnaXN0cmF0aW9uS2V5LCByZWdpc3RyYXRpb25zOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW10pIHtcblx0XHR0aGlzLnJlZ2lzdHJhdGlvbnMuc2V0KGtleS52YWx1ZSwgcmVnaXN0cmF0aW9ucyk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJSZWdpc3RyYXRpb25LZXkiLCJTZXJ2aWNlUmVnaXN0cmF0aW9uIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJTZXJ2aWNlUmVnaXN0cnkiLCJyZWdpc3RyYXRpb25zIiwicGFyZW50IiwiTWFwIiwicmVnaXN0ZXJUeXBlIiwic2NvcGUiLCJvcHRpb25zIiwicmVnaXN0cmF0aW9uIiwiY3JlYXRlUmVnaXN0cmF0aW9uRnJvbSIsImV4aXN0aW5nIiwiZ2V0UmVnaXN0cmF0aW9ucyIsImtleSIsImR1cGxpY2F0ZSIsImZpbmQiLCJyZWciLCJpc0VxdWFsIiwib3ZlcnJpZGUiLCJyZW1haW5pbmciLCJmaWx0ZXIiLCJzZXRSZWdpc3RyYXRpb24iLCJyZXBsYWNlVHlwZSIsImdldFJlZ2lzdHJhdGlvbiIsImtleVZhbCIsInZhbHVlIiwiZ2V0IiwidHlwZU9yS2V5IiwidHlwZU9ySW5zdGFuY2UiLCJpc0tleSIsImlzSW5zdGFuY2UiLCJuYW1lIiwidHlwZSIsInNldCJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsZUFBZSxRQUFRLHNDQUFzQztBQUN0RSxTQUFTQyxtQkFBbUIsUUFBUSwwQ0FBMEM7QUFDOUUsU0FBU0MsaUJBQWlCLFFBQVEscUJBQXFCO0FBU3ZELE9BQU8sTUFBTUM7SUFDS0MsY0FBa0Q7SUFDbkUsWUFBbUJDLE1BQXdCLENBQUU7UUFDNUMsSUFBSSxDQUFDRCxhQUFhLEdBQUcsSUFBSUUsSUFBSUQsUUFBUUQ7SUFDdEM7SUFFT0csYUFBYUMsS0FBWSxFQUFFQyxPQUE0QixFQUFFO1FBQy9ELE1BQU1DLGVBQWUsSUFBSSxDQUFDQyxzQkFBc0IsQ0FBQ0gsT0FBT0M7UUFDeEQsTUFBTUcsV0FBVyxJQUFJLENBQUNDLGdCQUFnQixDQUFDSCxhQUFhSSxHQUFHLEtBQUssRUFBRTtRQUM5RCxNQUFNQyxZQUFZSCxTQUFTSSxJQUFJLENBQUMsQ0FBQ0MsTUFBUUEsSUFBSUMsT0FBTyxDQUFDUjtRQUNyRCxJQUFJSyxhQUFhLFFBQVEsQ0FBQ04sUUFBUVUsUUFBUSxFQUFFO1lBQzNDLE1BQU0sSUFBSWpCLGtCQUNULENBQUMsd0NBQXdDLEVBQUVRLGFBQWFJLEdBQUcsQ0FBQyw0RkFBNEYsQ0FBQztRQUUzSjtRQUVBLE1BQU1NLFlBQVlSLFNBQVNTLE1BQU0sQ0FBQyxDQUFDSixNQUFRLENBQUNBLElBQUlDLE9BQU8sQ0FBQ1I7UUFDeEQsSUFBSSxDQUFDWSxlQUFlLENBQUNaLGFBQWFJLEdBQUcsRUFBRTtZQUFDSjtlQUFpQlU7U0FBVTtRQUNuRSxPQUFPVjtJQUNSO0lBRU9hLFlBQVlmLEtBQVksRUFBRUMsT0FBNEIsRUFBRTtRQUM5RCxNQUFNQyxlQUFlLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNILE9BQU9DO1FBQ3hELElBQUksQ0FBQ2EsZUFBZSxDQUFDWixhQUFhSSxHQUFHLEVBQUU7WUFBQ0o7U0FBYTtRQUNyRCxPQUFPQTtJQUNSO0lBRU9jLGdCQUFnQlYsR0FBb0MsRUFBeUI7UUFDbkYsTUFBTVcsU0FBUyxJQUFJekIsZ0JBQWdCYyxLQUFLWSxLQUFLO1FBQzdDLE1BQU1oQixlQUFlLElBQUksQ0FBQ04sYUFBYSxDQUFDdUIsR0FBRyxDQUFDRjtRQUM1QyxPQUFPZjtJQUNSO0lBRVFDLHVCQUF1QkgsS0FBWSxFQUFFQyxPQUE0QixFQUFFO1FBQzFFLE1BQU0sRUFBRW1CLFNBQVMsRUFBRUMsY0FBYyxFQUFFLEdBQUdwQjtRQUN0QyxNQUFNcUIsUUFBUSxPQUFPRixjQUFjLFlBQVksT0FBT0EsY0FBYztRQUNwRSxNQUFNRyxhQUFhLE9BQU9GLG1CQUFtQjtRQUM3QyxNQUFNZixNQUFNLElBQUlkLGdCQUFnQixDQUFDOEIsUUFBUUYsVUFBVUksSUFBSSxHQUFHSjtRQUMxRCxNQUFNSyxPQUFPRixhQUFhRixpQkFBaUJDLFFBQVFELGlCQUFpQkQ7UUFDcEUsTUFBTWxCLGVBQWUsSUFBSVQsb0JBQW9CYSxLQUFLbUIsTUFBTXpCLE9BQU91QjtRQUMvRCxPQUFPckI7SUFDUjtJQUVRRyxpQkFBaUJDLEdBQW9CLEVBQUU7UUFDOUMsTUFBTVksUUFBUVosSUFBSVksS0FBSztRQUN2QixPQUFPLElBQUksQ0FBQ3RCLGFBQWEsQ0FBQ3VCLEdBQUcsQ0FBQ0Q7SUFDL0I7SUFFUUosZ0JBQWdCUixHQUFvQixFQUFFVixhQUFvQyxFQUFFO1FBQ25GLElBQUksQ0FBQ0EsYUFBYSxDQUFDOEIsR0FBRyxDQUFDcEIsSUFBSVksS0FBSyxFQUFFdEI7SUFDbkM7QUFDRCJ9
@@ -1,3 +1,4 @@
1
+ export * from "./errors.js";
1
2
  export * from "./types.js";
2
3
 
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy90eXBlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi90eXBlcy5qc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSJ9
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy90eXBlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzLmpzXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjO0FBQzVCLGNBQWMsYUFBYSJ9
@@ -1,3 +1,3 @@
1
1
  export { };
2
2
 
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy90eXBlcy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7XG5cdENvbnRhaW5lckJ1aWxkZXIsXG5cdElDb250YWluZXIsXG5cdExpZmV0aW1lU2NvcGUsXG5cdFJlc29sdmVSZXF1ZXN0LFxuXHRTY29wZSxcblx0U2VydmljZVByb3ZpZGVyLFxufSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NvbXBvc2l0aW9uXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FPcUMifQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy90eXBlcy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7XG5cdENvbnRhaW5lckJ1aWxkZXIsXG5cdENvbnRhaW5lclJlZ2lzdHJhcixcblx0SUNvbnRhaW5lcixcblx0TGlmZXRpbWVTY29wZSxcblx0UmVzb2x2ZVJlcXVlc3QsXG5cdFNjb3BlLFxuXHRTZXJ2aWNlUHJvdmlkZXIsXG59IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY29tcG9zaXRpb25cIjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxXQVFxQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decohere/crucible",
3
- "version": "0.0.1-dev.7",
3
+ "version": "0.0.1-dev.71",
4
4
  "description": "Lightweight dependency injection container with decorator-based wiring",
5
5
  "keywords": [
6
6
  "typescript",
@@ -30,8 +30,8 @@
30
30
  "test": "echo \"Error: no test specified\" && exit 1"
31
31
  },
32
32
  "dependencies": {
33
- "@decohere/nexus": "0.0.1-dev.7",
34
- "@decohere/scribe": "0.0.1-dev.7"
33
+ "@decohere/nexus": "0.0.1-dev.71",
34
+ "@decohere/scribe": "0.0.1-dev.71"
35
35
  },
36
36
  "devDependencies": {}
37
37
  }
@@ -3,7 +3,7 @@ export declare const CrucibleMeta: {
3
3
  injecttoken: string;
4
4
  };
5
5
  export declare const Scopes: {
6
- request: string;
7
- singleton: string;
8
- transient: string;
6
+ request: "request";
7
+ singleton: "single-instance";
8
+ transient: "transient";
9
9
  };
@@ -1,5 +1,11 @@
1
+ import { type Constructable } from "@decohere/nexus/reflection";
1
2
  export type InjectionMetadata = Map<number, InjectionToken>;
2
3
  export type InjectionToken = {
3
- key: string | symbol;
4
+ key: string | symbol | Constructable;
4
5
  };
5
- export declare function inject(key: string | symbol): (target: object, _propertyKey: string | symbol | undefined, idx: number) => void;
6
+ /**
7
+ * Bind a constructor parameter to a registration key.
8
+ * A class uses `Class.name` (same key as `registerSingleton(Class)`).
9
+ * Prefer the class over a name string. Use a symbol or string when the key is not the class name.
10
+ */
11
+ export declare function inject(key: string | symbol | Constructable): (target: object, _propertyKey: string | symbol | undefined, idx: number) => void;
@@ -1,6 +1,6 @@
1
1
  import type { Constructable, FunctionType } from "@decohere/nexus/reflection";
2
2
  import type { ServiceRegistration } from "../models/service-registration.model.js";
3
- import type { ContainerBuilder, Scope } from "../types/types.js";
3
+ import type { ContainerBuilder, ContainerRegistrar, Scope } from "../types/types.js";
4
4
  import { Crucible } from "./crucible.js";
5
5
  import { ServiceRegistry } from "./service-registry.js";
6
6
  type ContainerBuilderOptions = {
@@ -9,6 +9,7 @@ type ContainerBuilderOptions = {
9
9
  export declare class CrucibleBuilder implements ContainerBuilder {
10
10
  private serviceRegistry;
11
11
  constructor(options?: ContainerBuilderOptions);
12
+ get override(): ContainerRegistrar;
12
13
  registerType(type: Constructable, scope?: Scope): ServiceRegistration;
13
14
  registerTypes(...types: Constructable[]): ServiceRegistration[];
14
15
  registerTypes(scope: Scope, ...types: Constructable[]): ServiceRegistration[];
@@ -22,5 +23,8 @@ export declare class CrucibleBuilder implements ContainerBuilder {
22
23
  registerRequestScoped(key: string | symbol, type: Constructable): ServiceRegistration;
23
24
  registerRequestScoped(type: Constructable): ServiceRegistration;
24
25
  build(): Crucible;
26
+ private register;
27
+ private registerMany;
28
+ private createRegistrar;
25
29
  }
26
30
  export {};
@@ -2,13 +2,14 @@ import type { IContainer, ResolveRequest } from "../types/types.js";
2
2
  import { ServiceRegistry } from "./service-registry.js";
3
3
  type CrucibleOptions = {
4
4
  key?: string;
5
- rootScope?: Crucible;
5
+ parent?: Crucible;
6
6
  serviceRegistry: ServiceRegistry;
7
7
  };
8
8
  export declare class Crucible implements IContainer {
9
9
  key: string;
10
10
  protected instances: Map<unknown, object>;
11
11
  private serviceRegistry;
12
+ private parent?;
12
13
  private rootScope;
13
14
  private scopes;
14
15
  private logger;
@@ -18,12 +19,15 @@ export declare class Crucible implements IContainer {
18
19
  resolve<T extends object | object[]>(resolveRequest: ResolveRequest<T>): T;
19
20
  beginScope(name?: string): Crucible;
20
21
  [Symbol.dispose](): void;
21
- private dispose;
22
+ [Symbol.asyncDispose](): Promise<void>;
23
+ private disposeSync;
24
+ private disposeAsync;
22
25
  private getRegistrationFrom;
23
26
  private resolveRegistration;
24
27
  private getOrCreateInstance;
25
28
  private createInstance;
26
29
  private resolveDependencies;
30
+ private releaseScope;
27
31
  private registerLifetimeScope;
28
32
  }
29
33
  export {};
@@ -4,11 +4,13 @@ import type { Scope } from "../types/types.js";
4
4
  export type RegisterTypeOptions = {
5
5
  typeOrKey: string | symbol | Constructable | FunctionType;
6
6
  typeOrInstance?: Constructable | FunctionType | object;
7
+ override?: boolean;
7
8
  };
8
9
  export declare class ServiceRegistry {
9
10
  private readonly registrations;
10
11
  constructor(parent?: ServiceRegistry);
11
12
  registerType(scope: Scope, options: RegisterTypeOptions): ServiceRegistration;
13
+ replaceType(scope: Scope, options: RegisterTypeOptions): ServiceRegistration;
12
14
  getRegistration(key: string | symbol | Constructable): ServiceRegistration[];
13
15
  private createRegistrationFrom;
14
16
  private getRegistrations;
@@ -1 +1,2 @@
1
+ export * from "./errors.js";
1
2
  export * from "./types.js";
@@ -1 +1 @@
1
- export type { ContainerBuilder, IContainer, LifetimeScope, ResolveRequest, Scope, ServiceProvider, } from "@decohere/nexus/composition";
1
+ export type { ContainerBuilder, ContainerRegistrar, IContainer, LifetimeScope, ResolveRequest, Scope, ServiceProvider, } from "@decohere/nexus/composition";