studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
54 lines (53 loc) • 2.1 kB
JavaScript
import { z } from "astro/zod";
function ensureStringArray(val) {
if (!val) return [];
if (typeof val === "string" && val.trim() === "") return [];
if (Array.isArray(val)) return val;
try {
const parsed = JSON.parse(val);
if (Array.isArray(parsed)) return parsed;
return [];
} catch {
return [];
}
}
const studioCMSCreatePageDataSchema = z.object({
title: z.string().min(1, { message: "Title is required" }),
slug: z.string().refine((val) => /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(val), {
message: "Slug must be lowercase and can only contain letters, numbers, and hyphens (no leading/trailing hyphens)"
}),
description: z.string().optional(),
package: z.string(),
showOnNav: z.string().optional().transform(transformStringToBoolean),
heroImage: z.string().optional(),
parentFolder: z.union([z.string(), z.null()]).transform((value) => value === "null" || value === null ? null : value).optional().default(null),
draft: z.string().optional().transform(transformStringToBoolean),
showAuthor: z.string().optional().transform(transformStringToBoolean),
showContributors: z.string().optional().transform(transformStringToBoolean),
categories: z.string().or(z.array(z.string())).optional().transform(ensureStringArray).default([]),
tags: z.string().or(z.array(z.string())).optional().transform(ensureStringArray).default([])
});
const studioCMSEditPageDataAndContentSchema = studioCMSCreatePageDataSchema.extend({
id: z.string(),
content: z.string(),
contentId: z.string(),
pluginFields: z.record(z.custom().nullable()).optional().default({}),
augments: z.array(z.string()).optional()
});
function formDataToRecord(formData, keyRemapping) {
const record = {};
for (const [key, value] of formData.entries()) {
const mappedKey = keyRemapping?.[key] || key;
record[mappedKey] = value;
}
return record;
}
function transformStringToBoolean(value) {
return !!value && value.toLowerCase() === "true";
}
export {
formDataToRecord,
studioCMSCreatePageDataSchema,
studioCMSEditPageDataAndContentSchema,
transformStringToBoolean
};