sourcebot/packages/web/src/app/[domain]/connections/utils.ts

40 lines
1.2 KiB
TypeScript
Raw Normal View History

2025-02-04 20:04:05 +00:00
import Ajv, { Schema } from "ajv";
import { z } from "zod";
export const createZodConnectionConfigValidator = <T>(jsonSchema: Schema, additionalConfigValidation?: (config: T) => { message: string, isValid: boolean }) => {
2025-02-04 20:04:05 +00:00
const ajv = new Ajv({
validateFormats: false,
});
const validate = ajv.compile(jsonSchema);
return z
.string()
.superRefine((data, ctx) => {
const addIssue = (message: string) => {
return ctx.addIssue({
code: "custom",
message: `Schema validation error: ${message}`
});
}
let parsed;
try {
parsed = JSON.parse(data);
} catch {
addIssue("Invalid JSON");
return;
}
const valid = validate(parsed);
if (!valid) {
addIssue(ajv.errorsText(validate.errors));
}
if (additionalConfigValidation) {
const result = additionalConfigValidation(parsed as T);
if (!result.isValid) {
addIssue(result.message);
}
}
2025-02-04 20:04:05 +00:00
});
}