Rufe die Zod-Beschreibung deiner Komponenten zur Compile-Zeit mithilfe eines Skripts ab
Diese Funktion ermöglicht es dir, die Beschreibung deines Schemas in Form einer typsicheren „Zod“-Definition zu erhalten, die eine TS-first-Schemavalidierung und statische Typinferenz für dein Schema bereitstellt.
Um unser Zod-Schema zu beziehen, laden wir einige Abhängigkeiten und erstellen ein Skript, das einige Hilfsfunktionen aus unserem cms-renderer verwendet.
Beginnen wir mit unserer Projektstruktur
theme={null}
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // hier befindet sich unser Skript
Jetzt bearbeiten wir diese Datei generated-schema.ts
generated-schema.ts theme={null}
import { fetchAllCustomSchemaFields, saveZodSchemaCode } from 'cms-renderer/lib/custom-schemas';
import { cmsConfig } from '../lib/cms-config'; // meine Konfiguration importieren
async function main() {
const { cmsUrl, websiteId } = cmsConfig;
if (!cmsUrl) {
throw new Error(
'[generate-schemas] NEXT_PUBLIC_CMS_API_URL ist nicht gesetzt. Lege sie in deiner Umgebung oder der .env-Datei fest.'
);
}
if (!websiteId) {
throw new Error(
'[generate-schemas] CMS_WEBSITE_ID ist nicht gesetzt. Lege sie in deiner Umgebung oder der .env-Datei fest.'
);
}
await saveZodSchemaCode(
await fetchAllCustomSchemaFields(cmsConfig),
'./generated/cms-schemas.ts'
);
console.log('[generate-schemas] Fertig.');
}
main().catch((err) => {
console.error('[generate-schemas] Fehlgeschlagen:', err);
process.exit(1);
});
Deine CmsConfig sollte folgendermaßen aussehen
theme={null}
export const cmsConfig = {
cmsUrl: process.env.NEXT_PUBLIC_CMS_API_URL,
apiKey: process.env.CMS_API_KEY,
websiteId: '...',
};
In unserer package.json legen wir fest, wie das Skript ausgeführt wird, sowie einige Abhängigkeiten.
HINWEIS: Wenn du keine tsconfig hast, kannst du den Schalter --tsconfig und seinen Wert entfernen
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",
"...": "..."
},
Nachdem wir nun Folgendes ausführen
$ bun run generate-schemas
tsx --tsconfig tsconfig.json scripts/generate-schemas.ts
[generate-schemas] Fertig.
Wir sollten eine ähnliche Ausgabe erhalten und sehen eine neue Datei in unserer Projektstruktur
theme={null}
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // hier befindet sich unser Skript
generated/
cms-schema.ts // generiertes Zod-Schema
Du kannst sie öffnen und dir ansehen, wie dein Schema aussieht. Um diese Datei zu aktualisieren, musst du den Befehl bun run generate-schemas erneut ausführen, den du mit deinem dev- oder build-Workflow verknüpfen kannst.
Anschließend können wir diese Zod-Objekte in unserer Datei page.tsx wie folgt einbinden.
page.tsx theme={null}
import type { PetFoodPost, SiteConfig } from '@/generated/cms-schemas';
import { petFoodPostSchema } from '@/generated/cms-schemas';
// Rufe petFoodPostSchema.parse(obj) für typsicheres Parsen von Objekten auf
Du kannst dein Schema über das Admin-Panel aktualisieren und das aktualisierte Schema für eine einfache Entwicklung erneut abrufen