@fluidframework/synthesize 0.55.0-48551 → 0.55.3
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/dependencyContainer.d.ts.map +1 -1
- package/dist/dependencyContainer.js +3 -4
- package/dist/dependencyContainer.js.map +1 -1
- package/dist/test/dependencyContainer.spec.js +6 -0
- package/dist/test/dependencyContainer.spec.js.map +1 -1
- package/dist/test/tsconfig.tsbuildinfo +1 -1
- package/lib/dependencyContainer.js +3 -4
- package/lib/dependencyContainer.js.map +1 -1
- package/package.json +4 -4
|
@@ -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,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;
|
|
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;IAcxB,OAAO,CAAC,eAAe;CA2C1B"}
|
|
@@ -92,11 +92,10 @@ class DependencyContainer {
|
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
generateOptional(base, types) {
|
|
95
|
+
var _a;
|
|
95
96
|
for (const key of Object.keys(types)) {
|
|
96
|
-
const provider = this.resolveProvider(key);
|
|
97
|
-
|
|
98
|
-
Object.defineProperty(base, key, provider);
|
|
99
|
-
}
|
|
97
|
+
const provider = (_a = this.resolveProvider(key)) !== null && _a !== void 0 ? _a : { get: () => Promise.resolve(undefined) };
|
|
98
|
+
Object.defineProperty(base, key, provider);
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
101
|
resolveProvider(t) {
|
|
@@ -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 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"]}
|
|
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) ?? {get:()=>Promise.resolve(undefined)};\n Object.defineProperty(\n base,\n key,\n provider,\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"]}
|
|
@@ -318,6 +318,12 @@ describe("Routerlicious", () => {
|
|
|
318
318
|
const deps = dc.synthesize({ IFluidHandle: core_interfaces_1.IFluidHandle }, {});
|
|
319
319
|
assert_1.strict(await deps.IFluidHandle !== undefined, "handle undefined");
|
|
320
320
|
});
|
|
321
|
+
it(`Undefined Provider is not Undefined`, async () => {
|
|
322
|
+
const dc = new __1.DependencyContainer();
|
|
323
|
+
const deps = dc.synthesize({ IFluidLoadable: core_interfaces_1.IFluidLoadable }, {});
|
|
324
|
+
assert_1.strict(deps.IFluidLoadable !== undefined, "handle undefined");
|
|
325
|
+
assert_1.strict(await deps.IFluidLoadable === undefined, "handle undefined");
|
|
326
|
+
});
|
|
321
327
|
});
|
|
322
328
|
});
|
|
323
329
|
});
|
|
@@ -1 +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 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"]}
|
|
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 it(`Undefined Provider is not Undefined`, async () => {\n const dc = new DependencyContainer();\n const deps = dc.synthesize<IFluidLoadable>({IFluidLoadable}, {});\n assert(deps.IFluidLoadable !== undefined, \"handle undefined\");\n assert(await deps.IFluidLoadable === undefined, \"handle undefined\");\n });\n });\n });\n});\n"]}
|
|
@@ -787,7 +787,7 @@
|
|
|
787
787
|
"affectsGlobalScope": false
|
|
788
788
|
},
|
|
789
789
|
"../../src/test/dependencyContainer.spec.ts": {
|
|
790
|
-
"version": "
|
|
790
|
+
"version": "fe7abc2e67293bac4b8dfd93ba4f77f4de7eb3d41e705a1e8d268417126679a2",
|
|
791
791
|
"signature": "abc949a48872f03572ff3108a999c28e5e394296186194fa9e4ad357fa3cfcd7",
|
|
792
792
|
"affectsGlobalScope": false
|
|
793
793
|
},
|
|
@@ -89,11 +89,10 @@ export class DependencyContainer {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
generateOptional(base, types) {
|
|
92
|
+
var _a;
|
|
92
93
|
for (const key of Object.keys(types)) {
|
|
93
|
-
const provider = this.resolveProvider(key);
|
|
94
|
-
|
|
95
|
-
Object.defineProperty(base, key, provider);
|
|
96
|
-
}
|
|
94
|
+
const provider = (_a = this.resolveProvider(key)) !== null && _a !== void 0 ? _a : { get: () => Promise.resolve(undefined) };
|
|
95
|
+
Object.defineProperty(base, key, provider);
|
|
97
96
|
}
|
|
98
97
|
}
|
|
99
98
|
resolveProvider(t) {
|
|
@@ -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 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"]}
|
|
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,SAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,mCAAI,EAAC,GAAG,EAAC,GAAE,EAAE,CAAA,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CACjB,IAAI,EACJ,GAAG,EACH,QAAQ,CACX,CAAC;SACL;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) ?? {get:()=>Promise.resolve(undefined)};\n Object.defineProperty(\n base,\n key,\n provider,\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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/synthesize",
|
|
3
|
-
"version": "0.55.
|
|
3
|
+
"version": "0.55.3",
|
|
4
4
|
"description": "A library for synthesizing scope objects.",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": "https://github.com/microsoft/FluidFramework",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@fluidframework/build-common": "^0.23.0",
|
|
65
|
-
"@fluidframework/datastore": "0.55.
|
|
66
|
-
"@fluidframework/eslint-config-fluid": "^0.25.0
|
|
67
|
-
"@fluidframework/mocha-test-setup": "0.55.
|
|
65
|
+
"@fluidframework/datastore": "^0.55.3",
|
|
66
|
+
"@fluidframework/eslint-config-fluid": "^0.25.0",
|
|
67
|
+
"@fluidframework/mocha-test-setup": "^0.55.3",
|
|
68
68
|
"@microsoft/api-extractor": "^7.16.1",
|
|
69
69
|
"@rushstack/eslint-config": "^2.5.1",
|
|
70
70
|
"@types/mocha": "^8.2.2",
|