jsxpression 0.1.28 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -188
- package/lib/analyze/analysis-report.d.ts +2 -2
- package/lib/analyze/analysis-report.d.ts.map +1 -1
- package/lib/analyze/analysis-report.js +4 -0
- package/lib/analyze/analysis-report.js.map +1 -1
- package/lib/analyze/data/data-access.d.ts.map +1 -1
- package/lib/analyze/data/data-access.js +45 -82
- package/lib/analyze/data/data-access.js.map +1 -1
- package/lib/analyze/data/method-calls.d.ts.map +1 -1
- package/lib/analyze/data/method-calls.js +4 -3
- package/lib/analyze/data/method-calls.js.map +1 -1
- package/lib/analyze/data/utils.d.ts +2 -3
- package/lib/analyze/data/utils.d.ts.map +1 -1
- package/lib/analyze/data/utils.js +10 -36
- package/lib/analyze/data/utils.js.map +1 -1
- package/lib/analyze/jsx/element-attributes.d.ts +1 -1
- package/lib/analyze/jsx/element-attributes.d.ts.map +1 -1
- package/lib/analyze/jsx/element-attributes.js +13 -3
- package/lib/analyze/jsx/element-attributes.js.map +1 -1
- package/lib/analyze/jsx/element-children.d.ts +1 -1
- package/lib/analyze/jsx/element-children.d.ts.map +1 -1
- package/lib/analyze/jsx/element-children.js +16 -5
- package/lib/analyze/jsx/element-children.js.map +1 -1
- package/lib/analyze/jsx/element-tags.d.ts +1 -1
- package/lib/analyze/jsx/element-tags.d.ts.map +1 -1
- package/lib/analyze/jsx/element-tags.js +12 -2
- package/lib/analyze/jsx/element-tags.js.map +1 -1
- package/lib/analyze/security/analyze.d.ts.map +1 -1
- package/lib/analyze/security/analyze.js +2 -4
- package/lib/analyze/security/analyze.js.map +1 -1
- package/lib/analyze/security/call-expressions.d.ts +2 -2
- package/lib/analyze/security/call-expressions.d.ts.map +1 -1
- package/lib/analyze/security/call-expressions.js +21 -5
- package/lib/analyze/security/call-expressions.js.map +1 -1
- package/lib/analyze/security/declarations.d.ts +1 -1
- package/lib/analyze/security/declarations.d.ts.map +1 -1
- package/lib/analyze/security/declarations.js +22 -2
- package/lib/analyze/security/declarations.js.map +1 -1
- package/lib/analyze/security/expressions.d.ts.map +1 -1
- package/lib/analyze/security/expressions.js +10 -2
- package/lib/analyze/security/expressions.js.map +1 -1
- package/lib/analyze/security/identifiers.d.ts +2 -2
- package/lib/analyze/security/identifiers.d.ts.map +1 -1
- package/lib/analyze/security/identifiers.js +159 -19
- package/lib/analyze/security/identifiers.js.map +1 -1
- package/lib/builtins.d.ts.map +1 -1
- package/lib/builtins.js +5 -0
- package/lib/builtins.js.map +1 -1
- package/lib/compile/compile.d.ts.map +1 -1
- package/lib/compile/compile.js +131 -61
- package/lib/compile/compile.js.map +1 -1
- package/lib/evaluate/evaluate.d.ts +3 -3
- package/lib/evaluate/evaluate.d.ts.map +1 -1
- package/lib/evaluate/evaluate.js +28 -7
- package/lib/evaluate/evaluate.js.map +1 -1
- package/lib/jsx.d.ts +2 -19
- package/lib/jsx.d.ts.map +1 -1
- package/lib/jsx.js +0 -6
- package/lib/jsx.js.map +1 -1
- package/lib/parse/parse.d.ts.map +1 -1
- package/lib/parse/parse.js +4 -3
- package/lib/parse/parse.js.map +1 -1
- package/lib/render.d.ts +4 -4
- package/lib/render.d.ts.map +1 -1
- package/lib/render.js +7 -9
- package/lib/render.js.map +1 -1
- package/lib/schema.d.ts +2 -7
- package/lib/schema.d.ts.map +1 -1
- package/lib/schema.js +0 -43
- package/lib/schema.js.map +1 -1
- package/lib/traverse.d.ts +4 -4
- package/lib/traverse.d.ts.map +1 -1
- package/lib/traverse.js +118 -40
- package/lib/traverse.js.map +1 -1
- package/lib/validate.d.ts +1 -1
- package/lib/validate.js +1 -1
- package/package.json +4 -3
- package/src/analyze/analysis-report.ts +6 -2
- package/src/analyze/analyze.test.ts +108 -69
- package/src/analyze/data/data-access.ts +45 -90
- package/src/analyze/data/method-calls.ts +4 -3
- package/src/analyze/data/utils.ts +11 -40
- package/src/analyze/jsx/element-attributes.ts +24 -9
- package/src/analyze/jsx/element-children.ts +20 -6
- package/src/analyze/jsx/element-tags.ts +15 -3
- package/src/analyze/security/analyze.ts +1 -3
- package/src/analyze/security/call-expressions.ts +37 -17
- package/src/analyze/security/declarations.ts +35 -9
- package/src/analyze/security/expressions.ts +17 -3
- package/src/analyze/security/identifiers.ts +172 -28
- package/src/builtins.ts +6 -0
- package/src/codegen/generate-typescript-definitions.test.ts +16 -23
- package/src/compile/compile.test.ts +153 -30
- package/src/compile/compile.ts +163 -73
- package/src/evaluate/evaluate.test.ts +276 -14
- package/src/evaluate/evaluate.ts +34 -10
- package/src/jsx.ts +2 -31
- package/src/parse/parse.test.ts +4 -4
- package/src/parse/parse.ts +4 -3
- package/src/render.test.ts +476 -27
- package/src/render.ts +7 -14
- package/src/schema.ts +1 -55
- package/src/traverse.ts +135 -49
- package/src/validate.ts +1 -1
- package/LICENSE +0 -21
- package/lib/analyze/analyze.test.d.ts +0 -2
- package/lib/analyze/analyze.test.d.ts.map +0 -1
- package/lib/analyze/analyze.test.js +0 -763
- package/lib/analyze/analyze.test.js.map +0 -1
- package/lib/analyze/security/member-access.d.ts +0 -6
- package/lib/codegen/generate-typescript-definitions.test.d.ts +0 -2
- package/lib/codegen/generate-typescript-definitions.test.d.ts.map +0 -1
- package/lib/codegen/generate-typescript-definitions.test.js +0 -649
- package/lib/codegen/generate-typescript-definitions.test.js.map +0 -1
- package/lib/compile/compile.test.d.ts +0 -2
- package/lib/compile/compile.test.d.ts.map +0 -1
- package/lib/compile/compile.test.js +0 -146
- package/lib/compile/compile.test.js.map +0 -1
- package/lib/evaluate/evaluate.test.d.ts +0 -2
- package/lib/evaluate/evaluate.test.d.ts.map +0 -1
- package/lib/evaluate/evaluate.test.js +0 -260
- package/lib/evaluate/evaluate.test.js.map +0 -1
- package/lib/parse/parse.test.d.ts +0 -2
- package/lib/parse/parse.test.d.ts.map +0 -1
- package/lib/parse/parse.test.js +0 -80
- package/lib/parse/parse.test.js.map +0 -1
- package/lib/render.test.d.ts +0 -2
- package/lib/render.test.d.ts.map +0 -1
- package/lib/render.test.js +0 -301
- package/lib/render.test.js.map +0 -1
- package/lib/traverse.test.d.ts +0 -2
- package/lib/traverse.test.d.ts.map +0 -1
- package/lib/traverse.test.js +0 -84
- package/lib/traverse.test.js.map +0 -1
- package/lib/types.d.ts +0 -12
- package/src/analyze/security/member-access.ts +0 -35
- package/src/types.ts +0 -17
package/README.md
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
# JSXpression
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Sandboxed JSX components with full TypeScript support**
|
|
4
4
|
|
|
5
|
-
JSXpression
|
|
5
|
+
JSXpression is a secure runtime for user-authored JSX. Think of it as a mini component system: users write functions, define interfaces, compose components — all inside a validated sandbox. The syntax is familiar TypeScript/JSX, but the execution environment is locked down by your schema.
|
|
6
6
|
|
|
7
|
-
Under the hood it parses
|
|
7
|
+
Under the hood it parses TSX into an AST, validates it against a schema, compiles it to safe JavaScript, and runs it in isolation — with only your data, components, and allowed builtins available.
|
|
8
8
|
|
|
9
9
|
## What's it for?
|
|
10
10
|
|
|
11
|
-
Let users
|
|
11
|
+
Let users build components — safely. You define a schema describing which elements and data are available, and JSXpression takes care of the rest: parsing, validation, and execution. No risk, no globals, no surprises.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Use cases: configurable document templates, dynamic diagram layouts, low-code UI builders, user-defined report generators — anywhere you need end-user flexibility without giving up control.
|
|
14
|
+
|
|
15
|
+
**Bonus:** You can generate `.d.ts` files straight from your schema for full editor support — autocomplete, error highlighting, inline docs — all the TypeScript DX, none of the compilation overhead. Your schema stays the single source of truth.
|
|
14
16
|
|
|
15
17
|
## Features
|
|
16
18
|
|
|
17
|
-
- 🛡️ **Secure by design**
|
|
18
|
-
- 📋 **Schema-driven**
|
|
19
|
-
- ⚡ **Fast**
|
|
20
|
-
-
|
|
19
|
+
- 🛡️ **Secure by design** — Static analysis blocks everything unsafe. No `eval`, no `window`, no `document`, only pure, allowed operations
|
|
20
|
+
- 📋 **Schema-driven** — Explicitly define what data and elements exist. Anything not in the schema simply doesn't exist
|
|
21
|
+
- ⚡ **Fast** — Parse and validate once, then run freely. No runtime compilation required
|
|
22
|
+
- 🧩 **Composable** — Define local functions, extract reusable components, use `const` bindings — just like real components
|
|
23
|
+
- 🎯 **Familiar** — It's TypeScript + JSX. The same syntax developers already know, now with guardrails
|
|
21
24
|
|
|
22
25
|
## Installation
|
|
23
26
|
|
|
@@ -25,12 +28,6 @@ Let users write JSX – safely. You define a schema describing which components
|
|
|
25
28
|
npm install jsxpression
|
|
26
29
|
```
|
|
27
30
|
|
|
28
|
-
or
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
pnpm add jsxpression
|
|
32
|
-
```
|
|
33
|
-
|
|
34
31
|
## Quick Start
|
|
35
32
|
|
|
36
33
|
```typescript
|
|
@@ -46,108 +43,109 @@ const schema = {
|
|
|
46
43
|
},
|
|
47
44
|
};
|
|
48
45
|
|
|
49
|
-
const result = render("<Text size={16}>Hello {
|
|
46
|
+
const result = render("<Text size={16}>Hello {user.name}!</Text>", schema, {
|
|
50
47
|
data: { user: { name: "Peter" }, items: ["apple", "banana"] },
|
|
51
48
|
components: { Text: ({ size, children }) => `<span style="font-size: ${size}px">${children}</span>` },
|
|
52
49
|
});
|
|
53
|
-
// Result: <span style="font-size: 16px">Hello Peter!</span>
|
|
54
50
|
```
|
|
55
51
|
|
|
56
|
-
##
|
|
52
|
+
## Writing Templates
|
|
53
|
+
|
|
54
|
+
Templates are mini TypeScript/JSX programs. You can use `const` bindings, `function` declarations, `interface` types, and compose them freely — just like a React component body. The only rule: the last statement must be a `return` with your JSX.
|
|
55
|
+
|
|
56
|
+
### Simple expression
|
|
57
57
|
|
|
58
58
|
```tsx
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
return <Text size={16}>Hello {user.name}!</Text>;
|
|
60
|
+
```
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
elements: {
|
|
78
|
-
Text: {
|
|
79
|
-
props: {
|
|
80
|
-
className: {
|
|
81
|
-
type: "string",
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
Card: {
|
|
86
|
-
props: {
|
|
87
|
-
title: {
|
|
88
|
-
type: "string",
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const result = render(template, schema, {
|
|
96
|
-
data: { user: userData },
|
|
97
|
-
components: {
|
|
98
|
-
Text: ({ className, children }) => <span className={className}>{children}</span>,
|
|
99
|
-
Card: ({ title, children }) => (
|
|
100
|
-
<div className="card">
|
|
101
|
-
<h3>{title}</h3>
|
|
102
|
-
<div>{children}</div>
|
|
103
|
-
</div>
|
|
104
|
-
),
|
|
105
|
-
},
|
|
106
|
-
createElement,
|
|
107
|
-
});
|
|
62
|
+
### With local variables
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
const greeting = user.isAdmin ? "Welcome back" : "Hello";
|
|
66
|
+
const itemCount = items.length;
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<Card title={greeting}>
|
|
70
|
+
<Text>{itemCount} items</Text>
|
|
71
|
+
</Card>
|
|
72
|
+
);
|
|
73
|
+
```
|
|
108
74
|
|
|
109
|
-
|
|
75
|
+
### With reusable functions
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
interface BadgeProps {
|
|
79
|
+
label: string;
|
|
80
|
+
color: string;
|
|
110
81
|
}
|
|
111
82
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
83
|
+
function Badge({ label, color }: BadgeProps) {
|
|
84
|
+
return (
|
|
85
|
+
<Box>
|
|
86
|
+
<Rectangle fill={color} width={60} height={20} />
|
|
87
|
+
<Text size={11} fill="#fff">
|
|
88
|
+
{label}
|
|
89
|
+
</Text>
|
|
90
|
+
</Box>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
interface RowProps {
|
|
95
|
+
item: { name: string; status: string };
|
|
96
|
+
y: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function Row({ item, y }: RowProps) {
|
|
100
|
+
return (
|
|
101
|
+
<Box>
|
|
102
|
+
<Text x={10} y={y}>
|
|
103
|
+
{item.name}
|
|
104
|
+
</Text>
|
|
105
|
+
<Badge label={item.status} color={item.status === "active" ? "#2b8a3e" : "#868e96"} />
|
|
106
|
+
</Box>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return (
|
|
111
|
+
<Container>
|
|
112
|
+
{items.map((item, i) => (
|
|
113
|
+
<Row item={item} y={i * 24} />
|
|
114
|
+
))}
|
|
115
|
+
</Container>
|
|
116
|
+
);
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
TypeScript syntax (`interface`, type annotations, generics) is fully supported in parsing and silently stripped at compile time. Type safety isn't lost though — it's enforced by the schema. The schema validates every element, attribute, data access, and function call at analysis time, before any code runs. TypeScript gives you the editor DX; the schema gives you the runtime guarantees.
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
## Expression Types
|
|
122
122
|
|
|
123
123
|
```typescript
|
|
124
|
-
// JSX
|
|
125
|
-
"<Text>Hello {
|
|
124
|
+
// JSX elements
|
|
125
|
+
"return <Text>Hello {user.name}</Text>";
|
|
126
126
|
|
|
127
|
-
// Fragments
|
|
128
|
-
"<>Hello {
|
|
127
|
+
// Fragments
|
|
128
|
+
"return <>Hello {user.name}, you have {items.length} items!</>";
|
|
129
129
|
|
|
130
|
-
// Bare expressions (single values)
|
|
131
|
-
"{
|
|
132
|
-
"{
|
|
130
|
+
// Bare expressions (single values — no return needed)
|
|
131
|
+
"{user.name}";
|
|
132
|
+
"{items.length * 2}";
|
|
133
133
|
```
|
|
134
134
|
|
|
135
|
-
**
|
|
136
|
-
|
|
137
|
-
- ❌ `"Hello {data.user.name}!"` - Won't work
|
|
138
|
-
- ✅ `"<>Hello {data.user.name}!</>"` - Correct approach
|
|
135
|
+
**Note:** Like React, mixed text and expressions need fragment wrapping:
|
|
139
136
|
|
|
140
|
-
|
|
137
|
+
- ❌ `"Hello {user.name}!"` — Won't work
|
|
138
|
+
- ✅ `"return <>Hello {user.name}!</>"` — Correct
|
|
141
139
|
|
|
142
|
-
|
|
140
|
+
## Supported Builtins
|
|
143
141
|
|
|
144
|
-
|
|
142
|
+
Only safe, read-only operations are exposed. No mutation, no DOM, no network — just the everyday tools needed for formatting and transforming data.
|
|
145
143
|
|
|
146
144
|
**Array (static):** `isArray`
|
|
147
145
|
|
|
148
146
|
**Array (prototype):** `map`, `filter`, `reduce`, `find`, `findIndex`, `some`, `every`, `slice`, `includes`, `indexOf`, `join`, `at`, `concat`, `flat`, `flatMap`, `length`
|
|
149
147
|
|
|
150
|
-
**String (
|
|
148
|
+
**String:** `String()` (conversion), plus prototype methods: `charAt`, `charCodeAt`, `concat`, `endsWith`, `includes`, `indexOf`, `lastIndexOf`, `slice`, `split`, `startsWith`, `substring`, `toLowerCase`, `toUpperCase`, `trim`, `trimStart`, `trimEnd`, `replace`, `repeat`, `padStart`, `padEnd`, `replaceAll`, `length`
|
|
151
149
|
|
|
152
150
|
**Number (static):** `isNaN`, `isFinite`, `parseInt`, `parseFloat`
|
|
153
151
|
|
|
@@ -157,47 +155,31 @@ JSXpression gives you access to common JavaScript methods for working with data
|
|
|
157
155
|
|
|
158
156
|
### Examples
|
|
159
157
|
|
|
160
|
-
```
|
|
158
|
+
```tsx
|
|
161
159
|
// Array operations
|
|
162
|
-
"{
|
|
163
|
-
"{
|
|
164
|
-
"{
|
|
165
|
-
"{data.arrays.flat()}"; // Flatten nested arrays
|
|
166
|
-
"{data.items.findIndex(item => item.id === 5)}"; // Find index
|
|
167
|
-
"{Array.isArray(data.value) ? data.value.length : 0}"; // Type check
|
|
160
|
+
"{items.map(item => item.toUpperCase())}";
|
|
161
|
+
"{numbers.filter(n => n > 10).length}";
|
|
162
|
+
"{Array.isArray(value) ? value.length : 0}";
|
|
168
163
|
|
|
169
164
|
// String operations
|
|
170
|
-
"{
|
|
171
|
-
"{
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
"{
|
|
175
|
-
|
|
176
|
-
// Math operations
|
|
177
|
-
"{Math.max(...data.scores)}";
|
|
178
|
-
"{Math.round(data.price * 1.2)}";
|
|
179
|
-
"{Math.sqrt(data.area)}"; // Square root
|
|
180
|
-
"{Math.pow(2, 8)}"; // 2^8 = 256
|
|
181
|
-
"{Math.sin(data.angle)}"; // Trigonometry
|
|
182
|
-
|
|
183
|
-
// Number operations
|
|
184
|
-
"{Number.isNaN(data.value)}";
|
|
185
|
-
"{Number.parseInt(data.stringNumber, 10)}";
|
|
186
|
-
"{data.temperature.toFixed(1)}°C"; // 23.5°C
|
|
187
|
-
"{data.price.toFixed(2)}"; // 19.99
|
|
188
|
-
"{data.airflow.toPrecision(4)} m³/h"; // Technical measurements
|
|
165
|
+
"{text.toUpperCase().trim()}";
|
|
166
|
+
"{String(numericValue)}";
|
|
167
|
+
|
|
168
|
+
// Math & Number
|
|
169
|
+
"{Math.round(price * 1.2)}";
|
|
170
|
+
"{temperature.toFixed(1)}°C";
|
|
189
171
|
```
|
|
190
172
|
|
|
191
173
|
## Schema Definition
|
|
192
174
|
|
|
193
|
-
Define what data and
|
|
175
|
+
Define what data and elements are available:
|
|
194
176
|
|
|
195
177
|
```typescript
|
|
196
178
|
import type { Schema } from "jsxpression";
|
|
197
179
|
|
|
198
180
|
const schema = {
|
|
199
181
|
//
|
|
200
|
-
// Data schema
|
|
182
|
+
// Data schema — each key becomes a top-level variable in expressions
|
|
201
183
|
//
|
|
202
184
|
data: {
|
|
203
185
|
user: {
|
|
@@ -208,16 +190,9 @@ const schema = {
|
|
|
208
190
|
age: { type: "number" },
|
|
209
191
|
isAdmin: { type: "boolean" },
|
|
210
192
|
role: { type: "string", enum: ["user", "admin", "guest"] },
|
|
211
|
-
address: {
|
|
212
|
-
type: "object",
|
|
213
|
-
shape: {
|
|
214
|
-
city: { type: "string" },
|
|
215
|
-
zip: { type: "number" },
|
|
216
|
-
},
|
|
217
|
-
},
|
|
218
193
|
tags: {
|
|
219
194
|
type: "array",
|
|
220
|
-
description: "User tags
|
|
195
|
+
description: "User tags",
|
|
221
196
|
shape: { type: "string" },
|
|
222
197
|
},
|
|
223
198
|
},
|
|
@@ -229,15 +204,10 @@ const schema = {
|
|
|
229
204
|
scores: { type: "array", shape: { type: "number" } },
|
|
230
205
|
},
|
|
231
206
|
},
|
|
232
|
-
|
|
233
|
-
onClick: {
|
|
234
|
-
type: "function",
|
|
235
|
-
description: "A safe callback (pure, no side effects)",
|
|
236
|
-
},
|
|
237
207
|
},
|
|
238
208
|
|
|
239
209
|
//
|
|
240
|
-
// Element schema
|
|
210
|
+
// Element schema — defines which JSX elements can be used
|
|
241
211
|
//
|
|
242
212
|
elements: {
|
|
243
213
|
Text: {
|
|
@@ -261,108 +231,105 @@ const schema = {
|
|
|
261
231
|
allowedChildren: [], // means <Image src="..." /> only
|
|
262
232
|
},
|
|
263
233
|
|
|
264
|
-
Button: {
|
|
265
|
-
description: "Button with event handler and label",
|
|
266
|
-
props: {
|
|
267
|
-
label: { type: "string", required: true },
|
|
268
|
-
onClick: { type: "function" },
|
|
269
|
-
variant: { type: "string", enum: ["primary", "secondary"] },
|
|
270
|
-
},
|
|
271
|
-
allowedChildren: ["Text"], // can only contain <Text>
|
|
272
|
-
},
|
|
273
|
-
|
|
274
234
|
Card: {
|
|
275
|
-
description: "Wrapper
|
|
235
|
+
description: "Wrapper for grouping content",
|
|
276
236
|
props: {
|
|
277
237
|
title: { type: "string", required: true },
|
|
278
238
|
highlighted: { type: "boolean" },
|
|
279
239
|
},
|
|
280
|
-
allowedChildren: ["Text", "Image"
|
|
240
|
+
allowedChildren: ["Text", "Image"], // allowed inside <Card>
|
|
281
241
|
},
|
|
282
242
|
},
|
|
283
|
-
} satisfies Schema;
|
|
284
243
|
|
|
285
|
-
//
|
|
286
|
-
//
|
|
287
|
-
//
|
|
288
|
-
|
|
244
|
+
//
|
|
245
|
+
// Functions — additional functions available in expressions
|
|
246
|
+
//
|
|
247
|
+
functions: {
|
|
248
|
+
formatDate: {
|
|
249
|
+
returnType: { type: "string" },
|
|
250
|
+
parameters: [{ name: "date", property: { type: "string" } }],
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
} satisfies Schema;
|
|
289
254
|
```
|
|
290
255
|
|
|
291
256
|
## API
|
|
292
257
|
|
|
293
258
|
### `render(source, schema, options?)`
|
|
294
259
|
|
|
295
|
-
|
|
260
|
+
Parse, validate, compile, and evaluate a JSX template in one call.
|
|
296
261
|
|
|
297
262
|
**Arguments:**
|
|
298
263
|
|
|
299
|
-
- `source: string`
|
|
300
|
-
- `schema: Schema`
|
|
301
|
-
- `options?: RenderOptions
|
|
302
|
-
- `data?: Record<string, any>`
|
|
303
|
-
- `components?: Record<string, Component>`
|
|
304
|
-
- `
|
|
305
|
-
- `
|
|
306
|
-
|
|
307
|
-
**Returns:** The rendered result (type depends on the provided createElement function)
|
|
264
|
+
- `source: string` — The JSX/TSX template
|
|
265
|
+
- `schema: Schema` — Schema defining available data and elements
|
|
266
|
+
- `options?: RenderOptions`:
|
|
267
|
+
- `data?: Record<string, any>` — Data variables available in the template
|
|
268
|
+
- `components?: Record<string, Component>` — Component implementations for schema elements
|
|
269
|
+
- `functions?: Record<string, Function>` — Additional function implementations
|
|
270
|
+
- `createElement?: Function` — Optional createElement (e.g., `React.createElement`)
|
|
271
|
+
- `minSeverity?: 1 | 2 | 3` — Minimum severity to abort (default: 3)
|
|
308
272
|
|
|
309
|
-
**
|
|
273
|
+
**Returns:** The rendered result
|
|
310
274
|
|
|
311
|
-
**
|
|
275
|
+
**Throws:** `AnalysisError` if validation fails, `ParseError` if syntax is invalid
|
|
312
276
|
|
|
313
277
|
```typescript
|
|
314
|
-
const result = render(
|
|
315
|
-
data: { title: "Hello",
|
|
316
|
-
components: { Card: MyCardComponent },
|
|
278
|
+
const result = render(template, schema, {
|
|
279
|
+
data: { title: "Hello", items: [1, 2, 3] },
|
|
280
|
+
components: { Card: MyCardComponent, Text: MyTextComponent },
|
|
317
281
|
createElement: React.createElement,
|
|
318
282
|
});
|
|
319
283
|
```
|
|
320
284
|
|
|
321
|
-
### `
|
|
285
|
+
### `compile(source, schema, options?)`
|
|
322
286
|
|
|
323
|
-
|
|
287
|
+
Parse, validate, and compile — but don't evaluate. Useful for pre-compiling templates.
|
|
324
288
|
|
|
325
|
-
|
|
289
|
+
```typescript
|
|
290
|
+
const compiled = compile(template, schema);
|
|
291
|
+
// Store `compiled` and evaluate later with different data
|
|
292
|
+
```
|
|
326
293
|
|
|
327
|
-
|
|
328
|
-
- `schema: Schema` - Schema to validate against
|
|
329
|
-
- `options?: ValidateOptions` - Optional validation settings:
|
|
330
|
-
- `minSeverity?: 1 | 2 | 3` - Minimum severity to count as failure. Default: 3
|
|
294
|
+
### `validate(source, schema, options?)`
|
|
331
295
|
|
|
332
|
-
|
|
296
|
+
Validate a template against a schema without rendering. Great for checking templates before persisting.
|
|
333
297
|
|
|
334
|
-
**
|
|
298
|
+
**Returns:** `{ ok: true }` or `{ ok: false, error: AnalysisError | ParseError }`
|
|
335
299
|
|
|
336
300
|
```typescript
|
|
337
|
-
const result = validate(
|
|
301
|
+
const result = validate(template, schema);
|
|
338
302
|
|
|
339
303
|
if (!result.ok) {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
// Analysis errors give you the full breakdown
|
|
304
|
+
// Individual issues with codes, messages, and source ranges
|
|
343
305
|
if (result.error instanceof AnalysisError) {
|
|
344
306
|
result.error.report.issues.forEach((issue) => {
|
|
345
|
-
console.error(
|
|
307
|
+
console.error(`[${issue.code}] ${issue.message} (line ${issue.range.start.line})`);
|
|
346
308
|
});
|
|
347
|
-
// Also available: .errors (severity 3), .warnings (severity 2), .infos (severity 1)
|
|
348
309
|
}
|
|
349
310
|
}
|
|
350
311
|
```
|
|
351
312
|
|
|
352
313
|
### `generateTypeScriptDefinitions(schema)`
|
|
353
314
|
|
|
354
|
-
|
|
315
|
+
Generate `.d.ts` content from a schema for editor autocomplete.
|
|
355
316
|
|
|
356
|
-
|
|
317
|
+
```typescript
|
|
318
|
+
const dts = generateTypeScriptDefinitions(schema);
|
|
319
|
+
// Feed to Monaco Editor, VS Code, or any TypeScript-aware editor
|
|
320
|
+
monaco.languages.typescript.javascriptDefaults.addExtraLib(dts, "jsxpression-types.d.ts");
|
|
321
|
+
```
|
|
357
322
|
|
|
358
|
-
|
|
323
|
+
## Security Model
|
|
359
324
|
|
|
360
|
-
|
|
325
|
+
Templates run in a locked-down sandbox. The static analyzer rejects anything potentially dangerous before code is ever executed:
|
|
361
326
|
|
|
362
|
-
**
|
|
327
|
+
- **No globals** — Only schema-defined data, allowed builtins, and local declarations are accessible
|
|
328
|
+
- **No mutation** — `let`, `var`, assignment, `delete`, `++/--` are all blocked
|
|
329
|
+
- **No escape hatches** — `eval`, `Function`, `import`, `require`, `new`, `this`, `super` are blocked
|
|
330
|
+
- **No async** — `await`, `yield`, generators are blocked
|
|
331
|
+
- **No side effects** — `try/catch`, `throw`, `debugger`, `with` are blocked
|
|
332
|
+
- **Method allowlist** — Only explicitly safe prototype methods are callable
|
|
333
|
+
- **Element validation** — Every JSX tag, attribute, and child is checked against the schema
|
|
363
334
|
|
|
364
|
-
|
|
365
|
-
const definitions = generateTypeScriptDefinitions(schema);
|
|
366
|
-
// Add to Monaco Editor:
|
|
367
|
-
monaco.languages.typescript.javascriptDefaults.addExtraLib(definitions, "jsxpression-types.d.ts");
|
|
368
|
-
```
|
|
335
|
+
Local `const` bindings and `function` declarations are allowed for composition, but they can't break out of the sandbox.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Range } from "./utils.js";
|
|
2
|
-
import { ValidationContextSnapshot } from "./validation-context.js";
|
|
1
|
+
import type { Range } from "./utils.js";
|
|
2
|
+
import type { ValidationContextSnapshot } from "./validation-context.js";
|
|
3
3
|
type IssueSeverity = 1 | 2 | 3;
|
|
4
4
|
interface Issue {
|
|
5
5
|
code: IssueCode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-report.d.ts","sourceRoot":"","sources":["../../src/analyze/analysis-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"analysis-report.d.ts","sourceRoot":"","sources":["../../src/analyze/analysis-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE/B,UAAU,KAAK;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,yBAAyB,CAAC;CACrC;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,QAAA,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAiJ9C,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAExD,qBAAa,cAAc;;IAGzB,IAAI,MAAM,IAAI,KAAK,EAAE,CAEpB;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CAEpB;IAED,IAAI,QAAQ,IAAI,KAAK,EAAE,CAEtB;IAED,IAAI,KAAK,IAAI,KAAK,EAAE,CAEnB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,QAAQ,CACN,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,yBAAyB,EACnC,WAAW,GAAE,MAAM,EAAO,GACzB,IAAI;IAaP,SAAS,CAAC,WAAW,GAAE,aAAiB,GAAG,OAAO;IAIlD,KAAK,CAAC,GAAG,eAAe,EAAE,cAAc,EAAE,GAAG,IAAI;CAQlD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-report.js","sourceRoot":"","sources":["../../src/analyze/analysis-report.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analysis-report.js","sourceRoot":"","sources":["../../src/analyze/analysis-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-access.d.ts","sourceRoot":"","sources":["../../../src/analyze/data/data-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"data-access.d.ts","sourceRoot":"","sources":["../../../src/analyze/data/data-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,cAAc,CAiIpH;AA8ID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI,CAEtF"}
|