From d000dfcc6b0317f4c53a7932fb8c1b251ffb7026 Mon Sep 17 00:00:00 2001 From: Wojciech Sikora Date: Wed, 30 Oct 2024 14:41:25 +0100 Subject: [PATCH 1/3] feat: add init function to apiClientFactory params --- .changeset/wet-cups-bathe.md | 28 +++++++++++++++++++ .../integration/bootstrap/serverWithInit.ts | 20 +++++++++++++ .../__tests__/integration/init.spec.ts | 27 ++++++++++++++++++ .../middleware/src/apiClientFactory/index.ts | 3 +- packages/middleware/src/types/server.ts | 3 +- 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 .changeset/wet-cups-bathe.md create mode 100644 packages/middleware/__tests__/integration/bootstrap/serverWithInit.ts create mode 100644 packages/middleware/__tests__/integration/init.spec.ts 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..ef79678e36 100644 --- a/packages/middleware/src/apiClientFactory/index.ts +++ b/packages/middleware/src/apiClientFactory/index.ts @@ -178,7 +178,8 @@ const apiClientFactory = < createApiClient._predefinedExtensions = factoryParams.extensions || []; - return { createApiClient }; + // TODO: Init function is being added to the return type but it's not being added nowhere here. + 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..9dd058f7f8 100644 --- a/packages/middleware/src/types/server.ts +++ b/packages/middleware/src/types/server.ts @@ -113,6 +113,7 @@ export interface ApiClientFactoryParams< | Promise<{ client: CLIENT; config: ApiClientConfig }> | { client: CLIENT; config: ApiClientConfig }; extensions?: ApiClientExtension[]; + init?: (configuration: CONFIG) => TObject; } export interface ApiClientFactory< @@ -123,7 +124,7 @@ export interface ApiClientFactory< /** * Sets up integration config, runs once. */ - init?: (configuration: TObject) => TObject; + init?: (configuration: CONFIG) => TObject; } export type CreateApiProxyFn = ( From 1bebc6ce2c05bb93a7c44049f55df2afeda1f865 Mon Sep 17 00:00:00 2001 From: Wojciech Sikora Date: Wed, 30 Oct 2024 14:42:33 +0100 Subject: [PATCH 2/3] remove comments --- packages/middleware/src/apiClientFactory/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/middleware/src/apiClientFactory/index.ts b/packages/middleware/src/apiClientFactory/index.ts index ef79678e36..f7222e4c31 100644 --- a/packages/middleware/src/apiClientFactory/index.ts +++ b/packages/middleware/src/apiClientFactory/index.ts @@ -178,7 +178,6 @@ const apiClientFactory = < createApiClient._predefinedExtensions = factoryParams.extensions || []; - // TODO: Init function is being added to the return type but it's not being added nowhere here. return { createApiClient, init: factoryParams.init }; }; From 750eac82eca21da2ad9823238a7d8d785049329e Mon Sep 17 00:00:00 2001 From: Wojciech Sikora Date: Wed, 30 Oct 2024 14:44:44 +0100 Subject: [PATCH 3/3] update types --- packages/middleware/src/types/server.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/middleware/src/types/server.ts b/packages/middleware/src/types/server.ts index 9dd058f7f8..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,7 +112,7 @@ export interface ApiClientFactoryParams< | Promise<{ client: CLIENT; config: ApiClientConfig }> | { client: CLIENT; config: ApiClientConfig }; extensions?: ApiClientExtension[]; - init?: (configuration: CONFIG) => TObject; + init?: (configuration: CONFIG) => CONFIG; } export interface ApiClientFactory< @@ -124,7 +123,7 @@ export interface ApiClientFactory< /** * Sets up integration config, runs once. */ - init?: (configuration: CONFIG) => TObject; + init?: (configuration: CONFIG) => CONFIG; } export type CreateApiProxyFn = (