profound-logoProfound CMS
⌘K
Admin
Theme
DocsTutorialBlogPhilosophy
DocsTutorialBlogPhilosophy

Hybrid

Collection of Pages with ComponentsTypes of ComponentsSetup server sent events (SSE) content refetchInstall Profound CMS as a proxyCEL Scripting in Template BuilderProject ScaffoldingMedia Library

Headless

Quick startSplit Screen JSON Component Builder with LLMComponent Zod Pull

REST API

REST API OverviewgetConnect your websitegetGET /routesgetGET /routegetGET /blocksgetGET /blocks/with-cel-cachegetGET /blocks/generatedgetGET /componentsgetGET /components/{name}getGET /dataset/{schema_name}getGET /content-changes (SSE)patchPATCH /dataset/{schema_name}postPOST /translationpatchPATCH /translationsgetGET /usagepostPOST /csvpatchPATCH /csv
All Systems Operational
Powered Byprofound-logo
Theme

Component Zod Pull

Hämta zod-beskrivningen av dina komponenter vid kompileringstid med hjälp av ett skript

Den här funktionen låter dig hämta din komponentbeskrivning i form av en typesäker "Zod"-beskrivning, som ger TS-först-schemavalidering och statisk typinferens för ditt innehåll.

https://zod.dev

För att hämta vårt Zod-schema kommer vi att ladda in några beroenden och skapa ett skript som använder några verktyg från vår cms-renderer.

Låt oss börja med vår projektstruktur

apps/
 web/
 app/
   page.tsx
 scripts/
   generate-schemas.ts // här ligger vårt skript

Nu redigerar vi filen generated-schema.ts

import { fetchAllCustomSchemaFields, saveZodSchemaCode } from 'cms-renderer/lib/custom-schemas';
import { cmsConfig } from '../lib/cms-config'; // importerar min konfiguration

async function main() {
  const { cmsUrl, websiteId, apiKey } = cmsConfig;

  if (!cmsUrl) {
    throw new Error(
      '[generate-schemas] NEXT_PUBLIC_CMS_API_URL is not set. Set it in your environment or .env file.'
    );
  }
  if (!websiteId) {
    throw new Error(
      '[generate-schemas] NEXT_PUBLIC_PROFOUND_WEBSITE_ID is not set. Set it in your environment or .env file.'
    );
  }
  if (!apiKey) {
    throw new Error(
      '[generate-schemas] PROFOUND_API_KEY is not set. Set it in your environment or .env file.'
    );
  }

  const schemas = await fetchAllCustomSchemaFields({ cmsUrl, websiteId, apiKey });

  if (schemas.length === 0) {
    throw new Error(
      '[generate-schemas] No components returned from the API. Check that PROFOUND_API_KEY is valid and points at the right website.'
    );
  }

  await saveZodSchemaCode(schemas, './generated/cms-schemas.ts');

  console.log('[generate-schemas] Done.');
}

main().catch((err) => {
 console.error('[generate-schemas] Failed:', err);
  process.exit(1);
});

Din CmsConfig bör se ut så här

export const cmsConfig = {
  cmsUrl: process.env.NEXT_PUBLIC_CMS_API_URL,
  apiKey: process.env.CMS_API_KEY,
  websiteId: '...',
};

I vår package.json definierar vi hur skriptet ska köras och några beroenden

OBS: Om du inte har en tsconfig kan du ta bort flaggan --tsconfig och dess värde

{
  "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",
    "...": "..."
  }
}

Nu, efter att vi har kört

$ bun run generate-schemas
tsx --tsconfig tsconfig.json scripts/generate-schemas.ts
[generate-schemas] Done.

Vi bör få en liknande utdata och vi kan se en ny fil i vår projektstruktur

apps/
 web/
 app/
   page.tsx
 scripts/
   generated-schema.ts // här ligger vårt skript
 generated/
   cms-schema.ts // genererat zod-schema

Du kan inspektera den och se hur ditt schema ser ut. För att uppdatera den här filen måste du köra kommandot bun run generate-schemas igen, vilket du kan koppla till ditt dev- eller build-arbetsflöde.

Sedan kan vi hämta in dessa zod-objekt i vår page.tsx-fil så här

import type { PetFoodPost, SiteConfig } from '@/generated/cms-schemas';
import { petFoodPostSchema } from '@/generated/cms-schemas';

// anropa petFoodPostSchema.parse(obj) för typesäker tolkning av objekt

Du kan uppdatera din komponent från adminpanelen och hämta det uppdaterade schemat igen för enkel utveckling

Continue Reading
Previous‹Split Screen JSON Component Builder with LLM