|
|
5 сар өмнө | |
|---|---|---|
| .. | ||
| src | 5 сар өмнө | |
| CHANGELOG.md | 5 сар өмнө | |
| README.md | 5 сар өмнө | |
| package.json | 5 сар өмнө | |
| tsconfig.json | 5 сар өмнө | |
| tsup.config.ts | 5 сар өмнө | |
Utilities for generating code from json-render UI trees.
This package provides framework-agnostic utilities for building code generators. Use these utilities to create custom code exporters for your specific framework (Next.js, Remix, etc.).
npm install @json-render/codegen
# or
pnpm add @json-render/codegen
import { traverseTree, collectUsedComponents, collectDataPaths, collectActions } from '@json-render/codegen';
// Walk the tree depth-first
traverseTree(tree, (element, depth, parent) => {
console.log(`${' '.repeat(depth * 2)}${element.type}`);
});
// Get all component types used
const components = collectUsedComponents(tree);
// Set { 'Card', 'Metric', 'Button' }
// Get all data paths referenced
const dataPaths = collectDataPaths(tree);
// Set { 'analytics/revenue', 'user/name' }
// Get all action names
const actions = collectActions(tree);
// Set { 'submit_form', 'refresh_data' }
import { serializePropValue, serializeProps, escapeString } from '@json-render/codegen';
// Serialize a single value
serializePropValue("hello");
// { value: '"hello"', needsBraces: false }
serializePropValue(42);
// { value: '42', needsBraces: true }
serializePropValue({ path: 'user/name' });
// { value: '{ path: "user/name" }', needsBraces: true }
// Serialize props for JSX
serializeProps({ title: "Dashboard", columns: 3, disabled: true });
// 'title="Dashboard" columns={3} disabled'
import type { GeneratedFile, CodeGenerator } from '@json-render/codegen';
// Implement your own code generator
const myGenerator: CodeGenerator = {
generate(tree) {
return [
{ path: 'package.json', content: '...' },
{ path: 'app/page.tsx', content: '...' },
];
}
};
See the examples/dashboard for a complete example of building a Next.js code generator using these utilities.
import {
collectUsedComponents,
collectDataPaths,
traverseTree,
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(tree);
// Generate package.json
files.push({
path: 'package.json',
content: JSON.stringify({
name: 'my-generated-app',
dependencies: {
next: '^14.0.0',
react: '^18.0.0',
}
}, null, 2)
});
// Generate component files...
// Generate main page...
return files;
}
Apache-2.0