Haal de Zod-beschrijving van je componenten op compile-tijd op met een script
Deze functie stelt je in staat om je schemaomschrijving te verkrijgen in de vorm van een typeveilige "Zod"-beschrijving die TS-first schema-validatie en statische type-inferentie voor je schema biedt.
Om ons Zod-schema op te halen, gaan we wat afhankelijkheden laden en een script maken dat enkele hulpmiddelen uit onze cms-renderer gebruikt
Laten we beginnen met onze projectstructuur
theme={null}
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // hier bevindt zich ons script
Nu gaan we dit bestand generated-schema.ts bewerken
generated-schema.ts theme={null}
import { fetchAllCustomSchemaFields, saveZodSchemaCode } from 'cms-renderer/lib/custom-schemas';
import { cmsConfig } from '../lib/cms-config'; // mijn config importeren
async function main() {
const { cmsUrl, websiteId } = cmsConfig;
if (!cmsUrl) {
throw new Error(
'[generate-schemas] NEXT_PUBLIC_CMS_API_URL is niet ingesteld. Stel hem in je omgeving of .env-bestand in.'
);
}
if (!websiteId) {
throw new Error(
'[generate-schemas] CMS_WEBSITE_ID is niet ingesteld. Stel hem in je omgeving of .env-bestand in.'
);
}
await saveZodSchemaCode(
await fetchAllCustomSchemaFields(cmsConfig),
'./generated/cms-schemas.ts'
);
console.log('[generate-schemas] Klaar.');
}
main().catch((err) => {
console.error('[generate-schemas] Mislukt:', err);
process.exit(1);
});
Je CmsConfig zou er als volgt uit moeten zien
theme={null}
export const cmsConfig = {
cmsUrl: process.env.NEXT_PUBLIC_CMS_API_URL,
apiKey: process.env.CMS_API_KEY,
websiteId: '...',
};
In onze package.json definiëren we hoe we het script uitvoeren en enkele afhankelijkheden
OPMERKING: Als je geen tsconfig hebt, kun je de vlag --tsconfig en de bijbehorende waarde verwijderen
package.json theme={null}
{
"name": "web",
"version": "0.1.0",
"type": "module",
"private": true,
"scripts": {
"generate-schemas": "tsx --tsconfig tsconfig.json scripts/generate-schemas.ts",
"...": "..."
},
Nu, nadat we het volgende hebben uitgevoerd
$ bun run generate-schemas
tsx --tsconfig tsconfig.json scripts/generate-schemas.ts
[generate-schemas] Klaar.
We zouden een vergelijkbare output moeten krijgen en we zien een nieuw bestand in onze projectstructuur
theme={null}
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // hier bevindt zich ons script
generated/
cms-schema.ts // gegenereerd zod-schema
Je kunt erin kijken en zien hoe je schema eruitziet. Om dit bestand bij te werken, moet je het commando bun run generate-schemas opnieuw uitvoeren, wat je kunt koppelen aan je dev- of build-workflow.
We kunnen deze Zod-objecten vervolgens in ons page.tsx-bestand binnenhalen als volgt
page.tsx theme={null}
import type { PetFoodPost, SiteConfig } from '@/generated/cms-schemas';
import { petFoodPostSchema } from '@/generated/cms-schemas';
// roep petFoodPostSchema.parse(obj) aan voor typeveilige parsing van objecten
Je kunt je schema bijwerken vanuit het beheerpaneel en het bijgewerkte schema opnieuw ophalen voor eenvoudige ontwikkeling