jsxpression 0.1.28 → 0.1.31

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.
Files changed (141) hide show
  1. package/README.md +155 -188
  2. package/lib/analyze/analysis-report.d.ts +2 -2
  3. package/lib/analyze/analysis-report.d.ts.map +1 -1
  4. package/lib/analyze/analysis-report.js +4 -0
  5. package/lib/analyze/analysis-report.js.map +1 -1
  6. package/lib/analyze/data/data-access.d.ts.map +1 -1
  7. package/lib/analyze/data/data-access.js +45 -82
  8. package/lib/analyze/data/data-access.js.map +1 -1
  9. package/lib/analyze/data/method-calls.d.ts.map +1 -1
  10. package/lib/analyze/data/method-calls.js +4 -3
  11. package/lib/analyze/data/method-calls.js.map +1 -1
  12. package/lib/analyze/data/utils.d.ts +2 -3
  13. package/lib/analyze/data/utils.d.ts.map +1 -1
  14. package/lib/analyze/data/utils.js +10 -36
  15. package/lib/analyze/data/utils.js.map +1 -1
  16. package/lib/analyze/jsx/element-attributes.d.ts +1 -1
  17. package/lib/analyze/jsx/element-attributes.d.ts.map +1 -1
  18. package/lib/analyze/jsx/element-attributes.js +13 -3
  19. package/lib/analyze/jsx/element-attributes.js.map +1 -1
  20. package/lib/analyze/jsx/element-children.d.ts +1 -1
  21. package/lib/analyze/jsx/element-children.d.ts.map +1 -1
  22. package/lib/analyze/jsx/element-children.js +16 -5
  23. package/lib/analyze/jsx/element-children.js.map +1 -1
  24. package/lib/analyze/jsx/element-tags.d.ts +1 -1
  25. package/lib/analyze/jsx/element-tags.d.ts.map +1 -1
  26. package/lib/analyze/jsx/element-tags.js +12 -2
  27. package/lib/analyze/jsx/element-tags.js.map +1 -1
  28. package/lib/analyze/security/analyze.d.ts.map +1 -1
  29. package/lib/analyze/security/analyze.js +2 -4
  30. package/lib/analyze/security/analyze.js.map +1 -1
  31. package/lib/analyze/security/call-expressions.d.ts +2 -2
  32. package/lib/analyze/security/call-expressions.d.ts.map +1 -1
  33. package/lib/analyze/security/call-expressions.js +21 -5
  34. package/lib/analyze/security/call-expressions.js.map +1 -1
  35. package/lib/analyze/security/declarations.d.ts +1 -1
  36. package/lib/analyze/security/declarations.d.ts.map +1 -1
  37. package/lib/analyze/security/declarations.js +22 -2
  38. package/lib/analyze/security/declarations.js.map +1 -1
  39. package/lib/analyze/security/expressions.d.ts.map +1 -1
  40. package/lib/analyze/security/expressions.js +10 -2
  41. package/lib/analyze/security/expressions.js.map +1 -1
  42. package/lib/analyze/security/identifiers.d.ts +2 -2
  43. package/lib/analyze/security/identifiers.d.ts.map +1 -1
  44. package/lib/analyze/security/identifiers.js +159 -19
  45. package/lib/analyze/security/identifiers.js.map +1 -1
  46. package/lib/builtins.d.ts.map +1 -1
  47. package/lib/builtins.js +5 -0
  48. package/lib/builtins.js.map +1 -1
  49. package/lib/codegen/builtins/builtin-types.d.ts.map +1 -1
  50. package/lib/codegen/builtins/builtin-types.js +7 -1
  51. package/lib/codegen/builtins/builtin-types.js.map +1 -1
  52. package/lib/compile/compile.d.ts.map +1 -1
  53. package/lib/compile/compile.js +131 -61
  54. package/lib/compile/compile.js.map +1 -1
  55. package/lib/evaluate/evaluate.d.ts +3 -3
  56. package/lib/evaluate/evaluate.d.ts.map +1 -1
  57. package/lib/evaluate/evaluate.js +28 -7
  58. package/lib/evaluate/evaluate.js.map +1 -1
  59. package/lib/jsx.d.ts +2 -19
  60. package/lib/jsx.d.ts.map +1 -1
  61. package/lib/jsx.js +0 -6
  62. package/lib/jsx.js.map +1 -1
  63. package/lib/parse/parse.d.ts.map +1 -1
  64. package/lib/parse/parse.js +4 -3
  65. package/lib/parse/parse.js.map +1 -1
  66. package/lib/render.d.ts +4 -4
  67. package/lib/render.d.ts.map +1 -1
  68. package/lib/render.js +7 -9
  69. package/lib/render.js.map +1 -1
  70. package/lib/schema.d.ts +2 -7
  71. package/lib/schema.d.ts.map +1 -1
  72. package/lib/schema.js +0 -43
  73. package/lib/schema.js.map +1 -1
  74. package/lib/traverse.d.ts +4 -4
  75. package/lib/traverse.d.ts.map +1 -1
  76. package/lib/traverse.js +118 -40
  77. package/lib/traverse.js.map +1 -1
  78. package/lib/validate.d.ts +1 -1
  79. package/lib/validate.js +1 -1
  80. package/package.json +4 -3
  81. package/src/analyze/analysis-report.ts +6 -2
  82. package/src/analyze/analyze.test.ts +108 -69
  83. package/src/analyze/data/data-access.ts +45 -90
  84. package/src/analyze/data/method-calls.ts +4 -3
  85. package/src/analyze/data/utils.ts +11 -40
  86. package/src/analyze/jsx/element-attributes.ts +24 -9
  87. package/src/analyze/jsx/element-children.ts +20 -6
  88. package/src/analyze/jsx/element-tags.ts +15 -3
  89. package/src/analyze/security/analyze.ts +1 -3
  90. package/src/analyze/security/call-expressions.ts +37 -17
  91. package/src/analyze/security/declarations.ts +35 -9
  92. package/src/analyze/security/expressions.ts +17 -3
  93. package/src/analyze/security/identifiers.ts +172 -28
  94. package/src/builtins.ts +6 -0
  95. package/src/codegen/builtins/builtin-types.ts +7 -1
  96. package/src/codegen/generate-typescript-definitions.test.ts +16 -23
  97. package/src/compile/compile.test.ts +153 -30
  98. package/src/compile/compile.ts +163 -73
  99. package/src/evaluate/evaluate.test.ts +276 -14
  100. package/src/evaluate/evaluate.ts +34 -10
  101. package/src/jsx.ts +2 -31
  102. package/src/parse/parse.test.ts +4 -4
  103. package/src/parse/parse.ts +4 -3
  104. package/src/render.test.ts +476 -27
  105. package/src/render.ts +7 -14
  106. package/src/schema.ts +1 -55
  107. package/src/traverse.ts +135 -49
  108. package/src/validate.ts +1 -1
  109. package/LICENSE +0 -21
  110. package/lib/analyze/analyze.test.d.ts +0 -2
  111. package/lib/analyze/analyze.test.d.ts.map +0 -1
  112. package/lib/analyze/analyze.test.js +0 -763
  113. package/lib/analyze/analyze.test.js.map +0 -1
  114. package/lib/analyze/security/member-access.d.ts +0 -6
  115. package/lib/codegen/generate-typescript-definitions.test.d.ts +0 -2
  116. package/lib/codegen/generate-typescript-definitions.test.d.ts.map +0 -1
  117. package/lib/codegen/generate-typescript-definitions.test.js +0 -649
  118. package/lib/codegen/generate-typescript-definitions.test.js.map +0 -1
  119. package/lib/compile/compile.test.d.ts +0 -2
  120. package/lib/compile/compile.test.d.ts.map +0 -1
  121. package/lib/compile/compile.test.js +0 -146
  122. package/lib/compile/compile.test.js.map +0 -1
  123. package/lib/evaluate/evaluate.test.d.ts +0 -2
  124. package/lib/evaluate/evaluate.test.d.ts.map +0 -1
  125. package/lib/evaluate/evaluate.test.js +0 -260
  126. package/lib/evaluate/evaluate.test.js.map +0 -1
  127. package/lib/parse/parse.test.d.ts +0 -2
  128. package/lib/parse/parse.test.d.ts.map +0 -1
  129. package/lib/parse/parse.test.js +0 -80
  130. package/lib/parse/parse.test.js.map +0 -1
  131. package/lib/render.test.d.ts +0 -2
  132. package/lib/render.test.d.ts.map +0 -1
  133. package/lib/render.test.js +0 -301
  134. package/lib/render.test.js.map +0 -1
  135. package/lib/traverse.test.d.ts +0 -2
  136. package/lib/traverse.test.d.ts.map +0 -1
  137. package/lib/traverse.test.js +0 -84
  138. package/lib/traverse.test.js.map +0 -1
  139. package/lib/types.d.ts +0 -12
  140. package/src/analyze/security/member-access.ts +0 -35
  141. package/src/types.ts +0 -17
package/README.md CHANGED
@@ -1,23 +1,26 @@
1
1
  # JSXpression
2
2
 
3
- **Safe JSX expressions with schema validation**
3
+ **Sandboxed JSX components with full TypeScript support**
4
4
 
5
- JSXpression lets you render dynamic JSX templates in a controlled, type-safe sandbox. Perfect for user-configurable components, low-code environments, and other places where you want flexibility without giving up control.
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 your JSX into an AST, validates it against a schema, compiles it to safe JavaScript, and runs it in isolation with only your data and components available.
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 write JSX safely. You define a schema describing which components and data are available, and JSXpression takes care of the rest: parsing, validation, and execution. No risk, no globals, no surprises.
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
- **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.
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** Static analysis blocks everything unsafe. No `eval`, no `window`, no `document`, only pure, allowed operations
18
- - 📋 **Schema-driven** Explicitly define what data and components exist. Anything not in the schema simply doesn't exist
19
- - ⚡ **Fast** Parse and validate once, then run freely. No runtime compilation required
20
- - 🎯 **Familiar** It's just JSX. The same syntax developers already know, now with guardrails
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 {data.user.name}!</Text>", schema, {
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
- ## React Example
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
- import { createElement } from "react";
60
- import { render } from "jsxpression";
59
+ return <Text size={16}>Hello {user.name}!</Text>;
60
+ ```
61
61
 
62
- function DynamicComponent({ template, userData }) {
63
- const schema = {
64
- data: {
65
- user: {
66
- type: "object",
67
- shape: {
68
- name: {
69
- type: "string",
70
- },
71
- role: {
72
- type: "string",
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
- return <div className="dynamic-content">{result}</div>;
75
+ ### With reusable functions
76
+
77
+ ```tsx
78
+ interface BadgeProps {
79
+ label: string;
80
+ color: string;
110
81
  }
111
82
 
112
- // Usage
113
- <DynamicComponent
114
- template="<Card title={data.user.role}><Text className='username'>{data.user.name}</Text></Card>"
115
- userData={{ name: "Alice", role: "Developer" }}
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
- ## Expression Types
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
- JSXpression supports different expression patterns:
121
+ ## Expression Types
122
122
 
123
123
  ```typescript
124
- // JSX Elements
125
- "<Text>Hello {data.user.name}</Text>";
124
+ // JSX elements
125
+ "return <Text>Hello {user.name}</Text>";
126
126
 
127
- // Fragments (for mixed content)
128
- "<>Hello {data.user.name}, you have {data.items.length} items!</>";
127
+ // Fragments
128
+ "return <>Hello {user.name}, you have {items.length} items!</>";
129
129
 
130
- // Bare expressions (single values)
131
- "{data.user.name}";
132
- "{data.items.length * 2}";
130
+ // Bare expressions (single values — no return needed)
131
+ "{user.name}";
132
+ "{items.length * 2}";
133
133
  ```
134
134
 
135
- **Important:** Like React components, mixed content needs fragment wrapping:
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
- ## Supported Methods
137
+ - `"Hello {user.name}!"` — Won't work
138
+ - ✅ `"return <>Hello {user.name}!</>"` — Correct
141
139
 
142
- JSXpression gives you access to common JavaScript methods for working with data - but only the safe ones. No methods that modify arrays in place, no DOM access, no network calls. Just the everyday operations you need for formatting and transforming data in templates.
140
+ ## Supported Builtins
143
141
 
144
- **Why?** When users write templates, they should be able to format dates, filter lists, and do basic math - but not delete files or make API calls. By exposing only pure, read-only methods, templates stay predictable and safe while covering 99% of real-world needs.
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 (prototype):** `charAt`, `charCodeAt`, `concat`, `endsWith`, `includes`, `indexOf`, `lastIndexOf`, `slice`, `split`, `startsWith`, `substring`, `toLowerCase`, `toUpperCase`, `trim`, `trimStart`, `trimEnd`, `replace`, `repeat`, `padStart`, `padEnd`, `replaceAll`, `length`
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
- ```typescript
158
+ ```tsx
161
159
  // Array operations
162
- "{data.items.map(item => item.toUpperCase())}";
163
- "{data.numbers.filter(n => n > 10).length}";
164
- "{data.items.at(-1)}"; // Last item
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
- "{data.text.toUpperCase().trim()}";
171
- "{data.name.slice(0, 3)}";
172
- "{data.label.padStart(10, '0')}"; // "00000label"
173
- "{data.text.repeat(3)}"; // Repeat string
174
- "{data.str.replaceAll('old', 'new')}"; // Replace all occurrences
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 components are available:
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 everything under `data.*` is available in expressions
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 (array of strings)",
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 defines which JSX elements can be used
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 element for grouping content",
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", "Button"], // allowed inside <Card>...</Card>
240
+ allowedChildren: ["Text", "Image"], // allowed inside <Card>
281
241
  },
282
242
  },
283
- } satisfies Schema;
284
243
 
285
- // <Text size={16} color="blue">{data.user.name}</Text>
286
- // <Image src={data.user.avatar} />
287
- // <Button label="Click" onClick={data.onClick}><Text>OK</Text></Button>
288
- // <Card title="Profile"><Text>{data.user.role}</Text><Button label="Edit" /></Card>
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
- Renders a JSX expression with data and components.
260
+ Parse, validate, compile, and evaluate a JSX template in one call.
296
261
 
297
262
  **Arguments:**
298
263
 
299
- - `source: string` - The JSX expression to render (e.g., `"<Text>{data.name}</Text>"`)
300
- - `schema: Schema` - Schema defining available data properties and components
301
- - `options?: RenderOptions` - Optional rendering settings:
302
- - `data?: Record<string, any>` - The actual data available as `data.*` in expressions
303
- - `components?: Record<string, Component>` - Component implementations
304
- - `createElement?: Function` - Optional createElement function (e.g., React's `createElement`)
305
- - `minSeverity?: 1 | 2 | 3` - Minimum severity to abort (1=info, 2=warning, 3=error). Default: 3
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
- **Throws:** `AnalysisError` if validation fails
273
+ **Returns:** The rendered result
310
274
 
311
- **Example:**
275
+ **Throws:** `AnalysisError` if validation fails, `ParseError` if syntax is invalid
312
276
 
313
277
  ```typescript
314
- const result = render("<Card title={data.title}>{data.content}</Card>", schema, {
315
- data: { title: "Hello", content: "World" },
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
- ### `validate(source, schema, options?)`
285
+ ### `compile(source, schema, options?)`
322
286
 
323
- Validatesa JSX expression against a schema without rendering. Great for checking templates before persisting or execution.
287
+ Parse, validate, and compile but don't evaluate. Useful for pre-compiling templates.
324
288
 
325
- **Arguments:**
289
+ ```typescript
290
+ const compiled = compile(template, schema);
291
+ // Store `compiled` and evaluate later with different data
292
+ ```
326
293
 
327
- - `source: string` - The JSX expression to validate
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
- **Returns:** `ValidateResult` - Either `{ ok: true }` or `{ ok: false, error: AnalysisError | ParseError }`
296
+ Validate a template against a schema without rendering. Great for checking templates before persisting.
333
297
 
334
- **Example:**
298
+ **Returns:** `{ ok: true }` or `{ ok: false, error: AnalysisError | ParseError }`
335
299
 
336
300
  ```typescript
337
- const result = validate("{data.user.invalidProperty}", schema);
301
+ const result = validate(template, schema);
338
302
 
339
303
  if (!result.ok) {
340
- console.error("Validation failed:", result.error.message);
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(`${issue.message} at line ${issue.range.start.line}`);
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
- Generates TypeScript type definitions from a schema. Use this to enable autocomplete and type checking in code editors like Monaco Editor or VS Code.
315
+ Generate `.d.ts` content from a schema for editor autocomplete.
355
316
 
356
- **Arguments:**
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
- - `schema: Schema` - The schema to generate types from
323
+ ## Security Model
359
324
 
360
- **Returns:** `string` - Complete TypeScript `.d.ts` file content
325
+ Templates run in a locked-down sandbox. The static analyzer rejects anything potentially dangerous before code is ever executed:
361
326
 
362
- **Example:**
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
- ```typescript
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;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,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,CA6I9C,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
+ {"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"}
@@ -139,6 +139,10 @@ const ISSUES_DEFINITIONS = {
139
139
  severity: 1,
140
140
  custom: true,
141
141
  },
142
+ RETURN_REQUIRED: {
143
+ severity: 3,
144
+ custom: true,
145
+ },
142
146
  };
143
147
  export class AnalysisReport {
144
148
  #issues = [];
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-report.js","sourceRoot":"","sources":["../../src/analyze/analysis-report.ts"],"names":[],"mappings":"AAoBA,MAAM,kBAAkB,GAAoC;IAC1D,oBAAoB,EAAE;QACpB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,sBAAsB,EAAE;QACtB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,kBAAkB,EAAE;QAClB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,kBAAkB,EAAE;QAClB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,sBAAsB,EAAE;QACtB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,kBAAkB,EAAE;QAClB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,kBAAkB,EAAE;QAClB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,gBAAgB,EAAE;QAChB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,qCAAqC,EAAE;QACrC,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,oBAAoB,EAAE;QACpB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,gBAAgB,EAAE;QAChB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,oBAAoB,EAAE;QACpB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,2BAA2B,EAAE;QAC3B,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,6BAA6B,EAAE;QAC7B,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,uBAAuB,EAAE;QACvB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,0BAA0B,EAAE;QAC1B,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,kBAAkB,EAAE;QAClB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,mBAAmB,EAAE;QACnB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,wBAAwB,EAAE;QACxB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,0BAA0B,EAAE;QAC1B,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,qBAAqB,EAAE;QACrB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,qBAAqB,EAAE;QACrB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;IACD,mBAAmB,EAAE;QACnB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,uBAAuB,EAAE;QACvB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,uBAAuB,EAAE;QACvB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,KAAK;KACd;IACD,0BAA0B,EAAE;QAC1B,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,IAAI;KACb;CACO,CAAC;AAIX,MAAM,OAAO,cAAc;IAChB,OAAO,GAAY,EAAE,CAAC;IAE/B,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ,CACN,IAAe,EACf,OAAe,EACf,KAAY,EACZ,QAAmC,EACnC,cAAwB,EAAE;QAE1B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,IAAI;YACJ,OAAO;YACP,KAAK;YACL,QAAQ;YACR,WAAW;YACX,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,cAA6B,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,GAAG,eAAiC;QACxC,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
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,CA+HpH;AAmND,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI,CAEtF"}
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"}