diff --git a/.changeset/wet-cups-bathe.md b/.changeset/wet-cups-bathe.md new file mode 100644 index 0000000000..1279c1ca30 --- /dev/null +++ b/.changeset/wet-cups-bathe.md @@ -0,0 +1,28 @@ +--- +"@vue-storefront/middleware": minor +--- + +[ADDED] an `init` function to the `apiClientFactory` parameters. It reduces boilerplate code and helps with type suggestions of the input and output of the function. + +```diff +- const init = (config) => { +- return { +- ...config, +- client: buildClient(config), +- } +- } + +- const { createApiClient } = apiClientFactory({ ++ const { createApiClient, init } = apiClientFactory({ + onCreate: (config) => config, + api: { ... } ++ init: (config) => { ++ return { ++ ...config, ++ client: buildClient(config), ++ } ++ }, +}) + +export const { createApiClient, init }; +``` diff --git a/packages/middleware/__tests__/integration/bootstrap/serverWithInit.ts b/packages/middleware/__tests__/integration/bootstrap/serverWithInit.ts new file mode 100644 index 0000000000..f7519c6949 --- /dev/null +++ b/packages/middleware/__tests__/integration/bootstrap/serverWithInit.ts @@ -0,0 +1,20 @@ +import { apiClientFactory } from "../../../src/apiClientFactory"; +import * as api from "./api"; + +const { createApiClient, init } = apiClientFactory({ + onCreate: (config) => { + return { + config, + client: null, + }; + }, + api, + init: (config) => { + return { + ...config, + isInit: true, + }; + }, +}); + +export { createApiClient, init }; diff --git a/packages/middleware/__tests__/integration/init.spec.ts b/packages/middleware/__tests__/integration/init.spec.ts new file mode 100644 index 0000000000..b9893e90bc --- /dev/null +++ b/packages/middleware/__tests__/integration/init.spec.ts @@ -0,0 +1,27 @@ +import request from "supertest"; +import { createServer } from "../../src/index"; + +describe("[Integration] Init", () => { + it("should extend the configuration", async () => { + const app = await createServer({ + integrations: { + test_integration: { + location: "./__tests__/integration/bootstrap/serverWithInit", + configuration: { + foo: "bar", + }, + }, + }, + }); + + const { body } = await request(app) + .post("/test_integration/getConfig") + .send([]); + + expect(body).toEqual({ + foo: "bar", + integrationName: "test_integration", + isInit: true, + }); + }); +}); diff --git a/packages/middleware/src/apiClientFactory/index.ts b/packages/middleware/src/apiClientFactory/index.ts index 3d2ac792ac..f7222e4c31 100644 --- a/packages/middleware/src/apiClientFactory/index.ts +++ b/packages/middleware/src/apiClientFactory/index.ts @@ -178,7 +178,7 @@ const apiClientFactory = < createApiClient._predefinedExtensions = factoryParams.extensions || []; - return { createApiClient }; + return { createApiClient, init: factoryParams.init }; }; export { apiClientFactory }; diff --git a/packages/middleware/src/types/server.ts b/packages/middleware/src/types/server.ts index 0a038979b1..dc143aea50 100644 --- a/packages/middleware/src/types/server.ts +++ b/packages/middleware/src/types/server.ts @@ -1,7 +1,6 @@ import { CorsOptions, CorsOptionsDelegate } from "cors"; import bodyParser from "body-parser"; import cookieParser from "cookie-parser"; -import { TObject } from "./base"; import { ApiClientExtension, ApiMethods, @@ -113,6 +112,7 @@ export interface ApiClientFactoryParams< | Promise<{ client: CLIENT; config: ApiClientConfig }> | { client: CLIENT; config: ApiClientConfig }; extensions?: ApiClientExtension[]; + init?: (configuration: CONFIG) => CONFIG; } export interface ApiClientFactory< @@ -123,7 +123,7 @@ export interface ApiClientFactory< /** * Sets up integration config, runs once. */ - init?: (configuration: TObject) => TObject; + init?: (configuration: CONFIG) => CONFIG; } export type CreateApiProxyFn = (