jsxpression 0.1.41 → 0.2.0
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.d.ts.map +1 -1
- package/lib/analyze/analysis-error.js +2 -7
- package/lib/analyze/analysis-error.js.map +1 -1
- package/lib/analyze/analysis-report.d.ts +13 -13
- package/lib/analyze/analysis-report.d.ts.map +1 -1
- package/lib/analyze/analysis-report.js +48 -45
- package/lib/analyze/analysis-report.js.map +1 -1
- package/lib/analyze/analyze.d.ts +1 -1
- package/lib/analyze/analyze.d.ts.map +1 -1
- package/lib/analyze/analyze.js +4 -4
- package/lib/analyze/analyze.js.map +1 -1
- package/lib/analyze/data/analyze.d.ts +1 -1
- package/lib/analyze/data/analyze.d.ts.map +1 -1
- package/lib/analyze/data/analyze.js +5 -5
- package/lib/analyze/data/analyze.js.map +1 -1
- package/lib/analyze/data/data-access.d.ts +1 -1
- package/lib/analyze/data/data-access.d.ts.map +1 -1
- package/lib/analyze/data/data-access.js +19 -15
- package/lib/analyze/data/data-access.js.map +1 -1
- package/lib/analyze/data/method-calls.d.ts +1 -1
- package/lib/analyze/data/method-calls.d.ts.map +1 -1
- package/lib/analyze/data/method-calls.js +5 -5
- package/lib/analyze/data/method-calls.js.map +1 -1
- package/lib/analyze/data/utils.d.ts +3 -3
- package/lib/analyze/data/utils.d.ts.map +1 -1
- package/lib/analyze/data/utils.js +6 -5
- package/lib/analyze/data/utils.js.map +1 -1
- package/lib/analyze/index.d.ts +1 -1
- package/lib/analyze/index.d.ts.map +1 -1
- package/lib/analyze/index.js +1 -1
- package/lib/analyze/index.js.map +1 -1
- package/lib/analyze/jsx/analyze.d.ts +1 -1
- package/lib/analyze/jsx/analyze.d.ts.map +1 -1
- package/lib/analyze/jsx/analyze.js +4 -4
- package/lib/analyze/jsx/analyze.js.map +1 -1
- package/lib/analyze/jsx/element-attributes.d.ts +1 -1
- package/lib/analyze/jsx/element-attributes.d.ts.map +1 -1
- package/lib/analyze/jsx/element-attributes.js +3 -3
- package/lib/analyze/jsx/element-attributes.js.map +1 -1
- package/lib/analyze/jsx/element-children.d.ts +1 -1
- package/lib/analyze/jsx/element-children.d.ts.map +1 -1
- package/lib/analyze/jsx/element-children.js +3 -3
- package/lib/analyze/jsx/element-children.js.map +1 -1
- package/lib/analyze/jsx/element-tags.d.ts +1 -1
- package/lib/analyze/jsx/element-tags.d.ts.map +1 -1
- package/lib/analyze/jsx/element-tags.js +2 -2
- package/lib/analyze/jsx/element-tags.js.map +1 -1
- package/lib/analyze/security/analyze.d.ts +1 -1
- package/lib/analyze/security/analyze.d.ts.map +1 -1
- package/lib/analyze/security/analyze.js +4 -4
- package/lib/analyze/security/analyze.js.map +1 -1
- package/lib/analyze/security/call-expressions.d.ts +1 -1
- package/lib/analyze/security/call-expressions.d.ts.map +1 -1
- package/lib/analyze/security/call-expressions.js +3 -5
- package/lib/analyze/security/call-expressions.js.map +1 -1
- package/lib/analyze/security/declarations.d.ts +1 -1
- package/lib/analyze/security/declarations.d.ts.map +1 -1
- package/lib/analyze/security/declarations.js +6 -6
- package/lib/analyze/security/declarations.js.map +1 -1
- package/lib/analyze/security/expressions.d.ts +1 -1
- package/lib/analyze/security/expressions.d.ts.map +1 -1
- package/lib/analyze/security/expressions.js +3 -6
- package/lib/analyze/security/expressions.js.map +1 -1
- package/lib/analyze/security/identifiers.d.ts +1 -1
- package/lib/analyze/security/identifiers.d.ts.map +1 -1
- package/lib/analyze/security/identifiers.js +19 -22
- package/lib/analyze/security/identifiers.js.map +1 -1
- package/lib/analyze/utils.d.ts +4 -4
- package/lib/analyze/utils.d.ts.map +1 -1
- package/lib/analyze/utils.js +5 -3
- package/lib/analyze/utils.js.map +1 -1
- package/lib/analyze/validation-context.d.ts +8 -8
- package/lib/analyze/validation-context.d.ts.map +1 -1
- package/lib/analyze/validation-context.js +23 -21
- package/lib/analyze/validation-context.js.map +1 -1
- package/lib/builtins.d.ts +6 -6
- package/lib/builtins.d.ts.map +1 -1
- package/lib/builtins.js +9 -8
- package/lib/builtins.js.map +1 -1
- package/lib/codegen/builtins/builtin-types.d.ts.map +1 -1
- package/lib/codegen/builtins/builtin-types.js +9 -13
- package/lib/codegen/builtins/builtin-types.js.map +1 -1
- package/lib/codegen/generate-typescript-definitions.d.ts +18 -17
- package/lib/codegen/generate-typescript-definitions.d.ts.map +1 -1
- package/lib/codegen/generate-typescript-definitions.js +19 -23
- package/lib/codegen/generate-typescript-definitions.js.map +1 -1
- package/lib/codegen/schema/component-types.d.ts.map +1 -1
- package/lib/codegen/schema/component-types.js +7 -4
- package/lib/codegen/schema/component-types.js.map +1 -1
- package/lib/codegen/schema/data-types.d.ts.map +1 -1
- package/lib/codegen/schema/data-types.js +1 -1
- package/lib/codegen/schema/data-types.js.map +1 -1
- package/lib/codegen/schema/function-types.d.ts.map +1 -1
- package/lib/codegen/schema/function-types.js +1 -3
- package/lib/codegen/schema/function-types.js.map +1 -1
- package/lib/codegen/schema/utils.d.ts +4 -3
- package/lib/codegen/schema/utils.d.ts.map +1 -1
- package/lib/codegen/schema/utils.js +12 -8
- package/lib/codegen/schema/utils.js.map +1 -1
- package/lib/compile/compilation-error.d.ts +1 -1
- package/lib/compile/compilation-error.d.ts.map +1 -1
- package/lib/compile/compilation-error.js +3 -1
- package/lib/compile/compilation-error.js.map +1 -1
- package/lib/compile/compile.d.ts.map +1 -1
- package/lib/compile/compile.js +5 -11
- package/lib/compile/compile.js.map +1 -1
- package/lib/evaluate/evaluate.d.ts +6 -6
- package/lib/evaluate/evaluate.d.ts.map +1 -1
- package/lib/evaluate/evaluate.js +1 -1
- package/lib/evaluate/evaluate.js.map +1 -1
- package/lib/evaluate/evaluation-error.d.ts.map +1 -1
- package/lib/evaluate/evaluation-error.js +1 -0
- package/lib/evaluate/evaluation-error.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/jsx.d.ts +3 -3
- package/lib/jsx.d.ts.map +1 -1
- package/lib/jsx.js.map +1 -1
- package/lib/parse/parse-error.d.ts.map +1 -1
- package/lib/parse/parse-error.js +1 -0
- package/lib/parse/parse-error.js.map +1 -1
- package/lib/render.d.ts +25 -33
- package/lib/render.d.ts.map +1 -1
- package/lib/render.js +21 -26
- package/lib/render.js.map +1 -1
- package/lib/schema.d.ts +9 -9
- package/lib/schema.d.ts.map +1 -1
- package/lib/schema.js +1 -1
- package/lib/schema.js.map +1 -1
- package/lib/traverse.d.ts.map +1 -1
- package/lib/traverse.js.map +1 -1
- package/lib/validate.d.ts +14 -17
- package/lib/validate.d.ts.map +1 -1
- package/lib/validate.js +13 -14
- package/lib/validate.js.map +1 -1
- package/package.json +14 -14
- package/src/analyze/analysis-error.ts +2 -6
- package/src/analyze/analysis-report.ts +73 -62
- package/src/analyze/analyze.test.ts +14 -18
- package/src/analyze/analyze.ts +4 -4
- package/src/analyze/data/analyze.ts +5 -8
- package/src/analyze/data/data-access.ts +49 -46
- package/src/analyze/data/method-calls.ts +9 -18
- package/src/analyze/data/utils.ts +15 -19
- package/src/analyze/index.ts +1 -1
- package/src/analyze/jsx/analyze.ts +4 -4
- package/src/analyze/jsx/element-attributes.ts +5 -18
- package/src/analyze/jsx/element-children.ts +4 -8
- package/src/analyze/jsx/element-tags.ts +2 -2
- package/src/analyze/security/analyze.ts +4 -4
- package/src/analyze/security/call-expressions.ts +5 -18
- package/src/analyze/security/declarations.ts +14 -43
- package/src/analyze/security/expressions.ts +12 -49
- package/src/analyze/security/identifiers.ts +37 -39
- package/src/analyze/utils.ts +25 -19
- package/src/analyze/validation-context.ts +32 -23
- package/src/builtins.ts +27 -38
- package/src/codegen/builtins/builtin-types.ts +13 -20
- package/src/codegen/generate-typescript-definitions.test.ts +6 -6
- package/src/codegen/generate-typescript-definitions.ts +19 -23
- package/src/codegen/schema/component-types.ts +22 -12
- package/src/codegen/schema/data-types.ts +6 -6
- package/src/codegen/schema/function-types.ts +1 -3
- package/src/codegen/schema/utils.ts +24 -23
- package/src/compile/compilation-error.ts +5 -1
- package/src/compile/compile.test.ts +7 -21
- package/src/compile/compile.ts +18 -30
- package/src/evaluate/evaluate.test.ts +76 -92
- package/src/evaluate/evaluate.ts +15 -20
- package/src/evaluate/evaluation-error.ts +1 -0
- package/src/index.ts +1 -7
- package/src/jsx.ts +4 -6
- package/src/parse/parse-error.ts +1 -0
- package/src/parse/parse.test.ts +1 -1
- package/src/render.test.ts +4 -4
- package/src/render.ts +26 -38
- package/src/schema.ts +11 -11
- package/src/traverse.test.ts +6 -6
- package/src/traverse.ts +3 -3
- package/src/validate.ts +14 -17
- package/CHANGELOG.md +0 -8
package/lib/render.js
CHANGED
|
@@ -1,12 +1,30 @@
|
|
|
1
|
+
import { analyze, AnalysisError } from "./analyze/index.js";
|
|
1
2
|
import { compile as compileInternal } from "./compile/index.js";
|
|
2
3
|
import { evaluate } from "./evaluate/evaluate.js";
|
|
3
4
|
import { parse } from "./parse/index.js";
|
|
4
|
-
import { analyze, AnalysisError } from "./analyze/index.js";
|
|
5
5
|
/**
|
|
6
6
|
* Renders a JSX expression with data validation and security constraints.
|
|
7
7
|
*
|
|
8
|
-
* Parses JSX source code, validates it against a schema for security and type safety,
|
|
9
|
-
*
|
|
8
|
+
* Parses JSX source code, validates it against a schema for security and type safety, compiles it to executable code, and evaluates it with the
|
|
9
|
+
* provided data and components.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const schema: Schema = {
|
|
14
|
+
* data: {
|
|
15
|
+
* user: { type: "object", shape: { name: { type: "string" } } },
|
|
16
|
+
* },
|
|
17
|
+
* elements: {
|
|
18
|
+
* Text: { props: { children: { type: "string" } } },
|
|
19
|
+
* },
|
|
20
|
+
* };
|
|
21
|
+
*
|
|
22
|
+
* const result = render("<Text>Hello {user.name}!</Text>", schema, {
|
|
23
|
+
* data: { user: { name: "World" } },
|
|
24
|
+
* components: { Text: ({ children }) => children },
|
|
25
|
+
* createElement: (type, props, ...children) => ({ type, props, children }),
|
|
26
|
+
* });
|
|
27
|
+
* ```;
|
|
10
28
|
*
|
|
11
29
|
* @template T - The return type of the rendered JSX (e.g., ReactElement, VNode, string)
|
|
12
30
|
* @param source - JSX expression source code to render (e.g., `"<Text x={user.name}>Hello</Text>"`)
|
|
@@ -17,30 +35,7 @@ import { analyze, AnalysisError } from "./analyze/index.js";
|
|
|
17
35
|
* @param options.createElement - Function to create elements (e.g., React.createElement)
|
|
18
36
|
* @param options.minSeverity - Minimum severity (1=info, 2=warning, 3=error) required to abort rendering; defaults to `3`
|
|
19
37
|
* @returns The rendered JSX element of type T
|
|
20
|
-
*
|
|
21
38
|
* @throws {AnalysisError} When JSX contains security violations, invalid data access, or schema mismatches
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```typescript
|
|
25
|
-
* const schema: Schema = {
|
|
26
|
-
* data: {
|
|
27
|
-
* user: { type: "object", shape: { name: { type: "string" } } }
|
|
28
|
-
* },
|
|
29
|
-
* elements: {
|
|
30
|
-
* Text: { props: { children: { type: "string" } } }
|
|
31
|
-
* }
|
|
32
|
-
* };
|
|
33
|
-
*
|
|
34
|
-
* const result = render(
|
|
35
|
-
* "<Text>Hello {user.name}!</Text>",
|
|
36
|
-
* schema,
|
|
37
|
-
* {
|
|
38
|
-
* data: { user: { name: "World" } },
|
|
39
|
-
* components: { Text: ({ children }) => children },
|
|
40
|
-
* createElement: (type, props, ...children) => ({ type, props, children })
|
|
41
|
-
* }
|
|
42
|
-
* );
|
|
43
|
-
* ```
|
|
44
39
|
*/
|
|
45
40
|
export function render(source, schema, { minSeverity = 3, ...options } = {}) {
|
|
46
41
|
const ast = parse(source);
|
package/lib/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAezC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,MAAM,CAAc,MAAc,EAAE,MAAc,EAAE,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAqB,EAAE;IACxH,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEpC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,MAAM,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,OAAO,CAAc,MAAc,EAAE,MAAc,EAAE,EAAE,WAAW,GAAG,CAAC,EAAE,GAAqB,EAAE;IAC7G,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,MAAM,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
|
package/lib/schema.d.ts
CHANGED
|
@@ -4,21 +4,21 @@ export type StringPropertySchema = {
|
|
|
4
4
|
description?: string;
|
|
5
5
|
required?: boolean;
|
|
6
6
|
default?: string;
|
|
7
|
-
enum?:
|
|
7
|
+
enum?: ReadonlyArray<string>;
|
|
8
8
|
};
|
|
9
9
|
export type NumberPropertySchema = {
|
|
10
10
|
type: "number";
|
|
11
11
|
description?: string;
|
|
12
12
|
required?: boolean;
|
|
13
13
|
default?: number;
|
|
14
|
-
enum?:
|
|
14
|
+
enum?: ReadonlyArray<number>;
|
|
15
15
|
};
|
|
16
16
|
export type BooleanPropertySchema = {
|
|
17
17
|
type: "boolean";
|
|
18
18
|
description?: string;
|
|
19
19
|
required?: boolean;
|
|
20
20
|
default?: boolean;
|
|
21
|
-
enum?:
|
|
21
|
+
enum?: ReadonlyArray<boolean>;
|
|
22
22
|
};
|
|
23
23
|
export type FunctionPropertySchema = {
|
|
24
24
|
type: "function";
|
|
@@ -53,7 +53,7 @@ export type PropertySchema = StringPropertySchema | NumberPropertySchema | Boole
|
|
|
53
53
|
export type ElementSchema = {
|
|
54
54
|
description?: string;
|
|
55
55
|
props?: Record<string, PropertySchema>;
|
|
56
|
-
allowedChildren?: string
|
|
56
|
+
allowedChildren?: Array<string>;
|
|
57
57
|
};
|
|
58
58
|
export type ArgumentSchema = {
|
|
59
59
|
name: string;
|
|
@@ -74,16 +74,16 @@ export declare function serializePropertySchemaToJson(schema: PropertySchema): s
|
|
|
74
74
|
export declare function deserializePropertySchemaFromJson(json: string): PropertySchema | undefined;
|
|
75
75
|
export declare function isElementAllowed(schema: Schema, tagName: string): boolean;
|
|
76
76
|
export declare function getElementSchema(schema: Schema, tagName: string): ElementSchema | undefined;
|
|
77
|
-
export declare function getAllowedAttributes(schema: Schema, tagName: string): string
|
|
77
|
+
export declare function getAllowedAttributes(schema: Schema, tagName: string): Array<string>;
|
|
78
78
|
export declare function isAttributeAllowed(schema: Schema, tagName: string, attributeName: string): boolean;
|
|
79
|
-
export declare function getAllowedChildren(schema: Schema, tagName: string): string
|
|
79
|
+
export declare function getAllowedChildren(schema: Schema, tagName: string): Array<string> | undefined;
|
|
80
80
|
export declare function canHaveChildren(schema: Schema, tagName: string): boolean;
|
|
81
81
|
export declare function isSelfClosing(schema: Schema, tagName: string): boolean;
|
|
82
82
|
export declare function isChildAllowed(schema: Schema, parentTag: string, childTag: string): boolean;
|
|
83
|
-
export declare function getAllElements(schema: Schema): string
|
|
83
|
+
export declare function getAllElements(schema: Schema): Array<string>;
|
|
84
84
|
export declare function getAttributeSchema(schema: Schema, tagName: string, attributeName: string): PropertySchema | undefined;
|
|
85
|
-
export declare function getRequiredAttributes(schema: Schema, tagName: string): string
|
|
85
|
+
export declare function getRequiredAttributes(schema: Schema, tagName: string): Array<string>;
|
|
86
86
|
type PropertyEnumValue = string | number | boolean;
|
|
87
|
-
export declare function getEnumValues(property: PropertySchema):
|
|
87
|
+
export declare function getEnumValues(property: PropertySchema): ReadonlyArray<PropertyEnumValue> | undefined;
|
|
88
88
|
export {};
|
|
89
89
|
//# sourceMappingURL=schema.d.ts.map
|
package/lib/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/lib/schema.js
CHANGED
|
@@ -93,7 +93,7 @@ export function canHaveChildren(schema, tagName) {
|
|
|
93
93
|
}
|
|
94
94
|
export function isSelfClosing(schema, tagName) {
|
|
95
95
|
const allowedChildren = getAllowedChildren(schema, tagName);
|
|
96
|
-
return allowedChildren
|
|
96
|
+
return allowedChildren?.length === 0;
|
|
97
97
|
}
|
|
98
98
|
export function isChildAllowed(schema, parentTag, childTag) {
|
|
99
99
|
const allowedChildren = getAllowedChildren(schema, parentTag);
|
package/lib/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/lib/traverse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,OAAO,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAgC,KAAK,cAAc,EAA+B,MAAM,YAAY,CAAC;AAC5G,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAIlB,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAW1D,KAAK,sBAAsB,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG;IACtD,YAAY,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACvC,sBAAsB,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC/D,WAAW,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACrD,kBAAkB,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CACxD,CAAC;AA4HF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAM7E"}
|
package/lib/traverse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse.js","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAA+C,MAAM,
|
|
1
|
+
{"version":3,"file":"traverse.js","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"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"}
|
package/lib/validate.d.ts
CHANGED
|
@@ -8,34 +8,31 @@ export type ValidateResult = {
|
|
|
8
8
|
error: AnalysisError | ParseError;
|
|
9
9
|
};
|
|
10
10
|
export interface ValidateOptions {
|
|
11
|
-
/**
|
|
12
|
-
* Minimum severity level that counts as a failure: 1=info, 2=warning, 3=error.
|
|
13
|
-
*/
|
|
11
|
+
/** Minimum severity level that counts as a failure: 1=info, 2=warning, 3=error. */
|
|
14
12
|
minSeverity?: 1 | 2 | 3;
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
17
15
|
* Validates JSX expression syntax and schema compliance without execution.
|
|
18
16
|
*
|
|
19
|
-
* Performs static analysis to check if JSX source code is valid according to the schema.
|
|
20
|
-
*
|
|
21
|
-
* and data access pattern validation - all without needing actual data or components.
|
|
17
|
+
* Performs static analysis to check if JSX source code is valid according to the schema. This includes syntax validation, security constraints, JSX
|
|
18
|
+
* element/attribute validation, and data access pattern validation - all without needing actual data or components.
|
|
22
19
|
*
|
|
23
20
|
* This function parses the source code and returns a simple ok/error result.
|
|
24
21
|
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const result = validate("<Text>{user.name}</Text>", schema);
|
|
25
|
+
* if (result.ok) {
|
|
26
|
+
* console.log("JSX is valid!");
|
|
27
|
+
* } else {
|
|
28
|
+
* console.error("Validation failed with", result.report.errors.length, "errors");
|
|
29
|
+
* result.report.errors.forEach((err) => console.error(err.message));
|
|
30
|
+
* }
|
|
31
|
+
* ```;
|
|
32
|
+
*
|
|
25
33
|
* @param source - JSX expression source code to validate
|
|
26
34
|
* @param schema - Schema defining allowed data properties, JSX elements, and hierarchy rules
|
|
27
35
|
* @returns Validation result indicating success or failure with parse or analysis error
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* ```typescript
|
|
31
|
-
* const result = validate("<Text>{user.name}</Text>", schema);
|
|
32
|
-
* if (result.ok) {
|
|
33
|
-
* console.log("JSX is valid!");
|
|
34
|
-
* } else {
|
|
35
|
-
* console.error("Validation failed with", result.report.errors.length, "errors");
|
|
36
|
-
* result.report.errors.forEach(err => console.error(err.message));
|
|
37
|
-
* }
|
|
38
|
-
* ```
|
|
39
36
|
*/
|
|
40
37
|
export declare function validate(source: string, schema: Schema, { minSeverity }?: ValidateOptions): ValidateResult;
|
|
41
38
|
//# sourceMappingURL=validate.d.ts.map
|
package/lib/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAS,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAAA;CAAE,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAS,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAAA;CAAE,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACzB;AACD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAEd,EAAE,WAAe,EAAE,GAAE,eAAoB,GACxC,cAAc,CAiBhB"}
|
package/lib/validate.js
CHANGED
|
@@ -3,26 +3,25 @@ import { parse, ParseError } from "./parse/index.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Validates JSX expression syntax and schema compliance without execution.
|
|
5
5
|
*
|
|
6
|
-
* Performs static analysis to check if JSX source code is valid according to the schema.
|
|
7
|
-
*
|
|
8
|
-
* and data access pattern validation - all without needing actual data or components.
|
|
6
|
+
* Performs static analysis to check if JSX source code is valid according to the schema. This includes syntax validation, security constraints, JSX
|
|
7
|
+
* element/attribute validation, and data access pattern validation - all without needing actual data or components.
|
|
9
8
|
*
|
|
10
9
|
* This function parses the source code and returns a simple ok/error result.
|
|
11
10
|
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const result = validate("<Text>{user.name}</Text>", schema);
|
|
14
|
+
* if (result.ok) {
|
|
15
|
+
* console.log("JSX is valid!");
|
|
16
|
+
* } else {
|
|
17
|
+
* console.error("Validation failed with", result.report.errors.length, "errors");
|
|
18
|
+
* result.report.errors.forEach((err) => console.error(err.message));
|
|
19
|
+
* }
|
|
20
|
+
* ```;
|
|
21
|
+
*
|
|
12
22
|
* @param source - JSX expression source code to validate
|
|
13
23
|
* @param schema - Schema defining allowed data properties, JSX elements, and hierarchy rules
|
|
14
24
|
* @returns Validation result indicating success or failure with parse or analysis error
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const result = validate("<Text>{user.name}</Text>", schema);
|
|
19
|
-
* if (result.ok) {
|
|
20
|
-
* console.log("JSX is valid!");
|
|
21
|
-
* } else {
|
|
22
|
-
* console.error("Validation failed with", result.report.errors.length, "errors");
|
|
23
|
-
* result.report.errors.forEach(err => console.error(err.message));
|
|
24
|
-
* }
|
|
25
|
-
* ```
|
|
26
25
|
*/
|
|
27
26
|
export function validate(source, schema, { minSeverity = 3 } = {}) {
|
|
28
27
|
try {
|
package/lib/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASrD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAc,EACd,MAAc,EAEd,EAAE,WAAW,GAAG,CAAC,EAAE,GAAoB,EAAE;IAEzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEpC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,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,UAAU,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,31 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jsxpression",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"gitHead": "d98928b5dbdc9fd2eab49956969f56e27d57aeb2",
|
|
4
5
|
"description": "Validate and safely render JSX expressions",
|
|
6
|
+
"license": "MIT",
|
|
5
7
|
"author": "Divid AB <info@divid.se>",
|
|
6
8
|
"repository": "https://github.com/dividab/abstract-visuals/tree/master/packages/jsxpression",
|
|
7
|
-
"license": "MIT",
|
|
8
|
-
"main": "lib/index.js",
|
|
9
|
-
"sideEffects": false,
|
|
10
|
-
"type": "module",
|
|
11
|
-
"types": "lib/index",
|
|
12
|
-
"exports": {
|
|
13
|
-
".": "./lib/index.js"
|
|
14
|
-
},
|
|
15
|
-
"scripts": {
|
|
16
|
-
"test": "vitest run src/**/*.test.ts"
|
|
17
|
-
},
|
|
18
9
|
"files": [
|
|
19
10
|
"/lib",
|
|
20
11
|
"/src",
|
|
21
12
|
"README.md",
|
|
22
13
|
"package.json"
|
|
23
14
|
],
|
|
15
|
+
"type": "module",
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"main": "lib/index.js",
|
|
18
|
+
"types": "lib/index",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": "./lib/index.js"
|
|
21
|
+
},
|
|
24
22
|
"dependencies": {
|
|
25
23
|
"acorn": "8.15.0",
|
|
26
24
|
"acorn-typescript": "1.4.13",
|
|
27
25
|
"acorn-walk": "8.3.4",
|
|
28
26
|
"zod": "^4.4.3"
|
|
29
27
|
},
|
|
30
|
-
"
|
|
31
|
-
|
|
28
|
+
"scripts": {
|
|
29
|
+
"test": "vitest run src/**/*.test.ts"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import type { AnalysisReport } from "./analysis-report.js";
|
|
2
2
|
|
|
3
|
+
// oxlint-disable-next-line functional/no-classes -- extends Error, which requires a class
|
|
3
4
|
export class AnalysisError extends Error {
|
|
4
5
|
static fromReport(report: AnalysisReport): AnalysisError {
|
|
5
|
-
|
|
6
|
-
if (report.errors.length === 1) {
|
|
7
|
-
message = report.errors[0].message;
|
|
8
|
-
} else {
|
|
9
|
-
message = `Analysis failed (${report.errors.length} issues)`;
|
|
10
|
-
}
|
|
6
|
+
const message: string = report.errors.length === 1 ? report.errors[0].message : `Analysis failed (${report.errors.length} issues)`;
|
|
11
7
|
|
|
12
8
|
return new AnalysisError(message, report);
|
|
13
9
|
}
|
|
@@ -9,7 +9,7 @@ interface Issue {
|
|
|
9
9
|
severity: IssueSeverity;
|
|
10
10
|
custom: boolean;
|
|
11
11
|
range: Range;
|
|
12
|
-
suggestions: string
|
|
12
|
+
suggestions: Array<string>;
|
|
13
13
|
snapshot: ValidationContextSnapshot;
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -167,66 +167,77 @@ const ISSUES_DEFINITIONS: Record<string, IssueDefinition> = {
|
|
|
167
167
|
|
|
168
168
|
export type IssueCode = keyof typeof ISSUES_DEFINITIONS;
|
|
169
169
|
|
|
170
|
-
export
|
|
171
|
-
readonly
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
custom
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
170
|
+
export interface AnalysisReport {
|
|
171
|
+
readonly issues: Array<Issue>;
|
|
172
|
+
readonly errors: Array<Issue>;
|
|
173
|
+
readonly warnings: Array<Issue>;
|
|
174
|
+
readonly infos: Array<Issue>;
|
|
175
|
+
readonly hasErrors: boolean;
|
|
176
|
+
readonly hasWarnings: boolean;
|
|
177
|
+
readonly hasInfos: boolean;
|
|
178
|
+
addIssue: (code: IssueCode, message: string, range: Range, snapshot: ValidationContextSnapshot, suggestions?: Array<string>) => void;
|
|
179
|
+
hasIssues: (minSeverity?: IssueSeverity) => boolean;
|
|
180
|
+
merge: (...analysisReports: Array<AnalysisReport>) => AnalysisReport;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function createAnalysisReport(): AnalysisReport {
|
|
184
|
+
const issues: Array<Issue> = [];
|
|
185
|
+
|
|
186
|
+
const self: AnalysisReport = {
|
|
187
|
+
get issues(): Array<Issue> {
|
|
188
|
+
return issues.slice();
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
get errors(): Array<Issue> {
|
|
192
|
+
return issues.filter((issue) => issue.severity === 3);
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
get warnings(): Array<Issue> {
|
|
196
|
+
return issues.filter((issue) => issue.severity === 2);
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
get infos(): Array<Issue> {
|
|
200
|
+
return issues.filter((issue) => issue.severity === 1);
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
get hasErrors(): boolean {
|
|
204
|
+
return self.errors.length > 0;
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
get hasWarnings(): boolean {
|
|
208
|
+
return self.warnings.length > 0;
|
|
209
|
+
},
|
|
210
|
+
|
|
211
|
+
get hasInfos(): boolean {
|
|
212
|
+
return self.infos.length > 0;
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
addIssue(code: IssueCode, message: string, range: Range, snapshot: ValidationContextSnapshot, suggestions: Array<string> = []): void {
|
|
216
|
+
const { severity, custom } = ISSUES_DEFINITIONS[code];
|
|
217
|
+
issues.push({
|
|
218
|
+
code,
|
|
219
|
+
message,
|
|
220
|
+
range,
|
|
221
|
+
snapshot,
|
|
222
|
+
suggestions,
|
|
223
|
+
severity,
|
|
224
|
+
custom,
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
hasIssues(minSeverity: IssueSeverity = 3): boolean {
|
|
229
|
+
return issues.some((issue) => issue.severity >= minSeverity);
|
|
230
|
+
},
|
|
231
|
+
|
|
232
|
+
merge(...analysisReports: Array<AnalysisReport>): AnalysisReport {
|
|
233
|
+
for (const analysisReport of analysisReports) {
|
|
234
|
+
for (const issue of analysisReport.issues) {
|
|
235
|
+
self.addIssue(issue.code, issue.message, issue.range, issue.snapshot, issue.suggestions);
|
|
236
|
+
}
|
|
228
237
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
238
|
+
return self;
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
return self;
|
|
232
243
|
}
|
|
@@ -169,9 +169,7 @@ describe("analyze - consolidated tests", () => {
|
|
|
169
169
|
const ast = parse("<Text>{items[variable]}</Text>");
|
|
170
170
|
const result = analyze(ast, baseSchema);
|
|
171
171
|
expect(result.hasErrors).toBe(true);
|
|
172
|
-
expect(result.errors.some((e) => e.message.includes("variable") || e.message.includes("not allowed"))).toBe(
|
|
173
|
-
true
|
|
174
|
-
);
|
|
172
|
+
expect(result.errors.some((e) => e.message.includes("variable") || e.message.includes("not allowed"))).toBe(true);
|
|
175
173
|
});
|
|
176
174
|
|
|
177
175
|
it("should block string-based computed access on objects", () => {
|
|
@@ -230,17 +228,13 @@ describe("analyze - consolidated tests", () => {
|
|
|
230
228
|
});
|
|
231
229
|
|
|
232
230
|
it("should handle complex nested scenarios", () => {
|
|
233
|
-
const ast = parse(
|
|
234
|
-
"<Text>{departments.map((dept) => dept.employees.map((employee) => employee.salary))}</Text>"
|
|
235
|
-
);
|
|
231
|
+
const ast = parse("<Text>{departments.map((dept) => dept.employees.map((employee) => employee.salary))}</Text>");
|
|
236
232
|
const result = analyze(ast, baseSchema);
|
|
237
233
|
expect(result.hasErrors).toBe(false);
|
|
238
234
|
});
|
|
239
235
|
|
|
240
236
|
it("should detect typos in complex nested scenarios", () => {
|
|
241
|
-
const ast = parse(
|
|
242
|
-
"<Text>{departments.map((dept) => dept.employees.map((employee) => employee.saladry))}</Text>"
|
|
243
|
-
);
|
|
237
|
+
const ast = parse("<Text>{departments.map((dept) => dept.employees.map((employee) => employee.saladry))}</Text>");
|
|
244
238
|
const result = analyze(ast, baseSchema);
|
|
245
239
|
expect(result.hasErrors).toBe(true);
|
|
246
240
|
expect(result.errors[0].message).toContain("Property 'saladry' does not exist on parameter 'employee'");
|
|
@@ -256,14 +250,16 @@ describe("analyze - consolidated tests", () => {
|
|
|
256
250
|
|
|
257
251
|
// Test each builtin object (Math, Array.prototype, String.prototype)
|
|
258
252
|
Object.entries(builtins).forEach(([objectName, schema]) => {
|
|
259
|
-
if (!schema.methods)
|
|
253
|
+
if (!schema.methods) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
260
256
|
|
|
261
257
|
describe(`${objectName} methods`, () => {
|
|
262
258
|
Object.entries(schema.methods!).forEach(([methodName, methodDef]) => {
|
|
263
259
|
const displayName = objectName === "Math" ? `Math.${methodName}` : methodName;
|
|
264
260
|
|
|
265
261
|
it(`should allow ${displayName} with valid parameters`, () => {
|
|
266
|
-
let testExpression: string;
|
|
262
|
+
let testExpression: string = "";
|
|
267
263
|
|
|
268
264
|
if (objectName === "Math") {
|
|
269
265
|
// Math methods
|
|
@@ -327,7 +323,7 @@ describe("analyze - consolidated tests", () => {
|
|
|
327
323
|
|
|
328
324
|
if (requiredParams.length > 0) {
|
|
329
325
|
it(`should validate ${displayName} minimum parameters`, () => {
|
|
330
|
-
let testExpression: string;
|
|
326
|
+
let testExpression: string = "";
|
|
331
327
|
|
|
332
328
|
if (objectName === "Math") {
|
|
333
329
|
testExpression = `<Text>{Math.${methodName}()}</Text>`;
|
|
@@ -342,9 +338,7 @@ describe("analyze - consolidated tests", () => {
|
|
|
342
338
|
const ast = parse(testExpression);
|
|
343
339
|
const result = analyze(ast, baseSchema);
|
|
344
340
|
expect(result.hasWarnings).toBe(true);
|
|
345
|
-
expect(result.warnings[0].message).toContain(
|
|
346
|
-
`${displayName} expects at least ${requiredParams.length} parameter`
|
|
347
|
-
);
|
|
341
|
+
expect(result.warnings[0].message).toContain(`${displayName} expects at least ${requiredParams.length} parameter`);
|
|
348
342
|
});
|
|
349
343
|
}
|
|
350
344
|
|
|
@@ -357,7 +351,7 @@ describe("analyze - consolidated tests", () => {
|
|
|
357
351
|
.fill("1")
|
|
358
352
|
.join(", ");
|
|
359
353
|
|
|
360
|
-
let testExpression: string;
|
|
354
|
+
let testExpression: string = "";
|
|
361
355
|
|
|
362
356
|
if (objectName === "Math") {
|
|
363
357
|
testExpression = `<Text>{Math.${methodName}(${extraParams})}</Text>`;
|
|
@@ -388,12 +382,14 @@ describe("analyze - consolidated tests", () => {
|
|
|
388
382
|
const builtins = getBuiltins();
|
|
389
383
|
|
|
390
384
|
Object.entries(builtins).forEach(([objectName, schema]) => {
|
|
391
|
-
if (!schema.properties)
|
|
385
|
+
if (!schema.properties) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
392
388
|
|
|
393
389
|
describe(`${objectName} properties`, () => {
|
|
394
390
|
Object.entries(schema.properties!).forEach(([propName, propDef]) => {
|
|
395
391
|
it(`should allow ${objectName}.${propName} property access`, () => {
|
|
396
|
-
let testExpression: string;
|
|
392
|
+
let testExpression: string = "";
|
|
397
393
|
|
|
398
394
|
if (objectName === "Array.prototype") {
|
|
399
395
|
testExpression = `<Text>{items.${propName}}</Text>`;
|
package/src/analyze/analyze.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Program } from "acorn";
|
|
2
2
|
import type { Schema } from "../schema.js";
|
|
3
|
-
import { AnalysisReport } from "./analysis-report.js";
|
|
4
|
-
import { analyzeSecurity } from "./security/index.js";
|
|
5
|
-
import { analyzeJsx } from "./jsx/index.js";
|
|
3
|
+
import { createAnalysisReport, type AnalysisReport } from "./analysis-report.js";
|
|
6
4
|
import { analyzeData } from "./data/index.js";
|
|
5
|
+
import { analyzeJsx } from "./jsx/index.js";
|
|
6
|
+
import { analyzeSecurity } from "./security/index.js";
|
|
7
7
|
|
|
8
8
|
export function analyze(ast: Program, schema: Schema): AnalysisReport {
|
|
9
|
-
return
|
|
9
|
+
return createAnalysisReport().merge(analyzeSecurity(ast, schema), analyzeJsx(ast, schema), analyzeData(ast, schema));
|
|
10
10
|
}
|