import { Ajv } from "ajv"; import addFormats from "ajv-formats"; import { getSchema, type SchemaBuilder } from "./schema-builder.js"; type CompiledWorkflowSchema = { jsonSchema: Record; validate: (value: unknown) => void; }; /** @internal */ export function compileWorkflowInputSchema( schema: SchemaBuilder, "object">, ): CompiledWorkflowSchema { return compileWorkflowObjectSchema(schema, { schemaName: "workflow manual inputSchema", valueName: "manual workflow input", }); } /** @internal */ export function compileWorkflowOutputSchema( schema: SchemaBuilder, "object">, ): CompiledWorkflowSchema { return compileWorkflowObjectSchema(schema, { schemaName: "workflow outputSchema", valueName: "workflow output", }); } function compileWorkflowObjectSchema( schema: SchemaBuilder, "object">, names: { schemaName: string; valueName: string }, ): CompiledWorkflowSchema { const jsonSchema = getSchema(schema); if (!("type" in jsonSchema) || jsonSchema.type !== "object") { throw new Error(`${names.schemaName}: must be a j.object() schema`); } const ajv = new Ajv({ allErrors: true, strict: true }); addFormats.default(ajv, { formats: [ "date-time", "date", "time", "duration", "email", "hostname", "ipv4", "ipv6", "uuid", ], keywords: false, }); const validate = ajv.compile(jsonSchema); return { jsonSchema, validate(value) { if (!validate(value)) { throw new Error(`Invalid ${names.valueName}: ${ajv.errorsText(validate.errors)}`); } }, }; }