스크립트를 사용해 컴파일 타임에 컴포넌트의 zod 설명을 가져옵니다
이 기능을 사용하면 스키마에 대해 TS 중심의 스키마 검증과 정적 타입 추론을 제공하는 타입 안전한 "Zod" 설명 형태로 스키마 설명을 가져올 수 있습니다.
zod 스키마를 가져오기 위해 몇 가지 의존성을 로드하고 cms-renderer의 몇 가지 유틸리티를 사용하는 스크립트를 만들겠습니다.
프로젝트 구조부터 살펴보겠습니다
theme={null}
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // 스크립트가 위치하는 곳
이제 generated-schema.ts 파일을 수정하겠습니다
generated-schema.ts theme={null}
import { fetchAllCustomSchemaFields, saveZodSchemaCode } from 'cms-renderer/lib/custom-schemas';
import { cmsConfig } from '../lib/cms-config'; // 내 설정을 가져옵니다
async function main() {
const { cmsUrl, websiteId } = 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] CMS_WEBSITE_ID is not set. Set it in your environment or .env file.'
);
}
await saveZodSchemaCode(
await fetchAllCustomSchemaFields(cmsConfig),
'./generated/cms-schemas.ts'
);
console.log('[generate-schemas] Done.');
}
main().catch((err) => {
console.error('[generate-schemas] Failed:', err);
process.exit(1);
});
여러분의 CmsConfig는 다음과 같아야 합니다
theme={null}
export const cmsConfig = {
cmsUrl: process.env.NEXT_PUBLIC_CMS_API_URL,
apiKey: process.env.CMS_API_KEY,
websiteId: '...',
};
package.json 내부에서 스크립트를 실행하는 방법과 몇 가지 의존성을 정의합니다
참고: tsconfig가 없다면 --tsconfig 플래그와 그 값을 제거하면 됩니다
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",
"...": "..."
},
이제 다음 명령을 실행하면
$ bun run generate-schemas
tsx --tsconfig tsconfig.json scripts/generate-schemas.ts
[generate-schemas] Done.
유사한 출력이 나타나고 프로젝트 구조에서 새 파일을 확인할 수 있습니다
theme={null}
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // 스크립트가 위치하는 곳
generated/
cms-schema.ts // 생성된 zod 스키마
내부를 확인하여 스키마가 어떻게 생겼는지 확인할 수 있습니다. 이 파일을 업데이트하려면 bun run generate-schemas 명령을 다시 실행해야 하며, 이를 dev 또는 build 워크플로에 연결할 수 있습니다.
page.tsx 파일에서 다음과 같이 이러한 zod 객체를 가져올 수 있습니다
page.tsx theme={null}
import type { PetFoodPost, SiteConfig } from '@/generated/cms-schemas';
import { petFoodPostSchema } from '@/generated/cms-schemas';
// 객체를 타입 안전하게 파싱하려면 petFoodPostSchema.parse(obj)를 호출하세요
관리자 패널에서 스키마를 업데이트한 다음, 업데이트된 스키마를 다시 가져와 손쉽게 개발할 수 있습니다