@fluidframework/synthesize 0.54.2 → 0.55.0-48551

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.
@@ -21,10 +21,12 @@ export interface IProvideFluidDependencySynthesizer {
21
21
  */
22
22
  export interface IFluidDependencySynthesizer extends IProvideFluidDependencySynthesizer {
23
23
  /**
24
+ * @deprecated - This will only be available on DependencyContainer
24
25
  * All the registered types available
25
26
  */
26
27
  readonly registeredTypes: Iterable<(keyof IFluidObject)>;
27
28
  /**
29
+ * @deprecated - This will only be available on DependencyContainer
28
30
  * Add a new provider
29
31
  * @param type - Name of the Type T being provided
30
32
  * @param provider - A provider that will resolve the T correctly when asked
@@ -32,6 +34,7 @@ export interface IFluidDependencySynthesizer extends IProvideFluidDependencySynt
32
34
  */
33
35
  register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void;
34
36
  /**
37
+ * @deprecated - This will only be available on DependencyContainer
35
38
  * Remove a provider
36
39
  * @param type - Name of the provider to remove
37
40
  */
@@ -46,10 +49,11 @@ export interface IFluidDependencySynthesizer extends IProvideFluidDependencySynt
46
49
  synthesize<O extends IFluidObject, R extends IFluidObject>(optionalTypes: FluidObjectSymbolProvider<O>, requiredTypes: FluidObjectSymbolProvider<R>): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>>;
47
50
  /**
48
51
  * Check if a given type is registered
49
- * @param types - Type to check
52
+ * @param type - Type to check
50
53
  */
51
- has(...types: (keyof IFluidObject)[]): boolean;
54
+ has(type: (keyof IFluidObject)): boolean;
52
55
  /**
56
+ * @deprecated - This will be removed. Use synthesize or has instead
53
57
  * Get a provider. undefined if not available.
54
58
  * @param type - Type to get
55
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"IFluidDependencySynthesizer.d.ts","sourceRoot":"","sources":["../src/IFluidDependencySynthesizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,QAAQ,iCAAiC,CAAC;IAC7C,UAAiB,YAAY;QACzB,2EAA2E;QAC3E,QAAQ,CAAC,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;KACtE;CACJ;AAED,eAAO,MAAM,2BAA2B,EAAE,MAAM,kCACb,CAAC;AAEpC,MAAM,WAAW,kCAAkC;IAC/C,2BAA2B,EAAE,2BAA2B,CAAC;CAC5D;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA4B,SAAQ,kCAAkC;IACnF;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;IAEzD;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAExF;;;OAGG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAExD;;;;;;OAMG;IACH,UAAU,CACN,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,EAClB,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,EAC3C,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAChD,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE;;;OAGG;IACH,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC;IAE/C;;;OAGG;IACH,WAAW,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CAC1F"}
1
+ {"version":3,"file":"IFluidDependencySynthesizer.d.ts","sourceRoot":"","sources":["../src/IFluidDependencySynthesizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,QAAQ,iCAAiC,CAAC;IAC7C,UAAiB,YAAY;QACzB,2EAA2E;QAC3E,QAAQ,CAAC,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;KACtE;CACJ;AAED,eAAO,MAAM,2BAA2B,EAAE,MAAM,kCACb,CAAC;AAEpC,MAAM,WAAW,kCAAkC;IAC/C,2BAA2B,EAAE,2BAA2B,CAAC;CAC5D;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA4B,SAAQ,kCAAkC;IACnF;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;IAEzD;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAExF;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAExD;;;;;;OAMG;IACH,UAAU,CACN,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,EAClB,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,EAC3C,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAChD,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE;;;OAGG;IACH,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,YAAY,CAAC,GAAG,OAAO,CAAC;IAEzC;;;;OAIG;IACH,WAAW,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CAC1F"}
@@ -1 +1 @@
1
- {"version":3,"file":"IFluidDependencySynthesizer.js","sourceRoot":"","sources":["../src/IFluidDependencySynthesizer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAiBU,QAAA,2BAA2B,GAClC,6BAA6B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n} from \"./types\";\n\ndeclare module \"@fluidframework/core-interfaces\" {\n export interface IFluidObject {\n /** @deprecated - use `FluidObject<IFluidDependencySynthesizer>` instead */\n readonly IFluidDependencySynthesizer?: IFluidDependencySynthesizer;\n }\n}\n\nexport const IFluidDependencySynthesizer: keyof IProvideFluidDependencySynthesizer\n = \"IFluidDependencySynthesizer\";\n\nexport interface IProvideFluidDependencySynthesizer {\n IFluidDependencySynthesizer: IFluidDependencySynthesizer;\n}\n\n/**\n * IFluidDependencySynthesizer can generate IFluidObjects based on the IProvideFluidObject pattern.\n * It allow for registering providers and uses synthesize to generate a new object with the optional\n * and required types.\n */\nexport interface IFluidDependencySynthesizer extends IProvideFluidDependencySynthesizer {\n /**\n * All the registered types available\n */\n readonly registeredTypes: Iterable<(keyof IFluidObject)>;\n\n /**\n * Add a new provider\n * @param type - Name of the Type T being provided\n * @param provider - A provider that will resolve the T correctly when asked\n * @throws - If passing a type that's already registered\n */\n register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void;\n\n /**\n * Remove a provider\n * @param type - Name of the provider to remove\n */\n unregister<T extends keyof IFluidObject>(type: T): void;\n\n /**\n * synthesize takes optional and required types and returns an object that will fulfill the\n * defined types based off objects that has been previously registered.\n *\n * @param optionalTypes - optional types to be in the Scope object\n * @param requiredTypes - required types that need to be in the Scope object\n */\n synthesize<\n O extends IFluidObject,\n R extends IFluidObject>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>>;\n\n /**\n * Check if a given type is registered\n * @param types - Type to check\n */\n has(...types: (keyof IFluidObject)[]): boolean;\n\n /**\n * Get a provider. undefined if not available.\n * @param type - Type to get\n */\n getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined;\n}\n"]}
1
+ {"version":3,"file":"IFluidDependencySynthesizer.js","sourceRoot":"","sources":["../src/IFluidDependencySynthesizer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAiBU,QAAA,2BAA2B,GAClC,6BAA6B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n} from \"./types\";\n\ndeclare module \"@fluidframework/core-interfaces\" {\n export interface IFluidObject {\n /** @deprecated - use `FluidObject<IFluidDependencySynthesizer>` instead */\n readonly IFluidDependencySynthesizer?: IFluidDependencySynthesizer;\n }\n}\n\nexport const IFluidDependencySynthesizer: keyof IProvideFluidDependencySynthesizer\n = \"IFluidDependencySynthesizer\";\n\nexport interface IProvideFluidDependencySynthesizer {\n IFluidDependencySynthesizer: IFluidDependencySynthesizer;\n}\n\n/**\n * IFluidDependencySynthesizer can generate IFluidObjects based on the IProvideFluidObject pattern.\n * It allow for registering providers and uses synthesize to generate a new object with the optional\n * and required types.\n */\nexport interface IFluidDependencySynthesizer extends IProvideFluidDependencySynthesizer {\n /**\n * @deprecated - This will only be available on DependencyContainer\n * All the registered types available\n */\n readonly registeredTypes: Iterable<(keyof IFluidObject)>;\n\n /**\n * @deprecated - This will only be available on DependencyContainer\n * Add a new provider\n * @param type - Name of the Type T being provided\n * @param provider - A provider that will resolve the T correctly when asked\n * @throws - If passing a type that's already registered\n */\n register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void;\n\n /**\n * @deprecated - This will only be available on DependencyContainer\n * Remove a provider\n * @param type - Name of the provider to remove\n */\n unregister<T extends keyof IFluidObject>(type: T): void;\n\n /**\n * synthesize takes optional and required types and returns an object that will fulfill the\n * defined types based off objects that has been previously registered.\n *\n * @param optionalTypes - optional types to be in the Scope object\n * @param requiredTypes - required types that need to be in the Scope object\n */\n synthesize<\n O extends IFluidObject,\n R extends IFluidObject>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>>;\n\n /**\n * Check if a given type is registered\n * @param type - Type to check\n */\n has(type: (keyof IFluidObject)): boolean;\n\n /**\n * @deprecated - This will be removed. Use synthesize or has instead\n * Get a provider. undefined if not available.\n * @param type - Type to get\n */\n getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined;\n}\n"]}
@@ -10,14 +10,15 @@ import { IFluidDependencySynthesizer } from "./IFluidDependencySynthesizer";
10
10
  * synthesize an object based on them when requested.
11
11
  */
12
12
  export declare class DependencyContainer implements IFluidDependencySynthesizer {
13
- parent: IFluidDependencySynthesizer | undefined;
14
13
  private readonly providers;
14
+ private readonly parents;
15
15
  get IFluidDependencySynthesizer(): this;
16
16
  /**
17
+ * @deprecated - use has instead
17
18
  * {@inheritDoc (IFluidDependencySynthesizer:interface).registeredTypes}
18
19
  */
19
20
  get registeredTypes(): Iterable<(keyof IFluidObject)>;
20
- constructor(parent?: IFluidDependencySynthesizer | undefined);
21
+ constructor(...parents: (IFluidDependencySynthesizer | undefined)[]);
21
22
  /**
22
23
  * {@inheritDoc (IFluidDependencySynthesizer:interface).register}
23
24
  */
@@ -32,9 +33,12 @@ export declare class DependencyContainer implements IFluidDependencySynthesizer
32
33
  synthesize<O extends IFluidObject, R extends IFluidObject = {}>(optionalTypes: FluidObjectSymbolProvider<O>, requiredTypes: FluidObjectSymbolProvider<R>): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>>;
33
34
  /**
34
35
  * {@inheritDoc (IFluidDependencySynthesizer:interface).has}
36
+ * @param excludeParents - If true, exclude checking parent registries
35
37
  */
36
- has(...types: (keyof IFluidObject)[]): boolean;
38
+ has(type: (keyof IFluidObject), excludeParents?: boolean): boolean;
37
39
  /**
40
+ * @deprecated - use synthesize or has instead
41
+ *
38
42
  * {@inheritDoc (IFluidDependencySynthesizer:interface).getProvider}
39
43
  */
40
44
  getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyContainer.d.ts","sourceRoot":"","sources":["../src/dependencyContainer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EACH,2BAA2B,EAC9B,MAAM,+BAA+B,CAAC;AAEvC;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,2BAA2B;IAYzC,MAAM,EAAE,2BAA2B,GAAG,SAAS;IAXzE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2D;IAErF,IAAW,2BAA2B,SAAmB;IAEzD;;OAEG;IACH,IAAW,eAAe,IAAI,QAAQ,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,CAE3D;gBAEyB,MAAM,GAAE,2BAA2B,GAAG,SAAqB;IAErF;;OAEG;IACI,QAAQ,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ9F;;OAEG;IACI,UAAU,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAM9D;;OAEG;IACI,UAAU,CACb,CAAC,SAAS,YAAY,EAEtB,CAAC,SAAS,YAAY,GAAG,EAAE,EACvB,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,EAC3C,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAChD,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAcjE;;OAEG;IACI,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,YAAY,CAAC,EAAE,GAAG,OAAO;IAMrD;;OAEG;IACI,WAAW,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAAS;IAc7F,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,eAAe;CA8B1B"}
1
+ {"version":3,"file":"dependencyContainer.d.ts","sourceRoot":"","sources":["../src/dependencyContainer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EAGjB,MAAM,SAAS,CAAC;AACjB,OAAO,EACH,2BAA2B,EAC9B,MAAM,+BAA+B,CAAC;AAEvC;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,2BAA2B;IACnE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2D;IACrF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,IAAW,2BAA2B,SAAmB;IAEzD;;;OAGG;IACH,IAAW,eAAe,IAAI,QAAQ,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,CAE3D;gBAEkB,GAAI,OAAO,EAAE,CAAC,2BAA2B,GAAG,SAAS,CAAC,EAAE;IAI3E;;OAEG;IACI,QAAQ,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ9F;;OAEG;IACI,UAAU,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAM9D;;OAEG;IACI,UAAU,CACb,CAAC,SAAS,YAAY,EAEtB,CAAC,SAAS,YAAY,GAAG,EAAE,EACvB,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,EAC3C,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAChD,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAQjE;;;OAGG;IACI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,YAAY,CAAC,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO;IAUzE;;;;OAIG;IACI,WAAW,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAAS;IAiB7F,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,eAAe;CA2C1B"}
@@ -5,17 +5,19 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.DependencyContainer = void 0;
8
+ const IFluidDependencySynthesizer_1 = require("./IFluidDependencySynthesizer");
8
9
  /**
9
10
  * DependencyContainer is similar to a IoC Container. It takes providers and will
10
11
  * synthesize an object based on them when requested.
11
12
  */
12
13
  class DependencyContainer {
13
- constructor(parent = undefined) {
14
- this.parent = parent;
14
+ constructor(...parents) {
15
15
  this.providers = new Map();
16
+ this.parents = parents.filter((v) => v !== undefined);
16
17
  }
17
18
  get IFluidDependencySynthesizer() { return this; }
18
19
  /**
20
+ * @deprecated - use has instead
19
21
  * {@inheritDoc (IFluidDependencySynthesizer:interface).registeredTypes}
20
22
  */
21
23
  get registeredTypes() {
@@ -25,7 +27,7 @@ class DependencyContainer {
25
27
  * {@inheritDoc (IFluidDependencySynthesizer:interface).register}
26
28
  */
27
29
  register(type, provider) {
28
- if (this.has(type)) {
30
+ if (this.providers.has(type)) {
29
31
  throw new Error(`Attempting to register a provider of type ${type} that already exists`);
30
32
  }
31
33
  this.providers.set(type, provider);
@@ -42,25 +44,28 @@ class DependencyContainer {
42
44
  * {@inheritDoc (IFluidDependencySynthesizer:interface).synthesize}
43
45
  */
44
46
  synthesize(optionalTypes, requiredTypes) {
45
- const optionalValues = Object.values(optionalTypes);
46
- const requiredValues = Object.values(requiredTypes);
47
- // There was nothing passed in so we can return
48
- if (optionalValues === [] && requiredValues === []) {
49
- return {};
50
- }
51
- const required = this.generateRequired(requiredTypes);
52
- const optional = this.generateOptional(optionalTypes);
53
- return Object.assign(Object.assign({}, required), optional);
47
+ const base = {};
48
+ this.generateRequired(base, requiredTypes);
49
+ this.generateOptional(base, optionalTypes);
50
+ Object.defineProperty(base, IFluidDependencySynthesizer_1.IFluidDependencySynthesizer, { get: () => this });
51
+ return base;
54
52
  }
55
53
  /**
56
54
  * {@inheritDoc (IFluidDependencySynthesizer:interface).has}
55
+ * @param excludeParents - If true, exclude checking parent registries
57
56
  */
58
- has(...types) {
59
- return types.every((type) => {
60
- return this.providers.has(type);
61
- });
57
+ has(type, excludeParents) {
58
+ if (this.providers.has(type)) {
59
+ return true;
60
+ }
61
+ if (excludeParents !== true) {
62
+ return this.parents.some((p) => p.has(type));
63
+ }
64
+ return false;
62
65
  }
63
66
  /**
67
+ * @deprecated - use synthesize or has instead
68
+ *
64
69
  * {@inheritDoc (IFluidDependencySynthesizer:interface).getProvider}
65
70
  */
66
71
  getProvider(type) {
@@ -69,50 +74,61 @@ class DependencyContainer {
69
74
  if (provider) {
70
75
  return provider;
71
76
  }
72
- if (this.parent) {
73
- return this.parent.getProvider(type);
77
+ for (const parent of this.parents) {
78
+ const p = parent.getProvider(type);
79
+ if (p !== undefined) {
80
+ return p;
81
+ }
74
82
  }
75
83
  return undefined;
76
84
  }
77
- generateRequired(types) {
78
- const values = Object.values(types);
79
- return Object.assign({}, ...Array.from(values, (t) => {
80
- const provider = this.getProvider(t);
81
- if (!provider) {
82
- throw new Error(`Object attempted to be created without registered required provider ${t}`);
85
+ generateRequired(base, types) {
86
+ for (const key of Object.keys(types)) {
87
+ const provider = this.resolveProvider(key);
88
+ if (provider === undefined) {
89
+ throw new Error(`Object attempted to be created without registered required provider ${key}`);
83
90
  }
84
- return this.resolveProvider(provider, t);
85
- }));
91
+ Object.defineProperty(base, key, provider);
92
+ }
86
93
  }
87
- generateOptional(types) {
88
- const values = Object.values(types);
89
- return Object.assign({}, ...Array.from(values, (t) => {
90
- const provider = this.getProvider(t);
91
- if (!provider) {
92
- return { get [t]() { return Promise.resolve(undefined); } };
94
+ generateOptional(base, types) {
95
+ for (const key of Object.keys(types)) {
96
+ const provider = this.resolveProvider(key);
97
+ if (provider !== undefined) {
98
+ Object.defineProperty(base, key, provider);
93
99
  }
94
- return this.resolveProvider(provider, t);
95
- }));
100
+ }
96
101
  }
97
- resolveProvider(provider, t) {
102
+ resolveProvider(t) {
103
+ // If we have the provider return it
104
+ const provider = this.providers.get(t);
105
+ if (provider === undefined) {
106
+ for (const parent of this.parents) {
107
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
108
+ const sp = { [t]: t };
109
+ // eslint-disable-next-line @typescript-eslint/ban-types
110
+ const syn = parent.synthesize(sp, {});
111
+ const descriptor = Object.getOwnPropertyDescriptor(syn, t);
112
+ if (descriptor !== undefined) {
113
+ return descriptor;
114
+ }
115
+ }
116
+ return undefined;
117
+ }
98
118
  // The double nested gets are required for lazy loading the provider resolution
99
119
  if (typeof provider === "function") {
100
- // eslint-disable-next-line @typescript-eslint/no-this-alias
101
- const self = this;
102
120
  return {
103
- get [t]() {
121
+ get() {
104
122
  if (provider && typeof provider === "function") {
105
- return Promise.resolve(provider(self)).then((p) => {
106
- if (p) {
107
- return p[t];
108
- }
109
- });
123
+ return Promise.resolve(this[IFluidDependencySynthesizer_1.IFluidDependencySynthesizer])
124
+ .then(async (fds) => provider(fds))
125
+ .then((p) => p === null || p === void 0 ? void 0 : p[t]);
110
126
  }
111
127
  },
112
128
  };
113
129
  }
114
130
  return {
115
- get [t]() {
131
+ get() {
116
132
  if (provider) {
117
133
  return Promise.resolve(provider).then((p) => {
118
134
  if (p) {
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyContainer.js","sourceRoot":"","sources":["../src/dependencyContainer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\n\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n} from \"./types\";\nimport {\n IFluidDependencySynthesizer,\n} from \"./IFluidDependencySynthesizer\";\n\n/**\n * DependencyContainer is similar to a IoC Container. It takes providers and will\n * synthesize an object based on them when requested.\n */\nexport class DependencyContainer implements IFluidDependencySynthesizer {\n private readonly providers = new Map<keyof IFluidObject, FluidObjectProvider<any>>();\n\n public get IFluidDependencySynthesizer() { return this; }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).registeredTypes}\n */\n public get registeredTypes(): Iterable<(keyof IFluidObject)> {\n return this.providers.keys();\n }\n\n public constructor(public parent: IFluidDependencySynthesizer | undefined = undefined) { }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).register}\n */\n public register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void {\n if (this.has(type)) {\n throw new Error(`Attempting to register a provider of type ${type} that already exists`);\n }\n\n this.providers.set(type, provider);\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).unregister}\n */\n public unregister<T extends keyof IFluidObject>(type: T): void {\n if (this.providers.has(type)) {\n this.providers.delete(type);\n }\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).synthesize}\n */\n public synthesize<\n O extends IFluidObject,\n // eslint-disable-next-line @typescript-eslint/ban-types\n R extends IFluidObject = {}>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>> {\n const optionalValues = Object.values(optionalTypes);\n const requiredValues = Object.values(requiredTypes);\n\n // There was nothing passed in so we can return\n if (optionalValues === [] && requiredValues === []) {\n return {} as any;\n }\n\n const required = this.generateRequired<R>(requiredTypes);\n const optional = this.generateOptional<O>(optionalTypes);\n return { ...required, ...optional };\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).has}\n */\n public has(...types: (keyof IFluidObject)[]): boolean {\n return types.every((type) => {\n return this.providers.has(type);\n });\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).getProvider}\n */\n public getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined {\n // If we have the provider return it\n const provider = this.providers.get(type);\n if (provider) {\n return provider;\n }\n\n if (this.parent) {\n return this.parent.getProvider(type);\n }\n\n return undefined;\n }\n\n private generateRequired<T extends IFluidObject>(\n types: FluidObjectSymbolProvider<T>,\n ) {\n const values: (keyof IFluidObject)[] = Object.values(types);\n return Object.assign({}, ...Array.from(values, (t) => {\n const provider = this.getProvider(t);\n if (!provider) {\n throw new Error(`Object attempted to be created without registered required provider ${t}`);\n }\n\n return this.resolveProvider(provider, t);\n }));\n }\n\n private generateOptional<T extends IFluidObject>(\n types: FluidObjectSymbolProvider<T>,\n ) {\n const values: (keyof IFluidObject)[] = Object.values(types);\n return Object.assign({}, ...Array.from(values, (t) => {\n const provider = this.getProvider(t);\n if (!provider) {\n return { get [t]() { return Promise.resolve(undefined); } };\n }\n\n return this.resolveProvider(provider, t);\n }));\n }\n\n private resolveProvider<T extends keyof IFluidObject>(provider: FluidObjectProvider<T>, t: keyof IFluidObject) {\n // The double nested gets are required for lazy loading the provider resolution\n if (typeof provider === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n return {\n get [t]() {\n if (provider && typeof provider === \"function\") {\n return Promise.resolve(provider(self)).then((p) => {\n if (p) {\n return p[t];\n }\n });\n }\n },\n };\n }\n\n return {\n get [t]() {\n if (provider) {\n return Promise.resolve(provider).then((p) => {\n if (p) {\n return p[t];\n }\n });\n }\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"dependencyContainer.js","sourceRoot":"","sources":["../src/dependencyContainer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\n\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n AsyncOptionalFluidObjectProvider,\n AsyncRequiredFluidObjectProvider,\n} from \"./types\";\nimport {\n IFluidDependencySynthesizer,\n} from \"./IFluidDependencySynthesizer\";\n\n/**\n * DependencyContainer is similar to a IoC Container. It takes providers and will\n * synthesize an object based on them when requested.\n */\nexport class DependencyContainer implements IFluidDependencySynthesizer {\n private readonly providers = new Map<keyof IFluidObject, FluidObjectProvider<any>>();\n private readonly parents: IFluidDependencySynthesizer[];\n public get IFluidDependencySynthesizer() { return this; }\n\n /**\n * @deprecated - use has instead\n * {@inheritDoc (IFluidDependencySynthesizer:interface).registeredTypes}\n */\n public get registeredTypes(): Iterable<(keyof IFluidObject)> {\n return this.providers.keys();\n }\n\n public constructor(... parents: (IFluidDependencySynthesizer | undefined)[]) {\n this.parents = parents.filter((v): v is IFluidDependencySynthesizer => v !== undefined);\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).register}\n */\n public register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void {\n if (this.providers.has(type)) {\n throw new Error(`Attempting to register a provider of type ${type} that already exists`);\n }\n\n this.providers.set(type, provider);\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).unregister}\n */\n public unregister<T extends keyof IFluidObject>(type: T): void {\n if (this.providers.has(type)) {\n this.providers.delete(type);\n }\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).synthesize}\n */\n public synthesize<\n O extends IFluidObject,\n // eslint-disable-next-line @typescript-eslint/ban-types\n R extends IFluidObject = {}>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>> {\n const base: AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>> = {} as any;\n this.generateRequired<R>(base, requiredTypes);\n this.generateOptional<O>(base, optionalTypes);\n Object.defineProperty(base, IFluidDependencySynthesizer, { get: () => this });\n return base;\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).has}\n * @param excludeParents - If true, exclude checking parent registries\n */\n public has(type: (keyof IFluidObject), excludeParents?: boolean): boolean {\n if (this.providers.has(type)) {\n return true;\n }\n if (excludeParents !== true) {\n return this.parents.some((p: IFluidDependencySynthesizer) => p.has(type));\n }\n return false;\n }\n\n /**\n * @deprecated - use synthesize or has instead\n *\n * {@inheritDoc (IFluidDependencySynthesizer:interface).getProvider}\n */\n public getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined {\n // If we have the provider return it\n const provider = this.providers.get(type);\n if (provider) {\n return provider;\n }\n\n for(const parent of this.parents) {\n const p = parent.getProvider(type);\n if (p !== undefined) {\n return p;\n }\n }\n\n return undefined;\n }\n\n private generateRequired<T extends IFluidObject>(\n base: AsyncRequiredFluidObjectProvider<FluidObjectKey<T>>,\n types: FluidObjectSymbolProvider<T>,\n ) {\n for(const key of Object.keys(types) as unknown as (keyof IFluidObject)[]) {\n const provider = this.resolveProvider(key);\n if(provider === undefined) {\n throw new Error(`Object attempted to be created without registered required provider ${key}`);\n }\n Object.defineProperty(\n base,\n key,\n provider,\n );\n }\n }\n\n private generateOptional<T extends IFluidObject>(\n base: AsyncOptionalFluidObjectProvider<FluidObjectKey<T>>,\n types: FluidObjectSymbolProvider<T>,\n ) {\n for(const key of Object.keys(types) as unknown as (keyof IFluidObject)[]) {\n const provider = this.resolveProvider(key);\n if(provider !== undefined) {\n Object.defineProperty(\n base,\n key,\n provider,\n );\n }\n }\n }\n\n private resolveProvider<T extends keyof IFluidObject>(t: T): PropertyDescriptor | undefined {\n // If we have the provider return it\n const provider = this.providers.get(t);\n if (provider === undefined) {\n for(const parent of this.parents) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const sp = { [t]: t } as FluidObjectSymbolProvider<Pick<IFluidObject, T>>;\n // eslint-disable-next-line @typescript-eslint/ban-types\n const syn = parent.synthesize<Pick<IFluidObject, T>,{}>(\n sp,\n {});\n const descriptor = Object.getOwnPropertyDescriptor(syn, t);\n if (descriptor !== undefined) {\n return descriptor;\n }\n }\n return undefined;\n }\n\n // The double nested gets are required for lazy loading the provider resolution\n if (typeof provider === \"function\") {\n return {\n get() {\n if (provider && typeof provider === \"function\") {\n return Promise.resolve(this[IFluidDependencySynthesizer])\n .then(async (fds): Promise<any> => provider(fds))\n .then((p) => p?.[t]);\n }\n },\n };\n }\n return {\n get() {\n if (provider) {\n return Promise.resolve(provider).then((p) => {\n if (p) {\n return p[t];\n }\n });\n }\n },\n };\n }\n}\n"]}
@@ -280,7 +280,7 @@ describe("Routerlicious", () => {
280
280
  dc.register(core_interfaces_1.IFluidConfiguration, new MockFluidConfiguration());
281
281
  assert_1.strict(dc.has(core_interfaces_1.IFluidLoadable), "Manager has IFluidLoadable");
282
282
  assert_1.strict(dc.has(core_interfaces_1.IFluidConfiguration), "Manager has IFluidConfiguration");
283
- assert_1.strict(dc.has(core_interfaces_1.IFluidLoadable, core_interfaces_1.IFluidConfiguration), "Manager has IFluidLoadable & IFluidConfiguration");
283
+ assert_1.strict(dc.has(core_interfaces_1.IFluidLoadable) && dc.has(core_interfaces_1.IFluidConfiguration), "Manager has IFluidLoadable & IFluidConfiguration");
284
284
  assert_1.strict(Array.from(dc.registeredTypes).length === 2, "Manager has two modules");
285
285
  });
286
286
  it(`registeredModules() resolves correctly`, async () => {
@@ -292,6 +292,32 @@ describe("Routerlicious", () => {
292
292
  assert_1.strict(modules.includes(core_interfaces_1.IFluidLoadable), "Manager has IFluidLoadable");
293
293
  assert_1.strict(modules.includes(core_interfaces_1.IFluidConfiguration), "Manager has IFluidConfiguration");
294
294
  });
295
+ it(`Child has Parent modules`, async () => {
296
+ const parentDc = new __1.DependencyContainer();
297
+ const loadableMock = new MockLoadable();
298
+ parentDc.register(core_interfaces_1.IFluidLoadable, loadableMock);
299
+ const dc = new __1.DependencyContainer(parentDc);
300
+ const configMock = new MockFluidConfiguration();
301
+ dc.register(core_interfaces_1.IFluidConfiguration, configMock);
302
+ assert_1.strict(dc.has(core_interfaces_1.IFluidLoadable), "has includes parent registered");
303
+ assert_1.strict(!dc.has(core_interfaces_1.IFluidLoadable, true), "has does not include excluded parent registered");
304
+ assert_1.strict(dc.has(core_interfaces_1.IFluidConfiguration), "has includes registered");
305
+ assert_1.strict(!dc.has(core_interfaces_1.IFluidHandle), "does not include not registered");
306
+ });
307
+ it(`Parent Resolved from Child`, async () => {
308
+ const parentDc = new __1.DependencyContainer();
309
+ const loadableToHandle = async (fds) => {
310
+ // eslint-disable-next-line @typescript-eslint/ban-types
311
+ const loadable = fds.synthesize({}, { IFluidLoadable: core_interfaces_1.IFluidLoadable });
312
+ return (await loadable.IFluidLoadable).handle;
313
+ };
314
+ parentDc.register(core_interfaces_1.IFluidHandle, loadableToHandle);
315
+ const dc = new __1.DependencyContainer(parentDc);
316
+ const loadableMock = new MockLoadable();
317
+ dc.register(core_interfaces_1.IFluidLoadable, loadableMock);
318
+ const deps = dc.synthesize({ IFluidHandle: core_interfaces_1.IFluidHandle }, {});
319
+ assert_1.strict(await deps.IFluidHandle !== undefined, "handle undefined");
320
+ });
295
321
  });
296
322
  });
297
323
  });
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyContainer.spec.js","sourceRoot":"","sources":["../../src/test/dependencyContainer.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,mCAA0C;AAE1C,qEAIyC;AACzC,yDAA8D;AAE9D,0BAAyC;AAEzC,MAAM,iBAAiB,GAAwB;IAC3C,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,KAAK;IACjB,mBAAmB,EAAE,SAAgB;IAErC,WAAW,EAAE,GAAG,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,aAAa,EAAE,GAAG,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;CACJ,CAAC;AAEF,MAAM,YAAY;IACd,IAAW,cAAc,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAW,MAAM,KAAK,OAAO,IAAI,6BAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;CACrF;AAED,MAAM,sBAAsB;IACxB,IAAW,mBAAmB,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACjD,IAAW,YAAY,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC3C,IAAW,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5C;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACtB,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACjC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBACxD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,CAAC,CAAC;gBAElC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAiB,EAAE,cAAc,EAAd,gCAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;gBAChE,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAEnD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAiB,EAAE,cAAc,EAAd,gCAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;gBAC1D,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;gBAC3B,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,OAAO,CAAC,CAAC;gBAErC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAiB,EAAE,cAAc,EAAd,gCAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBAClE,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;gBACjC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,OAAO,CAAC,CAAC;gBAErC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAiB,EAAE,cAAc,EAAd,gCAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBACxD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,CAAC,CAAC;gBAElC,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAqB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;gBAChE,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAEnD,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAqB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;gBAC1D,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;gBAC3B,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,OAAO,CAAC,CAAC;gBAErC,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAqB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBAClE,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;gBACjC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,OAAO,CAAC,CAAC;gBAErC,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAqB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,YAAY,CAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;gBAChD,EAAE,CAAC,QAAQ,CAAC,qCAAmB,EAAE,UAAU,CAAC,CAAC;gBAE7C,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CACnB,EAAE,cAAc,EAAd,gCAAc,EAAE,mBAAmB,EAAnB,qCAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,4BAA4B,CAAC,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC;gBAC3C,eAAM,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC;gBAC9D,eAAM,CAAC,MAAM,KAAK,UAAU,EAAE,iCAAiC,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,YAAY,CAAC,CAAC;gBAE1C,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CACnB,EAAE,cAAc,EAAd,gCAAc,EAAE,mBAAmB,EAAnB,qCAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,4BAA4B,CAAC,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC;gBAC3C,eAAM,CAAC,CAAC,MAAM,EAAE,iDAAiD,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;gBAClD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAErC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CACnB,EAAE,cAAc,EAAd,gCAAc,EAAE,mBAAmB,EAAnB,qCAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,CAAC,QAAQ,EAAE,4CAA4C,CAAC,CAAC;gBAChE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC;gBAC3C,eAAM,CAAC,CAAC,MAAM,EAAE,iDAAiD,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,YAAY,CAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;gBAChD,EAAE,CAAC,QAAQ,CAAC,qCAAmB,EAAE,UAAU,CAAC,CAAC;gBAE7C,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CACnB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,mBAAmB,EAAnB,qCAAmB,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,4BAA4B,CAAC,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC;gBAC3C,eAAM,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC;gBAC9D,eAAM,CAAC,MAAM,KAAK,UAAU,EAAE,iCAAiC,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;gBAC3D,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAErC,wDAAwD;gBACxD,eAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAC7B,EAAE,EACF,EAAE,cAAc,EAAd,gCAAc,EAAE,CACrB,EAAE,KAAK,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;gBAC/C,MAAM,QAAQ,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,QAAQ,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,CAAC,CAAC;gBACxC,MAAM,EAAE,GAAG,IAAI,uBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAE7C,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAiB,EAAE,cAAc,EAAd,gCAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBACxD,MAAM,QAAQ,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAC3C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,QAAQ,CAAC,QAAQ,CAAC,gCAAc,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,IAAI,uBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;gBAChD,EAAE,CAAC,QAAQ,CAAC,qCAAmB,EAAE,UAAU,CAAC,CAAC;gBAE7C,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CACnB,EAAE,cAAc,EAAd,gCAAc,EAAE,mBAAmB,EAAnB,qCAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,4BAA4B,CAAC,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC;gBAC3C,eAAM,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC;gBAC9D,eAAM,CAAC,MAAM,KAAK,UAAU,EAAE,iCAAiC,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;gBACxE,MAAM,QAAQ,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAC3C,QAAQ,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBACtD,MAAM,EAAE,GAAG,IAAI,uBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,YAAY,CAAC,CAAC;gBAE1C,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAiB,EAAE,cAAc,EAAd,gCAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,4BAA4B,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;gBAC/C,MAAM,QAAQ,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,QAAQ,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,CAAC,CAAC;gBACxC,MAAM,EAAE,GAAG,IAAI,uBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAE7C,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAqB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxD,eAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,YAAY,MAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBACxD,MAAM,QAAQ,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAC3C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,QAAQ,CAAC,QAAQ,CAAC,gCAAc,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,IAAI,uBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;gBAChD,EAAE,CAAC,QAAQ,CAAC,qCAAmB,EAAE,UAAU,CAAC,CAAC;gBAE7C,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CACnB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,mBAAmB,EAAnB,qCAAmB,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,4BAA4B,CAAC,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC;gBAC3C,eAAM,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC;gBAC9D,eAAM,CAAC,MAAM,KAAK,UAAU,EAAE,iCAAiC,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;gBACxE,MAAM,QAAQ,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBAC3C,QAAQ,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBACtD,MAAM,EAAE,GAAG,IAAI,uBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,YAAY,CAAC,CAAC;gBAE1C,wDAAwD;gBACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAqB,EAAE,EAAE,EAAE,cAAc,EAAd,gCAAc,EAAE,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC;gBACxC,eAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;gBAC3D,eAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,4BAA4B,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;gBACzB,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBAChD,eAAM,CAAC,EAAE,CAAC,GAAG,CAAC,gCAAc,CAAC,EAAE,wCAAwC,CAAC,CAAC;gBACzE,eAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,oCAAoC,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;gBACpD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBAChD,eAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAChF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;gBAC5C,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBAChD,EAAE,CAAC,UAAU,CAAC,gCAAc,CAAC,CAAC;gBAC9B,eAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,gCAAc,CAAC,EAAE,iDAAiD,CAAC,CAAC;gBACnF,eAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAC7D,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBAChD,EAAE,CAAC,UAAU,CAAC,gCAAc,CAAC,CAAC;gBAC9B,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBAChD,eAAM,CAAC,EAAE,CAAC,GAAG,CAAC,gCAAc,CAAC,EAAE,wCAAwC,CAAC,CAAC;YAC7E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBACxD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBAChD,EAAE,CAAC,QAAQ,CAAC,qCAAmB,EAAE,IAAI,sBAAsB,EAAE,CAAC,CAAC;gBAC/D,eAAM,CAAC,EAAE,CAAC,GAAG,CAAC,gCAAc,CAAC,EAAE,4BAA4B,CAAC,CAAC;gBAC7D,eAAM,CAAC,EAAE,CAAC,GAAG,CAAC,qCAAmB,CAAC,EAAE,iCAAiC,CAAC,CAAC;gBACvE,eAAM,CACF,EAAE,CAAC,GAAG,CAAC,gCAAc,EAAE,qCAAmB,CAAC,EAC3C,kDAAkD,CAAC,CAAC;gBACxD,eAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;gBACpD,MAAM,EAAE,GAAG,IAAI,uBAAmB,EAAE,CAAC;gBACrC,EAAE,CAAC,QAAQ,CAAC,gCAAc,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;gBAChD,EAAE,CAAC,QAAQ,CAAC,qCAAmB,EAAE,IAAI,sBAAsB,EAAE,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;gBAC/C,eAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;gBACxD,eAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,gCAAc,CAAC,EAAE,4BAA4B,CAAC,CAAC;gBACvE,eAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,qCAAmB,CAAC,EAAE,iCAAiC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\n\nimport {\n IFluidConfiguration,\n IFluidLoadable,\n IFluidHandleContext,\n} from \"@fluidframework/core-interfaces\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore\";\n\nimport { DependencyContainer } from \"..\";\n\nconst mockHandleContext: IFluidHandleContext = {\n absolutePath: \"\",\n isAttached: false,\n IFluidHandleContext: undefined as any,\n\n attachGraph: () => {\n throw new Error(\"Method not implemented.\");\n },\n resolveHandle: () => {\n throw new Error(\"Method not implemented.\");\n },\n};\n\nclass MockLoadable implements IFluidLoadable {\n public get IFluidLoadable() { return this; }\n public get handle() { return new FluidObjectHandle(this, \"\", mockHandleContext); }\n}\n\nclass MockFluidConfiguration implements IFluidConfiguration {\n public get IFluidConfiguration() { return this; }\n public get canReconnect() { return false; }\n public get scopes() { return [\"scope\"]; }\n}\n\ndescribe(\"Routerlicious\", () => {\n describe(\"Aqueduct\", () => {\n describe(\"DependencyContainer\", () => {\n it(`One Optional Provider registered via value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, mock);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Optional Provider registered via Promise value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, Promise.resolve(mock));\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Optional Provider registered via factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = () => mock;\n dc.register(IFluidLoadable, factory);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Optional Provider registered via Promise factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = async () => mock;\n dc.register(IFluidLoadable, factory);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, mock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via Promise value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, Promise.resolve(mock));\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = () => mock;\n dc.register(IFluidLoadable, factory);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via Promise factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = async () => mock;\n dc.register(IFluidLoadable, factory);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`Two Optional Modules all registered`, async () => {\n const dc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Optional IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Two Optional Modules one registered`, async () => {\n const dc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(!config, \"Optional IFluidConfiguration was not registered\");\n });\n\n it(`Two Optional Modules none registered`, async () => {\n const dc = new DependencyContainer();\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(!loadable, \"Optional IFluidLoadable was not registered\");\n const config = await s.IFluidConfiguration;\n assert(!config, \"Optional IFluidConfiguration was not registered\");\n });\n\n it(`Two Required Modules all registered`, async () => {\n const dc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable & IFluidConfiguration>(\n {}, { IFluidLoadable, IFluidConfiguration });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Required IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Required Provider not registered should throw`, async () => {\n const dc = new DependencyContainer();\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n assert.throws(() => dc.synthesize<{}, IFluidLoadable>(\n {},\n { IFluidLoadable },\n ), Error);\n });\n\n it(`Optional Provider found in Parent`, async () => {\n const parentDc = new DependencyContainer();\n const mock = new MockLoadable();\n parentDc.register(IFluidLoadable, mock);\n const dc = new DependencyContainer(parentDc);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`Optional Modules found in Parent and Child`, async () => {\n const parentDc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n parentDc.register(IFluidLoadable, loadableMock);\n const dc = new DependencyContainer(parentDc);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Optional IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Optional Provider found in Parent and Child resolves Child`, async () => {\n const parentDc = new DependencyContainer();\n parentDc.register(IFluidLoadable, new MockLoadable());\n const dc = new DependencyContainer(parentDc);\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n });\n\n it(`Required Provider found in Parent`, async () => {\n const parentDc = new DependencyContainer();\n const mock = new MockLoadable();\n parentDc.register(IFluidLoadable, mock);\n const dc = new DependencyContainer(parentDc);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`Required Modules found in Parent and Child`, async () => {\n const parentDc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n parentDc.register(IFluidLoadable, loadableMock);\n const dc = new DependencyContainer(parentDc);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable & IFluidConfiguration>(\n {}, { IFluidLoadable, IFluidConfiguration });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Required IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Required Provider found in Parent and Child resolves Child`, async () => {\n const parentDc = new DependencyContainer();\n parentDc.register(IFluidLoadable, new MockLoadable());\n const dc = new DependencyContainer(parentDc);\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n });\n\n it(`Registering`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n assert(dc.has(IFluidLoadable), \"DependencyContainer has IFluidLoadable\");\n assert(Array.from(dc.registeredTypes).length === 1, \"DependencyContainer has one module\");\n });\n\n it(`Registering the same type twice throws`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n assert.throws(() => dc.register(IFluidLoadable, new MockLoadable()), Error);\n });\n\n it(`Registering then Unregistering`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.unregister(IFluidLoadable);\n assert(!dc.has(IFluidLoadable), \"DependencyContainer doesn't have IFluidLoadable\");\n assert(Array.from(dc.registeredTypes).length === 0, \"Manager has no modules\");\n });\n\n it(`Registering then Unregistering then Registering`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.unregister(IFluidLoadable);\n dc.register(IFluidLoadable, new MockLoadable());\n assert(dc.has(IFluidLoadable), \"DependencyContainer has IFluidLoadable\");\n });\n\n it(`has() resolves correctly in all variations`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.register(IFluidConfiguration, new MockFluidConfiguration());\n assert(dc.has(IFluidLoadable), \"Manager has IFluidLoadable\");\n assert(dc.has(IFluidConfiguration), \"Manager has IFluidConfiguration\");\n assert(\n dc.has(IFluidLoadable, IFluidConfiguration),\n \"Manager has IFluidLoadable & IFluidConfiguration\");\n assert(Array.from(dc.registeredTypes).length === 2, \"Manager has two modules\");\n });\n\n it(`registeredModules() resolves correctly`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.register(IFluidConfiguration, new MockFluidConfiguration());\n const modules = Array.from(dc.registeredTypes);\n assert(modules.length === 2, \"Manager has two modules\");\n assert(modules.includes(IFluidLoadable), \"Manager has IFluidLoadable\");\n assert(modules.includes(IFluidConfiguration), \"Manager has IFluidConfiguration\");\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"dependencyContainer.spec.js","sourceRoot":"","sources":["../../src/test/dependencyContainer.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\n\nimport {\n IFluidConfiguration,\n IFluidLoadable,\n IFluidHandleContext,\n IFluidHandle,\n} from \"@fluidframework/core-interfaces\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore\";\n\nimport { DependencyContainer } from \"..\";\nimport { IFluidDependencySynthesizer } from \"../IFluidDependencySynthesizer\";\nimport { FluidObjectProvider } from \"../types\";\n\nconst mockHandleContext: IFluidHandleContext = {\n absolutePath: \"\",\n isAttached: false,\n IFluidHandleContext: undefined as any,\n\n attachGraph: () => {\n throw new Error(\"Method not implemented.\");\n },\n resolveHandle: () => {\n throw new Error(\"Method not implemented.\");\n },\n};\n\nclass MockLoadable implements IFluidLoadable {\n public get IFluidLoadable() { return this; }\n public get handle() { return new FluidObjectHandle(this, \"\", mockHandleContext); }\n}\n\nclass MockFluidConfiguration implements IFluidConfiguration {\n public get IFluidConfiguration() { return this; }\n public get canReconnect() { return false; }\n public get scopes() { return [\"scope\"]; }\n}\n\ndescribe(\"Routerlicious\", () => {\n describe(\"Aqueduct\", () => {\n describe(\"DependencyContainer\", () => {\n it(`One Optional Provider registered via value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, mock);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Optional Provider registered via Promise value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, Promise.resolve(mock));\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Optional Provider registered via factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = () => mock;\n dc.register(IFluidLoadable, factory);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Optional Provider registered via Promise factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = async () => mock;\n dc.register(IFluidLoadable, factory);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, mock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via Promise value`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n dc.register(IFluidLoadable, Promise.resolve(mock));\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = () => mock;\n dc.register(IFluidLoadable, factory);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`One Required Provider registered via Promise factory`, async () => {\n const dc = new DependencyContainer();\n const mock = new MockLoadable();\n const factory = async () => mock;\n dc.register(IFluidLoadable, factory);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`Two Optional Modules all registered`, async () => {\n const dc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Optional IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Two Optional Modules one registered`, async () => {\n const dc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(!config, \"Optional IFluidConfiguration was not registered\");\n });\n\n it(`Two Optional Modules none registered`, async () => {\n const dc = new DependencyContainer();\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(!loadable, \"Optional IFluidLoadable was not registered\");\n const config = await s.IFluidConfiguration;\n assert(!config, \"Optional IFluidConfiguration was not registered\");\n });\n\n it(`Two Required Modules all registered`, async () => {\n const dc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable & IFluidConfiguration>(\n {}, { IFluidLoadable, IFluidConfiguration });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Required IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Required Provider not registered should throw`, async () => {\n const dc = new DependencyContainer();\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n assert.throws(() => dc.synthesize<{}, IFluidLoadable>(\n {},\n { IFluidLoadable },\n ), Error);\n });\n\n it(`Optional Provider found in Parent`, async () => {\n const parentDc = new DependencyContainer();\n const mock = new MockLoadable();\n parentDc.register(IFluidLoadable, mock);\n const dc = new DependencyContainer(parentDc);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`Optional Modules found in Parent and Child`, async () => {\n const parentDc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n parentDc.register(IFluidLoadable, loadableMock);\n const dc = new DependencyContainer(parentDc);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n const s = dc.synthesize<IFluidLoadable & IFluidConfiguration>(\n { IFluidLoadable, IFluidConfiguration }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Optional IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Optional Provider found in Parent and Child resolves Child`, async () => {\n const parentDc = new DependencyContainer();\n parentDc.register(IFluidLoadable, new MockLoadable());\n const dc = new DependencyContainer(parentDc);\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n\n const s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Optional IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n });\n\n it(`Required Provider found in Parent`, async () => {\n const parentDc = new DependencyContainer();\n const mock = new MockLoadable();\n parentDc.register(IFluidLoadable, mock);\n const dc = new DependencyContainer(parentDc);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === mock, \"IFluidLoadable is expected\");\n assert(loadable?.handle.absolutePath === mock.handle.absolutePath, \"IFluidLoadable is valid\");\n });\n\n it(`Required Modules found in Parent and Child`, async () => {\n const parentDc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n parentDc.register(IFluidLoadable, loadableMock);\n const dc = new DependencyContainer(parentDc);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable & IFluidConfiguration>(\n {}, { IFluidLoadable, IFluidConfiguration });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n const config = await s.IFluidConfiguration;\n assert(config, \"Required IFluidConfiguration was registered\");\n assert(config === configMock, \"IFluidConfiguration is expected\");\n });\n\n it(`Required Provider found in Parent and Child resolves Child`, async () => {\n const parentDc = new DependencyContainer();\n parentDc.register(IFluidLoadable, new MockLoadable());\n const dc = new DependencyContainer(parentDc);\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const s = dc.synthesize<{}, IFluidLoadable>({}, { IFluidLoadable });\n const loadable = await s.IFluidLoadable;\n assert(loadable, \"Required IFluidLoadable was registered\");\n assert(loadable === loadableMock, \"IFluidLoadable is expected\");\n });\n\n it(`Registering`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n assert(dc.has(IFluidLoadable), \"DependencyContainer has IFluidLoadable\");\n assert(Array.from(dc.registeredTypes).length === 1, \"DependencyContainer has one module\");\n });\n\n it(`Registering the same type twice throws`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n assert.throws(() => dc.register(IFluidLoadable, new MockLoadable()), Error);\n });\n\n it(`Registering then Unregistering`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.unregister(IFluidLoadable);\n assert(!dc.has(IFluidLoadable), \"DependencyContainer doesn't have IFluidLoadable\");\n assert(Array.from(dc.registeredTypes).length === 0, \"Manager has no modules\");\n });\n\n it(`Registering then Unregistering then Registering`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.unregister(IFluidLoadable);\n dc.register(IFluidLoadable, new MockLoadable());\n assert(dc.has(IFluidLoadable), \"DependencyContainer has IFluidLoadable\");\n });\n\n it(`has() resolves correctly in all variations`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.register(IFluidConfiguration, new MockFluidConfiguration());\n assert(dc.has(IFluidLoadable), \"Manager has IFluidLoadable\");\n assert(dc.has(IFluidConfiguration), \"Manager has IFluidConfiguration\");\n assert(\n dc.has(IFluidLoadable) && dc.has(IFluidConfiguration),\n \"Manager has IFluidLoadable & IFluidConfiguration\");\n assert(Array.from(dc.registeredTypes).length === 2, \"Manager has two modules\");\n });\n\n it(`registeredModules() resolves correctly`, async () => {\n const dc = new DependencyContainer();\n dc.register(IFluidLoadable, new MockLoadable());\n dc.register(IFluidConfiguration, new MockFluidConfiguration());\n const modules = Array.from(dc.registeredTypes);\n assert(modules.length === 2, \"Manager has two modules\");\n assert(modules.includes(IFluidLoadable), \"Manager has IFluidLoadable\");\n assert(modules.includes(IFluidConfiguration), \"Manager has IFluidConfiguration\");\n });\n\n it(`Child has Parent modules`, async () => {\n const parentDc = new DependencyContainer();\n const loadableMock = new MockLoadable();\n parentDc.register(IFluidLoadable, loadableMock);\n const dc = new DependencyContainer(parentDc);\n const configMock = new MockFluidConfiguration();\n dc.register(IFluidConfiguration, configMock);\n\n assert(dc.has(IFluidLoadable), \"has includes parent registered\");\n assert(!dc.has(IFluidLoadable, true),\"has does not include excluded parent registered\");\n assert(dc.has(IFluidConfiguration),\"has includes registered\");\n assert(!dc.has(IFluidHandle),\"does not include not registered\");\n });\n\n it(`Parent Resolved from Child`, async () => {\n const parentDc = new DependencyContainer();\n const loadableToHandle: FluidObjectProvider<\"IFluidHandle\"> =\n async (fds: IFluidDependencySynthesizer) => {\n // eslint-disable-next-line @typescript-eslint/ban-types\n const loadable = fds.synthesize<{},IFluidLoadable>({},{IFluidLoadable});\n return (await loadable.IFluidLoadable).handle;\n };\n parentDc.register(IFluidHandle, loadableToHandle);\n\n const dc = new DependencyContainer(parentDc);\n const loadableMock = new MockLoadable();\n dc.register(IFluidLoadable, loadableMock);\n\n const deps = dc.synthesize<IFluidHandle>({IFluidHandle}, {});\n assert(await deps.IFluidHandle !== undefined, \"handle undefined\");\n });\n });\n });\n});\n"]}
@@ -692,8 +692,8 @@
692
692
  "affectsGlobalScope": false
693
693
  },
694
694
  "../../../../runtime/runtime-definitions/dist/garbageCollection.d.ts": {
695
- "version": "15026bcdfb49545956b4efc8b92540f091494d0609eff1306a52ec060482a329",
696
- "signature": "15026bcdfb49545956b4efc8b92540f091494d0609eff1306a52ec060482a329",
695
+ "version": "3a46909d243fe341ce2d71ad0c33977910196461e2f37d1c6ecd8d74abb7c82d",
696
+ "signature": "3a46909d243fe341ce2d71ad0c33977910196461e2f37d1c6ecd8d74abb7c82d",
697
697
  "affectsGlobalScope": false
698
698
  },
699
699
  "../../../../runtime/runtime-definitions/dist/protocol.d.ts": {
@@ -702,13 +702,13 @@
702
702
  "affectsGlobalScope": false
703
703
  },
704
704
  "../../../../runtime/runtime-definitions/dist/summary.d.ts": {
705
- "version": "858952f995ca3e0c7aac1018f41994eb6a82a05450ea880c7dd291fb6d46dfe2",
706
- "signature": "858952f995ca3e0c7aac1018f41994eb6a82a05450ea880c7dd291fb6d46dfe2",
705
+ "version": "50d7cb39cb949662e0994cbdefe4415959dfb4be6c867aab7e73e1e11519fb89",
706
+ "signature": "50d7cb39cb949662e0994cbdefe4415959dfb4be6c867aab7e73e1e11519fb89",
707
707
  "affectsGlobalScope": false
708
708
  },
709
709
  "../../../../runtime/runtime-definitions/dist/dataStoreContext.d.ts": {
710
- "version": "28ef6068103b7201fbe94fe48651d2d8daea2d3cb3f6607a0639c3a26e4b5201",
711
- "signature": "28ef6068103b7201fbe94fe48651d2d8daea2d3cb3f6607a0639c3a26e4b5201",
710
+ "version": "9e9249178b023440d34edcee927f07be916f1a29c4c3c02ace4f8a060d10f3e8",
711
+ "signature": "9e9249178b023440d34edcee927f07be916f1a29c4c3c02ace4f8a060d10f3e8",
712
712
  "affectsGlobalScope": false
713
713
  },
714
714
  "../../../../runtime/runtime-definitions/dist/dataStoreFactory.d.ts": {
@@ -727,13 +727,13 @@
727
727
  "affectsGlobalScope": false
728
728
  },
729
729
  "../../../../runtime/datastore-definitions/dist/dataStoreRuntime.d.ts": {
730
- "version": "96cc8af99cbd2e4653d318e14efff1851029c0e014d3df2d2dc6b0e1e3cddc55",
731
- "signature": "96cc8af99cbd2e4653d318e14efff1851029c0e014d3df2d2dc6b0e1e3cddc55",
730
+ "version": "e870cc895f5a97810e1d7bf84d96533faf4fb67f00c5732d9026c3b959631479",
731
+ "signature": "e870cc895f5a97810e1d7bf84d96533faf4fb67f00c5732d9026c3b959631479",
732
732
  "affectsGlobalScope": false
733
733
  },
734
734
  "../../../../runtime/datastore-definitions/dist/channel.d.ts": {
735
- "version": "fb9f2f9c8aa023b5e7243763536b99bbc7f7305da1d6821cd03d09cc9a91ac64",
736
- "signature": "fb9f2f9c8aa023b5e7243763536b99bbc7f7305da1d6821cd03d09cc9a91ac64",
735
+ "version": "5decb4d4a862e272a49518ea747a268b4fbb753f931b5de7a6cdb0d3a323d8fd",
736
+ "signature": "5decb4d4a862e272a49518ea747a268b4fbb753f931b5de7a6cdb0d3a323d8fd",
737
737
  "affectsGlobalScope": false
738
738
  },
739
739
  "../../../../runtime/datastore-definitions/dist/jsonable.d.ts": {
@@ -752,8 +752,8 @@
752
752
  "affectsGlobalScope": false
753
753
  },
754
754
  "../../../../runtime/datastore/dist/dataStoreRuntime.d.ts": {
755
- "version": "2f24a048495543ad1e2d550cee907264ddc1660a721f1ca5edba5f8021fe48ec",
756
- "signature": "2f24a048495543ad1e2d550cee907264ddc1660a721f1ca5edba5f8021fe48ec",
755
+ "version": "0681e1d400359b7344d1f8390a92e66f11eaa63f1b036b2c99df853d3cbb0e77",
756
+ "signature": "0681e1d400359b7344d1f8390a92e66f11eaa63f1b036b2c99df853d3cbb0e77",
757
757
  "affectsGlobalScope": false
758
758
  },
759
759
  "../../../../runtime/datastore/dist/fluidHandle.d.ts": {
@@ -767,18 +767,18 @@
767
767
  "affectsGlobalScope": false
768
768
  },
769
769
  "../types.d.ts": {
770
- "version": "0e2db71cf9f90c33a0865303ba590bf83107dfb8b0c7ae6671e907af1115b058",
771
- "signature": "0e2db71cf9f90c33a0865303ba590bf83107dfb8b0c7ae6671e907af1115b058",
770
+ "version": "6b322f69f32f18a9d3528354387990b49b75fa3736891a2789cfeb99de926cee",
771
+ "signature": "6b322f69f32f18a9d3528354387990b49b75fa3736891a2789cfeb99de926cee",
772
772
  "affectsGlobalScope": false
773
773
  },
774
774
  "../IFluidDependencySynthesizer.d.ts": {
775
- "version": "83d22c422c78fae1c34fe21877cdf66039978997a0f5636fee4a55f527136477",
776
- "signature": "83d22c422c78fae1c34fe21877cdf66039978997a0f5636fee4a55f527136477",
775
+ "version": "93b84a17e082bd3d24ff7c121eeb509d1ccc21b59fc26fe592b67ff4cc3ad30a",
776
+ "signature": "93b84a17e082bd3d24ff7c121eeb509d1ccc21b59fc26fe592b67ff4cc3ad30a",
777
777
  "affectsGlobalScope": false
778
778
  },
779
779
  "../dependencyContainer.d.ts": {
780
- "version": "a3b3ea5a1340459e8391733aebf8d29816f39688f863fa0a9ec96e556335a288",
781
- "signature": "a3b3ea5a1340459e8391733aebf8d29816f39688f863fa0a9ec96e556335a288",
780
+ "version": "ae72dc4141881e5bdc6a1174f6f3a1328b7b7d485d24b1c9713e2fd72fcc0e4e",
781
+ "signature": "ae72dc4141881e5bdc6a1174f6f3a1328b7b7d485d24b1c9713e2fd72fcc0e4e",
782
782
  "affectsGlobalScope": false
783
783
  },
784
784
  "../index.d.ts": {
@@ -787,7 +787,7 @@
787
787
  "affectsGlobalScope": false
788
788
  },
789
789
  "../../src/test/dependencyContainer.spec.ts": {
790
- "version": "73a96aae189befd029f1d44ccde4309e76e39cd45cf3902397dc5bb2123f0324",
790
+ "version": "2e7709f8721ad8cf73c2d90e61dc6867d798f8de2f566f1b99a0b95269e63612",
791
791
  "signature": "abc949a48872f03572ff3108a999c28e5e394296186194fa9e4ad357fa3cfcd7",
792
792
  "affectsGlobalScope": false
793
793
  },
@@ -1280,13 +1280,15 @@
1280
1280
  ],
1281
1281
  "../types.d.ts": [
1282
1282
  "../../../../../node_modules/@fluidframework/core-interfaces/dist/index.d.ts",
1283
- "../dependencyContainer.d.ts"
1283
+ "../index.d.ts"
1284
1284
  ],
1285
1285
  "../../src/test/dependencyContainer.spec.ts": [
1286
1286
  "../../../../../node_modules/@fluidframework/core-interfaces/dist/index.d.ts",
1287
1287
  "../../../../../node_modules/@types/node/assert.d.ts",
1288
1288
  "../../../../runtime/datastore/dist/index.d.ts",
1289
- "../index.d.ts"
1289
+ "../IFluidDependencySynthesizer.d.ts",
1290
+ "../index.d.ts",
1291
+ "../types.d.ts"
1290
1292
  ],
1291
1293
  "../../../../runtime/datastore-definitions/dist/channel.d.ts": [
1292
1294
  "../../../../../node_modules/@fluidframework/core-interfaces/dist/index.d.ts",
@@ -1831,7 +1833,7 @@
1831
1833
  ],
1832
1834
  "../types.d.ts": [
1833
1835
  "../../../../../node_modules/@fluidframework/core-interfaces/dist/index.d.ts",
1834
- "../dependencyContainer.d.ts"
1836
+ "../index.d.ts"
1835
1837
  ],
1836
1838
  "../../../../runtime/datastore-definitions/dist/channel.d.ts": [
1837
1839
  "../../../../../node_modules/@fluidframework/core-interfaces/dist/index.d.ts",
package/dist/types.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { IFluidObject } from "@fluidframework/core-interfaces";
6
- import { DependencyContainer } from "./dependencyContainer";
6
+ import { IFluidDependencySynthesizer } from ".";
7
7
  export declare type FluidObjectKey<T extends IFluidObject> = keyof T & keyof IFluidObject;
8
8
  /**
9
9
  * This is a condensed version of Record that requires the object has all
@@ -42,8 +42,9 @@ export declare type NonNullableFluidObject<T extends keyof IFluidObject> = NonNu
42
42
  /**
43
43
  * Multiple ways to provide a Fluid object.
44
44
  */
45
- export declare type FluidObjectProvider<T extends keyof IFluidObject> = NonNullableFluidObject<T> | Promise<NonNullableFluidObject<T>> | ((dependencyContainer: DependencyContainer) => NonNullableFluidObject<T>) | ((dependencyContainer: DependencyContainer) => Promise<NonNullableFluidObject<T>>);
45
+ export declare type FluidObjectProvider<T extends keyof IFluidObject> = NonNullableFluidObject<T> | Promise<NonNullableFluidObject<T>> | ((dependencyContainer: IFluidDependencySynthesizer) => NonNullableFluidObject<T>) | ((dependencyContainer: IFluidDependencySynthesizer) => Promise<NonNullableFluidObject<T>>);
46
46
  /**
47
+ * @deprecated - create a new DependencyContainer instead
47
48
  * ProviderEntry is a mapping of the type to the Provider
48
49
  */
49
50
  export interface ProviderEntry<T extends keyof IFluidObject> {
@@ -51,6 +52,7 @@ export interface ProviderEntry<T extends keyof IFluidObject> {
51
52
  provider: FluidObjectProvider<T>;
52
53
  }
53
54
  /**
55
+ * @deprecated - create a new DependencyContainer instead
54
56
  * A mapping of ProviderEntries
55
57
  */
56
58
  export declare type DependencyContainerRegistry = Iterable<ProviderEntry<any>>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,oBAAY,cAAc,CAAC,CAAC,SAAS,YAAY,IAAI,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC;AAElF;;;;;;GAMG;AACH,oBAAY,yBAAyB,CAAC,CAAC,SAAS,YAAY,IAAI;KAC3D,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC;CAClD,CAAC;AAEF;;;;GAIG;AACH,oBAAY,gCAAgC,CAAC,CAAC,SAAS,MAAM,YAAY,IAAI;KACxE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAClD,CAAC;AAEF;;;;GAIG;AACH,oBAAY,gCAAgC,CAAC,CAAC,SAAS,MAAM,YAAY,IAAI;KACxE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,oBAAY,wBAAwB,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,CAAC,SAAS,MAAM,YAAY,IACzF,gCAAgC,CAAC,CAAC,CAAC,GAAG,gCAAgC,CAAC,CAAC,CAAC,CAAC;AAEhF;;GAEG;AACH,oBAAY,sBAAsB,CAAC,CAAC,SAAS,MAAM,YAAY,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhG;;GAEG;AACH,oBAAY,mBAAmB,CAAC,CAAC,SAAS,MAAM,YAAY,IACxD,sBAAsB,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,GAClC,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,KAAK,sBAAsB,CAAC,CAAC,CAAC,CAAC,GACzE,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,YAAY;IACvD,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAA;CACnC;AAED;;GAEG;AACH,oBAAY,2BAA2B,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,GAAG,CAAC;AAEhD,oBAAY,cAAc,CAAC,CAAC,SAAS,YAAY,IAAI,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC;AAElF;;;;;;GAMG;AACH,oBAAY,yBAAyB,CAAC,CAAC,SAAS,YAAY,IAAI;KAC3D,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC;CAClD,CAAC;AAEF;;;;GAIG;AACH,oBAAY,gCAAgC,CAAC,CAAC,SAAS,MAAM,YAAY,IAAI;KACxE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAClD,CAAC;AAEF;;;;GAIG;AACH,oBAAY,gCAAgC,CAAC,CAAC,SAAS,MAAM,YAAY,IAAI;KACxE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,oBAAY,wBAAwB,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,CAAC,SAAS,MAAM,YAAY,IACzF,gCAAgC,CAAC,CAAC,CAAC,GAAG,gCAAgC,CAAC,CAAC,CAAC,CAAC;AAEhF;;GAEG;AACH,oBAAY,sBAAsB,CAAC,CAAC,SAAS,MAAM,YAAY,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhG;;GAEG;AACH,oBAAY,mBAAmB,CAAC,CAAC,SAAS,MAAM,YAAY,IACxD,sBAAsB,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,GAClC,CAAC,CAAC,mBAAmB,EAAE,2BAA2B,KAAK,sBAAsB,CAAC,CAAC,CAAC,CAAC,GACjF,CAAC,CAAC,mBAAmB,EAAE,2BAA2B,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjG;;;GAGG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,YAAY;IACvD,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAA;CACnC;AAED;;;GAGG;AACH,oBAAY,2BAA2B,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport { DependencyContainer } from \"./dependencyContainer\";\n\nexport type FluidObjectKey<T extends IFluidObject> = keyof T & keyof IFluidObject;\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to a string representation\n * of that property.\n *\n * @example - \\{ IFoo: \"IFoo\" \\}\n */\nexport type FluidObjectSymbolProvider<T extends IFluidObject> = {\n [P in FluidObjectKey<T>]: FluidObjectKey<T> & P;\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to an object that implements\n * the property.\n */\nexport type AsyncRequiredFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<NonNullable<IFluidObject[P]>>\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type, mapped to an object that implements\n * the property or undefined.\n */\nexport type AsyncOptionalFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<IFluidObject[P] | undefined>;\n};\n\n/**\n * Combined type for Optional and Required Async Fluid object Providers\n */\nexport type AsyncFluidObjectProvider<O extends keyof IFluidObject, R extends keyof IFluidObject>\n = AsyncOptionalFluidObjectProvider<O> & AsyncRequiredFluidObjectProvider<R>;\n\n/**\n * Provided a keyof IFluidObject will ensure the type is an instance of that type\n */\nexport type NonNullableFluidObject<T extends keyof IFluidObject> = NonNullable<IFluidObject[T]>;\n\n/**\n * Multiple ways to provide a Fluid object.\n */\nexport type FluidObjectProvider<T extends keyof IFluidObject> =\n NonNullableFluidObject<T>\n | Promise<NonNullableFluidObject<T>>\n | ((dependencyContainer: DependencyContainer) => NonNullableFluidObject<T>)\n | ((dependencyContainer: DependencyContainer) => Promise<NonNullableFluidObject<T>>);\n\n/**\n * ProviderEntry is a mapping of the type to the Provider\n */\nexport interface ProviderEntry<T extends keyof IFluidObject> {\n type: T;\n provider: FluidObjectProvider<T>\n}\n\n/**\n * A mapping of ProviderEntries\n */\nexport type DependencyContainerRegistry = Iterable<ProviderEntry<any>>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport { IFluidDependencySynthesizer } from \".\";\n\nexport type FluidObjectKey<T extends IFluidObject> = keyof T & keyof IFluidObject;\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to a string representation\n * of that property.\n *\n * @example - \\{ IFoo: \"IFoo\" \\}\n */\nexport type FluidObjectSymbolProvider<T extends IFluidObject> = {\n [P in FluidObjectKey<T>]: FluidObjectKey<T> & P;\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to an object that implements\n * the property.\n */\nexport type AsyncRequiredFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<NonNullable<IFluidObject[P]>>\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type, mapped to an object that implements\n * the property or undefined.\n */\nexport type AsyncOptionalFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<IFluidObject[P] | undefined>;\n};\n\n/**\n * Combined type for Optional and Required Async Fluid object Providers\n */\nexport type AsyncFluidObjectProvider<O extends keyof IFluidObject, R extends keyof IFluidObject>\n = AsyncOptionalFluidObjectProvider<O> & AsyncRequiredFluidObjectProvider<R>;\n\n/**\n * Provided a keyof IFluidObject will ensure the type is an instance of that type\n */\nexport type NonNullableFluidObject<T extends keyof IFluidObject> = NonNullable<IFluidObject[T]>;\n\n/**\n * Multiple ways to provide a Fluid object.\n */\nexport type FluidObjectProvider<T extends keyof IFluidObject> =\n NonNullableFluidObject<T>\n | Promise<NonNullableFluidObject<T>>\n | ((dependencyContainer: IFluidDependencySynthesizer) => NonNullableFluidObject<T>)\n | ((dependencyContainer: IFluidDependencySynthesizer) => Promise<NonNullableFluidObject<T>>);\n\n/**\n * @deprecated - create a new DependencyContainer instead\n * ProviderEntry is a mapping of the type to the Provider\n */\nexport interface ProviderEntry<T extends keyof IFluidObject> {\n type: T;\n provider: FluidObjectProvider<T>\n}\n\n/**\n * @deprecated - create a new DependencyContainer instead\n * A mapping of ProviderEntries\n */\nexport type DependencyContainerRegistry = Iterable<ProviderEntry<any>>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IFluidDependencySynthesizer.js","sourceRoot":"","sources":["../src/IFluidDependencySynthesizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,CAAC,MAAM,2BAA2B,GAClC,6BAA6B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n} from \"./types\";\n\ndeclare module \"@fluidframework/core-interfaces\" {\n export interface IFluidObject {\n /** @deprecated - use `FluidObject<IFluidDependencySynthesizer>` instead */\n readonly IFluidDependencySynthesizer?: IFluidDependencySynthesizer;\n }\n}\n\nexport const IFluidDependencySynthesizer: keyof IProvideFluidDependencySynthesizer\n = \"IFluidDependencySynthesizer\";\n\nexport interface IProvideFluidDependencySynthesizer {\n IFluidDependencySynthesizer: IFluidDependencySynthesizer;\n}\n\n/**\n * IFluidDependencySynthesizer can generate IFluidObjects based on the IProvideFluidObject pattern.\n * It allow for registering providers and uses synthesize to generate a new object with the optional\n * and required types.\n */\nexport interface IFluidDependencySynthesizer extends IProvideFluidDependencySynthesizer {\n /**\n * All the registered types available\n */\n readonly registeredTypes: Iterable<(keyof IFluidObject)>;\n\n /**\n * Add a new provider\n * @param type - Name of the Type T being provided\n * @param provider - A provider that will resolve the T correctly when asked\n * @throws - If passing a type that's already registered\n */\n register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void;\n\n /**\n * Remove a provider\n * @param type - Name of the provider to remove\n */\n unregister<T extends keyof IFluidObject>(type: T): void;\n\n /**\n * synthesize takes optional and required types and returns an object that will fulfill the\n * defined types based off objects that has been previously registered.\n *\n * @param optionalTypes - optional types to be in the Scope object\n * @param requiredTypes - required types that need to be in the Scope object\n */\n synthesize<\n O extends IFluidObject,\n R extends IFluidObject>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>>;\n\n /**\n * Check if a given type is registered\n * @param types - Type to check\n */\n has(...types: (keyof IFluidObject)[]): boolean;\n\n /**\n * Get a provider. undefined if not available.\n * @param type - Type to get\n */\n getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined;\n}\n"]}
1
+ {"version":3,"file":"IFluidDependencySynthesizer.js","sourceRoot":"","sources":["../src/IFluidDependencySynthesizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,CAAC,MAAM,2BAA2B,GAClC,6BAA6B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n} from \"./types\";\n\ndeclare module \"@fluidframework/core-interfaces\" {\n export interface IFluidObject {\n /** @deprecated - use `FluidObject<IFluidDependencySynthesizer>` instead */\n readonly IFluidDependencySynthesizer?: IFluidDependencySynthesizer;\n }\n}\n\nexport const IFluidDependencySynthesizer: keyof IProvideFluidDependencySynthesizer\n = \"IFluidDependencySynthesizer\";\n\nexport interface IProvideFluidDependencySynthesizer {\n IFluidDependencySynthesizer: IFluidDependencySynthesizer;\n}\n\n/**\n * IFluidDependencySynthesizer can generate IFluidObjects based on the IProvideFluidObject pattern.\n * It allow for registering providers and uses synthesize to generate a new object with the optional\n * and required types.\n */\nexport interface IFluidDependencySynthesizer extends IProvideFluidDependencySynthesizer {\n /**\n * @deprecated - This will only be available on DependencyContainer\n * All the registered types available\n */\n readonly registeredTypes: Iterable<(keyof IFluidObject)>;\n\n /**\n * @deprecated - This will only be available on DependencyContainer\n * Add a new provider\n * @param type - Name of the Type T being provided\n * @param provider - A provider that will resolve the T correctly when asked\n * @throws - If passing a type that's already registered\n */\n register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void;\n\n /**\n * @deprecated - This will only be available on DependencyContainer\n * Remove a provider\n * @param type - Name of the provider to remove\n */\n unregister<T extends keyof IFluidObject>(type: T): void;\n\n /**\n * synthesize takes optional and required types and returns an object that will fulfill the\n * defined types based off objects that has been previously registered.\n *\n * @param optionalTypes - optional types to be in the Scope object\n * @param requiredTypes - required types that need to be in the Scope object\n */\n synthesize<\n O extends IFluidObject,\n R extends IFluidObject>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>>;\n\n /**\n * Check if a given type is registered\n * @param type - Type to check\n */\n has(type: (keyof IFluidObject)): boolean;\n\n /**\n * @deprecated - This will be removed. Use synthesize or has instead\n * Get a provider. undefined if not available.\n * @param type - Type to get\n */\n getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined;\n}\n"]}
@@ -2,17 +2,19 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ import { IFluidDependencySynthesizer, } from "./IFluidDependencySynthesizer";
5
6
  /**
6
7
  * DependencyContainer is similar to a IoC Container. It takes providers and will
7
8
  * synthesize an object based on them when requested.
8
9
  */
9
10
  export class DependencyContainer {
10
- constructor(parent = undefined) {
11
- this.parent = parent;
11
+ constructor(...parents) {
12
12
  this.providers = new Map();
13
+ this.parents = parents.filter((v) => v !== undefined);
13
14
  }
14
15
  get IFluidDependencySynthesizer() { return this; }
15
16
  /**
17
+ * @deprecated - use has instead
16
18
  * {@inheritDoc (IFluidDependencySynthesizer:interface).registeredTypes}
17
19
  */
18
20
  get registeredTypes() {
@@ -22,7 +24,7 @@ export class DependencyContainer {
22
24
  * {@inheritDoc (IFluidDependencySynthesizer:interface).register}
23
25
  */
24
26
  register(type, provider) {
25
- if (this.has(type)) {
27
+ if (this.providers.has(type)) {
26
28
  throw new Error(`Attempting to register a provider of type ${type} that already exists`);
27
29
  }
28
30
  this.providers.set(type, provider);
@@ -39,25 +41,28 @@ export class DependencyContainer {
39
41
  * {@inheritDoc (IFluidDependencySynthesizer:interface).synthesize}
40
42
  */
41
43
  synthesize(optionalTypes, requiredTypes) {
42
- const optionalValues = Object.values(optionalTypes);
43
- const requiredValues = Object.values(requiredTypes);
44
- // There was nothing passed in so we can return
45
- if (optionalValues === [] && requiredValues === []) {
46
- return {};
47
- }
48
- const required = this.generateRequired(requiredTypes);
49
- const optional = this.generateOptional(optionalTypes);
50
- return Object.assign(Object.assign({}, required), optional);
44
+ const base = {};
45
+ this.generateRequired(base, requiredTypes);
46
+ this.generateOptional(base, optionalTypes);
47
+ Object.defineProperty(base, IFluidDependencySynthesizer, { get: () => this });
48
+ return base;
51
49
  }
52
50
  /**
53
51
  * {@inheritDoc (IFluidDependencySynthesizer:interface).has}
52
+ * @param excludeParents - If true, exclude checking parent registries
54
53
  */
55
- has(...types) {
56
- return types.every((type) => {
57
- return this.providers.has(type);
58
- });
54
+ has(type, excludeParents) {
55
+ if (this.providers.has(type)) {
56
+ return true;
57
+ }
58
+ if (excludeParents !== true) {
59
+ return this.parents.some((p) => p.has(type));
60
+ }
61
+ return false;
59
62
  }
60
63
  /**
64
+ * @deprecated - use synthesize or has instead
65
+ *
61
66
  * {@inheritDoc (IFluidDependencySynthesizer:interface).getProvider}
62
67
  */
63
68
  getProvider(type) {
@@ -66,50 +71,61 @@ export class DependencyContainer {
66
71
  if (provider) {
67
72
  return provider;
68
73
  }
69
- if (this.parent) {
70
- return this.parent.getProvider(type);
74
+ for (const parent of this.parents) {
75
+ const p = parent.getProvider(type);
76
+ if (p !== undefined) {
77
+ return p;
78
+ }
71
79
  }
72
80
  return undefined;
73
81
  }
74
- generateRequired(types) {
75
- const values = Object.values(types);
76
- return Object.assign({}, ...Array.from(values, (t) => {
77
- const provider = this.getProvider(t);
78
- if (!provider) {
79
- throw new Error(`Object attempted to be created without registered required provider ${t}`);
82
+ generateRequired(base, types) {
83
+ for (const key of Object.keys(types)) {
84
+ const provider = this.resolveProvider(key);
85
+ if (provider === undefined) {
86
+ throw new Error(`Object attempted to be created without registered required provider ${key}`);
80
87
  }
81
- return this.resolveProvider(provider, t);
82
- }));
88
+ Object.defineProperty(base, key, provider);
89
+ }
83
90
  }
84
- generateOptional(types) {
85
- const values = Object.values(types);
86
- return Object.assign({}, ...Array.from(values, (t) => {
87
- const provider = this.getProvider(t);
88
- if (!provider) {
89
- return { get [t]() { return Promise.resolve(undefined); } };
91
+ generateOptional(base, types) {
92
+ for (const key of Object.keys(types)) {
93
+ const provider = this.resolveProvider(key);
94
+ if (provider !== undefined) {
95
+ Object.defineProperty(base, key, provider);
90
96
  }
91
- return this.resolveProvider(provider, t);
92
- }));
97
+ }
93
98
  }
94
- resolveProvider(provider, t) {
99
+ resolveProvider(t) {
100
+ // If we have the provider return it
101
+ const provider = this.providers.get(t);
102
+ if (provider === undefined) {
103
+ for (const parent of this.parents) {
104
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
105
+ const sp = { [t]: t };
106
+ // eslint-disable-next-line @typescript-eslint/ban-types
107
+ const syn = parent.synthesize(sp, {});
108
+ const descriptor = Object.getOwnPropertyDescriptor(syn, t);
109
+ if (descriptor !== undefined) {
110
+ return descriptor;
111
+ }
112
+ }
113
+ return undefined;
114
+ }
95
115
  // The double nested gets are required for lazy loading the provider resolution
96
116
  if (typeof provider === "function") {
97
- // eslint-disable-next-line @typescript-eslint/no-this-alias
98
- const self = this;
99
117
  return {
100
- get [t]() {
118
+ get() {
101
119
  if (provider && typeof provider === "function") {
102
- return Promise.resolve(provider(self)).then((p) => {
103
- if (p) {
104
- return p[t];
105
- }
106
- });
120
+ return Promise.resolve(this[IFluidDependencySynthesizer])
121
+ .then(async (fds) => provider(fds))
122
+ .then((p) => p === null || p === void 0 ? void 0 : p[t]);
107
123
  }
108
124
  },
109
125
  };
110
126
  }
111
127
  return {
112
- get [t]() {
128
+ get() {
113
129
  if (provider) {
114
130
  return Promise.resolve(provider).then((p) => {
115
131
  if (p) {
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyContainer.js","sourceRoot":"","sources":["../src/dependencyContainer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\n\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n} from \"./types\";\nimport {\n IFluidDependencySynthesizer,\n} from \"./IFluidDependencySynthesizer\";\n\n/**\n * DependencyContainer is similar to a IoC Container. It takes providers and will\n * synthesize an object based on them when requested.\n */\nexport class DependencyContainer implements IFluidDependencySynthesizer {\n private readonly providers = new Map<keyof IFluidObject, FluidObjectProvider<any>>();\n\n public get IFluidDependencySynthesizer() { return this; }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).registeredTypes}\n */\n public get registeredTypes(): Iterable<(keyof IFluidObject)> {\n return this.providers.keys();\n }\n\n public constructor(public parent: IFluidDependencySynthesizer | undefined = undefined) { }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).register}\n */\n public register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void {\n if (this.has(type)) {\n throw new Error(`Attempting to register a provider of type ${type} that already exists`);\n }\n\n this.providers.set(type, provider);\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).unregister}\n */\n public unregister<T extends keyof IFluidObject>(type: T): void {\n if (this.providers.has(type)) {\n this.providers.delete(type);\n }\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).synthesize}\n */\n public synthesize<\n O extends IFluidObject,\n // eslint-disable-next-line @typescript-eslint/ban-types\n R extends IFluidObject = {}>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>> {\n const optionalValues = Object.values(optionalTypes);\n const requiredValues = Object.values(requiredTypes);\n\n // There was nothing passed in so we can return\n if (optionalValues === [] && requiredValues === []) {\n return {} as any;\n }\n\n const required = this.generateRequired<R>(requiredTypes);\n const optional = this.generateOptional<O>(optionalTypes);\n return { ...required, ...optional };\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).has}\n */\n public has(...types: (keyof IFluidObject)[]): boolean {\n return types.every((type) => {\n return this.providers.has(type);\n });\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).getProvider}\n */\n public getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined {\n // If we have the provider return it\n const provider = this.providers.get(type);\n if (provider) {\n return provider;\n }\n\n if (this.parent) {\n return this.parent.getProvider(type);\n }\n\n return undefined;\n }\n\n private generateRequired<T extends IFluidObject>(\n types: FluidObjectSymbolProvider<T>,\n ) {\n const values: (keyof IFluidObject)[] = Object.values(types);\n return Object.assign({}, ...Array.from(values, (t) => {\n const provider = this.getProvider(t);\n if (!provider) {\n throw new Error(`Object attempted to be created without registered required provider ${t}`);\n }\n\n return this.resolveProvider(provider, t);\n }));\n }\n\n private generateOptional<T extends IFluidObject>(\n types: FluidObjectSymbolProvider<T>,\n ) {\n const values: (keyof IFluidObject)[] = Object.values(types);\n return Object.assign({}, ...Array.from(values, (t) => {\n const provider = this.getProvider(t);\n if (!provider) {\n return { get [t]() { return Promise.resolve(undefined); } };\n }\n\n return this.resolveProvider(provider, t);\n }));\n }\n\n private resolveProvider<T extends keyof IFluidObject>(provider: FluidObjectProvider<T>, t: keyof IFluidObject) {\n // The double nested gets are required for lazy loading the provider resolution\n if (typeof provider === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n return {\n get [t]() {\n if (provider && typeof provider === \"function\") {\n return Promise.resolve(provider(self)).then((p) => {\n if (p) {\n return p[t];\n }\n });\n }\n },\n };\n }\n\n return {\n get [t]() {\n if (provider) {\n return Promise.resolve(provider).then((p) => {\n if (p) {\n return p[t];\n }\n });\n }\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"dependencyContainer.js","sourceRoot":"","sources":["../src/dependencyContainer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EACH,2BAA2B,GAC9B,MAAM,+BAA+B,CAAC;AAEvC;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAa5B,YAAmB,GAAI,OAAoD;QAZ1D,cAAS,GAAG,IAAI,GAAG,EAAgD,CAAC;QAajF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC5F,CAAC;IAZD,IAAW,2BAA2B,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAEzD;;;OAGG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAMD;;OAEG;IACI,QAAQ,CAA+B,IAAO,EAAE,QAAgC;QACnF,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,sBAAsB,CAAC,CAAC;SAC5F;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,UAAU,CAA+B,IAAO;QACnD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC/B;IACL,CAAC;IAED;;OAEG;IACI,UAAU,CAIT,aAA2C,EAC3C,aAA2C;QAE/C,MAAM,IAAI,GAAmE,EAAS,CAAC;QACvF,IAAI,CAAC,gBAAgB,CAAI,IAAI,EAAE,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAI,IAAI,EAAE,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,2BAA2B,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,GAAG,CAAC,IAA0B,EAAE,cAAwB;QAC3D,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC;SACf;QACD,IAAI,cAAc,KAAK,IAAI,EAAE;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAA8B,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7E;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAA+B,IAAO;QACpD,oCAAoC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE;YACV,OAAO,QAAQ,CAAC;SACnB;QAED,KAAI,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,SAAS,EAAE;gBACjB,OAAO,CAAC,CAAC;aACZ;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,gBAAgB,CACpB,IAAyD,EACzD,KAAmC;QAEnC,KAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAsC,EAAE;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAG,QAAQ,KAAK,SAAS,EAAE;gBACvB,MAAM,IAAI,KAAK,CAAC,uEAAuE,GAAG,EAAE,CAAC,CAAC;aACjG;YACD,MAAM,CAAC,cAAc,CACjB,IAAI,EACJ,GAAG,EACH,QAAQ,CACX,CAAC;SACL;IACL,CAAC;IAEO,gBAAgB,CACpB,IAAyD,EACzD,KAAmC;QAEnC,KAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAsC,EAAE;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAG,QAAQ,KAAK,SAAS,EAAE;gBACvB,MAAM,CAAC,cAAc,CACjB,IAAI,EACJ,GAAG,EACH,QAAQ,CACX,CAAC;aACL;SACJ;IACL,CAAC;IAEO,eAAe,CAA+B,CAAI;QACtD,oCAAoC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS,EAAE;YACxB,KAAI,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9B,yEAAyE;gBACzE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAsD,CAAC;gBAC1E,wDAAwD;gBACxD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CACzB,EAAE,EACF,EAAE,CAAC,CAAC;gBACR,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC3D,IAAI,UAAU,KAAK,SAAS,EAAE;oBAC1B,OAAO,UAAU,CAAC;iBACrB;aACJ;YACD,OAAO,SAAS,CAAC;SACpB;QAED,+EAA+E;QAC/E,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;YAChC,OAAO;gBACH,GAAG;oBACC,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;wBAC5C,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;6BACpD,IAAI,CAAC,KAAK,EAAE,GAAG,EAAgB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;6BAChD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAG,CAAC,CAAC,CAAC,CAAC;qBAC5B;gBACL,CAAC;aACJ,CAAC;SACL;QACD,OAAO;YACC,GAAG;gBACC,IAAI,QAAQ,EAAE;oBACV,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;wBACxC,IAAI,CAAC,EAAE;4BACH,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;yBACf;oBACL,CAAC,CAAC,CAAC;iBACN;YACL,CAAC;SACJ,CAAC;IACV,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\n\nimport {\n AsyncFluidObjectProvider,\n FluidObjectSymbolProvider,\n FluidObjectProvider,\n FluidObjectKey,\n AsyncOptionalFluidObjectProvider,\n AsyncRequiredFluidObjectProvider,\n} from \"./types\";\nimport {\n IFluidDependencySynthesizer,\n} from \"./IFluidDependencySynthesizer\";\n\n/**\n * DependencyContainer is similar to a IoC Container. It takes providers and will\n * synthesize an object based on them when requested.\n */\nexport class DependencyContainer implements IFluidDependencySynthesizer {\n private readonly providers = new Map<keyof IFluidObject, FluidObjectProvider<any>>();\n private readonly parents: IFluidDependencySynthesizer[];\n public get IFluidDependencySynthesizer() { return this; }\n\n /**\n * @deprecated - use has instead\n * {@inheritDoc (IFluidDependencySynthesizer:interface).registeredTypes}\n */\n public get registeredTypes(): Iterable<(keyof IFluidObject)> {\n return this.providers.keys();\n }\n\n public constructor(... parents: (IFluidDependencySynthesizer | undefined)[]) {\n this.parents = parents.filter((v): v is IFluidDependencySynthesizer => v !== undefined);\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).register}\n */\n public register<T extends keyof IFluidObject>(type: T, provider: FluidObjectProvider<T>): void {\n if (this.providers.has(type)) {\n throw new Error(`Attempting to register a provider of type ${type} that already exists`);\n }\n\n this.providers.set(type, provider);\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).unregister}\n */\n public unregister<T extends keyof IFluidObject>(type: T): void {\n if (this.providers.has(type)) {\n this.providers.delete(type);\n }\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).synthesize}\n */\n public synthesize<\n O extends IFluidObject,\n // eslint-disable-next-line @typescript-eslint/ban-types\n R extends IFluidObject = {}>(\n optionalTypes: FluidObjectSymbolProvider<O>,\n requiredTypes: FluidObjectSymbolProvider<R>,\n ): AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>> {\n const base: AsyncFluidObjectProvider<FluidObjectKey<O>, FluidObjectKey<R>> = {} as any;\n this.generateRequired<R>(base, requiredTypes);\n this.generateOptional<O>(base, optionalTypes);\n Object.defineProperty(base, IFluidDependencySynthesizer, { get: () => this });\n return base;\n }\n\n /**\n * {@inheritDoc (IFluidDependencySynthesizer:interface).has}\n * @param excludeParents - If true, exclude checking parent registries\n */\n public has(type: (keyof IFluidObject), excludeParents?: boolean): boolean {\n if (this.providers.has(type)) {\n return true;\n }\n if (excludeParents !== true) {\n return this.parents.some((p: IFluidDependencySynthesizer) => p.has(type));\n }\n return false;\n }\n\n /**\n * @deprecated - use synthesize or has instead\n *\n * {@inheritDoc (IFluidDependencySynthesizer:interface).getProvider}\n */\n public getProvider<T extends keyof IFluidObject>(type: T): FluidObjectProvider<T> | undefined {\n // If we have the provider return it\n const provider = this.providers.get(type);\n if (provider) {\n return provider;\n }\n\n for(const parent of this.parents) {\n const p = parent.getProvider(type);\n if (p !== undefined) {\n return p;\n }\n }\n\n return undefined;\n }\n\n private generateRequired<T extends IFluidObject>(\n base: AsyncRequiredFluidObjectProvider<FluidObjectKey<T>>,\n types: FluidObjectSymbolProvider<T>,\n ) {\n for(const key of Object.keys(types) as unknown as (keyof IFluidObject)[]) {\n const provider = this.resolveProvider(key);\n if(provider === undefined) {\n throw new Error(`Object attempted to be created without registered required provider ${key}`);\n }\n Object.defineProperty(\n base,\n key,\n provider,\n );\n }\n }\n\n private generateOptional<T extends IFluidObject>(\n base: AsyncOptionalFluidObjectProvider<FluidObjectKey<T>>,\n types: FluidObjectSymbolProvider<T>,\n ) {\n for(const key of Object.keys(types) as unknown as (keyof IFluidObject)[]) {\n const provider = this.resolveProvider(key);\n if(provider !== undefined) {\n Object.defineProperty(\n base,\n key,\n provider,\n );\n }\n }\n }\n\n private resolveProvider<T extends keyof IFluidObject>(t: T): PropertyDescriptor | undefined {\n // If we have the provider return it\n const provider = this.providers.get(t);\n if (provider === undefined) {\n for(const parent of this.parents) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const sp = { [t]: t } as FluidObjectSymbolProvider<Pick<IFluidObject, T>>;\n // eslint-disable-next-line @typescript-eslint/ban-types\n const syn = parent.synthesize<Pick<IFluidObject, T>,{}>(\n sp,\n {});\n const descriptor = Object.getOwnPropertyDescriptor(syn, t);\n if (descriptor !== undefined) {\n return descriptor;\n }\n }\n return undefined;\n }\n\n // The double nested gets are required for lazy loading the provider resolution\n if (typeof provider === \"function\") {\n return {\n get() {\n if (provider && typeof provider === \"function\") {\n return Promise.resolve(this[IFluidDependencySynthesizer])\n .then(async (fds): Promise<any> => provider(fds))\n .then((p) => p?.[t]);\n }\n },\n };\n }\n return {\n get() {\n if (provider) {\n return Promise.resolve(provider).then((p) => {\n if (p) {\n return p[t];\n }\n });\n }\n },\n };\n }\n}\n"]}
package/lib/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport { DependencyContainer } from \"./dependencyContainer\";\n\nexport type FluidObjectKey<T extends IFluidObject> = keyof T & keyof IFluidObject;\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to a string representation\n * of that property.\n *\n * @example - \\{ IFoo: \"IFoo\" \\}\n */\nexport type FluidObjectSymbolProvider<T extends IFluidObject> = {\n [P in FluidObjectKey<T>]: FluidObjectKey<T> & P;\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to an object that implements\n * the property.\n */\nexport type AsyncRequiredFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<NonNullable<IFluidObject[P]>>\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type, mapped to an object that implements\n * the property or undefined.\n */\nexport type AsyncOptionalFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<IFluidObject[P] | undefined>;\n};\n\n/**\n * Combined type for Optional and Required Async Fluid object Providers\n */\nexport type AsyncFluidObjectProvider<O extends keyof IFluidObject, R extends keyof IFluidObject>\n = AsyncOptionalFluidObjectProvider<O> & AsyncRequiredFluidObjectProvider<R>;\n\n/**\n * Provided a keyof IFluidObject will ensure the type is an instance of that type\n */\nexport type NonNullableFluidObject<T extends keyof IFluidObject> = NonNullable<IFluidObject[T]>;\n\n/**\n * Multiple ways to provide a Fluid object.\n */\nexport type FluidObjectProvider<T extends keyof IFluidObject> =\n NonNullableFluidObject<T>\n | Promise<NonNullableFluidObject<T>>\n | ((dependencyContainer: DependencyContainer) => NonNullableFluidObject<T>)\n | ((dependencyContainer: DependencyContainer) => Promise<NonNullableFluidObject<T>>);\n\n/**\n * ProviderEntry is a mapping of the type to the Provider\n */\nexport interface ProviderEntry<T extends keyof IFluidObject> {\n type: T;\n provider: FluidObjectProvider<T>\n}\n\n/**\n * A mapping of ProviderEntries\n */\nexport type DependencyContainerRegistry = Iterable<ProviderEntry<any>>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { IFluidObject } from \"@fluidframework/core-interfaces\";\nimport { IFluidDependencySynthesizer } from \".\";\n\nexport type FluidObjectKey<T extends IFluidObject> = keyof T & keyof IFluidObject;\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to a string representation\n * of that property.\n *\n * @example - \\{ IFoo: \"IFoo\" \\}\n */\nexport type FluidObjectSymbolProvider<T extends IFluidObject> = {\n [P in FluidObjectKey<T>]: FluidObjectKey<T> & P;\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type mapped to an object that implements\n * the property.\n */\nexport type AsyncRequiredFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<NonNullable<IFluidObject[P]>>\n};\n\n/**\n * This is a condensed version of Record that requires the object has all\n * the IFluidObject properties as its type, mapped to an object that implements\n * the property or undefined.\n */\nexport type AsyncOptionalFluidObjectProvider<T extends keyof IFluidObject> = {\n [P in T]: Promise<IFluidObject[P] | undefined>;\n};\n\n/**\n * Combined type for Optional and Required Async Fluid object Providers\n */\nexport type AsyncFluidObjectProvider<O extends keyof IFluidObject, R extends keyof IFluidObject>\n = AsyncOptionalFluidObjectProvider<O> & AsyncRequiredFluidObjectProvider<R>;\n\n/**\n * Provided a keyof IFluidObject will ensure the type is an instance of that type\n */\nexport type NonNullableFluidObject<T extends keyof IFluidObject> = NonNullable<IFluidObject[T]>;\n\n/**\n * Multiple ways to provide a Fluid object.\n */\nexport type FluidObjectProvider<T extends keyof IFluidObject> =\n NonNullableFluidObject<T>\n | Promise<NonNullableFluidObject<T>>\n | ((dependencyContainer: IFluidDependencySynthesizer) => NonNullableFluidObject<T>)\n | ((dependencyContainer: IFluidDependencySynthesizer) => Promise<NonNullableFluidObject<T>>);\n\n/**\n * @deprecated - create a new DependencyContainer instead\n * ProviderEntry is a mapping of the type to the Provider\n */\nexport interface ProviderEntry<T extends keyof IFluidObject> {\n type: T;\n provider: FluidObjectProvider<T>\n}\n\n/**\n * @deprecated - create a new DependencyContainer instead\n * A mapping of ProviderEntries\n */\nexport type DependencyContainerRegistry = Iterable<ProviderEntry<any>>;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/synthesize",
3
- "version": "0.54.2",
3
+ "version": "0.55.0-48551",
4
4
  "description": "A library for synthesizing scope objects.",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": "https://github.com/microsoft/FluidFramework",
@@ -26,7 +26,7 @@
26
26
  "ci:build:docs": "api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/",
27
27
  "clean": "rimraf dist lib *.tsbuildinfo *.build.log",
28
28
  "eslint": "eslint --format stylish src",
29
- "eslint:fix": "eslint --format stylish src --fix",
29
+ "eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout",
30
30
  "lint": "npm run eslint",
31
31
  "lint:fix": "npm run eslint:fix",
32
32
  "test": "npm run test:mocha",
@@ -62,24 +62,25 @@
62
62
  },
63
63
  "devDependencies": {
64
64
  "@fluidframework/build-common": "^0.23.0",
65
- "@fluidframework/datastore": "^0.54.2",
66
- "@fluidframework/eslint-config-fluid": "^0.24.0",
67
- "@fluidframework/mocha-test-setup": "^0.54.2",
65
+ "@fluidframework/datastore": "0.55.0-48551",
66
+ "@fluidframework/eslint-config-fluid": "^0.25.0-0",
67
+ "@fluidframework/mocha-test-setup": "0.55.0-48551",
68
68
  "@microsoft/api-extractor": "^7.16.1",
69
+ "@rushstack/eslint-config": "^2.5.1",
69
70
  "@types/mocha": "^8.2.2",
70
71
  "@types/node": "^14.18.0",
71
- "@typescript-eslint/eslint-plugin": "~4.14.0",
72
- "@typescript-eslint/parser": "~4.14.0",
72
+ "@typescript-eslint/eslint-plugin": "~5.9.0",
73
+ "@typescript-eslint/parser": "~5.9.0",
73
74
  "concurrently": "^6.2.0",
74
75
  "copyfiles": "^2.1.0",
75
76
  "cross-env": "^7.0.2",
76
- "eslint": "~7.18.0",
77
+ "eslint": "~8.6.0",
78
+ "eslint-plugin-editorconfig": "~3.2.0",
77
79
  "eslint-plugin-eslint-comments": "~3.2.0",
78
- "eslint-plugin-import": "~2.22.1",
80
+ "eslint-plugin-import": "~2.25.4",
79
81
  "eslint-plugin-no-null": "~1.0.2",
80
- "eslint-plugin-prefer-arrow": "~1.2.2",
81
- "eslint-plugin-react": "~7.22.0",
82
- "eslint-plugin-unicorn": "~26.0.1",
82
+ "eslint-plugin-react": "~7.28.0",
83
+ "eslint-plugin-unicorn": "~40.0.0",
83
84
  "mocha": "^8.4.0",
84
85
  "nyc": "^15.0.0",
85
86
  "rimraf": "^2.6.2",