From 875bae3fdee7a0fd3b00c424f0f1adad574368f6 Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Tue, 5 May 2026 08:28:50 +0200 Subject: [PATCH] feat(marketing-pages): add per-feature InversifyJS container --- .../marketing-pages/src/di/container.test.ts | 33 +++++++++++++++++++ packages/marketing-pages/src/di/container.ts | 8 +++++ packages/marketing-pages/src/di/module.ts | 18 ++++++++++ packages/marketing-pages/src/di/symbols.ts | 4 +++ 4 files changed, 63 insertions(+) create mode 100644 packages/marketing-pages/src/di/container.test.ts create mode 100644 packages/marketing-pages/src/di/container.ts create mode 100644 packages/marketing-pages/src/di/module.ts create mode 100644 packages/marketing-pages/src/di/symbols.ts diff --git a/packages/marketing-pages/src/di/container.test.ts b/packages/marketing-pages/src/di/container.test.ts new file mode 100644 index 0000000..782cce8 --- /dev/null +++ b/packages/marketing-pages/src/di/container.test.ts @@ -0,0 +1,33 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { marketingPagesContainer } from "./container"; +import { MARKETING_PAGES_SYMBOLS } from "./symbols"; +import { MarketingPagesModule } from "./module"; +import { MockPagesRepository } from "@/infrastructure/repositories/mock-pages.repository"; +import { MockSiteSettingsRepository } from "@/infrastructure/repositories/mock-site-settings.repository"; +import type { IPagesRepository } from "@/application/repositories/pages-repository.interface"; +import type { ISiteSettingsRepository } from "@/application/repositories/site-settings-repository.interface"; + +describe("marketingPagesContainer", () => { + beforeEach(() => { + marketingPagesContainer.unbindAll(); + marketingPagesContainer.load(MarketingPagesModule); + }); + + afterEach(() => { + marketingPagesContainer.unbindAll(); + }); + + it("resolves IPagesRepository to MockPagesRepository", () => { + const repo = marketingPagesContainer.get( + MARKETING_PAGES_SYMBOLS.IPagesRepository, + ); + expect(repo).toBeInstanceOf(MockPagesRepository); + }); + + it("resolves ISiteSettingsRepository to MockSiteSettingsRepository", () => { + const repo = marketingPagesContainer.get( + MARKETING_PAGES_SYMBOLS.ISiteSettingsRepository, + ); + expect(repo).toBeInstanceOf(MockSiteSettingsRepository); + }); +}); diff --git a/packages/marketing-pages/src/di/container.ts b/packages/marketing-pages/src/di/container.ts new file mode 100644 index 0000000..f9b4c00 --- /dev/null +++ b/packages/marketing-pages/src/di/container.ts @@ -0,0 +1,8 @@ +import "reflect-metadata"; +import { Container } from "inversify"; +import { MarketingPagesModule } from "./module"; + +export const marketingPagesContainer = new Container({ + defaultScope: "Singleton", +}); +marketingPagesContainer.load(MarketingPagesModule); diff --git a/packages/marketing-pages/src/di/module.ts b/packages/marketing-pages/src/di/module.ts new file mode 100644 index 0000000..2f5c157 --- /dev/null +++ b/packages/marketing-pages/src/di/module.ts @@ -0,0 +1,18 @@ +import { ContainerModule, type interfaces } from "inversify"; + +import type { IPagesRepository } from "../application/repositories/pages-repository.interface"; +import type { ISiteSettingsRepository } from "../application/repositories/site-settings-repository.interface"; +import { MockPagesRepository } from "../infrastructure/repositories/mock-pages.repository"; +import { MockSiteSettingsRepository } from "../infrastructure/repositories/mock-site-settings.repository"; +import { MARKETING_PAGES_SYMBOLS } from "./symbols"; + +export const MarketingPagesModule = new ContainerModule( + (bind: interfaces.Bind) => { + bind(MARKETING_PAGES_SYMBOLS.IPagesRepository).to( + MockPagesRepository, + ); + bind( + MARKETING_PAGES_SYMBOLS.ISiteSettingsRepository, + ).to(MockSiteSettingsRepository); + }, +); diff --git a/packages/marketing-pages/src/di/symbols.ts b/packages/marketing-pages/src/di/symbols.ts new file mode 100644 index 0000000..7f82590 --- /dev/null +++ b/packages/marketing-pages/src/di/symbols.ts @@ -0,0 +1,4 @@ +export const MARKETING_PAGES_SYMBOLS = { + IPagesRepository: Symbol.for("marketing-pages:IPagesRepository"), + ISiteSettingsRepository: Symbol.for("marketing-pages:ISiteSettingsRepository"), +} as const;