|
|
5 luni în urmă | |
|---|---|---|
| .. | ||
| src | 5 luni în urmă | |
| README.md | 5 luni în urmă | |
| package.json | 5 luni în urmă | |
| tsconfig.json | 5 luni în urmă | |
| tsup.config.ts | 5 luni în urmă | |
Predictable. Guardrailed. Fast. Core library for safe, user-prompted UI generation.
npm install @json-render/core
# or
pnpm add @json-render/core
import { createCatalog } from '@json-render/core';
import { z } from 'zod';
const catalog = createCatalog({
name: 'My Dashboard',
components: {
Card: {
props: z.object({
title: z.string(),
description: z.string().nullable(),
}),
hasChildren: true,
description: 'A card container',
},
Button: {
props: z.object({
label: z.string(),
action: ActionSchema,
}),
description: 'A clickable button',
},
},
actions: {
submit: { description: 'Submit the form' },
export: {
params: z.object({ format: z.enum(['csv', 'pdf']) }),
description: 'Export data',
},
},
functions: {
customValidation: (value) => typeof value === 'string' && value.length > 0,
},
});
import { visibility, evaluateVisibility } from '@json-render/core';
// Simple path-based visibility
const element1 = {
key: 'error-banner',
type: 'Alert',
props: { message: 'Error!' },
visible: { path: '/form/hasError' },
};
// Auth-based visibility
const element2 = {
key: 'admin-panel',
type: 'Card',
props: { title: 'Admin' },
visible: { auth: 'signedIn' },
};
// Complex logic
const element3 = {
key: 'notification',
type: 'Alert',
props: { message: 'Warning' },
visible: {
and: [
{ path: '/settings/notifications' },
{ not: { path: '/user/dismissed' } },
{ gt: [{ path: '/items/count' }, 10] },
],
},
};
// Evaluate visibility
const isVisible = evaluateVisibility(element1.visible, {
dataModel: { form: { hasError: true } },
});
import { resolveAction, executeAction } from '@json-render/core';
const buttonAction = {
name: 'refund',
params: {
paymentId: { path: '/selected/id' },
amount: 100,
},
confirm: {
title: 'Confirm Refund',
message: 'Refund $100 to customer?',
variant: 'danger',
},
onSuccess: { navigate: '/payments' },
onError: { set: { '/ui/error': '$error.message' } },
};
// Resolve dynamic values
const resolved = resolveAction(buttonAction, dataModel);
import { runValidation, check } from '@json-render/core';
const config = {
checks: [
check.required('Email is required'),
check.email('Invalid email'),
check.maxLength(100, 'Too long'),
],
validateOn: 'blur',
};
const result = runValidation(config, {
value: 'user@example.com',
dataModel: {},
});
// result.valid = true
// result.errors = []
evaluateVisibility(condition, context) - Evaluate a visibility conditionevaluateLogicExpression(expr, context) - Evaluate a logic expressionvisibility.* - Helper functions for creating visibility conditionsresolveAction(action, dataModel) - Resolve dynamic values in an actionexecuteAction(context) - Execute an action with callbacksinterpolateString(template, dataModel) - Interpolate ${path} in stringsrunValidation(config, context) - Run validation checksrunValidationCheck(check, context) - Run a single validation checkbuiltInValidationFunctions - Built-in validators (required, email, min, max, etc.)check.* - Helper functions for creating validation checkscreateCatalog(config) - Create a catalog with components, actions, and functionsgenerateCatalogPrompt(catalog) - Generate an AI prompt describing the catalogSee src/types.ts for full type definitions:
UIElement - Base element structureUITree - Flat tree structureVisibilityCondition - Visibility condition typesLogicExpression - Logic expression typesAction - Rich action definitionValidationConfig - Validation configuration