feat(01-03): implement BACKEND_SCHEMAS Zod schema builder

- buildZodSchema derives z.object() from BACKEND_REGISTRY field definitions
- required fields map to z.string().min(1, label) — optional to z.string().optional()
- BACKEND_SCHEMAS exported with entries for azureblob, s3, s3-compatible
- BackendFormValues<T> utility type infers TypeScript type from schema
- No hardcoded field names — all shapes derived from registry loop
- All 8 tests in index.test.ts pass (GREEN)
This commit is contained in:
2026-03-26 10:21:11 +01:00
parent 64c02e7b76
commit eaeae32849
+28
View File
@@ -0,0 +1,28 @@
// src/schemas/index.ts
// Zod schemas derived programmatically from the Backend Schema Registry.
// DO NOT hand-write z.object() calls with hardcoded field names — all shapes come from the registry.
// Adding a field to BACKEND_REGISTRY automatically adds it to validation.
import { z } from 'zod';
import { BACKEND_REGISTRY, BackendType } from './registry';
function buildZodSchema(backendType: BackendType): z.ZodObject<Record<string, z.ZodTypeAny>> {
const fields = BACKEND_REGISTRY[backendType];
const shape: Record<string, z.ZodTypeAny> = {};
for (const field of fields) {
shape[field.key] = field.required
? z.string().min(1, `${field.label} is required`)
: z.string().optional();
}
return z.object(shape);
}
export const BACKEND_SCHEMAS = {
azureblob: buildZodSchema('azureblob'),
s3: buildZodSchema('s3'),
's3-compatible': buildZodSchema('s3-compatible'),
} as const;
// Utility type: infer TypeScript type from a backend's Zod schema
export type BackendFormValues<T extends BackendType> =
z.infer<typeof BACKEND_SCHEMAS[T]>;