diff --git a/app/client/src/utils/WidgetQueryGeneratorRegistry.test.ts b/app/client/src/utils/WidgetQueryGeneratorRegistry.test.ts new file mode 100644 index 0000000000..d9e878d4f4 --- /dev/null +++ b/app/client/src/utils/WidgetQueryGeneratorRegistry.test.ts @@ -0,0 +1,32 @@ +import WidgetQueryGeneratorRegistry from "./WidgetQueryGeneratorRegistry"; + +describe("WidgetQueryGeneratorRegistry", () => { + const somepluginId = "somePluginId"; + + it("should be able to register a QueryGenerator", () => { + const someQueryGenerator = {}; + + WidgetQueryGeneratorRegistry.register(somepluginId, someQueryGenerator); + expect(WidgetQueryGeneratorRegistry.get(somepluginId)).toBeTruthy(); + }); + + it("should return a falsey value when searching for an non existing generator", () => { + const nonExistingQueryGeneratopr = "someId"; + expect( + WidgetQueryGeneratorRegistry.get(nonExistingQueryGeneratopr), + ).toBeFalsy(); + }); + + it("should return the same adaptor reference when querying the same pluginId", () => { + const adaptor = WidgetQueryGeneratorRegistry.get(somepluginId); + expect(adaptor).toBe(WidgetQueryGeneratorRegistry.get(somepluginId)); + }); + it("should not find the registered plugin after clearing the registry", () => { + WidgetQueryGeneratorRegistry.clear(); + expect(WidgetQueryGeneratorRegistry.get(somepluginId)).toBeFalsy(); + }); + + afterAll(() => { + WidgetQueryGeneratorRegistry.clear(); + }); +}); diff --git a/app/client/src/utils/WidgetQueryGeneratorRegistry.ts b/app/client/src/utils/WidgetQueryGeneratorRegistry.ts new file mode 100644 index 0000000000..1baea40574 --- /dev/null +++ b/app/client/src/utils/WidgetQueryGeneratorRegistry.ts @@ -0,0 +1,36 @@ +import { error } from "loglevel"; + +export default class WidgetQueryGeneratorRegistry { + private static queryGeneratorMap = new Map(); + + static register(pluginId: string, queryGenerator: any) { + if (this.queryGeneratorMap.has(pluginId)) { + error( + "There is already a widget query generator with the given pluginID:", + pluginId, + ); + + return; + } + + this.queryGeneratorMap.set(pluginId, queryGenerator); + } + + static clear() { + WidgetQueryGeneratorRegistry.queryGeneratorMap.clear(); + } + + static get(pluginId: string) { + const queryAdaptor = this.queryGeneratorMap.get(pluginId); + + if (!queryAdaptor) { + error( + "Couldn't find the query generator with the given pluginId:", + pluginId, + ); + return; + } + + return queryAdaptor; + } +}