@fluidframework/synthesize 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/IFluidDependencySynthesizer.d.ts +1 -1
- package/dist/IFluidDependencySynthesizer.d.ts.map +1 -1
- package/dist/IFluidDependencySynthesizer.js.map +1 -1
- package/dist/dependencyContainer.d.ts +2 -2
- package/dist/dependencyContainer.d.ts.map +1 -1
- package/dist/dependencyContainer.js +3 -3
- package/dist/dependencyContainer.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/test/dependencyContainer.spec.js +41 -41
- package/dist/test/dependencyContainer.spec.js.map +1 -1
- package/dist/test/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/test/types/validateSynthesizePrevious.generated.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/lib/{IFluidDependencySynthesizer.d.mts → IFluidDependencySynthesizer.d.ts} +2 -2
- package/lib/IFluidDependencySynthesizer.d.ts.map +1 -0
- package/lib/{IFluidDependencySynthesizer.mjs → IFluidDependencySynthesizer.js} +1 -1
- package/lib/IFluidDependencySynthesizer.js.map +1 -0
- package/lib/{dependencyContainer.d.mts → dependencyContainer.d.ts} +3 -3
- package/lib/dependencyContainer.d.ts.map +1 -0
- package/lib/{dependencyContainer.mjs → dependencyContainer.js} +2 -2
- package/lib/dependencyContainer.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +4 -4
- package/lib/index.d.ts.map +1 -0
- package/lib/{index.mjs → index.js} +3 -3
- package/lib/index.js.map +1 -0
- package/lib/test/dependencyContainer.spec.js +405 -0
- package/lib/test/dependencyContainer.spec.js.map +1 -0
- package/lib/test/tsconfig.tsbuildinfo +1 -0
- package/lib/test/types/validateSynthesizePrevious.generated.js +20 -0
- package/lib/test/types/validateSynthesizePrevious.generated.js.map +1 -0
- package/lib/{types.d.mts → types.d.ts} +6 -2
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/package.json +33 -40
- package/dist/test/tsconfig.tsbuildinfo +0 -1
- package/lib/IFluidDependencySynthesizer.d.mts.map +0 -1
- package/lib/IFluidDependencySynthesizer.mjs.map +0 -1
- package/lib/dependencyContainer.d.mts.map +0 -1
- package/lib/dependencyContainer.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs.map +0 -1
- package/lib/types.d.mts.map +0 -1
- package/lib/types.mjs +0 -2
- package/lib/types.mjs.map +0 -1
- /package/lib/{synthesize-alpha.d.mts → synthesize-alpha.d.ts} +0 -0
- /package/lib/{synthesize-beta.d.mts → synthesize-beta.d.ts} +0 -0
- /package/lib/{synthesize-public.d.mts → synthesize-public.d.ts} +0 -0
- /package/lib/{synthesize-untrimmed.d.mts → synthesize-untrimmed.d.ts} +0 -0
|
@@ -0,0 +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 { LazyPromise } from \"@fluidframework/core-utils\";\nimport {\n\tAsyncFluidObjectProvider,\n\tFluidObjectSymbolProvider,\n\tFluidObjectProvider,\n\tAsyncOptionalFluidObjectProvider,\n\tAsyncRequiredFluidObjectProvider,\n} from \"./types.js\";\nimport { IFluidDependencySynthesizer } from \"./IFluidDependencySynthesizer.js\";\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 * @alpha\n */\nexport class DependencyContainer<TMap> implements IFluidDependencySynthesizer {\n\tprivate readonly providers = new Map<keyof TMap, FluidObjectProvider<any>>();\n\tprivate readonly parents: IFluidDependencySynthesizer[];\n\tpublic get IFluidDependencySynthesizer() {\n\t\treturn this;\n\t}\n\n\tpublic constructor(...parents: (IFluidDependencySynthesizer | undefined)[]) {\n\t\tthis.parents = parents.filter((v): v is IFluidDependencySynthesizer => v !== undefined);\n\t}\n\n\t/**\n\t * Add a new provider\n\t * @param type - Name of the Type T being provided\n\t * @param provider - A provider that will resolve the T correctly when asked\n\t * @throws - If passing a type that's already registered\n\t */\n\tpublic register<T extends keyof TMap = keyof TMap>(\n\t\ttype: T,\n\t\tprovider: FluidObjectProvider<Pick<TMap, T>>,\n\t): void {\n\t\tif (this.providers.has(type)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempting to register a provider of type ${String(type)} that already exists`,\n\t\t\t);\n\t\t}\n\n\t\tthis.providers.set(type, provider);\n\t}\n\n\t/**\n\t * Remove a provider\n\t * @param type - Name of the provider to remove\n\t */\n\tpublic unregister(type: keyof TMap): void {\n\t\tif (this.providers.has(type)) {\n\t\t\tthis.providers.delete(type);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc (IFluidDependencySynthesizer:interface).synthesize}\n\t */\n\tpublic synthesize<O, R = undefined | Record<string, never>>(\n\t\toptionalTypes: FluidObjectSymbolProvider<O>,\n\t\trequiredTypes: Required<FluidObjectSymbolProvider<R>>,\n\t): AsyncFluidObjectProvider<O, R> {\n\t\tconst base: AsyncFluidObjectProvider<O, R> = {} as any;\n\t\tthis.generateRequired<R>(base, requiredTypes);\n\t\tthis.generateOptional<O>(base, optionalTypes);\n\t\tObject.defineProperty(base, IFluidDependencySynthesizer, { get: () => this });\n\t\treturn base;\n\t}\n\n\t/**\n\t * {@inheritDoc (IFluidDependencySynthesizer:interface).has}\n\t * @param excludeParents - If true, exclude checking parent registries\n\t */\n\tpublic has(type: string, excludeParents?: boolean): boolean {\n\t\tif (this.providers.has(type as keyof TMap)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (excludeParents !== true) {\n\t\t\treturn this.parents.some((p: IFluidDependencySynthesizer) => p.has(type));\n\t\t}\n\t\treturn false;\n\t}\n\t/**\n\t * @deprecated Needed for backwards compatability.\n\t */\n\tprivate getProvider(provider: string & keyof TMap) {\n\t\t// this was removed, but some partners have trouble with back compat where they\n\t\t// use invalid patterns with FluidObject and IFluidDependencySynthesizer\n\t\t// this is just for back compat until those are removed\n\t\tif (this.has(provider)) {\n\t\t\tif (this.providers.has(provider)) {\n\t\t\t\treturn this.providers.get(provider);\n\t\t\t}\n\t\t\tfor (const parent of this.parents) {\n\t\t\t\tif (parent instanceof DependencyContainer) {\n\t\t\t\t\treturn parent.getProvider(provider);\n\t\t\t\t} else {\n\t\t\t\t\t// older implementations of the IFluidDependencySynthesizer exposed getProvider\n\t\t\t\t\tconst maybeGetProvider: { getProvider?(provider: string & keyof TMap) } =\n\t\t\t\t\t\tparent as any;\n\t\t\t\t\tif (maybeGetProvider?.getProvider !== undefined) {\n\t\t\t\t\t\treturn maybeGetProvider.getProvider(provider);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate generateRequired<T>(\n\t\tbase: AsyncRequiredFluidObjectProvider<T>,\n\t\ttypes: Required<FluidObjectSymbolProvider<T>>,\n\t) {\n\t\tif (types === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const key of Object.keys(types) as unknown as (keyof TMap)[]) {\n\t\t\tconst provider = this.resolveProvider(key);\n\t\t\tif (provider === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Object attempted to be created without registered required provider ${String(\n\t\t\t\t\t\tkey,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tObject.defineProperty(base, key, provider);\n\t\t}\n\t}\n\n\tprivate generateOptional<T>(\n\t\tbase: AsyncOptionalFluidObjectProvider<T>,\n\t\ttypes: FluidObjectSymbolProvider<T>,\n\t) {\n\t\tif (types === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const key of Object.keys(types) as unknown as (keyof TMap)[]) {\n\t\t\t// back-compat: in 0.56 we allow undefined in the types, but we didn't before\n\t\t\t// this will keep runtime back compat, eventually we should support undefined properties\n\t\t\t// rather than properties that return promises that resolve to undefined\n\t\t\tconst provider = this.resolveProvider(key) ?? { get: async () => undefined };\n\t\t\tObject.defineProperty(base, key, provider);\n\t\t}\n\t}\n\n\tprivate resolveProvider<T extends keyof TMap>(t: T): PropertyDescriptor | undefined {\n\t\t// If we have the provider return it\n\t\tconst provider = this.providers.get(t);\n\t\tif (provider === undefined) {\n\t\t\tfor (const parent of this.parents) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tconst sp = { [t]: t } as FluidObjectSymbolProvider<Pick<TMap, T>>;\n\t\t\t\tconst syn = parent.synthesize<Pick<TMap, T>, Record<string, unknown>>(sp, {});\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(syn, t);\n\t\t\t\tif (descriptor !== undefined) {\n\t\t\t\t\treturn descriptor;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// The double nested gets are required for lazy loading the provider resolution\n\t\tif (typeof provider === \"function\") {\n\t\t\treturn {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t\t\tget() {\n\t\t\t\t\tif (provider && typeof provider === \"function\") {\n\t\t\t\t\t\treturn Promise.resolve(this[IFluidDependencySynthesizer])\n\t\t\t\t\t\t\t.then(async (fds): Promise<any> => provider(fds))\n\t\t\t\t\t\t\t.then((p) => p?.[t]);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tget() {\n\t\t\t\tif (provider) {\n\t\t\t\t\treturn new LazyPromise(async () => {\n\t\t\t\t\t\treturn Promise.resolve(provider).then((p) => {\n\t\t\t\t\t\t\tif (p) {\n\t\t\t\t\t\t\t\treturn p[t];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
export { DependencyContainer } from "./dependencyContainer.
|
|
6
|
-
export { IFluidDependencySynthesizer, IProvideFluidDependencySynthesizer, } from "./IFluidDependencySynthesizer.
|
|
7
|
-
export { AsyncFluidObjectProvider, AsyncOptionalFluidObjectProvider, AsyncRequiredFluidObjectProvider, FluidObjectProvider, FluidObjectSymbolProvider, } from "./types.
|
|
8
|
-
//# sourceMappingURL=index.d.
|
|
5
|
+
export { DependencyContainer } from "./dependencyContainer.js";
|
|
6
|
+
export { IFluidDependencySynthesizer, IProvideFluidDependencySynthesizer, } from "./IFluidDependencySynthesizer.js";
|
|
7
|
+
export { AsyncFluidObjectProvider, AsyncOptionalFluidObjectProvider, AsyncRequiredFluidObjectProvider, FluidObjectProvider, FluidObjectSymbolProvider, } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,2BAA2B,EAC3B,kCAAkC,GAClC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACN,wBAAwB,EACxB,gCAAgC,EAChC,gCAAgC,EAChC,mBAAmB,EACnB,yBAAyB,GACzB,MAAM,YAAY,CAAC"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
export { DependencyContainer } from "./dependencyContainer.
|
|
6
|
-
export { IFluidDependencySynthesizer, } from "./IFluidDependencySynthesizer.
|
|
7
|
-
//# sourceMappingURL=index.
|
|
5
|
+
export { DependencyContainer } from "./dependencyContainer.js";
|
|
6
|
+
export { IFluidDependencySynthesizer, } from "./IFluidDependencySynthesizer.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,2BAA2B,GAE3B,MAAM,kCAAkC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { DependencyContainer } from \"./dependencyContainer.js\";\nexport {\n\tIFluidDependencySynthesizer,\n\tIProvideFluidDependencySynthesizer,\n} from \"./IFluidDependencySynthesizer.js\";\nexport {\n\tAsyncFluidObjectProvider,\n\tAsyncOptionalFluidObjectProvider,\n\tAsyncRequiredFluidObjectProvider,\n\tFluidObjectProvider,\n\tFluidObjectSymbolProvider,\n} from \"./types.js\";\n"]}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "assert";
|
|
6
|
+
import { IFluidLoadable, IFluidHandle, } from "@fluidframework/core-interfaces";
|
|
7
|
+
import { FluidObjectHandle } from "@fluidframework/datastore";
|
|
8
|
+
import { LazyPromise } from "@fluidframework/core-utils";
|
|
9
|
+
import { DependencyContainer } from "../index.js";
|
|
10
|
+
const mockHandleContext = {
|
|
11
|
+
absolutePath: "",
|
|
12
|
+
isAttached: false,
|
|
13
|
+
IFluidHandleContext: undefined,
|
|
14
|
+
attachGraph: () => {
|
|
15
|
+
throw new Error("Method not implemented.");
|
|
16
|
+
},
|
|
17
|
+
resolveHandle: () => {
|
|
18
|
+
throw new Error("Method not implemented.");
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
class MockLoadable {
|
|
22
|
+
get IFluidLoadable() {
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
get handle() {
|
|
26
|
+
return new FluidObjectHandle(this, "", mockHandleContext);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const ISomeObject = "ISomeObject";
|
|
30
|
+
class MockSomeObject {
|
|
31
|
+
constructor() {
|
|
32
|
+
this.value = 0;
|
|
33
|
+
}
|
|
34
|
+
get ISomeObject() {
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
describe("someObjectlicious", () => {
|
|
39
|
+
describe("Aqueduct", () => {
|
|
40
|
+
describe("DependencyContainer", () => {
|
|
41
|
+
it(`One Optional Provider registered via value`, async () => {
|
|
42
|
+
const dc = new DependencyContainer();
|
|
43
|
+
const mock = new MockLoadable();
|
|
44
|
+
dc.register(IFluidLoadable, mock);
|
|
45
|
+
const s = dc.synthesize({ IFluidLoadable }, undefined);
|
|
46
|
+
const loadable = await s.IFluidLoadable;
|
|
47
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
48
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
49
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
50
|
+
});
|
|
51
|
+
it(`One Optional Provider registered via Promise value`, async () => {
|
|
52
|
+
const dc = new DependencyContainer();
|
|
53
|
+
const mock = new MockLoadable();
|
|
54
|
+
dc.register(IFluidLoadable, Promise.resolve(mock));
|
|
55
|
+
const s = dc.synthesize({ IFluidLoadable }, undefined);
|
|
56
|
+
const loadable = await s.IFluidLoadable;
|
|
57
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
58
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
59
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
60
|
+
});
|
|
61
|
+
it(`One Optional Provider registered via factory`, async () => {
|
|
62
|
+
const dc = new DependencyContainer();
|
|
63
|
+
const mock = new MockLoadable();
|
|
64
|
+
const factory = () => mock;
|
|
65
|
+
dc.register(IFluidLoadable, factory);
|
|
66
|
+
const s = dc.synthesize({ IFluidLoadable }, undefined);
|
|
67
|
+
const loadable = await s.IFluidLoadable;
|
|
68
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
69
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
70
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
71
|
+
});
|
|
72
|
+
it(`One Optional Provider registered via Promise factory`, async () => {
|
|
73
|
+
const dc = new DependencyContainer();
|
|
74
|
+
const mock = new MockLoadable();
|
|
75
|
+
const factory = async () => mock;
|
|
76
|
+
dc.register(IFluidLoadable, factory);
|
|
77
|
+
const s = dc.synthesize({ IFluidLoadable }, undefined);
|
|
78
|
+
const loadable = await s.IFluidLoadable;
|
|
79
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
80
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
81
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
82
|
+
});
|
|
83
|
+
it(`One Optional Provider registered via LazyPromise factory`, async () => {
|
|
84
|
+
const dc = new DependencyContainer();
|
|
85
|
+
const mock = new MockLoadable();
|
|
86
|
+
let lazyPromiseFlag = false;
|
|
87
|
+
const lazyFactory = new LazyPromise(async () => {
|
|
88
|
+
lazyPromiseFlag = true;
|
|
89
|
+
return mock;
|
|
90
|
+
});
|
|
91
|
+
dc.register(IFluidLoadable, lazyFactory);
|
|
92
|
+
const s = dc.synthesize({ IFluidLoadable }, undefined);
|
|
93
|
+
const loadable_promise = s.IFluidLoadable;
|
|
94
|
+
// This stacking of promises is done in order to make sure that the loadable_promise would have been executed by the time the assertion is done
|
|
95
|
+
await Promise.resolve().then(async () => {
|
|
96
|
+
assert(!lazyPromiseFlag, "Optional IFluidLoadable was correctly lazy loaded");
|
|
97
|
+
const loadable = await loadable_promise;
|
|
98
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
99
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
100
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it(`One Required Provider registered via value`, async () => {
|
|
104
|
+
const dc = new DependencyContainer();
|
|
105
|
+
const mock = new MockLoadable();
|
|
106
|
+
dc.register(IFluidLoadable, mock);
|
|
107
|
+
const s = dc.synthesize(undefined, {
|
|
108
|
+
IFluidLoadable,
|
|
109
|
+
});
|
|
110
|
+
const loadable = await s.IFluidLoadable;
|
|
111
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
112
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
113
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
114
|
+
});
|
|
115
|
+
it(`One Required Provider registered via Promise value`, async () => {
|
|
116
|
+
const dc = new DependencyContainer();
|
|
117
|
+
const mock = new MockLoadable();
|
|
118
|
+
dc.register(IFluidLoadable, Promise.resolve(mock));
|
|
119
|
+
const s = dc.synthesize(undefined, {
|
|
120
|
+
IFluidLoadable,
|
|
121
|
+
});
|
|
122
|
+
const loadable = await s.IFluidLoadable;
|
|
123
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
124
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
125
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
126
|
+
});
|
|
127
|
+
it(`One Required Provider registered via factory`, async () => {
|
|
128
|
+
const dc = new DependencyContainer();
|
|
129
|
+
const mock = new MockLoadable();
|
|
130
|
+
const factory = () => mock;
|
|
131
|
+
dc.register(IFluidLoadable, factory);
|
|
132
|
+
const s = dc.synthesize(undefined, {
|
|
133
|
+
IFluidLoadable,
|
|
134
|
+
});
|
|
135
|
+
const loadable = await s.IFluidLoadable;
|
|
136
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
137
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
138
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
139
|
+
});
|
|
140
|
+
it(`One Required Provider registered via Promise factory`, async () => {
|
|
141
|
+
const dc = new DependencyContainer();
|
|
142
|
+
const mock = new MockLoadable();
|
|
143
|
+
const factory = async () => mock;
|
|
144
|
+
dc.register(IFluidLoadable, factory);
|
|
145
|
+
const s = dc.synthesize(undefined, {
|
|
146
|
+
IFluidLoadable,
|
|
147
|
+
});
|
|
148
|
+
const loadable = await s.IFluidLoadable;
|
|
149
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
150
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
151
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
152
|
+
});
|
|
153
|
+
it(`One Required Provider registered via LazyPromise factory`, async () => {
|
|
154
|
+
const dc = new DependencyContainer();
|
|
155
|
+
const mock = new MockLoadable();
|
|
156
|
+
let lazyPromiseFlag = false;
|
|
157
|
+
const lazyFactory = new LazyPromise(async () => {
|
|
158
|
+
lazyPromiseFlag = true;
|
|
159
|
+
return mock;
|
|
160
|
+
});
|
|
161
|
+
dc.register(IFluidLoadable, lazyFactory);
|
|
162
|
+
const s = dc.synthesize(undefined, {
|
|
163
|
+
IFluidLoadable,
|
|
164
|
+
});
|
|
165
|
+
const loadable_promise = s.IFluidLoadable;
|
|
166
|
+
// This stacking of promises is done in order to make sure that the loadable_promise would have been executed by the time the assertion is done
|
|
167
|
+
await Promise.resolve().then(async () => {
|
|
168
|
+
assert(!lazyPromiseFlag, "Required IFluidLoadable was correctly lazy loaded");
|
|
169
|
+
const loadable = await loadable_promise;
|
|
170
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
171
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
172
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
it(`Two Optional Modules all registered`, async () => {
|
|
176
|
+
const dc = new DependencyContainer();
|
|
177
|
+
const loadableMock = new MockLoadable();
|
|
178
|
+
dc.register(IFluidLoadable, loadableMock);
|
|
179
|
+
const someObjectMock = new MockSomeObject();
|
|
180
|
+
dc.register(ISomeObject, someObjectMock);
|
|
181
|
+
const s = dc.synthesize({ IFluidLoadable, ISomeObject }, undefined);
|
|
182
|
+
const loadable = await s.IFluidLoadable;
|
|
183
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
184
|
+
assert(loadable === loadableMock, "IFluidLoadable is expected");
|
|
185
|
+
const someObject = await s.ISomeObject;
|
|
186
|
+
assert(someObject, "Optional ISomeObject was registered");
|
|
187
|
+
assert(someObject === someObjectMock, "ISomeObject is expected");
|
|
188
|
+
});
|
|
189
|
+
it(`Two Optional Modules one registered`, async () => {
|
|
190
|
+
const dc = new DependencyContainer();
|
|
191
|
+
const loadableMock = new MockLoadable();
|
|
192
|
+
dc.register(IFluidLoadable, loadableMock);
|
|
193
|
+
const s = dc.synthesize({ IFluidLoadable, ISomeObject }, undefined);
|
|
194
|
+
const loadable = await s.IFluidLoadable;
|
|
195
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
196
|
+
assert(loadable === loadableMock, "IFluidLoadable is expected");
|
|
197
|
+
const someObject = await s.ISomeObject;
|
|
198
|
+
assert(!someObject, "Optional ISomeObject was not registered");
|
|
199
|
+
});
|
|
200
|
+
it(`Two Optional Modules none registered`, async () => {
|
|
201
|
+
const dc = new DependencyContainer();
|
|
202
|
+
const s = dc.synthesize({ IFluidLoadable, ISomeObject }, undefined);
|
|
203
|
+
const loadable = await s.IFluidLoadable;
|
|
204
|
+
assert(!loadable, "Optional IFluidLoadable was not registered");
|
|
205
|
+
const someObject = await s.ISomeObject;
|
|
206
|
+
assert(!someObject, "Optional ISomeObject was not registered");
|
|
207
|
+
});
|
|
208
|
+
it(`Two Required Modules all registered`, async () => {
|
|
209
|
+
const dc = new DependencyContainer();
|
|
210
|
+
const loadableMock = new MockLoadable();
|
|
211
|
+
dc.register(IFluidLoadable, loadableMock);
|
|
212
|
+
const someObjectMock = new MockSomeObject();
|
|
213
|
+
dc.register(ISomeObject, someObjectMock);
|
|
214
|
+
const s = dc.synthesize(undefined, { IFluidLoadable, ISomeObject });
|
|
215
|
+
const loadable = await s.IFluidLoadable;
|
|
216
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
217
|
+
assert(loadable === loadableMock, "IFluidLoadable is expected");
|
|
218
|
+
const someObject = await s.ISomeObject;
|
|
219
|
+
assert(someObject, "Required ISomeObject was registered");
|
|
220
|
+
assert(someObject === someObjectMock, "ISomeObject is expected");
|
|
221
|
+
});
|
|
222
|
+
it(`Required Provider not registered should throw`, async () => {
|
|
223
|
+
const dc = new DependencyContainer();
|
|
224
|
+
assert.throws(() => dc.synthesize(undefined, {
|
|
225
|
+
IFluidLoadable,
|
|
226
|
+
}), Error);
|
|
227
|
+
});
|
|
228
|
+
it(`Optional Provider found in Parent`, async () => {
|
|
229
|
+
const parentDc = new DependencyContainer();
|
|
230
|
+
const mock = new MockLoadable();
|
|
231
|
+
parentDc.register(IFluidLoadable, mock);
|
|
232
|
+
const dc = new DependencyContainer(parentDc);
|
|
233
|
+
const s = dc.synthesize({ IFluidLoadable }, undefined);
|
|
234
|
+
const loadable = await s.IFluidLoadable;
|
|
235
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
236
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
237
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
238
|
+
});
|
|
239
|
+
it(`Optional Modules found in Parent and Child`, async () => {
|
|
240
|
+
const parentDc = new DependencyContainer();
|
|
241
|
+
const loadableMock = new MockLoadable();
|
|
242
|
+
parentDc.register(IFluidLoadable, loadableMock);
|
|
243
|
+
const dc = new DependencyContainer(parentDc);
|
|
244
|
+
const someObjectMock = new MockSomeObject();
|
|
245
|
+
dc.register(ISomeObject, someObjectMock);
|
|
246
|
+
const s = dc.synthesize({ IFluidLoadable, ISomeObject }, undefined);
|
|
247
|
+
const loadable = await s.IFluidLoadable;
|
|
248
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
249
|
+
assert(loadable === loadableMock, "IFluidLoadable is expected");
|
|
250
|
+
const someObject = await s.ISomeObject;
|
|
251
|
+
assert(someObject, "Optional ISomeObject was registered");
|
|
252
|
+
assert(someObject === someObjectMock, "ISomeObject is expected");
|
|
253
|
+
});
|
|
254
|
+
it(`Optional Provider found in Parent and Child resolves Child`, async () => {
|
|
255
|
+
const parentDc = new DependencyContainer();
|
|
256
|
+
parentDc.register(IFluidLoadable, new MockLoadable());
|
|
257
|
+
const dc = new DependencyContainer(parentDc);
|
|
258
|
+
const loadableMock = new MockLoadable();
|
|
259
|
+
dc.register(IFluidLoadable, loadableMock);
|
|
260
|
+
const s = dc.synthesize({ IFluidLoadable }, undefined);
|
|
261
|
+
const loadable = await s.IFluidLoadable;
|
|
262
|
+
assert(loadable, "Optional IFluidLoadable was registered");
|
|
263
|
+
assert(loadable === loadableMock, "IFluidLoadable is expected");
|
|
264
|
+
});
|
|
265
|
+
it(`Required Provider found in Parent`, async () => {
|
|
266
|
+
const parentDc = new DependencyContainer();
|
|
267
|
+
const mock = new MockLoadable();
|
|
268
|
+
parentDc.register(IFluidLoadable, mock);
|
|
269
|
+
const dc = new DependencyContainer(parentDc);
|
|
270
|
+
const s = dc.synthesize(undefined, {
|
|
271
|
+
IFluidLoadable,
|
|
272
|
+
});
|
|
273
|
+
const loadable = await s.IFluidLoadable;
|
|
274
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
275
|
+
assert(loadable === mock, "IFluidLoadable is expected");
|
|
276
|
+
assert(loadable?.handle.absolutePath === mock.handle.absolutePath, "IFluidLoadable is valid");
|
|
277
|
+
});
|
|
278
|
+
it(`Required Modules found in Parent and Child`, async () => {
|
|
279
|
+
const parentDc = new DependencyContainer();
|
|
280
|
+
const loadableMock = new MockLoadable();
|
|
281
|
+
parentDc.register(IFluidLoadable, loadableMock);
|
|
282
|
+
const dc = new DependencyContainer(parentDc);
|
|
283
|
+
const someObjectMock = new MockSomeObject();
|
|
284
|
+
dc.register(ISomeObject, someObjectMock);
|
|
285
|
+
const s = dc.synthesize(undefined, { IFluidLoadable, ISomeObject });
|
|
286
|
+
const loadable = await s.IFluidLoadable;
|
|
287
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
288
|
+
assert(loadable === loadableMock, "IFluidLoadable is expected");
|
|
289
|
+
const someObject = await s.ISomeObject;
|
|
290
|
+
assert(someObject, "Required ISomeObject was registered");
|
|
291
|
+
assert(someObject === someObjectMock, "ISomeObject is expected");
|
|
292
|
+
});
|
|
293
|
+
it(`Required Provider found in Parent and Child resolves Child`, async () => {
|
|
294
|
+
const parentDc = new DependencyContainer();
|
|
295
|
+
parentDc.register(IFluidLoadable, new MockLoadable());
|
|
296
|
+
const dc = new DependencyContainer(parentDc);
|
|
297
|
+
const loadableMock = new MockLoadable();
|
|
298
|
+
dc.register(IFluidLoadable, loadableMock);
|
|
299
|
+
const s = dc.synthesize(undefined, {
|
|
300
|
+
IFluidLoadable,
|
|
301
|
+
});
|
|
302
|
+
const loadable = await s.IFluidLoadable;
|
|
303
|
+
assert(loadable, "Required IFluidLoadable was registered");
|
|
304
|
+
assert(loadable === loadableMock, "IFluidLoadable is expected");
|
|
305
|
+
});
|
|
306
|
+
it(`Registering`, async () => {
|
|
307
|
+
const dc = new DependencyContainer();
|
|
308
|
+
dc.register(IFluidLoadable, new MockLoadable());
|
|
309
|
+
assert(dc.has(IFluidLoadable), "DependencyContainer has IFluidLoadable");
|
|
310
|
+
});
|
|
311
|
+
it(`Registering the same type twice throws`, async () => {
|
|
312
|
+
const dc = new DependencyContainer();
|
|
313
|
+
dc.register(IFluidLoadable, new MockLoadable());
|
|
314
|
+
assert.throws(() => dc.register(IFluidLoadable, new MockLoadable()), Error);
|
|
315
|
+
});
|
|
316
|
+
it(`Registering then Unregistering`, async () => {
|
|
317
|
+
const dc = new DependencyContainer();
|
|
318
|
+
dc.register(IFluidLoadable, new MockLoadable());
|
|
319
|
+
dc.unregister(IFluidLoadable);
|
|
320
|
+
assert(!dc.has(IFluidLoadable), "DependencyContainer doesn't have IFluidLoadable");
|
|
321
|
+
});
|
|
322
|
+
it(`Registering then Unregistering then Registering`, async () => {
|
|
323
|
+
const dc = new DependencyContainer();
|
|
324
|
+
dc.register(IFluidLoadable, new MockLoadable());
|
|
325
|
+
dc.unregister(IFluidLoadable);
|
|
326
|
+
dc.register(IFluidLoadable, new MockLoadable());
|
|
327
|
+
assert(dc.has(IFluidLoadable), "DependencyContainer has IFluidLoadable");
|
|
328
|
+
});
|
|
329
|
+
it(`has() resolves correctly in all variations`, async () => {
|
|
330
|
+
const dc = new DependencyContainer();
|
|
331
|
+
dc.register(IFluidLoadable, new MockLoadable());
|
|
332
|
+
dc.register(ISomeObject, new MockSomeObject());
|
|
333
|
+
assert(dc.has(IFluidLoadable), "Manager has IFluidLoadable");
|
|
334
|
+
assert(dc.has(ISomeObject), "Manager has ISomeObject");
|
|
335
|
+
assert(dc.has(IFluidLoadable) && dc.has(ISomeObject), "Manager has IFluidLoadable & ISomeObject");
|
|
336
|
+
});
|
|
337
|
+
it(`Child has Parent modules`, async () => {
|
|
338
|
+
const parentDc = new DependencyContainer();
|
|
339
|
+
const loadableMock = new MockLoadable();
|
|
340
|
+
parentDc.register(IFluidLoadable, loadableMock);
|
|
341
|
+
const dc = new DependencyContainer(parentDc);
|
|
342
|
+
const someObjectMock = new MockSomeObject();
|
|
343
|
+
dc.register(ISomeObject, someObjectMock);
|
|
344
|
+
assert(dc.has(IFluidLoadable), "has includes parent registered");
|
|
345
|
+
assert(!dc.has(IFluidLoadable, true), "has does not include excluded parent registered");
|
|
346
|
+
assert(dc.has(ISomeObject), "has includes registered");
|
|
347
|
+
assert(!dc.has(IFluidHandle), "does not include not registered");
|
|
348
|
+
});
|
|
349
|
+
it(`Parent Resolved from Child`, async () => {
|
|
350
|
+
const parentDc = new DependencyContainer();
|
|
351
|
+
const loadableToHandle = async (fds) => {
|
|
352
|
+
const loadable = fds.synthesize(undefined, {
|
|
353
|
+
IFluidLoadable,
|
|
354
|
+
});
|
|
355
|
+
return (await loadable.IFluidLoadable).handle;
|
|
356
|
+
};
|
|
357
|
+
parentDc.register(IFluidHandle, loadableToHandle);
|
|
358
|
+
const dc = new DependencyContainer(parentDc);
|
|
359
|
+
const loadableMock = new MockLoadable();
|
|
360
|
+
dc.register(IFluidLoadable, loadableMock);
|
|
361
|
+
const deps = dc.synthesize({ IFluidHandle }, undefined);
|
|
362
|
+
assert((await deps.IFluidHandle) !== undefined, "handle undefined");
|
|
363
|
+
});
|
|
364
|
+
it(`Undefined Provider is not Undefined`, async () => {
|
|
365
|
+
const dc = new DependencyContainer();
|
|
366
|
+
const deps = dc.synthesize({ IFluidLoadable }, {});
|
|
367
|
+
assert(deps.IFluidLoadable !== undefined, "handle undefined");
|
|
368
|
+
assert((await deps.IFluidLoadable) === undefined, "handle undefined");
|
|
369
|
+
});
|
|
370
|
+
it(`test getProvider backcompat`, async () => {
|
|
371
|
+
const dc = new DependencyContainer();
|
|
372
|
+
const loadableMock = new MockLoadable();
|
|
373
|
+
dc.register(IFluidLoadable, loadableMock);
|
|
374
|
+
const testGetProvider = (deps, scenario) => {
|
|
375
|
+
const old = deps;
|
|
376
|
+
const provider = old.getProvider("IFluidLoadable");
|
|
377
|
+
assert.equal(provider, loadableMock, scenario);
|
|
378
|
+
};
|
|
379
|
+
testGetProvider(dc, "direct");
|
|
380
|
+
testGetProvider(new DependencyContainer(dc), "parent");
|
|
381
|
+
testGetProvider(new PassThru(dc), "pass thru");
|
|
382
|
+
testGetProvider(new DependencyContainer(new PassThru(dc)), "pass thru as child");
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
class PassThru {
|
|
388
|
+
constructor(parent) {
|
|
389
|
+
this.parent = parent;
|
|
390
|
+
this.IFluidDependencySynthesizer = this;
|
|
391
|
+
}
|
|
392
|
+
synthesize(optionalTypes, requiredTypes) {
|
|
393
|
+
return this.parent.synthesize(optionalTypes, requiredTypes);
|
|
394
|
+
}
|
|
395
|
+
has(type) {
|
|
396
|
+
return this.parent.has(type);
|
|
397
|
+
}
|
|
398
|
+
getProvider(key) {
|
|
399
|
+
const maybe = this.parent;
|
|
400
|
+
if (maybe.getProvider) {
|
|
401
|
+
return maybe.getProvider(key);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=dependencyContainer.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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\tIFluidLoadable,\n\tIFluidHandleContext,\n\tIFluidHandle,\n\tIProvideFluidLoadable,\n\tIProvideFluidHandle,\n\tFluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore\";\n\nimport { LazyPromise } from \"@fluidframework/core-utils\";\nimport { DependencyContainer } from \"../index.js\";\nimport { IFluidDependencySynthesizer } from \"../IFluidDependencySynthesizer.js\";\nimport {\n\tAsyncFluidObjectProvider,\n\tFluidObjectProvider,\n\tFluidObjectSymbolProvider,\n} from \"../types.js\";\n\nconst mockHandleContext: IFluidHandleContext = {\n\tabsolutePath: \"\",\n\tisAttached: false,\n\tIFluidHandleContext: undefined as any,\n\n\tattachGraph: () => {\n\t\tthrow new Error(\"Method not implemented.\");\n\t},\n\tresolveHandle: () => {\n\t\tthrow new Error(\"Method not implemented.\");\n\t},\n};\n\nclass MockLoadable implements IFluidLoadable {\n\tpublic get IFluidLoadable() {\n\t\treturn this;\n\t}\n\tpublic get handle() {\n\t\treturn new FluidObjectHandle(this, \"\", mockHandleContext);\n\t}\n}\n\nconst ISomeObject: keyof IProvideSomeObject = \"ISomeObject\";\ninterface IProvideSomeObject {\n\treadonly ISomeObject: ISomeObject;\n}\ninterface ISomeObject extends IProvideSomeObject {\n\tvalue: number;\n}\nclass MockSomeObject implements ISomeObject {\n\tpublic get ISomeObject() {\n\t\treturn this;\n\t}\n\tpublic readonly value = 0;\n}\n\ndescribe(\"someObjectlicious\", () => {\n\tdescribe(\"Aqueduct\", () => {\n\t\tdescribe(\"DependencyContainer\", () => {\n\t\t\tit(`One Optional Provider registered via value`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, mock);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, undefined);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Optional Provider registered via Promise value`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, Promise.resolve(mock));\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, undefined);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Optional Provider registered via factory`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tconst factory = () => mock;\n\t\t\t\tdc.register(IFluidLoadable, factory);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, undefined);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Optional Provider registered via Promise factory`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tconst factory = async () => mock;\n\t\t\t\tdc.register(IFluidLoadable, factory);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, undefined);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Optional Provider registered via LazyPromise factory`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tlet lazyPromiseFlag = false;\n\t\t\t\tconst lazyFactory = new LazyPromise(async () => {\n\t\t\t\t\tlazyPromiseFlag = true;\n\t\t\t\t\treturn mock;\n\t\t\t\t});\n\t\t\t\tdc.register(IFluidLoadable, lazyFactory);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, undefined);\n\t\t\t\tconst loadable_promise = s.IFluidLoadable;\n\t\t\t\t// This stacking of promises is done in order to make sure that the loadable_promise would have been executed by the time the assertion is done\n\t\t\t\tawait Promise.resolve().then(async () => {\n\t\t\t\t\tassert(!lazyPromiseFlag, \"Optional IFluidLoadable was correctly lazy loaded\");\n\t\t\t\t\tconst loadable = await loadable_promise;\n\t\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(`One Required Provider registered via value`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, mock);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\tIFluidLoadable,\n\t\t\t\t});\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Required Provider registered via Promise value`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, Promise.resolve(mock));\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\tIFluidLoadable,\n\t\t\t\t});\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Required Provider registered via factory`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tconst factory = () => mock;\n\t\t\t\tdc.register(IFluidLoadable, factory);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\tIFluidLoadable,\n\t\t\t\t});\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Required Provider registered via Promise factory`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tconst factory = async () => mock;\n\t\t\t\tdc.register(IFluidLoadable, factory);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\tIFluidLoadable,\n\t\t\t\t});\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`One Required Provider registered via LazyPromise factory`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tlet lazyPromiseFlag = false;\n\t\t\t\tconst lazyFactory = new LazyPromise(async () => {\n\t\t\t\t\tlazyPromiseFlag = true;\n\t\t\t\t\treturn mock;\n\t\t\t\t});\n\t\t\t\tdc.register(IFluidLoadable, lazyFactory);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\tIFluidLoadable,\n\t\t\t\t});\n\t\t\t\tconst loadable_promise = s.IFluidLoadable;\n\t\t\t\t// This stacking of promises is done in order to make sure that the loadable_promise would have been executed by the time the assertion is done\n\t\t\t\tawait Promise.resolve().then(async () => {\n\t\t\t\t\tassert(!lazyPromiseFlag, \"Required IFluidLoadable was correctly lazy loaded\");\n\t\t\t\t\tconst loadable = await loadable_promise;\n\t\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(`Two Optional Modules all registered`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable & ISomeObject>>();\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, loadableMock);\n\t\t\t\tconst someObjectMock = new MockSomeObject();\n\t\t\t\tdc.register(ISomeObject, someObjectMock);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable & ISomeObject>(\n\t\t\t\t\t{ IFluidLoadable, ISomeObject },\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n\t\t\t\tconst someObject = await s.ISomeObject;\n\t\t\t\tassert(someObject, \"Optional ISomeObject was registered\");\n\t\t\t\tassert(someObject === someObjectMock, \"ISomeObject is expected\");\n\t\t\t});\n\n\t\t\tit(`Two Optional Modules one registered`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable & ISomeObject>>();\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, loadableMock);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable & ISomeObject>(\n\t\t\t\t\t{ IFluidLoadable, ISomeObject },\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n\t\t\t\tconst someObject = await s.ISomeObject;\n\t\t\t\tassert(!someObject, \"Optional ISomeObject was not registered\");\n\t\t\t});\n\n\t\t\tit(`Two Optional Modules none registered`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable & ISomeObject>>();\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable & ISomeObject>(\n\t\t\t\t\t{ IFluidLoadable, ISomeObject },\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(!loadable, \"Optional IFluidLoadable was not registered\");\n\t\t\t\tconst someObject = await s.ISomeObject;\n\t\t\t\tassert(!someObject, \"Optional ISomeObject was not registered\");\n\t\t\t});\n\n\t\t\tit(`Two Required Modules all registered`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable & ISomeObject>>();\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, loadableMock);\n\t\t\t\tconst someObjectMock = new MockSomeObject();\n\t\t\t\tdc.register(ISomeObject, someObjectMock);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable & IProvideSomeObject>(\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ IFluidLoadable, ISomeObject },\n\t\t\t\t);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n\t\t\t\tconst someObject = await s.ISomeObject;\n\t\t\t\tassert(someObject, \"Required ISomeObject was registered\");\n\t\t\t\tassert(someObject === someObjectMock, \"ISomeObject is expected\");\n\t\t\t});\n\n\t\t\tit(`Required Provider not registered should throw`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\n\t\t\t\tassert.throws(\n\t\t\t\t\t() =>\n\t\t\t\t\t\tdc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\t\t\tIFluidLoadable,\n\t\t\t\t\t\t}),\n\t\t\t\t\tError,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`Optional Provider found in Parent`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tparentDc.register(IFluidLoadable, mock);\n\t\t\t\tconst dc = new DependencyContainer(parentDc);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, undefined);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`Optional Modules found in Parent and Child`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tparentDc.register(IFluidLoadable, loadableMock);\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<ISomeObject>>(parentDc);\n\t\t\t\tconst someObjectMock = new MockSomeObject();\n\t\t\t\tdc.register(ISomeObject, someObjectMock);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable & ISomeObject>(\n\t\t\t\t\t{ IFluidLoadable, ISomeObject },\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n\t\t\t\tconst someObject = await s.ISomeObject;\n\t\t\t\tassert(someObject, \"Optional ISomeObject was registered\");\n\t\t\t\tassert(someObject === someObjectMock, \"ISomeObject is expected\");\n\t\t\t});\n\n\t\t\tit(`Optional Provider found in Parent and Child resolves Child`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tparentDc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>(parentDc);\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, loadableMock);\n\n\t\t\t\tconst s = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, undefined);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Optional IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\t\t\t});\n\n\t\t\tit(`Required Provider found in Parent`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst mock = new MockLoadable();\n\t\t\t\tparentDc.register(IFluidLoadable, mock);\n\t\t\t\tconst dc = new DependencyContainer(parentDc);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\tIFluidLoadable,\n\t\t\t\t});\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === mock, \"IFluidLoadable is expected\");\n\t\t\t\tassert(\n\t\t\t\t\tloadable?.handle.absolutePath === mock.handle.absolutePath,\n\t\t\t\t\t\"IFluidLoadable is valid\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`Required Modules found in Parent and Child`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tparentDc.register(IFluidLoadable, loadableMock);\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<ISomeObject>>(parentDc);\n\t\t\t\tconst someObjectMock = new MockSomeObject();\n\t\t\t\tdc.register(ISomeObject, someObjectMock);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable & IProvideSomeObject>(\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ IFluidLoadable, ISomeObject },\n\t\t\t\t);\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\n\t\t\t\tconst someObject = await s.ISomeObject;\n\t\t\t\tassert(someObject, \"Required ISomeObject was registered\");\n\t\t\t\tassert(someObject === someObjectMock, \"ISomeObject is expected\");\n\t\t\t});\n\n\t\t\tit(`Required Provider found in Parent and Child resolves Child`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tparentDc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>(parentDc);\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, loadableMock);\n\n\t\t\t\tconst s = dc.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\tIFluidLoadable,\n\t\t\t\t});\n\t\t\t\tconst loadable = await s.IFluidLoadable;\n\t\t\t\tassert(loadable, \"Required IFluidLoadable was registered\");\n\t\t\t\tassert(loadable === loadableMock, \"IFluidLoadable is expected\");\n\t\t\t});\n\n\t\t\tit(`Registering`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tdc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tassert(dc.has(IFluidLoadable), \"DependencyContainer has IFluidLoadable\");\n\t\t\t});\n\n\t\t\tit(`Registering the same type twice throws`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tdc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tassert.throws(() => dc.register(IFluidLoadable, new MockLoadable()), Error);\n\t\t\t});\n\n\t\t\tit(`Registering then Unregistering`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tdc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tdc.unregister(IFluidLoadable);\n\t\t\t\tassert(!dc.has(IFluidLoadable), \"DependencyContainer doesn't have IFluidLoadable\");\n\t\t\t});\n\n\t\t\tit(`Registering then Unregistering then Registering`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tdc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tdc.unregister(IFluidLoadable);\n\t\t\t\tdc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tassert(dc.has(IFluidLoadable), \"DependencyContainer has IFluidLoadable\");\n\t\t\t});\n\n\t\t\tit(`has() resolves correctly in all variations`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable & ISomeObject>>();\n\t\t\t\tdc.register(IFluidLoadable, new MockLoadable());\n\t\t\t\tdc.register(ISomeObject, new MockSomeObject());\n\t\t\t\tassert(dc.has(IFluidLoadable), \"Manager has IFluidLoadable\");\n\t\t\t\tassert(dc.has(ISomeObject), \"Manager has ISomeObject\");\n\t\t\t\tassert(\n\t\t\t\t\tdc.has(IFluidLoadable) && dc.has(ISomeObject),\n\t\t\t\t\t\"Manager has IFluidLoadable & ISomeObject\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(`Child has Parent modules`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tparentDc.register(IFluidLoadable, loadableMock);\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<ISomeObject>>(parentDc);\n\t\t\t\tconst someObjectMock = new MockSomeObject();\n\t\t\t\tdc.register(ISomeObject, someObjectMock);\n\n\t\t\t\tassert(dc.has(IFluidLoadable), \"has includes parent registered\");\n\t\t\t\tassert(\n\t\t\t\t\t!dc.has(IFluidLoadable, true),\n\t\t\t\t\t\"has does not include excluded parent registered\",\n\t\t\t\t);\n\t\t\t\tassert(dc.has(ISomeObject), \"has includes registered\");\n\t\t\t\tassert(!dc.has(IFluidHandle), \"does not include not registered\");\n\t\t\t});\n\n\t\t\tit(`Parent Resolved from Child`, async () => {\n\t\t\t\tconst parentDc = new DependencyContainer<FluidObject<IFluidHandle>>();\n\t\t\t\tconst loadableToHandle: FluidObjectProvider<IProvideFluidHandle> = async (\n\t\t\t\t\tfds: IFluidDependencySynthesizer,\n\t\t\t\t) => {\n\t\t\t\t\tconst loadable = fds.synthesize<undefined, IProvideFluidLoadable>(undefined, {\n\t\t\t\t\t\tIFluidLoadable,\n\t\t\t\t\t});\n\t\t\t\t\treturn (await loadable.IFluidLoadable).handle;\n\t\t\t\t};\n\t\t\t\tparentDc.register(IFluidHandle, loadableToHandle);\n\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>(parentDc);\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, loadableMock);\n\n\t\t\t\tconst deps = dc.synthesize<IFluidHandle>({ IFluidHandle }, undefined);\n\t\t\t\tassert((await deps.IFluidHandle) !== undefined, \"handle undefined\");\n\t\t\t});\n\n\t\t\tit(`Undefined Provider is not Undefined`, async () => {\n\t\t\t\tconst dc = new DependencyContainer();\n\t\t\t\tconst deps = dc.synthesize<IFluidLoadable>({ IFluidLoadable }, {});\n\t\t\t\tassert(deps.IFluidLoadable !== undefined, \"handle undefined\");\n\t\t\t\tassert((await deps.IFluidLoadable) === undefined, \"handle undefined\");\n\t\t\t});\n\n\t\t\tit(`test getProvider backcompat`, async () => {\n\t\t\t\tconst dc = new DependencyContainer<FluidObject<IFluidLoadable>>();\n\t\t\t\tconst loadableMock = new MockLoadable();\n\t\t\t\tdc.register(IFluidLoadable, loadableMock);\n\t\t\t\tconst testGetProvider = (deps: IFluidDependencySynthesizer, scenario: string) => {\n\t\t\t\t\tconst old = deps as any as {\n\t\t\t\t\t\tgetProvider(\n\t\t\t\t\t\t\tkey: \"IFluidLoadable\",\n\t\t\t\t\t\t): FluidObjectProvider<FluidObject<IFluidLoadable>>;\n\t\t\t\t\t};\n\t\t\t\t\tconst provider = old.getProvider(\"IFluidLoadable\");\n\t\t\t\t\tassert.equal(provider, loadableMock, scenario);\n\t\t\t\t};\n\t\t\t\ttestGetProvider(dc, \"direct\");\n\t\t\t\ttestGetProvider(new DependencyContainer(dc), \"parent\");\n\t\t\t\ttestGetProvider(new PassThru<FluidObject<IFluidLoadable>>(dc), \"pass thru\");\n\t\t\t\ttestGetProvider(\n\t\t\t\t\tnew DependencyContainer(new PassThru<FluidObject<IFluidLoadable>>(dc)),\n\t\t\t\t\t\"pass thru as child\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n});\n\nclass PassThru<TMap> implements IFluidDependencySynthesizer {\n\tconstructor(private readonly parent: IFluidDependencySynthesizer) {}\n\tsynthesize<O, R = Record<string, never> | undefined>(\n\t\toptionalTypes: FluidObjectSymbolProvider<O>,\n\t\trequiredTypes: Required<FluidObjectSymbolProvider<R>>,\n\t): AsyncFluidObjectProvider<O, R> {\n\t\treturn this.parent.synthesize(optionalTypes, requiredTypes);\n\t}\n\thas(type: string): boolean {\n\t\treturn this.parent.has(type);\n\t}\n\treadonly IFluidDependencySynthesizer = this;\n\n\tgetProvider<K extends keyof TMap>(key: K): FluidObjectProvider<TMap[K]> | undefined {\n\t\tconst maybe = this.parent as any as Partial<this>;\n\t\tif (maybe.getProvider) {\n\t\t\treturn maybe.getProvider(key);\n\t\t}\n\t}\n}\n"]}
|