import { createReferenceFeatureInput } from "../application/reference-feature-api.js"; import { REFERENCE_FEATURE_CONTRACT, REFERENCE_FEATURE_ID, } from "../contracts/reference-feature-contract.js"; import { mapReferenceOperation } from "../contracts/reference-mapper.js"; import { validateReferencePayload, validateReferenceRequest, } from "../contracts/reference-schemas.js"; import { createReferenceHttpGateway } from "./reference-http-gateway.js"; type HttpContract = Readonly<{ getOperation(operationId: string): unknown; validatePayload: typeof validateReferencePayload; validateRequest: typeof validateReferenceRequest; mapPayload: typeof mapReferenceOperation; }>; type HttpExecutor = Parameters[0]; export function createReferenceFeatureInstalledInput(context: Readonly<{ createHttpClient(contract: HttpContract): HttpExecutor; }>) { const operations = REFERENCE_FEATURE_CONTRACT.apiOperations as Readonly>; const http = context.createHttpClient({ getOperation(operationId) { const operation = operations[operationId]; if (!operation) { throw new Error(`Unknown reference operation: ${operationId}`); } return operation; }, validatePayload: validateReferencePayload, validateRequest: validateReferenceRequest, mapPayload: mapReferenceOperation, }); return Object.freeze({ featureId: REFERENCE_FEATURE_ID, input: createReferenceFeatureInput(createReferenceHttpGateway(http)), }); }