55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { z, type ZodTypeAny } from "zod";
|
|
import { DmPolicySchema } from "../../config/zod-schema.core.js";
|
|
import type { ChannelConfigSchema } from "./types.plugin.js";
|
|
|
|
type ZodSchemaWithToJsonSchema = ZodTypeAny & {
|
|
toJSONSchema?: (params?: Record<string, unknown>) => unknown;
|
|
};
|
|
|
|
type ExtendableZodObject = ZodTypeAny & {
|
|
extend: (shape: Record<string, ZodTypeAny>) => ZodTypeAny;
|
|
};
|
|
|
|
export const AllowFromEntrySchema = z.union([z.string(), z.number()]);
|
|
export const AllowFromListSchema = z.array(AllowFromEntrySchema).optional();
|
|
|
|
export function buildNestedDmConfigSchema() {
|
|
return z
|
|
.object({
|
|
enabled: z.boolean().optional(),
|
|
policy: DmPolicySchema.optional(),
|
|
allowFrom: AllowFromListSchema,
|
|
})
|
|
.optional();
|
|
}
|
|
|
|
export function buildCatchallMultiAccountChannelSchema<T extends ExtendableZodObject>(
|
|
accountSchema: T,
|
|
): T {
|
|
return accountSchema.extend({
|
|
accounts: z.object({}).catchall(accountSchema).optional(),
|
|
defaultAccount: z.string().optional(),
|
|
}) as T;
|
|
}
|
|
|
|
export function buildChannelConfigSchema(schema: ZodTypeAny): ChannelConfigSchema {
|
|
const schemaWithJson = schema as ZodSchemaWithToJsonSchema;
|
|
if (typeof schemaWithJson.toJSONSchema === "function") {
|
|
return {
|
|
schema: schemaWithJson.toJSONSchema({
|
|
target: "draft-07",
|
|
unrepresentable: "any",
|
|
}) as Record<string, unknown>,
|
|
};
|
|
}
|
|
|
|
// Compatibility fallback for plugins built against Zod v3 schemas,
|
|
// where `.toJSONSchema()` is unavailable.
|
|
return {
|
|
schema: {
|
|
type: "object",
|
|
additionalProperties: true,
|
|
},
|
|
};
|
|
}
|