From 40c7ec51462cc951d79469fbb718aad984b548a6 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 7 Jul 2020 14:24:44 +0200 Subject: [PATCH] Allow merging modules --- packages/sdk38/src/lcdapi/lcdclient.spec.ts | 35 +++++++++++++++++++++ packages/sdk38/src/lcdapi/lcdclient.ts | 5 +-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/sdk38/src/lcdapi/lcdclient.spec.ts b/packages/sdk38/src/lcdapi/lcdclient.spec.ts index 81f776d4..a048cfa3 100644 --- a/packages/sdk38/src/lcdapi/lcdclient.spec.ts +++ b/packages/sdk38/src/lcdapi/lcdclient.spec.ts @@ -160,6 +160,41 @@ describe("LcdClient", () => { ], }); }); + + it("can merge two extension into the same module", async () => { + pendingWithoutWasmd(); + + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + function setupSupplyExtensionBasic(base: LcdClient) { + return { + supply: { + totalAll: async () => { + const path = `/supply/total`; + return base.get(path); + }, + }, + }; + } + + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + function setupSupplyExtensionPremium(base: LcdClient) { + return { + supply: { + total: async (denom: string) => { + return base.get(`/supply/total/${denom}`); + }, + }, + }; + } + + const client = LcdClient.withExtensions( + { apiUrl: wasmd.endpoint }, + setupSupplyExtensionBasic, + setupSupplyExtensionPremium, + ); + expect(client.supply.totalAll).toEqual(jasmine.any(Function)); + expect(client.supply.total).toEqual(jasmine.any(Function)); + }); }); // The /txs endpoints diff --git a/packages/sdk38/src/lcdapi/lcdclient.ts b/packages/sdk38/src/lcdapi/lcdclient.ts index d1685b68..8be43afe 100644 --- a/packages/sdk38/src/lcdapi/lcdclient.ts +++ b/packages/sdk38/src/lcdapi/lcdclient.ts @@ -204,8 +204,9 @@ export class LcdClient { if (setupExtensionH) extensions.push(setupExtensionH(client)); for (const extension of extensions) { assert(isNonNullObject(extension), `Extension must be a non-null object`); - for (const [key, value] of Object.entries(extension)) { - (client as any)[key] = value; + for (const [moduleKey, moduleValue] of Object.entries(extension)) { + const current = (client as any)[moduleKey] || {}; + (client as any)[moduleKey] = Object.assign(current, moduleValue); } }