jsxpression 0.1.11 → 0.1.13
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/lib/analyze/analysis-error.js +1 -5
- package/lib/analyze/analysis-error.js.map +1 -1
- package/lib/analyze/analysis-report.js +1 -5
- package/lib/analyze/analysis-report.js.map +1 -1
- package/lib/analyze/analyze.js +6 -9
- package/lib/analyze/analyze.js.map +1 -1
- package/lib/analyze/analyze.test.js +312 -314
- package/lib/analyze/analyze.test.js.map +1 -1
- package/lib/analyze/data/analyze.js +7 -10
- package/lib/analyze/data/analyze.js.map +1 -1
- package/lib/analyze/data/data-access.js +20 -24
- package/lib/analyze/data/data-access.js.map +1 -1
- package/lib/analyze/data/index.js +1 -5
- package/lib/analyze/data/index.js.map +1 -1
- package/lib/analyze/data/method-calls.js +17 -20
- package/lib/analyze/data/method-calls.js.map +1 -1
- package/lib/analyze/data/utils.js +22 -29
- package/lib/analyze/data/utils.js.map +1 -1
- package/lib/analyze/index.js +3 -9
- package/lib/analyze/index.js.map +1 -1
- package/lib/analyze/jsx/analyze.js +8 -11
- package/lib/analyze/jsx/analyze.js.map +1 -1
- package/lib/analyze/jsx/element-attributes.js +21 -24
- package/lib/analyze/jsx/element-attributes.js.map +1 -1
- package/lib/analyze/jsx/element-children.js +20 -23
- package/lib/analyze/jsx/element-children.js.map +1 -1
- package/lib/analyze/jsx/element-tags.js +12 -15
- package/lib/analyze/jsx/element-tags.js.map +1 -1
- package/lib/analyze/jsx/index.js +1 -5
- package/lib/analyze/jsx/index.js.map +1 -1
- package/lib/analyze/security/analyze.js +10 -13
- package/lib/analyze/security/analyze.js.map +1 -1
- package/lib/analyze/security/call-expressions.js +8 -11
- package/lib/analyze/security/call-expressions.js.map +1 -1
- package/lib/analyze/security/declarations.js +12 -15
- package/lib/analyze/security/declarations.js.map +1 -1
- package/lib/analyze/security/expressions.js +14 -17
- package/lib/analyze/security/expressions.js.map +1 -1
- package/lib/analyze/security/identifiers.js +10 -13
- package/lib/analyze/security/identifiers.js.map +1 -1
- package/lib/analyze/security/index.js +1 -5
- package/lib/analyze/security/index.js.map +1 -1
- package/lib/analyze/security/member-access.js +7 -10
- package/lib/analyze/security/member-access.js.map +1 -1
- package/lib/analyze/utils.js +4 -10
- package/lib/analyze/utils.js.map +1 -1
- package/lib/analyze/validation-context.js +1 -5
- package/lib/analyze/validation-context.js.map +1 -1
- package/lib/builtins.js +9 -20
- package/lib/builtins.js.map +1 -1
- package/lib/codegen/builtins/builtin-types.js +3 -6
- package/lib/codegen/builtins/builtin-types.js.map +1 -1
- package/lib/codegen/builtins/index.js +1 -5
- package/lib/codegen/builtins/index.js.map +1 -1
- package/lib/codegen/generate-typescript-definitions.js +4 -7
- package/lib/codegen/generate-typescript-definitions.js.map +1 -1
- package/lib/codegen/generate-typescript-definitions.test.js +190 -192
- package/lib/codegen/generate-typescript-definitions.test.js.map +1 -1
- package/lib/codegen/index.js +1 -5
- package/lib/codegen/index.js.map +1 -1
- package/lib/codegen/schema/component-types.js +3 -6
- package/lib/codegen/schema/component-types.js.map +1 -1
- package/lib/codegen/schema/data-types.js +3 -6
- package/lib/codegen/schema/data-types.js.map +1 -1
- package/lib/codegen/schema/index.js +2 -7
- package/lib/codegen/schema/index.js.map +1 -1
- package/lib/codegen/schema/utils.js +3 -8
- package/lib/codegen/schema/utils.js.map +1 -1
- package/lib/compile/compilation-error.js +1 -5
- package/lib/compile/compilation-error.js.map +1 -1
- package/lib/compile/compile.js +18 -21
- package/lib/compile/compile.js.map +1 -1
- package/lib/compile/compile.test.js +110 -112
- package/lib/compile/compile.test.js.map +1 -1
- package/lib/compile/index.js +2 -7
- package/lib/compile/index.js.map +1 -1
- package/lib/evaluate/evaluate.js +8 -11
- package/lib/evaluate/evaluate.js.map +1 -1
- package/lib/evaluate/evaluate.test.js +56 -58
- package/lib/evaluate/evaluate.test.js.map +1 -1
- package/lib/evaluate/evaluation-error.js +1 -5
- package/lib/evaluate/evaluation-error.js.map +1 -1
- package/lib/evaluate/index.js +2 -7
- package/lib/evaluate/index.js.map +1 -1
- package/lib/index.js +6 -15
- package/lib/index.js.map +1 -1
- package/lib/jsx.js +10 -22
- package/lib/jsx.js.map +1 -1
- package/lib/parse/index.js +2 -7
- package/lib/parse/index.js.map +1 -1
- package/lib/parse/parse-error.js +1 -5
- package/lib/parse/parse-error.js.map +1 -1
- package/lib/parse/parse.js +7 -13
- package/lib/parse/parse.js.map +1 -1
- package/lib/parse/parse.test.js +56 -58
- package/lib/parse/parse.test.js.map +1 -1
- package/lib/render.js +9 -12
- package/lib/render.js.map +1 -1
- package/lib/render.test.js +62 -64
- package/lib/render.test.js.map +1 -1
- package/lib/schema.js +18 -38
- package/lib/schema.js.map +1 -1
- package/lib/traverse.js +8 -11
- package/lib/traverse.js.map +1 -1
- package/lib/traverse.test.js +34 -36
- package/lib/traverse.test.js.map +1 -1
- package/lib/types.js +1 -2
- package/lib/validate.js +7 -10
- package/lib/validate.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,45 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
(
|
|
6
|
-
(0, vitest_1.describe)("basic structure", () => {
|
|
7
|
-
(0, vitest_1.it)("should generate valid TypeScript definitions for empty schema", () => {
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateTypeScriptDefinitions } from "./generate-typescript-definitions.js";
|
|
3
|
+
describe("generateTypeScriptDefinitions", () => {
|
|
4
|
+
describe("basic structure", () => {
|
|
5
|
+
it("should generate valid TypeScript definitions for empty schema", () => {
|
|
8
6
|
const schema = {
|
|
9
7
|
data: {},
|
|
10
8
|
elements: {},
|
|
11
9
|
};
|
|
12
|
-
const result =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
11
|
+
expect(result).toContain("declare global");
|
|
12
|
+
expect(result).toContain("namespace JSX");
|
|
13
|
+
expect(result).toContain("export {};");
|
|
16
14
|
});
|
|
17
|
-
|
|
15
|
+
it("should include builtin types declarations", () => {
|
|
18
16
|
const schema = {
|
|
19
17
|
data: {},
|
|
20
18
|
elements: {},
|
|
21
19
|
};
|
|
22
|
-
const result =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
20
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
21
|
+
expect(result).toContain("namespace JSX");
|
|
22
|
+
expect(result).toContain("type Element");
|
|
23
|
+
expect(result).toContain("type Node");
|
|
24
|
+
expect(result).toContain("interface IntrinsicElements");
|
|
25
|
+
expect(result).toContain("Math");
|
|
26
|
+
expect(result).toContain("String");
|
|
27
|
+
expect(result).toContain("Array");
|
|
30
28
|
});
|
|
31
|
-
|
|
29
|
+
it("should generate variadic parameters with array types", () => {
|
|
32
30
|
const schema = {
|
|
33
31
|
data: {},
|
|
34
32
|
elements: {},
|
|
35
33
|
};
|
|
36
|
-
const result =
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
35
|
+
expect(result).toContain("max(...values: number[]): number");
|
|
36
|
+
expect(result).toContain("min(...values: number[]): number");
|
|
39
37
|
});
|
|
40
38
|
});
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
describe("element types generation", () => {
|
|
40
|
+
it("should generate element with string prop", () => {
|
|
43
41
|
const schema = {
|
|
44
42
|
data: {},
|
|
45
43
|
elements: {
|
|
@@ -50,12 +48,12 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
50
48
|
},
|
|
51
49
|
},
|
|
52
50
|
};
|
|
53
|
-
const result =
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
52
|
+
expect(result).toContain("interface ButtonProps");
|
|
53
|
+
expect(result).toContain("label: string");
|
|
54
|
+
expect(result).toContain("const Button: (props: ButtonProps) => JSX.Element");
|
|
57
55
|
});
|
|
58
|
-
|
|
56
|
+
it("should generate element with multiple prop types", () => {
|
|
59
57
|
const schema = {
|
|
60
58
|
data: {},
|
|
61
59
|
elements: {
|
|
@@ -69,14 +67,14 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
69
67
|
},
|
|
70
68
|
},
|
|
71
69
|
};
|
|
72
|
-
const result =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
71
|
+
expect(result).toContain("interface InputProps");
|
|
72
|
+
expect(result).toContain("name: string");
|
|
73
|
+
expect(result).toContain("value?: string");
|
|
74
|
+
expect(result).toContain("maxLength?: number");
|
|
75
|
+
expect(result).toContain("disabled?: boolean");
|
|
78
76
|
});
|
|
79
|
-
|
|
77
|
+
it("should generate element with enum prop", () => {
|
|
80
78
|
const schema = {
|
|
81
79
|
data: {},
|
|
82
80
|
elements: {
|
|
@@ -87,11 +85,11 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
87
85
|
},
|
|
88
86
|
},
|
|
89
87
|
};
|
|
90
|
-
const result =
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
89
|
+
expect(result).toContain("interface ButtonProps");
|
|
90
|
+
expect(result).toContain('size?: "sm" | "md" | "lg"');
|
|
93
91
|
});
|
|
94
|
-
|
|
92
|
+
it("should generate element with object prop", () => {
|
|
95
93
|
const schema = {
|
|
96
94
|
data: {},
|
|
97
95
|
elements: {
|
|
@@ -108,13 +106,13 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
108
106
|
},
|
|
109
107
|
},
|
|
110
108
|
};
|
|
111
|
-
const result =
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
109
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
110
|
+
expect(result).toContain("interface CardProps");
|
|
111
|
+
expect(result).toContain("style?:");
|
|
112
|
+
expect(result).toContain("color: string");
|
|
113
|
+
expect(result).toContain("backgroundColor: string");
|
|
116
114
|
});
|
|
117
|
-
|
|
115
|
+
it("should generate element with array prop", () => {
|
|
118
116
|
const schema = {
|
|
119
117
|
data: {},
|
|
120
118
|
elements: {
|
|
@@ -128,11 +126,11 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
128
126
|
},
|
|
129
127
|
},
|
|
130
128
|
};
|
|
131
|
-
const result =
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
130
|
+
expect(result).toContain("interface ListProps");
|
|
131
|
+
expect(result).toContain("items?: string[]");
|
|
134
132
|
});
|
|
135
|
-
|
|
133
|
+
it("should generate element with function prop", () => {
|
|
136
134
|
const schema = {
|
|
137
135
|
data: {},
|
|
138
136
|
elements: {
|
|
@@ -143,11 +141,11 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
143
141
|
},
|
|
144
142
|
},
|
|
145
143
|
};
|
|
146
|
-
const result =
|
|
147
|
-
|
|
148
|
-
|
|
144
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
145
|
+
expect(result).toContain("interface ButtonProps");
|
|
146
|
+
expect(result).toContain("onClick?: (...args: any[]) => any");
|
|
149
147
|
});
|
|
150
|
-
|
|
148
|
+
it("should include children prop by default", () => {
|
|
151
149
|
const schema = {
|
|
152
150
|
data: {},
|
|
153
151
|
elements: {
|
|
@@ -156,11 +154,11 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
156
154
|
},
|
|
157
155
|
},
|
|
158
156
|
};
|
|
159
|
-
const result =
|
|
160
|
-
|
|
161
|
-
|
|
157
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
158
|
+
expect(result).toContain("interface ContainerProps");
|
|
159
|
+
expect(result).toContain("children?: JSX.Node");
|
|
162
160
|
});
|
|
163
|
-
|
|
161
|
+
it("should exclude children prop when content is false", () => {
|
|
164
162
|
const schema = {
|
|
165
163
|
data: {},
|
|
166
164
|
elements: {
|
|
@@ -170,11 +168,11 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
170
168
|
},
|
|
171
169
|
},
|
|
172
170
|
};
|
|
173
|
-
const result =
|
|
174
|
-
|
|
175
|
-
|
|
171
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
172
|
+
expect(result).toContain("interface InputProps");
|
|
173
|
+
expect(result).not.toContain("children");
|
|
176
174
|
});
|
|
177
|
-
|
|
175
|
+
it("should include element description as JSDoc", () => {
|
|
178
176
|
const schema = {
|
|
179
177
|
data: {},
|
|
180
178
|
elements: {
|
|
@@ -186,11 +184,11 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
186
184
|
},
|
|
187
185
|
},
|
|
188
186
|
};
|
|
189
|
-
const result =
|
|
190
|
-
|
|
191
|
-
|
|
187
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
188
|
+
expect(result).toContain("A clickable button element");
|
|
189
|
+
expect(result).toContain("The button text");
|
|
192
190
|
});
|
|
193
|
-
|
|
191
|
+
it("should generate multiple components", () => {
|
|
194
192
|
const schema = {
|
|
195
193
|
data: {},
|
|
196
194
|
elements: {
|
|
@@ -205,28 +203,28 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
205
203
|
},
|
|
206
204
|
},
|
|
207
205
|
};
|
|
208
|
-
const result =
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
206
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
207
|
+
expect(result).toContain("interface ButtonProps");
|
|
208
|
+
expect(result).toContain("interface InputProps");
|
|
209
|
+
expect(result).toContain("interface ContainerProps");
|
|
210
|
+
expect(result).toContain("const Button: (props: ButtonProps) => JSX.Element");
|
|
211
|
+
expect(result).toContain("const Input: (props: InputProps) => JSX.Element");
|
|
212
|
+
expect(result).toContain("const Container: (props: ContainerProps) => JSX.Element");
|
|
215
213
|
});
|
|
216
214
|
});
|
|
217
|
-
|
|
218
|
-
|
|
215
|
+
describe("data types generation", () => {
|
|
216
|
+
it("should generate data with string property", () => {
|
|
219
217
|
const schema = {
|
|
220
218
|
data: {
|
|
221
219
|
userName: { type: "string" },
|
|
222
220
|
},
|
|
223
221
|
elements: {},
|
|
224
222
|
};
|
|
225
|
-
const result =
|
|
226
|
-
|
|
227
|
-
|
|
223
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
224
|
+
expect(result).toContain("const data:");
|
|
225
|
+
expect(result).toContain("userName: string");
|
|
228
226
|
});
|
|
229
|
-
|
|
227
|
+
it("should generate data with multiple property types", () => {
|
|
230
228
|
const schema = {
|
|
231
229
|
data: {
|
|
232
230
|
name: { type: "string" },
|
|
@@ -235,13 +233,13 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
235
233
|
},
|
|
236
234
|
elements: {},
|
|
237
235
|
};
|
|
238
|
-
const result =
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
236
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
237
|
+
expect(result).toContain("const data:");
|
|
238
|
+
expect(result).toContain("name: string");
|
|
239
|
+
expect(result).toContain("age: number");
|
|
240
|
+
expect(result).toContain("active: boolean");
|
|
243
241
|
});
|
|
244
|
-
|
|
242
|
+
it("should generate data with object property", () => {
|
|
245
243
|
const schema = {
|
|
246
244
|
data: {
|
|
247
245
|
user: {
|
|
@@ -254,13 +252,13 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
254
252
|
},
|
|
255
253
|
elements: {},
|
|
256
254
|
};
|
|
257
|
-
const result =
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
255
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
256
|
+
expect(result).toContain("const data:");
|
|
257
|
+
expect(result).toContain("user:");
|
|
258
|
+
expect(result).toContain("name: string");
|
|
259
|
+
expect(result).toContain("email: string");
|
|
262
260
|
});
|
|
263
|
-
|
|
261
|
+
it("should generate data with nested object properties", () => {
|
|
264
262
|
const schema = {
|
|
265
263
|
data: {
|
|
266
264
|
user: {
|
|
@@ -279,14 +277,14 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
279
277
|
},
|
|
280
278
|
elements: {},
|
|
281
279
|
};
|
|
282
|
-
const result =
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
280
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
281
|
+
expect(result).toContain("const data:");
|
|
282
|
+
expect(result).toContain("user:");
|
|
283
|
+
expect(result).toContain("profile:");
|
|
284
|
+
expect(result).toContain("avatar: string");
|
|
285
|
+
expect(result).toContain("bio: string");
|
|
288
286
|
});
|
|
289
|
-
|
|
287
|
+
it("should generate data with array of primitives", () => {
|
|
290
288
|
const schema = {
|
|
291
289
|
data: {
|
|
292
290
|
tags: {
|
|
@@ -300,12 +298,12 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
300
298
|
},
|
|
301
299
|
elements: {},
|
|
302
300
|
};
|
|
303
|
-
const result =
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
301
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
302
|
+
expect(result).toContain("const data:");
|
|
303
|
+
expect(result).toContain("tags: string[]");
|
|
304
|
+
expect(result).toContain("scores: number[]");
|
|
307
305
|
});
|
|
308
|
-
|
|
306
|
+
it("should generate data with array of objects", () => {
|
|
309
307
|
const schema = {
|
|
310
308
|
data: {
|
|
311
309
|
users: {
|
|
@@ -321,14 +319,14 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
321
319
|
},
|
|
322
320
|
elements: {},
|
|
323
321
|
};
|
|
324
|
-
const result =
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
322
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
323
|
+
expect(result).toContain("const data:");
|
|
324
|
+
expect(result).toContain("users:");
|
|
325
|
+
expect(result).toContain("name: string");
|
|
326
|
+
expect(result).toContain("age: number");
|
|
327
|
+
expect(result).toContain("[]");
|
|
330
328
|
});
|
|
331
|
-
|
|
329
|
+
it("should include data property descriptions as JSDoc", () => {
|
|
332
330
|
const schema = {
|
|
333
331
|
data: {
|
|
334
332
|
userName: { type: "string", description: "The current user's name" },
|
|
@@ -342,12 +340,12 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
342
340
|
},
|
|
343
341
|
elements: {},
|
|
344
342
|
};
|
|
345
|
-
const result =
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
343
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
344
|
+
expect(result).toContain("The current user's name");
|
|
345
|
+
expect(result).toContain("User preferences");
|
|
346
|
+
expect(result).toContain("UI theme preference");
|
|
349
347
|
});
|
|
350
|
-
|
|
348
|
+
it("should generate data with enum values", () => {
|
|
351
349
|
const schema = {
|
|
352
350
|
data: {
|
|
353
351
|
status: { type: "string", enum: ["pending", "active", "completed"] },
|
|
@@ -355,14 +353,14 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
355
353
|
},
|
|
356
354
|
elements: {},
|
|
357
355
|
};
|
|
358
|
-
const result =
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
356
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
357
|
+
expect(result).toContain("const data:");
|
|
358
|
+
expect(result).toContain('status: "pending" | "active" | "completed"');
|
|
359
|
+
expect(result).toContain("priority: 1 | 2 | 3");
|
|
362
360
|
});
|
|
363
361
|
});
|
|
364
|
-
|
|
365
|
-
|
|
362
|
+
describe("combined schema", () => {
|
|
363
|
+
it("should generate definitions for both components and data", () => {
|
|
366
364
|
const schema = {
|
|
367
365
|
data: {
|
|
368
366
|
userName: { type: "string" },
|
|
@@ -381,17 +379,17 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
381
379
|
},
|
|
382
380
|
},
|
|
383
381
|
};
|
|
384
|
-
const result =
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
382
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
383
|
+
expect(result).toContain("const data:");
|
|
384
|
+
expect(result).toContain("userName: string");
|
|
385
|
+
expect(result).toContain("count: number");
|
|
386
|
+
expect(result).toContain("interface DisplayProps");
|
|
387
|
+
expect(result).toContain("interface CounterProps");
|
|
388
|
+
expect(result).toContain("const Display: (props: DisplayProps) => JSX.Element");
|
|
389
|
+
expect(result).toContain("const Counter: (props: CounterProps) => JSX.Element");
|
|
390
|
+
expect(result).toContain("namespace JSX");
|
|
393
391
|
});
|
|
394
|
-
|
|
392
|
+
it("should generate valid TypeScript that can be parsed", () => {
|
|
395
393
|
const schema = {
|
|
396
394
|
data: {
|
|
397
395
|
user: {
|
|
@@ -444,37 +442,37 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
444
442
|
},
|
|
445
443
|
},
|
|
446
444
|
};
|
|
447
|
-
const result =
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
445
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
446
|
+
expect(result).toContain("declare global");
|
|
447
|
+
expect(result).toContain("export {};");
|
|
448
|
+
expect(result).toContain("const data:");
|
|
449
|
+
expect(result).toContain("user:");
|
|
450
|
+
expect(result).toContain("name: string");
|
|
451
|
+
expect(result).toContain("email: string");
|
|
452
|
+
expect(result).toContain("settings:");
|
|
453
|
+
expect(result).toContain('theme: "light" | "dark"');
|
|
454
|
+
expect(result).toContain("notifications: boolean");
|
|
455
|
+
expect(result).toContain("items:");
|
|
456
|
+
expect(result).toContain("id: number");
|
|
457
|
+
expect(result).toContain("tags: string[]");
|
|
458
|
+
expect(result).toContain("interface CardProps");
|
|
459
|
+
expect(result).toContain("title: string");
|
|
460
|
+
expect(result).toContain("subtitle?: string");
|
|
461
|
+
expect(result).toContain('variant?: "default" | "outlined" | "filled"');
|
|
462
|
+
expect(result).toContain("onClick?: (...args: any[]) => any");
|
|
463
|
+
expect(result).toContain("children?: JSX.Node");
|
|
464
|
+
expect(result).toContain("A card element for displaying content");
|
|
465
|
+
expect(result).toContain("interface ListProps");
|
|
466
|
+
expect(result).toContain("items?: string[]");
|
|
467
|
+
expect(result).not.toMatch(/interface ListProps\s*{[^}]*children/);
|
|
468
|
+
expect(result).toContain("namespace JSX");
|
|
469
|
+
expect(result).toContain("Math");
|
|
470
|
+
expect(result).toContain("const Card: (props: CardProps) => JSX.Element");
|
|
471
|
+
expect(result).toContain("const List: (props: ListProps) => JSX.Element");
|
|
474
472
|
});
|
|
475
473
|
});
|
|
476
|
-
|
|
477
|
-
|
|
474
|
+
describe("edge cases", () => {
|
|
475
|
+
it("should handle empty props object", () => {
|
|
478
476
|
const schema = {
|
|
479
477
|
data: {},
|
|
480
478
|
elements: {
|
|
@@ -483,12 +481,12 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
483
481
|
},
|
|
484
482
|
},
|
|
485
483
|
};
|
|
486
|
-
const result =
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
484
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
485
|
+
expect(result).toContain("interface DividerProps");
|
|
486
|
+
expect(result).toContain("children?: JSX.Node");
|
|
487
|
+
expect(result).toContain("const Divider: (props: DividerProps) => JSX.Element");
|
|
490
488
|
});
|
|
491
|
-
|
|
489
|
+
it("should handle element with only required props", () => {
|
|
492
490
|
const schema = {
|
|
493
491
|
data: {},
|
|
494
492
|
elements: {
|
|
@@ -500,14 +498,14 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
500
498
|
},
|
|
501
499
|
},
|
|
502
500
|
};
|
|
503
|
-
const result =
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
501
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
502
|
+
expect(result).toContain("interface LabelProps");
|
|
503
|
+
expect(result).toContain("text: string");
|
|
504
|
+
expect(result).toContain("id: string");
|
|
505
|
+
expect(result).not.toMatch(/text\?:/);
|
|
506
|
+
expect(result).not.toMatch(/id\?:/);
|
|
509
507
|
});
|
|
510
|
-
|
|
508
|
+
it("should handle deeply nested object structures", () => {
|
|
511
509
|
const schema = {
|
|
512
510
|
data: {
|
|
513
511
|
config: {
|
|
@@ -534,14 +532,14 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
534
532
|
},
|
|
535
533
|
elements: {},
|
|
536
534
|
};
|
|
537
|
-
const result =
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
535
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
536
|
+
expect(result).toContain("config:");
|
|
537
|
+
expect(result).toContain("level1:");
|
|
538
|
+
expect(result).toContain("level2:");
|
|
539
|
+
expect(result).toContain("level3:");
|
|
540
|
+
expect(result).toContain("value: string");
|
|
543
541
|
});
|
|
544
|
-
|
|
542
|
+
it("should handle array of arrays", () => {
|
|
545
543
|
const schema = {
|
|
546
544
|
data: {
|
|
547
545
|
matrix: {
|
|
@@ -554,10 +552,10 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
554
552
|
},
|
|
555
553
|
elements: {},
|
|
556
554
|
};
|
|
557
|
-
const result =
|
|
558
|
-
|
|
555
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
556
|
+
expect(result).toContain("matrix: number[][]");
|
|
559
557
|
});
|
|
560
|
-
|
|
558
|
+
it("should handle mixed required and optional props", () => {
|
|
561
559
|
const schema = {
|
|
562
560
|
data: {},
|
|
563
561
|
elements: {
|
|
@@ -573,14 +571,14 @@ const generate_typescript_definitions_js_1 = require("./generate-typescript-defi
|
|
|
573
571
|
},
|
|
574
572
|
},
|
|
575
573
|
};
|
|
576
|
-
const result =
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
574
|
+
const result = generateTypeScriptDefinitions(schema);
|
|
575
|
+
expect(result).toContain("interface FormProps");
|
|
576
|
+
expect(result).toContain("id: string");
|
|
577
|
+
expect(result).toContain("name: string");
|
|
578
|
+
expect(result).toContain("title?: string");
|
|
579
|
+
expect(result).toContain("description?: string");
|
|
580
|
+
expect(result).toContain("onSubmit: (...args: any[]) => any");
|
|
581
|
+
expect(result).toContain("onCancel?: (...args: any[]) => any");
|
|
584
582
|
});
|
|
585
583
|
});
|
|
586
584
|
});
|