profound-logoProfound CMS
тМШK
Admin
Theme
DocsTutorialBlogPhilosophy
DocsTutorialBlogPhilosophy

Hybrid

Collection of Pages with ComponentsTypes of ComponentsSetup server sent events (SSE) content refetchрдПрдбрдорд┐рди рдкреИрдирд▓ рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрдЯрдЕрдкрдЯреЗрдореНрдкрд▓реЗрдЯ рдмрд┐рд▓реНрдбрд░ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧProject ScaffoldingрдореАрдбрд┐рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА

Headless

рддреНрд╡рд░рд┐рдд рдкреНрд░рд╛рд░рдВрднSplit Screen JSON Component Builder with LLMComponent Zod Pull

REST API

REST API OverviewgetConnect your websitegetрд░реВрдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВgetрд░реВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВgetрдмреНрд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВgetCEL рдХреИрд╢ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВgetрдмреНрд▓реЙрдХреНрд╕-рдЬрдирд░реЗрдЯреЗрдб-рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВgetрдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВgetGET /components/{name}getрдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реНрдХреАрдорд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВgetGET /content-changes (SSE)patchPATCH /dataset/{schema_name}postPOST /translationpatchрдкреИрдЪ рдЕрдиреБрд╡рд╛рджgetGET /usagepostPOST /csvpatchPATCH /csv
All Systems Operational
Powered Byprofound-logo
Theme

рддреНрд╡рд░рд┐рдд рдкреНрд░рд╛рд░рдВрдн

рд╕реНрдХреАрдорд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ

рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд Zod рд╕реНрдХреАрдорд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ рдЖрдкрдХреЗ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд Zod рд╕реНрдХреАрдорд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

  • TypeScript-рдкреНрд░рдердо рд╕реНрдХреАрдорд╛ рд╕рддреНрдпрд╛рдкрди
  • рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди

рдФрд░ рдЬрд╛рдиреЗрдВ: https://zod.dev

рд╕реЗрдЯрдЕрдк

рдЕрдкрдирд╛ Zod рд╕реНрдХреАрдорд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк:

  1. рдЖрд╡рд╢реНрдпрдХ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рд▓реЛрдб рдХрд░реЗрдВ
  2. cms-renderer рд╕реЗ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛

apps/
  web/
    app/
      page.tsx
    scripts/
      generated-schema.ts   # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓

рд╕реНрдХреНрд░рд┐рдкреНрдЯ: generated-schema.ts

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

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

  if (!cmsUrl) {
    throw new Error(
      '[generate-schemas] NEXT_PUBLIC_CMS_API_URL рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЕрдкрдиреЗ environment рдпрд╛ .env рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ.'
    );
  }

  if (!websiteId) {
    throw new Error(
      '[generate-schemas] CMS_WEBSITE_ID рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЕрдкрдиреЗ environment рдпрд╛ .env рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ.'
    );
  }

  if (!apiKey) {
    throw new Error(
      '[generate-schemas] PROFOUND_API_KEY рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЕрдкрдиреЗ environment рдпрд╛ .env рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ.'
    );
  }

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

  if (schemas.length === 0) {
    throw new Error(
      '[generate-schemas] рдПрдкреАрдЖрдИ рд╕реЗ рдХреЛрдИ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдпрд╛ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ PROFOUND_API_KEY рдорд╛рдиреНрдп рд╣реИ рдФрд░ рд╕рд╣реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ.'
    );
  }

  console.log(
    `[generate-schemas] ${schemas.length} рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдорд┐рд▓реЗ: ${schemas.map((s) => s.name).join(', ')}`
  );

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

  console.log('[generate-schemas] рдкреВрд░рд╛ рд╣реБрдЖ.');
}

main().catch((err) => {
  console.error('[generate-schemas] рд╡рд┐рдлрд▓:', err);
  process.exit(1);
});

CMS рдХреЙрдиреНрдлрд╝рд┐рдЧ рдЙрджрд╛рд╣рд░рдг

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

package.json рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

рдиреЛрдЯ: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ tsconfig.json рдирд╣реАрдВ рд╣реИ, рддреЛ --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] 3 рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдорд┐рд▓реЗ: post, categories, header
[generate-schemas] рдкреВрд░рд╛ рд╣реБрдЖ.

рдЕрджреНрдпрддрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛

apps/
  web/
    app/
      page.tsx
    scripts/
      generated-schema.ts
    generated/
      cms-schemas.ts   # рдЬрдирд░реЗрдЯреЗрдб Zod рд╕реНрдХреАрдорд╛

page.tsx рдореЗрдВ рдЙрдкрдпреЛрдЧ

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

// рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
petFoodPostSchema.parse(obj);

рдиреЛрдЯреНрд╕

  • рдЕрдкрдиреЗ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯреЗрдб рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
  • рдЬрдм рднреА рдЖрдкрдХреЗ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрджрд▓рддреА рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреБрдирдГ рдЪрд▓рд╛рдПрдБ:
bun run generate-schemas
  • рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ dev рдпрд╛ build рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдПрдбрдорд┐рди рдкреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреБрдирдГ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ
Continue Reading
NextSplit Screen JSON Component Builder with LLMтА║