import type { z } from 'zod'; import { ArvoErrorSchema } from '../schema'; import type { ArvoSemanticVersion } from '../types'; import { VersionedArvoContract } from './VersionedArvoContract'; import type { ArvoContractJSONSchema, ArvoContractParam, ArvoContractRecord } from './types'; /** * Represents a contract with defined input and output schemas for event-driven architectures. * The ArvoContract class provides type-safe validation and versioning capabilities for event handling, * ensuring consistency in message passing between different parts of the system. * * @example * ```typescript * const contract = createArvoContract({ * uri: '#/my/service/data', * type: 'com.process.data', * description: 'An example contract', * metadata: { * visibility: "public" * } * versions: { * '1.0.0': { * accepts: z.object({ data: z.string() }), * emits: { * 'data.processed': z.object({ result: z.string() }) * } * }, * '2.0.0': { * accepts: z.object({ data: z.number() }), * emits: { * 'data.processed': z.object({ result: z.number() }) * } * } * } * }); * ``` */ export default class ArvoContract; }> = Record; }>, TMetaData extends Record = Record> { protected readonly _uri: TUri; protected readonly _type: TType; protected readonly _versions: TVersions; protected readonly _description: string | null; protected readonly _metadata: TMetaData; protected readonly _domain: string | null; get uri(): TUri; get type(): TType; get versions(): TVersions; get description(): string | null; get metadata(): TMetaData; get domain(): string | null; /** * Creates a new ArvoContract instance with validated parameters. * * @param params - Contract configuration parameters * * @throws {Error} When URI format is invalid * @throws {Error} When event type format is invalid * @throws {Error} When version string is not valid semantic version * @throws {Error} When version is a reserved wildcard version * @throws {Error} When emit type format is invalid * @throws {Error} When no versions are provided * @throws {Error} When domain does not have follow the condition Domain must contain only lowercase letters, numbers, and dots */ constructor(params: ArvoContractParam); /** * Gets the system error event specification for this contract. * System errors follow a standardized format to handle exceptional conditions * and failures in a consistent way across all contracts. * * The error schema includes: * - errorName: The name/type of the error * - errorMessage: A descriptive message about what went wrong * - errorStack: Optional stack trace information (null if not available) * * System errors are special events that: * - Are automatically prefixed with 'sys.' and suffixed with '.error' * - Use a standardized schema across all contracts * - Can capture error details, messages, and stack traces * - Are version-independent (work the same across all contract versions) */ get systemError(): ArvoContractRecord<`sys.${TType}.error`, typeof ArvoErrorSchema>; /** * Retrieves a specific version of the contract or resolves special version identifiers. * * @param option - Version identifier or special version string * - Specific version (e.g., "1.0.0") * - "latest" or "any" for the most recent version * - "oldest" for the first version * * @returns A versioned contract instance with type-safe schemas * * @throws {Error} When an invalid or non-existent version is requested */ version(option: V): V extends ArvoSemanticVersion & keyof TVersions ? VersionedArvoContract : VersionedArvoContract; /** * Retrieves version numbers in sorted order based on semantic versioning rules. * @returns Array of semantic versions sorted according to specified ordering */ getSortedVersionNumbers(ordering: 'ASC' | 'DESC'): `${number}.${number}.${number}`[]; /** * Exports the ArvoContract instance as a plain object conforming to the IArvoContract interface. * This method can be used to serialize the contract or to create a new instance with the same parameters. */ export(): ArvoContractParam; /** * Converts the ArvoContract instance to a JSON Schema representation. * This method provides a way to represent the contract's structure and validation rules * in a format that conforms to the JSON Schema specification. */ toJsonSchema(): ArvoContractJSONSchema; }