@t1mmen/srtd
Version:
Supabase Repeatable Template Definitions (srtd): 🪄 Live-reloading SQL templates for Supabase DX. Make your database changes reviewable and migrations maintainable! 🚀
92 lines • 2.69 kB
JavaScript
import { z } from 'zod';
/**
* Format Zod validation errors into a human-readable string
* @param error - Zod error object from safeParse
* @returns Formatted error string with paths and messages
*/
export function formatZodErrors(error) {
return error.issues
.map(issue => {
const path = issue.path.join('.');
return path ? `${path}: ${issue.message}` : issue.message;
})
.join('; ');
}
/**
* Schema for TemplateBuildState - all fields are optional strings
*/
export const TemplateBuildStateSchema = z.object({
lastBuildHash: z.string().optional(),
lastBuildDate: z.string().optional(),
lastBuildError: z.string().optional(),
lastMigrationFile: z.string().optional(),
lastAppliedHash: z.string().optional(),
lastAppliedDate: z.string().optional(),
lastAppliedError: z.string().optional(),
});
/**
* Schema for BuildLog - contains version, lastTimestamp, and templates record
*/
export const BuildLogSchema = z.object({
version: z.string(),
lastTimestamp: z.string(),
templates: z.record(z.string(), TemplateBuildStateSchema),
});
/**
* Schema for CLIConfig - matches CLIConfig interface from types.ts
*/
export const CLIConfigSchema = z.object({
filter: z.string(),
wipIndicator: z.string(),
wrapInTransaction: z.boolean(),
banner: z.string(),
footer: z.string(),
templateDir: z.string(),
migrationDir: z.string(),
migrationPrefix: z.string().optional(),
migrationFilename: z.string().optional(),
buildLog: z.string(),
localBuildLog: z.string(),
pgConnection: z.string(),
});
/**
* Validates a JSON string as a BuildLog
* @param content - JSON string to validate
* @returns ValidationResult with parsed data or error message
*/
export function validateBuildLog(content) {
// Handle empty string
if (!content || content.trim() === '') {
return {
success: false,
error: 'Empty content provided',
errorType: 'parse',
};
}
// Try to parse JSON first
let parsed;
try {
parsed = JSON.parse(content);
}
catch (e) {
return {
success: false,
error: `Invalid JSON: ${e instanceof Error ? e.message : 'Parse error'}`,
errorType: 'parse',
};
}
// Validate against schema
const result = BuildLogSchema.safeParse(parsed);
if (result.success) {
return {
success: true,
data: result.data,
};
}
return {
success: false,
error: formatZodErrors(result.error),
errorType: 'validation',
};
}
//# sourceMappingURL=schemas.js.map