codegen について
@json-render/codegen は、json-render の UI ツリーからコードを生成するフレームワーク非依存のユーティリティです。Next.js や Remix など向けのカスタムエクスポーターを作る開発者に、ツリー走査や情報収集、シリアライズ機能を提供します。
主な機能
- 01仕様ツリーの深さ優先走査
- 02コンポーネント、状態パス、アクションの収集
- 03プロパティ値とプロパティのシリアライズ
- 04ジェネレーターと生成ファイルの定義
活用シーン
- 01Next.js 向けコードエクスポーターの構築
- 02Remix 向けアプリケーションコードの生成
- 03仕様内で使われるコンポーネントとアクションの抽出
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ vercel-labs/ json-render --skill codegenインストール後、Claude Code で/codegenを入力して読み込まれたか確認します。
詳細
@json-render/codegen
json-render UI ツリーからコードを生成するための、フレームワークに依存しないユーティリティです。これらを使用して、Next.js、Remix、その他のフレームワーク向けのカスタムコードエクスポーターを構築できます。
インストール
npm install @json-render/codegen
ツリーの走査
import {
traverseSpec,
collectUsedComponents,
collectStatePaths,
collectActions,
} from "@json-render/codegen";
// Walk the spec depth-first
traverseSpec(spec, (element, key, depth, parent) => {
console.log(`${" ".repeat(depth * 2)}${key}: ${element.type}`);
});
// Get all component types used
const components = collectUsedComponents(spec);
// Set { "Card", "Metric", "Button" }
// Get all state paths referenced
const statePaths = collectStatePaths(spec);
// Set { "analytics/revenue", "user/name" }
// Get all action names
const actions = collectActions(spec);
// Set { "submit_form", "refresh_data" }
シリアライズ
import {
serializePropValue,
serializeProps,
escapeString,
type SerializeOptions,
} from "@json-render/codegen";
// Serialize a single value
serializePropValue("hello");
// { value: '"hello"', needsBraces: false }
serializePropValue({ $state: "/user/name" });
// { value: '{ $state: "/user/name" }', needsBraces: true }
// Serialize props for JSX
serializeProps({ title: "Dashboard", columns: 3, disabled: true });
// 'title="Dashboard" columns={3} disabled'
// Escape strings for code
escapeString('hello "world"');
// 'hello \"world\"'
SerializeOptions
interface SerializeOptions {
quotes?: "single" | "double";
indent?: number;
}
型
import type { GeneratedFile, CodeGenerator } from "@json-render/codegen";
const myGenerator: CodeGenerator = {
generate(spec) {
return [
{ path: "package.json", content: "..." },
{ path: "app/page.tsx", content: "..." },
];
},
};
カスタムジェネレーターの構築
import {
collectUsedComponents,
collectStatePaths,
traverseSpec,
serializeProps,
type GeneratedFile,
} from "@json-render/codegen";
import type { Spec } from "@json-render/core";
export function generateNextJSProject(spec: Spec): GeneratedFile[] {
const files: GeneratedFile[] = [];
const components = collectUsedComponents(spec);
// Generate package.json, component files, main page...
return files;
}
コメント
Markdown 対応