From 8622b19730829f6a4e1661adcb1362305ad8f535 Mon Sep 17 00:00:00 2001 From: "lukasz.bielecki" Date: Mon, 9 Mar 2026 17:12:45 +0100 Subject: [PATCH] refactor: streamline integration configuration by consolidating imports --- apps/api-harmonization/src/app.config.ts | 42 +--------- packages/configs/integrations/src/config.ts | 51 ++++++++++++ .../integrations/src/models/articles.ts | 9 --- .../configs/integrations/src/models/auth.ts | 9 --- .../src/models/billing-accounts.ts | 9 --- .../configs/integrations/src/models/cache.ts | 7 -- .../configs/integrations/src/models/carts.ts | 9 --- .../integrations/src/models/checkout.ts | 9 --- .../configs/integrations/src/models/cms.ts | 9 --- .../integrations/src/models/customers.ts | 9 --- .../configs/integrations/src/models/index.ts | 39 +++++----- .../integrations/src/models/invoices.ts | 9 --- .../integrations/src/models/notifications.ts | 9 --- .../configs/integrations/src/models/orders.ts | 9 --- .../integrations/src/models/organizations.ts | 9 --- .../integrations/src/models/payments.ts | 9 --- .../integrations/src/models/products.ts | 9 --- .../integrations/src/models/resources.ts | 9 --- .../configs/integrations/src/models/search.ts | 7 -- .../integrations/src/models/tickets.ts | 8 -- .../configs/integrations/src/models/users.ts | 9 --- packages/framework/package.json | 4 + .../src/config/create-integration-config.ts | 78 +++++++++++++++++++ packages/framework/src/config/index.ts | 5 ++ 24 files changed, 161 insertions(+), 215 deletions(-) create mode 100644 packages/configs/integrations/src/config.ts delete mode 100644 packages/configs/integrations/src/models/articles.ts delete mode 100644 packages/configs/integrations/src/models/auth.ts delete mode 100644 packages/configs/integrations/src/models/billing-accounts.ts delete mode 100644 packages/configs/integrations/src/models/cache.ts delete mode 100644 packages/configs/integrations/src/models/carts.ts delete mode 100644 packages/configs/integrations/src/models/checkout.ts delete mode 100644 packages/configs/integrations/src/models/cms.ts delete mode 100644 packages/configs/integrations/src/models/customers.ts delete mode 100644 packages/configs/integrations/src/models/invoices.ts delete mode 100644 packages/configs/integrations/src/models/notifications.ts delete mode 100644 packages/configs/integrations/src/models/orders.ts delete mode 100644 packages/configs/integrations/src/models/organizations.ts delete mode 100644 packages/configs/integrations/src/models/payments.ts delete mode 100644 packages/configs/integrations/src/models/products.ts delete mode 100644 packages/configs/integrations/src/models/resources.ts delete mode 100644 packages/configs/integrations/src/models/search.ts delete mode 100644 packages/configs/integrations/src/models/tickets.ts delete mode 100644 packages/configs/integrations/src/models/users.ts create mode 100644 packages/framework/src/config/create-integration-config.ts create mode 100644 packages/framework/src/config/index.ts diff --git a/apps/api-harmonization/src/app.config.ts b/apps/api-harmonization/src/app.config.ts index 8da0e5f9d..94b007b00 100644 --- a/apps/api-harmonization/src/app.config.ts +++ b/apps/api-harmonization/src/app.config.ts @@ -1,45 +1,7 @@ -import { - Articles, - Auth, - BillingAccounts, - CMS, - Cache, - Carts, - Checkout, - Customers, - Invoices, - Notifications, - Orders, - Organizations, - Payments, - Products, - Resources, - Search, - Tickets, - Users, -} from '@o2s/configs.integrations'; +import { integrations } from '@o2s/configs.integrations'; import { ApiConfig } from '@o2s/framework/modules'; export const AppConfig: ApiConfig = { - integrations: { - users: Users.UsersIntegrationConfig, - organizations: Organizations.OrganizationsIntegrationConfig, - tickets: Tickets.TicketsIntegrationConfig, - notifications: Notifications.NotificationsIntegrationConfig, - articles: Articles.ArticlesIntegrationConfig, - resources: Resources.ResourcesIntegrationConfig, - invoices: Invoices.InvoicesIntegrationConfig, - cms: CMS.CmsIntegrationConfig, - cache: Cache.CacheIntegrationConfig, - billingAccounts: BillingAccounts.BillingAccountsIntegrationConfig, - search: Search.SearchIntegrationConfig, - products: Products.ProductsIntegrationConfig, - orders: Orders.OrdersIntegrationConfig, - carts: Carts.CartsIntegrationConfig, - customers: Customers.CustomersIntegrationConfig, - payments: Payments.PaymentsIntegrationConfig, - checkout: Checkout.CheckoutIntegrationConfig, - auth: Auth.AuthIntegrationConfig, - }, + integrations, }; diff --git a/packages/configs/integrations/src/config.ts b/packages/configs/integrations/src/config.ts new file mode 100644 index 000000000..c999f5172 --- /dev/null +++ b/packages/configs/integrations/src/config.ts @@ -0,0 +1,51 @@ +import * as Mocked from '@o2s/integrations.mocked/integration'; + +import { createIntegrationConfig } from '@o2s/framework/config'; +import type { ApiConfig } from '@o2s/framework/modules'; + +// Single swap point: change Mocked → another integration per domain +// When swapping a domain, update BOTH the assignment below AND the matching export import +const result = createIntegrationConfig({ + articles: Mocked, + auth: Mocked, + billingAccounts: Mocked, + cache: Mocked, + carts: Mocked, + checkout: Mocked, + cms: Mocked, + customers: Mocked, + invoices: Mocked, + notifications: Mocked, + orders: Mocked, + organizations: Mocked, + payments: Mocked, + products: Mocked, + resources: Mocked, + search: Mocked, + tickets: Mocked, + users: Mocked, +}); + +export const integrations: ApiConfig['integrations'] = result.integrations; + +// Type exports — re-export the integration namespace so consumers get the correct types, +// including any model extensions defined by the integration (e.g. extended Notification). +// Keep these in sync with the createIntegrationConfig assignments above. +export import Articles = Mocked.Integration.Articles; +export import Auth = Mocked.Integration.Auth; +export import BillingAccounts = Mocked.Integration.BillingAccounts; +export import Cache = Mocked.Integration.Cache; +export import Carts = Mocked.Integration.Carts; +export import Checkout = Mocked.Integration.Checkout; +export import CMS = Mocked.Integration.CMS; +export import Customers = Mocked.Integration.Customers; +export import Invoices = Mocked.Integration.Invoices; +export import Notifications = Mocked.Integration.Notifications; +export import Orders = Mocked.Integration.Orders; +export import Organizations = Mocked.Integration.Organizations; +export import Payments = Mocked.Integration.Payments; +export import Products = Mocked.Integration.Products; +export import Resources = Mocked.Integration.Resources; +export import Search = Mocked.Integration.Search; +export import Tickets = Mocked.Integration.Tickets; +export import Users = Mocked.Integration.Users; diff --git a/packages/configs/integrations/src/models/articles.ts b/packages/configs/integrations/src/models/articles.ts deleted file mode 100644 index de4b3fea8..000000000 --- a/packages/configs/integrations/src/models/articles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const ArticlesIntegrationConfig: ApiConfig['integrations']['articles'] = Config.articles!; - -export import Service = Integration.Articles.Service; -export import Request = Integration.Articles.Request; -export import Model = Integration.Articles.Model; diff --git a/packages/configs/integrations/src/models/auth.ts b/packages/configs/integrations/src/models/auth.ts deleted file mode 100644 index 6f792a45a..000000000 --- a/packages/configs/integrations/src/models/auth.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const AuthIntegrationConfig: ApiConfig['integrations']['auth'] = Config.auth!; - -export import Service = Integration.Auth.Service; -export import Model = Integration.Auth.Model; -export import Guards = Integration.Auth.Guards; diff --git a/packages/configs/integrations/src/models/billing-accounts.ts b/packages/configs/integrations/src/models/billing-accounts.ts deleted file mode 100644 index 2901ee271..000000000 --- a/packages/configs/integrations/src/models/billing-accounts.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const BillingAccountsIntegrationConfig: ApiConfig['integrations']['billingAccounts'] = Config.billingAccounts!; - -export import Service = Integration.BillingAccounts.Service; -export import Request = Integration.BillingAccounts.Request; -export import Model = Integration.BillingAccounts.Model; diff --git a/packages/configs/integrations/src/models/cache.ts b/packages/configs/integrations/src/models/cache.ts deleted file mode 100644 index 75808de9f..000000000 --- a/packages/configs/integrations/src/models/cache.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const CacheIntegrationConfig: ApiConfig['integrations']['cache'] = Config.cache!; - -export import Service = Integration.Cache.Service; diff --git a/packages/configs/integrations/src/models/carts.ts b/packages/configs/integrations/src/models/carts.ts deleted file mode 100644 index b8f1582ed..000000000 --- a/packages/configs/integrations/src/models/carts.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const CartsIntegrationConfig: ApiConfig['integrations']['carts'] = Config.carts!; - -export import Service = Integration.Carts.Service; -export import Request = Integration.Carts.Request; -export import Model = Integration.Carts.Model; diff --git a/packages/configs/integrations/src/models/checkout.ts b/packages/configs/integrations/src/models/checkout.ts deleted file mode 100644 index e267d6b5c..000000000 --- a/packages/configs/integrations/src/models/checkout.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const CheckoutIntegrationConfig: ApiConfig['integrations']['checkout'] = Config.checkout!; - -export import Service = Integration.Checkout.Service; -export import Request = Integration.Checkout.Request; -export import Model = Integration.Checkout.Model; diff --git a/packages/configs/integrations/src/models/cms.ts b/packages/configs/integrations/src/models/cms.ts deleted file mode 100644 index 0051b2e5c..000000000 --- a/packages/configs/integrations/src/models/cms.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const CmsIntegrationConfig: ApiConfig['integrations']['cms'] = Config.cms!; - -export import Service = Integration.CMS.Service; -export import Request = Integration.CMS.Request; -export import Model = Integration.CMS.Model; diff --git a/packages/configs/integrations/src/models/customers.ts b/packages/configs/integrations/src/models/customers.ts deleted file mode 100644 index 80f726acf..000000000 --- a/packages/configs/integrations/src/models/customers.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const CustomersIntegrationConfig: ApiConfig['integrations']['customers'] = Config.customers!; - -export import Service = Integration.Customers.Service; -export import Request = Integration.Customers.Request; -export import Model = Integration.Customers.Model; diff --git a/packages/configs/integrations/src/models/index.ts b/packages/configs/integrations/src/models/index.ts index 8cf0413f4..cb1cc4fb3 100644 --- a/packages/configs/integrations/src/models/index.ts +++ b/packages/configs/integrations/src/models/index.ts @@ -1,18 +1,21 @@ -export * as Articles from './articles'; -export * as Auth from './auth'; -export * as BillingAccounts from './billing-accounts'; -export * as Cache from './cache'; -export * as Carts from './carts'; -export * as Checkout from './checkout'; -export * as CMS from './cms'; -export * as Customers from './customers'; -export * as Invoices from './invoices'; -export * as Notifications from './notifications'; -export * as Orders from './orders'; -export * as Organizations from './organizations'; -export * as Payments from './payments'; -export * as Products from './products'; -export * as Resources from './resources'; -export * as Search from './search'; -export * as Tickets from './tickets'; -export * as Users from './users'; +export { + integrations, + Articles, + Auth, + BillingAccounts, + Cache, + Carts, + Checkout, + CMS, + Customers, + Invoices, + Notifications, + Orders, + Organizations, + Payments, + Products, + Resources, + Search, + Tickets, + Users, +} from '../config'; diff --git a/packages/configs/integrations/src/models/invoices.ts b/packages/configs/integrations/src/models/invoices.ts deleted file mode 100644 index 7c6c162d5..000000000 --- a/packages/configs/integrations/src/models/invoices.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const InvoicesIntegrationConfig: ApiConfig['integrations']['invoices'] = Config.invoices!; - -export import Service = Integration.Invoices.Service; -export import Request = Integration.Invoices.Request; -export import Model = Integration.Invoices.Model; diff --git a/packages/configs/integrations/src/models/notifications.ts b/packages/configs/integrations/src/models/notifications.ts deleted file mode 100644 index 7a5bc55c4..000000000 --- a/packages/configs/integrations/src/models/notifications.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const NotificationsIntegrationConfig: ApiConfig['integrations']['notifications'] = Config.notifications!; - -export import Service = Integration.Notifications.Service; -export import Request = Integration.Notifications.Request; -export import Model = Integration.Notifications.Model; diff --git a/packages/configs/integrations/src/models/orders.ts b/packages/configs/integrations/src/models/orders.ts deleted file mode 100644 index 413ebd794..000000000 --- a/packages/configs/integrations/src/models/orders.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const OrdersIntegrationConfig: ApiConfig['integrations']['orders'] = Config.orders!; - -export import Service = Integration.Orders.Service; -export import Request = Integration.Orders.Request; -export import Model = Integration.Orders.Model; diff --git a/packages/configs/integrations/src/models/organizations.ts b/packages/configs/integrations/src/models/organizations.ts deleted file mode 100644 index 2b0301d11..000000000 --- a/packages/configs/integrations/src/models/organizations.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const OrganizationsIntegrationConfig: ApiConfig['integrations']['organizations'] = Config.organizations!; - -export import Service = Integration.Organizations.Service; -export import Request = Integration.Organizations.Request; -export import Model = Integration.Organizations.Model; diff --git a/packages/configs/integrations/src/models/payments.ts b/packages/configs/integrations/src/models/payments.ts deleted file mode 100644 index b03c77fa5..000000000 --- a/packages/configs/integrations/src/models/payments.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const PaymentsIntegrationConfig: ApiConfig['integrations']['payments'] = Config.payments!; - -export import Service = Integration.Payments.Service; -export import Request = Integration.Payments.Request; -export import Model = Integration.Payments.Model; diff --git a/packages/configs/integrations/src/models/products.ts b/packages/configs/integrations/src/models/products.ts deleted file mode 100644 index b8d770415..000000000 --- a/packages/configs/integrations/src/models/products.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const ProductsIntegrationConfig: ApiConfig['integrations']['products'] = Config.products!; - -export import Service = Integration.Products.Service; -export import Request = Integration.Products.Request; -export import Model = Integration.Products.Model; diff --git a/packages/configs/integrations/src/models/resources.ts b/packages/configs/integrations/src/models/resources.ts deleted file mode 100644 index b0ac78b10..000000000 --- a/packages/configs/integrations/src/models/resources.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const ResourcesIntegrationConfig: ApiConfig['integrations']['resources'] = Config.resources!; - -export import Service = Integration.Resources.Service; -export import Request = Integration.Resources.Request; -export import Model = Integration.Resources.Model; diff --git a/packages/configs/integrations/src/models/search.ts b/packages/configs/integrations/src/models/search.ts deleted file mode 100644 index 29ee2fa36..000000000 --- a/packages/configs/integrations/src/models/search.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const SearchIntegrationConfig: ApiConfig['integrations']['search'] = Config.search!; - -export import Service = Integration.Search.Service; diff --git a/packages/configs/integrations/src/models/tickets.ts b/packages/configs/integrations/src/models/tickets.ts deleted file mode 100644 index 507024ea9..000000000 --- a/packages/configs/integrations/src/models/tickets.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const TicketsIntegrationConfig: ApiConfig['integrations']['tickets'] = Config.tickets!; -export import Service = Integration.Tickets.Service; -export import Request = Integration.Tickets.Request; -export import Model = Integration.Tickets.Model; diff --git a/packages/configs/integrations/src/models/users.ts b/packages/configs/integrations/src/models/users.ts deleted file mode 100644 index 3cada25f1..000000000 --- a/packages/configs/integrations/src/models/users.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Config, Integration } from '@o2s/integrations.mocked/integration'; - -import { ApiConfig } from '@o2s/framework/modules'; - -export const UsersIntegrationConfig: ApiConfig['integrations']['users'] = Config.users!; - -export import Service = Integration.Users.Service; -export import Request = Integration.Users.Request; -export import Model = Integration.Users.Model; diff --git a/packages/framework/package.json b/packages/framework/package.json index 1cca987a8..672896095 100644 --- a/packages/framework/package.json +++ b/packages/framework/package.json @@ -22,6 +22,10 @@ }, "type": "commonjs", "exports": { + "./config": { + "import": "./dist/src/config/index.js", + "require": "./dist/src/config/index.js" + }, "./modules": { "import": "./dist/src/index.js", "require": "./dist/src/index.js" diff --git a/packages/framework/src/config/create-integration-config.ts b/packages/framework/src/config/create-integration-config.ts new file mode 100644 index 000000000..96742181e --- /dev/null +++ b/packages/framework/src/config/create-integration-config.ts @@ -0,0 +1,78 @@ +import type { ApiConfig } from '../api-config'; + +/** + * Integration module must export Config with the domain's config and Integration namespace. + * Domain presence is validated at runtime by createIntegrationConfig. + */ +export type IntegrationWithDomain = { + Config: Record; + Integration: Record; +}; + +type DomainKey = keyof ApiConfig['integrations']; + +/** + * Input for createIntegrationConfig. Each domain maps to an integration that provides that domain. + */ +export type IntegrationConfigInput = { + [D in DomainKey]: IntegrationWithDomain; +}; + +const DOMAIN_KEYS: DomainKey[] = [ + 'articles', + 'auth', + 'billingAccounts', + 'cache', + 'carts', + 'checkout', + 'cms', + 'customers', + 'invoices', + 'notifications', + 'orders', + 'organizations', + 'payments', + 'products', + 'resources', + 'search', + 'tickets', + 'users', +]; + +/** + * Creates integration config from a domain-to-integration map. + * Validates at runtime that each integration provides the domain it's assigned to. + * + * @example + * const { integrations } = createIntegrationConfig({ + * cms: Mocked, + * tickets: Zendesk, // swap: change Mocked -> Zendesk + * articles: Mocked, + * // ... + * }); + */ +export function createIntegrationConfig( + config: T, +): { + integrations: ApiConfig['integrations']; +} { + const integrations: Record = {}; + + for (const domain of DOMAIN_KEYS) { + const integration = config[domain] as IntegrationWithDomain; + if (!integration?.Config) { + throw new Error(`Missing integration for domain: ${domain}`); + } + + const domainConfig = (integration.Config as Record)[domain]; + if (!domainConfig) { + throw new Error(`Integration does not provide config for domain: ${domain}`); + } + + integrations[domain] = domainConfig; + } + + return { + integrations: integrations as ApiConfig['integrations'], + }; +} diff --git a/packages/framework/src/config/index.ts b/packages/framework/src/config/index.ts new file mode 100644 index 000000000..02e2f6d19 --- /dev/null +++ b/packages/framework/src/config/index.ts @@ -0,0 +1,5 @@ +export { + createIntegrationConfig, + type IntegrationConfigInput, + type IntegrationWithDomain, +} from './create-integration-config';