From dc7aafb97f331d227ede837736771abe5d608b87 Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Wed, 13 May 2026 00:09:36 +0200 Subject: [PATCH] feat(media): conformance manifest + self-asserting bind-production --- packages/media/src/di/bind-production.ts | 14 ++++++++++++++ packages/media/src/feature.manifest.ts | 18 ++++++++++++++++++ packages/media/src/index.ts | 1 + 3 files changed, 33 insertions(+) create mode 100644 packages/media/src/feature.manifest.ts diff --git a/packages/media/src/di/bind-production.ts b/packages/media/src/di/bind-production.ts index 3c7c0f5..d3b304a 100644 --- a/packages/media/src/di/bind-production.ts +++ b/packages/media/src/di/bind-production.ts @@ -6,8 +6,10 @@ import { type ILogger, } from "@repo/core-shared/instrumentation"; import type { BindProductionContext } from "@repo/core-shared/di"; +import { assertFeatureConformance } from "@repo/core-shared/conformance"; import { mediaContainer } from "./container"; import { MEDIA_SYMBOLS } from "./symbols"; +import { mediaManifest } from "../feature.manifest"; import { MediaRepository } from "../infrastructure/repositories/media.repository"; import { getMediaUseCase } from "../application/use-cases/get-media.use-case"; import { listMediaUseCase } from "../application/use-cases/list-media.use-case"; @@ -134,4 +136,16 @@ export function bindProductionMedia(ctx: BindProductionContext): void { // // // + + // Boot-time conformance check. + assertFeatureConformance( + mediaContainer, + mediaManifest, + { + getMedia: MEDIA_SYMBOLS.IGetMediaUseCase, + listMedia: MEDIA_SYMBOLS.IListMediaUseCase, + deleteMedia: MEDIA_SYMBOLS.IDeleteMediaUseCase, + }, + ctx, + ); } diff --git a/packages/media/src/feature.manifest.ts b/packages/media/src/feature.manifest.ts new file mode 100644 index 0000000..3f227a6 --- /dev/null +++ b/packages/media/src/feature.manifest.ts @@ -0,0 +1,18 @@ +import { defineFeature } from "@repo/core-shared/conformance"; + +/** + * The media feature's conformance manifest. + */ +export const mediaManifest = defineFeature({ + name: "media", + requiredCores: [], + useCases: { + getMedia: { mutates: false, audits: [], publishes: [], consumes: [] }, + listMedia: { mutates: false, audits: [], publishes: [], consumes: [] }, + deleteMedia: { mutates: true, audits: [], publishes: [], consumes: [] }, + }, + realtimeChannels: [], + jobs: [], +} as const); + +export type MediaManifest = typeof mediaManifest; diff --git a/packages/media/src/index.ts b/packages/media/src/index.ts index 4ac69a5..afd7c2c 100644 --- a/packages/media/src/index.ts +++ b/packages/media/src/index.ts @@ -31,3 +31,4 @@ export type { IDeleteMediaController } from "./interface-adapters/controllers/de // // +export { mediaManifest, type MediaManifest } from "./feature.manifest";