Ανακτήστε την περιγραφή Zod των components σας τη στιγμή της μεταγλώττισης χρησιμοποιώντας ένα script
Αυτή η δυνατότητα σας επιτρέπει να λάβετε την περιγραφή του component σας με τη μορφή μιας type-safe περιγραφής "Zod", η οποία προσφέρει επικύρωση σχημάτων με προτεραιότητα στο TS και στατικό προσδιορισμό τύπων για το περιεχόμενό σας.
Για να τραβήξουμε το Zod schema μας, θα φορτώσουμε μερικές εξαρτήσεις και θα δημιουργήσουμε ένα script που χρησιμοποιεί ορισμένες βοηθητικές συναρτήσεις από το cms-renderer μας.
Ας ξεκινήσουμε με τη δομή του έργου μας
apps/
web/
app/
page.tsx
scripts/
generate-schemas.ts // εδώ βρίσκεται το script μας
Τώρα θα επεξεργαστούμε αυτό το αρχείο generated-schema.ts
import { fetchAllCustomSchemaFields, saveZodSchemaCode } from 'cms-renderer/lib/custom-schemas';
import { cmsConfig } from '../lib/cms-config'; // εισάγοντας το config μου
async function main() {
const { cmsUrl, websiteId, apiKey } = cmsConfig;
if (!cmsUrl) {
throw new Error(
'[generate-schemas] Το NEXT_PUBLIC_CMS_API_URL δεν έχει οριστεί. Ορίστε το στο περιβάλλον σας ή στο αρχείο .env.'
);
}
if (!websiteId) {
throw new Error(
'[generate-schemas] Το NEXT_PUBLIC_PROFOUND_WEBSITE_ID δεν έχει οριστεί. Ορίστε το στο περιβάλλον σας ή στο αρχείο .env.'
);
}
if (!apiKey) {
throw new Error(
'[generate-schemas] Το PROFOUND_API_KEY δεν έχει οριστεί. Ορίστε το στο περιβάλλον σας ή στο αρχείο .env.'
);
}
const schemas = await fetchAllCustomSchemaFields({ cmsUrl, websiteId, apiKey });
if (schemas.length === 0) {
throw new Error(
'[generate-schemas] Δεν επιστράφηκαν components από το API. Ελέγξτε ότι το PROFOUND_API_KEY είναι έγκυρο και δείχνει στο σωστό website.'
);
}
await saveZodSchemaCode(schemas, './generated/cms-schemas.ts');
console.log('[generate-schemas] Ολοκληρώθηκε.');
}
main().catch((err) => {
console.error('[generate-schemas] Απέτυχε:', err);
process.exit(1);
});
Το CmsConfig σας θα πρέπει να μοιάζει με
export const cmsConfig = {
cmsUrl: process.env.NEXT_PUBLIC_CMS_API_URL,
apiKey: process.env.CMS_API_KEY,
websiteId: '...',
};
Μέσα στο package.json μας, ορίζουμε πώς θα τρέξουμε το script και μερικές εξαρτήσεις
ΣΗΜΕΙΩΣΗ: Αν δεν έχετε tsconfig, τότε μπορείτε να αφαιρέσετε το flag
--tsconfigκαι την τιμή του
{
"name": "web",
"version": "0.1.0",
"type": "module",
"private": true,
"scripts": {
"generate-schemas": "tsx --tsconfig tsconfig.json scripts/generate-schemas.ts",
"...": "..."
},
"dependencies": {
"cms-renderer": "0.3.1",
"zod": "^4.3.6",
"...": "..."
},
"devDependencies": {
"tsx": "^4.21.0",
"object-hash": "^3.0.0",
"...": "..."
}
}
Τώρα, αφού εκτελέσουμε
$ bun run generate-schemas
tsx --tsconfig tsconfig.json scripts/generate-schemas.ts
[generate-schemas] Ολοκληρώθηκε.
Θα πρέπει να λάβουμε ένα παρόμοιο αποτέλεσμα και μπορούμε να δούμε ένα νέο αρχείο στη δομή του έργου μας
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // εδώ βρίσκεται το script μας
generated/
cms-schema.ts // παραγόμενο zod schema
Μπορείτε να το εξετάσετε και να δείτε πώς φαίνεται το schema σας. Για να ενημερώσετε αυτό το αρχείο, πρέπει να εκτελέσετε ξανά την εντολή bun run generate-schemas, την οποία μπορείτε να συνδέσετε στη ροή εργασίας dev ή build.
Στη συνέχεια μπορούμε να τραβήξουμε αυτά τα αντικείμενα zod μέσα στο αρχείο page.tsx μας ως εξής
import type { PetFoodPost, SiteConfig } from '@/generated/cms-schemas';
import { petFoodPostSchema } from '@/generated/cms-schemas';
// καλέστε petFoodPostSchema.parse(obj) για type-safe ανάλυση αντικειμένων
Μπορείτε να ενημερώσετε το component σας από το admin panel και να τραβήξετε ξανά το ενημερωμένο schema για εύκολη ανάπτυξη