スクリプトを使ってコンポーネントの 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 が設定されていません。環境変数または .env ファイルに設定してください。'
);
}
if (!websiteId) {
throw new Error(
'[generate-schemas] CMS_WEBSITE_ID が設定されていません。環境変数または .env ファイルに設定してください。'
);
}
await saveZodSchemaCode(
await fetchAllCustomSchemaFields(cmsConfig),
'./generated/cms-schemas.ts'
);
console.log('[generate-schemas] 完了しました。');
}
main().catch((err) => {
console.error('[generate-schemas] 失敗しました:', 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] 完了しました。
同様の出力が得られ、プロジェクト構成内に新しいファイルが作成されていることが確認できます。
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) を呼び出して、オブジェクトを型安全に解析します
管理画面でスキーマを更新し、再度取得すれば、開発が容易になります。