jsxpression 0.1.5 → 0.1.11
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 +5 -1
- package/lib/analyze/analysis-error.js.map +1 -1
- package/lib/analyze/analysis-report.js +5 -1
- package/lib/analyze/analysis-report.js.map +1 -1
- package/lib/analyze/analyze.js +9 -6
- package/lib/analyze/analyze.js.map +1 -1
- package/lib/analyze/analyze.test.d.ts +2 -0
- package/lib/analyze/analyze.test.js +314 -312
- package/lib/analyze/analyze.test.js.map +1 -1
- package/lib/analyze/data/analyze.js +10 -7
- package/lib/analyze/data/analyze.js.map +1 -1
- package/lib/analyze/data/data-access.js +24 -20
- package/lib/analyze/data/data-access.js.map +1 -1
- package/lib/analyze/data/index.js +5 -1
- package/lib/analyze/data/index.js.map +1 -1
- package/lib/analyze/data/method-calls.js +20 -17
- package/lib/analyze/data/method-calls.js.map +1 -1
- package/lib/analyze/data/utils.js +29 -22
- package/lib/analyze/data/utils.js.map +1 -1
- package/lib/analyze/index.js +9 -3
- package/lib/analyze/index.js.map +1 -1
- package/lib/analyze/jsx/analyze.js +11 -8
- package/lib/analyze/jsx/analyze.js.map +1 -1
- package/lib/analyze/jsx/element-attributes.js +24 -21
- package/lib/analyze/jsx/element-attributes.js.map +1 -1
- package/lib/analyze/jsx/element-children.js +23 -20
- package/lib/analyze/jsx/element-children.js.map +1 -1
- package/lib/analyze/jsx/element-tags.js +15 -12
- package/lib/analyze/jsx/element-tags.js.map +1 -1
- package/lib/analyze/jsx/index.js +5 -1
- package/lib/analyze/jsx/index.js.map +1 -1
- package/lib/analyze/security/analyze.js +13 -10
- package/lib/analyze/security/analyze.js.map +1 -1
- package/lib/analyze/security/call-expressions.js +11 -8
- package/lib/analyze/security/call-expressions.js.map +1 -1
- package/lib/analyze/security/declarations.js +15 -12
- package/lib/analyze/security/declarations.js.map +1 -1
- package/lib/analyze/security/expressions.js +17 -14
- package/lib/analyze/security/expressions.js.map +1 -1
- package/lib/analyze/security/identifiers.js +13 -10
- package/lib/analyze/security/identifiers.js.map +1 -1
- package/lib/analyze/security/index.js +5 -1
- package/lib/analyze/security/index.js.map +1 -1
- package/lib/analyze/security/member-access.js +10 -7
- package/lib/analyze/security/member-access.js.map +1 -1
- package/lib/analyze/utils.d.ts +20 -0
- package/lib/analyze/utils.js +10 -4
- package/lib/analyze/utils.js.map +1 -1
- package/lib/analyze/validation-context.d.ts +13 -0
- package/lib/analyze/validation-context.js +5 -1
- package/lib/analyze/validation-context.js.map +1 -1
- package/lib/builtins.js +20 -9
- package/lib/builtins.js.map +1 -1
- package/lib/codegen/builtins/builtin-types.js +6 -3
- package/lib/codegen/builtins/builtin-types.js.map +1 -1
- package/lib/codegen/builtins/index.js +5 -1
- package/lib/codegen/builtins/index.js.map +1 -1
- package/lib/codegen/generate-typescript-definitions.js +7 -4
- package/lib/codegen/generate-typescript-definitions.js.map +1 -1
- package/lib/codegen/generate-typescript-definitions.test.js +192 -190
- package/lib/codegen/generate-typescript-definitions.test.js.map +1 -1
- package/lib/codegen/index.js +5 -1
- package/lib/codegen/index.js.map +1 -1
- package/lib/codegen/schema/component-types.js +6 -3
- package/lib/codegen/schema/component-types.js.map +1 -1
- package/lib/codegen/schema/data-types.js +6 -3
- package/lib/codegen/schema/data-types.js.map +1 -1
- package/lib/codegen/schema/index.js +7 -2
- package/lib/codegen/schema/index.js.map +1 -1
- package/lib/codegen/schema/utils.js +8 -3
- package/lib/codegen/schema/utils.js.map +1 -1
- package/lib/compile/compilation-error.d.ts +17 -0
- package/lib/compile/compilation-error.js +5 -1
- package/lib/compile/compilation-error.js.map +1 -1
- package/lib/compile/compile.js +21 -18
- package/lib/compile/compile.js.map +1 -1
- package/lib/compile/compile.test.d.ts +2 -0
- package/lib/compile/compile.test.js +112 -110
- package/lib/compile/compile.test.js.map +1 -1
- package/lib/compile/index.js +7 -2
- package/lib/compile/index.js.map +1 -1
- package/lib/evaluate/evaluate.d.ts +2 -1
- package/lib/evaluate/evaluate.d.ts.map +1 -1
- package/lib/evaluate/evaluate.js +17 -12
- package/lib/evaluate/evaluate.js.map +1 -1
- package/lib/evaluate/evaluate.test.d.ts +2 -0
- package/lib/evaluate/evaluate.test.js +86 -74
- package/lib/evaluate/evaluate.test.js.map +1 -1
- package/lib/evaluate/evaluation-error.js +5 -1
- package/lib/evaluate/evaluation-error.js.map +1 -1
- package/lib/evaluate/index.js +7 -2
- package/lib/evaluate/index.js.map +1 -1
- package/lib/index.js +15 -6
- package/lib/index.js.map +1 -1
- package/lib/jsx.js +22 -10
- package/lib/jsx.js.map +1 -1
- package/lib/parse/index.js +7 -2
- package/lib/parse/index.js.map +1 -1
- package/lib/parse/parse-error.d.ts +10 -0
- package/lib/parse/parse-error.js +5 -1
- package/lib/parse/parse-error.js.map +1 -1
- package/lib/parse/parse.js +13 -7
- package/lib/parse/parse.js.map +1 -1
- package/lib/parse/parse.test.d.ts +2 -0
- package/lib/parse/parse.test.js +58 -56
- package/lib/parse/parse.test.js.map +1 -1
- package/lib/render.js +12 -9
- package/lib/render.js.map +1 -1
- package/lib/render.test.d.ts +2 -0
- package/lib/render.test.js +64 -62
- package/lib/render.test.js.map +1 -1
- package/lib/schema.js +38 -18
- package/lib/schema.js.map +1 -1
- package/lib/traverse.js +11 -8
- package/lib/traverse.js.map +1 -1
- package/lib/traverse.test.d.ts +2 -0
- package/lib/traverse.test.js +36 -34
- package/lib/traverse.test.js.map +1 -1
- package/lib/types.d.ts +12 -0
- package/lib/types.js +2 -1
- package/lib/validate.js +10 -7
- package/lib/validate.js.map +1 -1
- package/package.json +7 -7
- package/src/evaluate/evaluate.test.ts +39 -25
- package/src/evaluate/evaluate.ts +11 -8
- package/src/render.ts +1 -1
- package/lib/codegen/builtin-types.d.ts +0 -11
- package/lib/codegen/builtin-types.d.ts.map +0 -1
- package/lib/codegen/builtin-types.js +0 -151
- package/lib/codegen/builtin-types.js.map +0 -1
- package/lib/codegen/declare-types.d.ts +0 -20
- package/lib/codegen/declare-types.d.ts.map +0 -1
- package/lib/codegen/declare-types.js +0 -299
- package/lib/codegen/declare-types.js.map +0 -1
- package/lib/codegen/schema-to-types.d.ts +0 -14
- package/lib/codegen/schema-to-types.d.ts.map +0 -1
- package/lib/codegen/schema-to-types.js +0 -203
- package/lib/codegen/schema-to-types.js.map +0 -1
package/lib/schema.js
CHANGED
|
@@ -1,45 +1,65 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isElementAllowed = isElementAllowed;
|
|
4
|
+
exports.getElementSchema = getElementSchema;
|
|
5
|
+
exports.getAllowedAttributes = getAllowedAttributes;
|
|
6
|
+
exports.isAttributeAllowed = isAttributeAllowed;
|
|
7
|
+
exports.getAllowedChildren = getAllowedChildren;
|
|
8
|
+
exports.canHaveChildren = canHaveChildren;
|
|
9
|
+
exports.isSelfClosing = isSelfClosing;
|
|
10
|
+
exports.isChildAllowed = isChildAllowed;
|
|
11
|
+
exports.getAllElements = getAllElements;
|
|
12
|
+
exports.getElementConfig = getElementConfig;
|
|
13
|
+
exports.getAttributeSchema = getAttributeSchema;
|
|
14
|
+
exports.getRequiredAttributes = getRequiredAttributes;
|
|
15
|
+
exports.getOptionalAttributes = getOptionalAttributes;
|
|
16
|
+
exports.isAttributeRequired = isAttributeRequired;
|
|
17
|
+
exports.getDataSchema = getDataSchema;
|
|
18
|
+
exports.getPropertyAtPath = getPropertyAtPath;
|
|
19
|
+
exports.getAvailablePropertiesAtPath = getAvailablePropertiesAtPath;
|
|
20
|
+
exports.getEnumValues = getEnumValues;
|
|
21
|
+
function isElementAllowed(schema, tagName) {
|
|
2
22
|
return !!schema.elements?.[tagName];
|
|
3
23
|
}
|
|
4
|
-
|
|
24
|
+
function getElementSchema(schema, tagName) {
|
|
5
25
|
return schema.elements?.[tagName];
|
|
6
26
|
}
|
|
7
|
-
|
|
27
|
+
function getAllowedAttributes(schema, tagName) {
|
|
8
28
|
const elementConfig = getElementSchema(schema, tagName);
|
|
9
29
|
return elementConfig?.props ? Object.keys(elementConfig.props) : [];
|
|
10
30
|
}
|
|
11
|
-
|
|
31
|
+
function isAttributeAllowed(schema, tagName, attributeName) {
|
|
12
32
|
const allowedAttributes = getAllowedAttributes(schema, tagName);
|
|
13
33
|
return allowedAttributes.includes(attributeName);
|
|
14
34
|
}
|
|
15
|
-
|
|
35
|
+
function getAllowedChildren(schema, tagName) {
|
|
16
36
|
const elementConfig = getElementSchema(schema, tagName);
|
|
17
37
|
return elementConfig?.allowedChildren;
|
|
18
38
|
}
|
|
19
|
-
|
|
39
|
+
function canHaveChildren(schema, tagName) {
|
|
20
40
|
const allowedChildren = getAllowedChildren(schema, tagName);
|
|
21
41
|
return allowedChildren === undefined || allowedChildren.length > 0;
|
|
22
42
|
}
|
|
23
|
-
|
|
43
|
+
function isSelfClosing(schema, tagName) {
|
|
24
44
|
const allowedChildren = getAllowedChildren(schema, tagName);
|
|
25
45
|
return allowedChildren !== undefined && allowedChildren.length === 0;
|
|
26
46
|
}
|
|
27
|
-
|
|
47
|
+
function isChildAllowed(schema, parentTag, childTag) {
|
|
28
48
|
const allowedChildren = getAllowedChildren(schema, parentTag);
|
|
29
49
|
return allowedChildren === undefined || allowedChildren.includes(childTag);
|
|
30
50
|
}
|
|
31
51
|
// New schema utilities for enhanced validation
|
|
32
|
-
|
|
52
|
+
function getAllElements(schema) {
|
|
33
53
|
return schema.elements ? Object.keys(schema.elements) : [];
|
|
34
54
|
}
|
|
35
|
-
|
|
55
|
+
function getElementConfig(schema, tagName) {
|
|
36
56
|
return getElementSchema(schema, tagName);
|
|
37
57
|
}
|
|
38
|
-
|
|
58
|
+
function getAttributeSchema(schema, tagName, attributeName) {
|
|
39
59
|
const elementSchema = getElementSchema(schema, tagName);
|
|
40
60
|
return elementSchema?.props?.[attributeName];
|
|
41
61
|
}
|
|
42
|
-
|
|
62
|
+
function getRequiredAttributes(schema, tagName) {
|
|
43
63
|
const elementSchema = getElementSchema(schema, tagName);
|
|
44
64
|
if (!elementSchema?.props) {
|
|
45
65
|
return [];
|
|
@@ -52,19 +72,19 @@ export function getRequiredAttributes(schema, tagName) {
|
|
|
52
72
|
}
|
|
53
73
|
return required;
|
|
54
74
|
}
|
|
55
|
-
|
|
75
|
+
function getOptionalAttributes(schema, tagName) {
|
|
56
76
|
const allAttributes = getAllowedAttributes(schema, tagName);
|
|
57
77
|
const requiredAttributes = getRequiredAttributes(schema, tagName);
|
|
58
78
|
return allAttributes.filter((attr) => !requiredAttributes.includes(attr));
|
|
59
79
|
}
|
|
60
|
-
|
|
80
|
+
function isAttributeRequired(schema, tagName, attributeName) {
|
|
61
81
|
const requiredAttributes = getRequiredAttributes(schema, tagName);
|
|
62
82
|
return requiredAttributes.includes(attributeName);
|
|
63
83
|
}
|
|
64
|
-
|
|
84
|
+
function getDataSchema(schema) {
|
|
65
85
|
return schema.data;
|
|
66
86
|
}
|
|
67
|
-
|
|
87
|
+
function getPropertyAtPath(schema, path) {
|
|
68
88
|
if (!schema.data || path.length === 0) {
|
|
69
89
|
return undefined;
|
|
70
90
|
}
|
|
@@ -79,7 +99,7 @@ export function getPropertyAtPath(schema, path) {
|
|
|
79
99
|
}
|
|
80
100
|
return current;
|
|
81
101
|
}
|
|
82
|
-
|
|
102
|
+
function getAvailablePropertiesAtPath(schema, path) {
|
|
83
103
|
if (!schema.data) {
|
|
84
104
|
return [];
|
|
85
105
|
}
|
|
@@ -92,7 +112,7 @@ export function getAvailablePropertiesAtPath(schema, path) {
|
|
|
92
112
|
}
|
|
93
113
|
return [];
|
|
94
114
|
}
|
|
95
|
-
|
|
115
|
+
function getEnumValues(property) {
|
|
96
116
|
switch (property.type) {
|
|
97
117
|
case "string":
|
|
98
118
|
return property.enum;
|
package/lib/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAgEA,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/lib/traverse.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.traverse = traverse;
|
|
4
|
+
const acorn_walk_1 = require("acorn-walk");
|
|
5
|
+
const jsx_js_1 = require("./jsx.js");
|
|
6
|
+
function traverse(ast, visitors) {
|
|
7
|
+
(0, acorn_walk_1.simple)(ast, visitors, {
|
|
8
|
+
...acorn_walk_1.base,
|
|
6
9
|
JSXAttribute(node, state, visit) {
|
|
7
10
|
if (node.value) {
|
|
8
11
|
visit(node.value, state);
|
|
@@ -16,19 +19,19 @@ export function traverse(ast, visitors) {
|
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
21
|
for (const child of node.children) {
|
|
19
|
-
if (!isJsxText(child)) {
|
|
22
|
+
if (!(0, jsx_js_1.isJsxText)(child)) {
|
|
20
23
|
visit(child, state);
|
|
21
24
|
}
|
|
22
25
|
}
|
|
23
26
|
},
|
|
24
27
|
JSXExpressionContainer(node, state, visit) {
|
|
25
|
-
if (!isJsxEmptyExpression(node.expression)) {
|
|
28
|
+
if (!(0, jsx_js_1.isJsxEmptyExpression)(node.expression)) {
|
|
26
29
|
visit(node.expression, state);
|
|
27
30
|
}
|
|
28
31
|
},
|
|
29
32
|
JSXFragment(node, state, visit) {
|
|
30
33
|
for (const child of node.children) {
|
|
31
|
-
if (!isJsxText(child)) {
|
|
34
|
+
if (!(0, jsx_js_1.isJsxText)(child)) {
|
|
32
35
|
visit(child, state);
|
|
33
36
|
}
|
|
34
37
|
}
|
package/lib/traverse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse.js","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"traverse.js","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":";;AAmCA,4BA0CC;AA5ED,2CAA6E;AAC7E,qCASkB;AAwBlB,SAAgB,QAAQ,CAAC,GAAY,EAAE,QAAyC;IAC9E,IAAA,mBAAM,EAAC,GAAG,EAAE,QAAQ,EAAE;QACpB,GAAG,iBAAI;QACP,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YAC7B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YAC3B,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;YAChC,IAAI,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/D,KAAK,MAAM,SAAS,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;oBAClD,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAA,kBAAS,EAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YACvC,IAAI,CAAC,IAAA,6BAAoB,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAA,kBAAS,EAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YAClC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YACnC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;KAC2B,CAAC,CAAC;AAClC,CAAC"}
|
package/lib/traverse.test.js
CHANGED
|
@@ -1,71 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const traverse_js_1 = require("./traverse.js");
|
|
5
|
+
const index_js_1 = require("./parse/index.js");
|
|
6
|
+
(0, vitest_1.describe)("traverse", () => {
|
|
7
|
+
(0, vitest_1.it)("should call JSXElement visitor", () => {
|
|
8
|
+
const ast = (0, index_js_1.parse)("<Text>Hello</Text>");
|
|
7
9
|
const visits = [];
|
|
8
|
-
traverse(ast, {
|
|
10
|
+
(0, traverse_js_1.traverse)(ast, {
|
|
9
11
|
JSXElement() {
|
|
10
12
|
visits.push("JSXElement");
|
|
11
13
|
},
|
|
12
14
|
});
|
|
13
|
-
expect(visits).toContain("JSXElement");
|
|
15
|
+
(0, vitest_1.expect)(visits).toContain("JSXElement");
|
|
14
16
|
});
|
|
15
|
-
it("should call JSXFragment visitor", () => {
|
|
16
|
-
const ast = parse("<>Fragment</>");
|
|
17
|
+
(0, vitest_1.it)("should call JSXFragment visitor", () => {
|
|
18
|
+
const ast = (0, index_js_1.parse)("<>Fragment</>");
|
|
17
19
|
const visits = [];
|
|
18
|
-
traverse(ast, {
|
|
20
|
+
(0, traverse_js_1.traverse)(ast, {
|
|
19
21
|
JSXFragment() {
|
|
20
22
|
visits.push("JSXFragment");
|
|
21
23
|
},
|
|
22
24
|
});
|
|
23
|
-
expect(visits).toContain("JSXFragment");
|
|
25
|
+
(0, vitest_1.expect)(visits).toContain("JSXFragment");
|
|
24
26
|
});
|
|
25
|
-
it("should call Identifier visitor for expressions", () => {
|
|
26
|
-
const ast = parse("<Text>{props.value}</Text>");
|
|
27
|
+
(0, vitest_1.it)("should call Identifier visitor for expressions", () => {
|
|
28
|
+
const ast = (0, index_js_1.parse)("<Text>{props.value}</Text>");
|
|
27
29
|
const identifiers = [];
|
|
28
|
-
traverse(ast, {
|
|
30
|
+
(0, traverse_js_1.traverse)(ast, {
|
|
29
31
|
Identifier(node) {
|
|
30
32
|
identifiers.push(node.name);
|
|
31
33
|
},
|
|
32
34
|
});
|
|
33
|
-
expect(identifiers).toContain("props");
|
|
35
|
+
(0, vitest_1.expect)(identifiers).toContain("props");
|
|
34
36
|
});
|
|
35
|
-
it("should call JSXAttribute visitor", () => {
|
|
36
|
-
const ast = parse("<Text x={10} y={20}>Hello</Text>");
|
|
37
|
+
(0, vitest_1.it)("should call JSXAttribute visitor", () => {
|
|
38
|
+
const ast = (0, index_js_1.parse)("<Text x={10} y={20}>Hello</Text>");
|
|
37
39
|
let attributeCount = 0;
|
|
38
|
-
traverse(ast, {
|
|
40
|
+
(0, traverse_js_1.traverse)(ast, {
|
|
39
41
|
JSXAttribute() {
|
|
40
42
|
attributeCount++;
|
|
41
43
|
},
|
|
42
44
|
});
|
|
43
|
-
expect(attributeCount).toBe(2);
|
|
45
|
+
(0, vitest_1.expect)(attributeCount).toBe(2);
|
|
44
46
|
});
|
|
45
|
-
it("should call JSXExpressionContainer visitor", () => {
|
|
46
|
-
const ast = parse("<Text>{props.value}</Text>");
|
|
47
|
+
(0, vitest_1.it)("should call JSXExpressionContainer visitor", () => {
|
|
48
|
+
const ast = (0, index_js_1.parse)("<Text>{props.value}</Text>");
|
|
47
49
|
const visits = [];
|
|
48
|
-
traverse(ast, {
|
|
50
|
+
(0, traverse_js_1.traverse)(ast, {
|
|
49
51
|
JSXExpressionContainer() {
|
|
50
52
|
visits.push("JSXExpressionContainer");
|
|
51
53
|
},
|
|
52
54
|
});
|
|
53
|
-
expect(visits).toContain("JSXExpressionContainer");
|
|
55
|
+
(0, vitest_1.expect)(visits).toContain("JSXExpressionContainer");
|
|
54
56
|
});
|
|
55
|
-
it("should traverse nested JSX elements", () => {
|
|
56
|
-
const ast = parse("<Outer><Inner>Text</Inner></Outer>");
|
|
57
|
+
(0, vitest_1.it)("should traverse nested JSX elements", () => {
|
|
58
|
+
const ast = (0, index_js_1.parse)("<Outer><Inner>Text</Inner></Outer>");
|
|
57
59
|
let jsxCount = 0;
|
|
58
|
-
traverse(ast, {
|
|
60
|
+
(0, traverse_js_1.traverse)(ast, {
|
|
59
61
|
JSXElement() {
|
|
60
62
|
jsxCount++;
|
|
61
63
|
},
|
|
62
64
|
});
|
|
63
|
-
expect(jsxCount).toBe(2);
|
|
65
|
+
(0, vitest_1.expect)(jsxCount).toBe(2);
|
|
64
66
|
});
|
|
65
|
-
it("should handle multiple visitor types simultaneously", () => {
|
|
66
|
-
const ast = parse("<Text x={props.value}>Hello</Text>");
|
|
67
|
+
(0, vitest_1.it)("should handle multiple visitor types simultaneously", () => {
|
|
68
|
+
const ast = (0, index_js_1.parse)("<Text x={props.value}>Hello</Text>");
|
|
67
69
|
const visits = [];
|
|
68
|
-
traverse(ast, {
|
|
70
|
+
(0, traverse_js_1.traverse)(ast, {
|
|
69
71
|
JSXElement() {
|
|
70
72
|
visits.push("JSXElement");
|
|
71
73
|
},
|
|
@@ -76,9 +78,9 @@ describe("traverse", () => {
|
|
|
76
78
|
visits.push("Identifier:" + node.name);
|
|
77
79
|
},
|
|
78
80
|
});
|
|
79
|
-
expect(visits).toContain("JSXElement");
|
|
80
|
-
expect(visits).toContain("JSXAttribute");
|
|
81
|
-
expect(visits).toContain("Identifier:props");
|
|
81
|
+
(0, vitest_1.expect)(visits).toContain("JSXElement");
|
|
82
|
+
(0, vitest_1.expect)(visits).toContain("JSXAttribute");
|
|
83
|
+
(0, vitest_1.expect)(visits).toContain("Identifier:props");
|
|
82
84
|
});
|
|
83
85
|
});
|
|
84
86
|
//# sourceMappingURL=traverse.test.js.map
|
package/lib/traverse.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse.test.js","sourceRoot":"","sources":["../src/traverse.test.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"traverse.test.js","sourceRoot":"","sources":["../src/traverse.test.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type PropsDict = Record<string, unknown>;
|
|
2
|
+
export type DataDict = Record<string, unknown>;
|
|
3
|
+
export type ComponentDict = Record<string, Component>;
|
|
4
|
+
export type CreateElement<T = any> = (type: Component, props?: PropsDict, ...children: any[]) => T;
|
|
5
|
+
export type Node = {
|
|
6
|
+
type: string;
|
|
7
|
+
props: PropsDict;
|
|
8
|
+
children: Node[];
|
|
9
|
+
};
|
|
10
|
+
export type H = (type: string, props?: PropsDict, ...children: Node[]) => Node;
|
|
11
|
+
export type Component = (...args: any[]) => any;
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
package/lib/types.js
CHANGED
package/lib/validate.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validate = validate;
|
|
4
|
+
const index_js_1 = require("./analyze/index.js");
|
|
5
|
+
const index_js_2 = require("./parse/index.js");
|
|
3
6
|
/**
|
|
4
7
|
* Validates JSX expression syntax and schema compliance without execution.
|
|
5
8
|
*
|
|
@@ -24,17 +27,17 @@ import { parse, ParseError } from "./parse/index.js";
|
|
|
24
27
|
* }
|
|
25
28
|
* ```
|
|
26
29
|
*/
|
|
27
|
-
|
|
30
|
+
function validate(source, schema, { minSeverity = 3 } = {}) {
|
|
28
31
|
try {
|
|
29
|
-
const ast = parse(source);
|
|
30
|
-
const report = analyze(ast, schema);
|
|
32
|
+
const ast = (0, index_js_2.parse)(source);
|
|
33
|
+
const report = (0, index_js_1.analyze)(ast, schema);
|
|
31
34
|
if (report.hasIssues(minSeverity)) {
|
|
32
|
-
return { ok: false, error: AnalysisError.fromReport(report) };
|
|
35
|
+
return { ok: false, error: index_js_1.AnalysisError.fromReport(report) };
|
|
33
36
|
}
|
|
34
37
|
return { ok: true };
|
|
35
38
|
}
|
|
36
39
|
catch (error) {
|
|
37
|
-
if (error instanceof ParseError) {
|
|
40
|
+
if (error instanceof index_js_2.ParseError) {
|
|
38
41
|
return { ok: false, error };
|
|
39
42
|
}
|
|
40
43
|
throw error;
|
package/lib/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":";;AAoCA,4BAsBC;AA1DD,iDAA4D;AAC5D,+CAAqD;AAWrD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,QAAQ,CACtB,MAAc,EACd,MAAc,EAEd,EAAE,WAAW,GAAG,CAAC,KAAsB,EAAE;IAEzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,gBAAK,EAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAA,kBAAO,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEpC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAa,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,qBAAU,EAAE,CAAC;YAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jsxpression",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "Validate and safely render JSX expressions",
|
|
5
5
|
"author": "Divid AB <info@divid.se>",
|
|
6
6
|
"repository": "https://github.com/dividab/abstract-visuals/tree/master/packages/jsxpression",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
|
+
"sideEffects": false,
|
|
9
10
|
"types": "lib/index",
|
|
10
|
-
"type": "module",
|
|
11
11
|
"exports": {
|
|
12
12
|
".": "./lib/index.js"
|
|
13
13
|
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"test": "vitest run src/**/*.test.ts"
|
|
16
|
+
},
|
|
14
17
|
"files": [
|
|
15
18
|
"/lib",
|
|
16
19
|
"/src",
|
|
@@ -22,8 +25,5 @@
|
|
|
22
25
|
"acorn-jsx": "5.3.2",
|
|
23
26
|
"acorn-walk": "8.3.4"
|
|
24
27
|
},
|
|
25
|
-
"gitHead": "
|
|
26
|
-
|
|
27
|
-
"test": "vitest run src/**/*.test.ts"
|
|
28
|
-
}
|
|
29
|
-
}
|
|
28
|
+
"gitHead": "07369c92f3faed8f1adfc92b37ff7f8a040cf5e9"
|
|
29
|
+
}
|
|
@@ -2,6 +2,7 @@ import { describe, it, expect, vi } from "vitest";
|
|
|
2
2
|
import { evaluate, type EvaluateOptions } from "./evaluate.js";
|
|
3
3
|
import { compile } from "../compile/index.js";
|
|
4
4
|
import { parse } from "../parse/index.js";
|
|
5
|
+
import { Schema } from "../schema.js";
|
|
5
6
|
|
|
6
7
|
import { EvaluationError } from "./evaluation-error.js";
|
|
7
8
|
|
|
@@ -11,16 +12,24 @@ type Node = {
|
|
|
11
12
|
children: Node[];
|
|
12
13
|
};
|
|
13
14
|
|
|
15
|
+
function createPermissiveSchema(componentNames: string[]): Schema {
|
|
16
|
+
return {
|
|
17
|
+
elements: Object.fromEntries(componentNames.map((name) => [name, {}])),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
14
21
|
describe("evaluate", () => {
|
|
15
22
|
const compileAndEvaluate = (source: string, options: EvaluateOptions = {}): Node => {
|
|
16
|
-
|
|
23
|
+
const componentNames = Object.keys(options.components || {});
|
|
24
|
+
const schema = createPermissiveSchema(componentNames);
|
|
25
|
+
return evaluate(compile(parse(source)), schema, options);
|
|
17
26
|
};
|
|
18
27
|
|
|
19
28
|
it("should evaluate JSX with props", () => {
|
|
20
|
-
const TestComponent = (props: any
|
|
29
|
+
const TestComponent = (props: any): Node => ({
|
|
21
30
|
type: "TestComponent",
|
|
22
|
-
props,
|
|
23
|
-
children,
|
|
31
|
+
props: { x: props.x, y: props.y },
|
|
32
|
+
children: props.children,
|
|
24
33
|
});
|
|
25
34
|
|
|
26
35
|
const result = compileAndEvaluate("<Test x={data.x} y={data.y}>Hello</Test>", {
|
|
@@ -56,9 +65,12 @@ describe("evaluate", () => {
|
|
|
56
65
|
|
|
57
66
|
it("should throw EvaluationError for unknown component", () => {
|
|
58
67
|
const compiled = compile(parse("<UnknownComponent>Hello</UnknownComponent>"));
|
|
68
|
+
const emptySchema = createPermissiveSchema([]);
|
|
59
69
|
|
|
60
|
-
expect(() => evaluate(compiled, { components: {} })).toThrow(EvaluationError);
|
|
61
|
-
expect(() => evaluate(compiled, { components: {} })).toThrow(
|
|
70
|
+
expect(() => evaluate(compiled, emptySchema, { components: {} })).toThrow(EvaluationError);
|
|
71
|
+
expect(() => evaluate(compiled, emptySchema, { components: {} })).toThrow(
|
|
72
|
+
'component "UnknownComponent" is not allowed'
|
|
73
|
+
);
|
|
62
74
|
});
|
|
63
75
|
|
|
64
76
|
it("should deep-freeze props to prevent mutations", () => {
|
|
@@ -70,8 +82,9 @@ describe("evaluate", () => {
|
|
|
70
82
|
};
|
|
71
83
|
|
|
72
84
|
const compiled = compile(parse("<Test>Hello</Test>"));
|
|
85
|
+
const schema = createPermissiveSchema(["Test"]);
|
|
73
86
|
|
|
74
|
-
evaluate(compiled, {
|
|
87
|
+
evaluate(compiled, schema, {
|
|
75
88
|
data: { nested: { value: 42 } },
|
|
76
89
|
components: {
|
|
77
90
|
Test: TestComponent,
|
|
@@ -80,16 +93,16 @@ describe("evaluate", () => {
|
|
|
80
93
|
});
|
|
81
94
|
|
|
82
95
|
it("should evaluate nested elements", () => {
|
|
83
|
-
const OuterComponent = (props: any
|
|
96
|
+
const OuterComponent = (props: any): Node => ({
|
|
84
97
|
type: "Outer",
|
|
85
|
-
props,
|
|
86
|
-
children,
|
|
98
|
+
props: { x: props.x },
|
|
99
|
+
children: props.children,
|
|
87
100
|
});
|
|
88
101
|
|
|
89
|
-
const InnerComponent = (props: any
|
|
102
|
+
const InnerComponent = (props: any): Node => ({
|
|
90
103
|
type: "Inner",
|
|
91
|
-
props,
|
|
92
|
-
children,
|
|
104
|
+
props: { y: props.y },
|
|
105
|
+
children: props.children,
|
|
93
106
|
});
|
|
94
107
|
|
|
95
108
|
const result = compileAndEvaluate("<Outer x={data.x}><Inner y={data.y}>Text</Inner></Outer>", {
|
|
@@ -100,11 +113,11 @@ describe("evaluate", () => {
|
|
|
100
113
|
},
|
|
101
114
|
});
|
|
102
115
|
|
|
103
|
-
expect(result.type).toBe("
|
|
116
|
+
expect(result.type).toBe("Outer");
|
|
104
117
|
expect(result.props).toEqual({ x: 10 });
|
|
105
118
|
expect(result.children).toHaveLength(1);
|
|
106
119
|
const innerNode = result.children[0] as Node;
|
|
107
|
-
expect(innerNode.type).toBe("
|
|
120
|
+
expect(innerNode.type).toBe("Inner");
|
|
108
121
|
expect(innerNode.props).toEqual({ y: 20 });
|
|
109
122
|
expect(innerNode.children).toEqual(["Text"]);
|
|
110
123
|
});
|
|
@@ -169,9 +182,10 @@ describe("evaluate", () => {
|
|
|
169
182
|
it("should handle runtime errors gracefully", () => {
|
|
170
183
|
const compiled = compile(parse("<Test value={data.missing.nested}>Text</Test>"));
|
|
171
184
|
const TestComponent = (): Node => ({ type: "Test", props: {}, children: [] });
|
|
185
|
+
const schema = createPermissiveSchema(["Test"]);
|
|
172
186
|
|
|
173
187
|
expect(() =>
|
|
174
|
-
evaluate(compiled, {
|
|
188
|
+
evaluate(compiled, schema, {
|
|
175
189
|
data: {},
|
|
176
190
|
components: {
|
|
177
191
|
Test: TestComponent,
|
|
@@ -198,10 +212,10 @@ describe("evaluate", () => {
|
|
|
198
212
|
});
|
|
199
213
|
|
|
200
214
|
it("should flatten and filter children correctly", () => {
|
|
201
|
-
const TestComponent = (props: any
|
|
215
|
+
const TestComponent = (props: any): Node => ({
|
|
202
216
|
type: "Test",
|
|
203
|
-
props,
|
|
204
|
-
children,
|
|
217
|
+
props: {},
|
|
218
|
+
children: props.children,
|
|
205
219
|
});
|
|
206
220
|
|
|
207
221
|
const result = compileAndEvaluate("<Test>{data.show && 'Visible'}{false}{'Always'}</Test>", {
|
|
@@ -226,10 +240,10 @@ describe("evaluate", () => {
|
|
|
226
240
|
});
|
|
227
241
|
|
|
228
242
|
it("should handle empty JSX expressions", () => {
|
|
229
|
-
const TestComponent = (props: any
|
|
243
|
+
const TestComponent = (props: any): Node => ({
|
|
230
244
|
type: "Test",
|
|
231
|
-
props,
|
|
232
|
-
children,
|
|
245
|
+
props: {},
|
|
246
|
+
children: props.children,
|
|
233
247
|
});
|
|
234
248
|
|
|
235
249
|
const result = compileAndEvaluate("<Test>{}{data.value}{}</Test>", {
|
|
@@ -300,10 +314,10 @@ describe("evaluate", () => {
|
|
|
300
314
|
});
|
|
301
315
|
|
|
302
316
|
it("should handle data access in children", () => {
|
|
303
|
-
const TestComponent = (props: any
|
|
317
|
+
const TestComponent = (props: any): Node => ({
|
|
304
318
|
type: "Test",
|
|
305
|
-
props,
|
|
306
|
-
children,
|
|
319
|
+
props: {},
|
|
320
|
+
children: props.children,
|
|
307
321
|
});
|
|
308
322
|
|
|
309
323
|
const result = compileAndEvaluate("<Test>Hello {data.name}!</Test>", {
|
package/src/evaluate/evaluate.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EvaluationError } from "./evaluation-error.js";
|
|
2
|
+
import { Schema, isElementAllowed, canHaveChildren } from "../schema.js";
|
|
2
3
|
|
|
3
4
|
export type ComponentDict = Record<string, Component>;
|
|
4
5
|
|
|
@@ -32,10 +33,10 @@ export interface EvaluateOptions<T = any> {
|
|
|
32
33
|
createElement?: CreateElement<T>;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
export function evaluate<T = any>(source: string, options: EvaluateOptions<T>): T {
|
|
36
|
+
export function evaluate<T = any>(source: string, schema: Schema, options: EvaluateOptions<T>): T {
|
|
36
37
|
const { data = {}, components = {}, createElement } = options;
|
|
37
38
|
|
|
38
|
-
const h = createH(components, createElement || defaultCreateElement);
|
|
39
|
+
const h = createH(components, createElement || defaultCreateElement, schema);
|
|
39
40
|
|
|
40
41
|
try {
|
|
41
42
|
// eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
|
|
@@ -50,11 +51,17 @@ export function evaluate<T = any>(source: string, options: EvaluateOptions<T>):
|
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
53
|
|
|
53
|
-
function createH(components: ComponentDict, createElement: CreateElement): H {
|
|
54
|
+
function createH(components: ComponentDict, createElement: CreateElement, schema: Schema): H {
|
|
54
55
|
return function h(type, props, ...children) {
|
|
55
56
|
const Component = components[type];
|
|
56
57
|
|
|
57
58
|
if (!Component) {
|
|
59
|
+
if (isElementAllowed(schema, type)) {
|
|
60
|
+
const defaultComponent = (props: PropsDict): any => (canHaveChildren(schema, type) ? props.children : null);
|
|
61
|
+
return createElement(defaultComponent, props, ...children.flat().filter(Boolean));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Component not in schema - throw error
|
|
58
65
|
throw new EvaluationError(`component "${type}" is not allowed`);
|
|
59
66
|
}
|
|
60
67
|
|
|
@@ -73,9 +80,5 @@ function isDataDict(value: any): value is DataDict {
|
|
|
73
80
|
}
|
|
74
81
|
|
|
75
82
|
function defaultCreateElement(Component: Component, props: PropsDict = {}, ...children: any[]): Node {
|
|
76
|
-
return {
|
|
77
|
-
type: Component.name,
|
|
78
|
-
props,
|
|
79
|
-
children,
|
|
80
|
-
};
|
|
83
|
+
return Component({ ...props, children });
|
|
81
84
|
}
|
package/src/render.ts
CHANGED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate TypeScript .d.ts declarations for builtin types
|
|
3
|
-
* Pure type generation without Monaco dependencies
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Generate essential builtin type declarations (Math, String, Array)
|
|
7
|
-
* Uses direct declarations (not inside declare global) for better Monaco support
|
|
8
|
-
* Dynamically generated from builtins schema
|
|
9
|
-
*/
|
|
10
|
-
export declare function declareBuiltinTypes(): string;
|
|
11
|
-
//# sourceMappingURL=builtin-types.d.ts.map
|