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
package/lib/analyze/index.js
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var analyze_js_1 = require("./analyze.js");
|
|
5
|
-
Object.defineProperty(exports, "analyze", { enumerable: true, get: function () { return analyze_js_1.analyze; } });
|
|
6
|
-
var analysis_error_js_1 = require("./analysis-error.js");
|
|
7
|
-
Object.defineProperty(exports, "AnalysisError", { enumerable: true, get: function () { return analysis_error_js_1.AnalysisError; } });
|
|
8
|
-
var analysis_report_js_1 = require("./analysis-report.js");
|
|
9
|
-
Object.defineProperty(exports, "AnalysisReport", { enumerable: true, get: function () { return analysis_report_js_1.AnalysisReport; } });
|
|
1
|
+
export { analyze } from "./analyze.js";
|
|
2
|
+
export { AnalysisError } from "./analysis-error.js";
|
|
3
|
+
export { AnalysisReport } from "./analysis-report.js";
|
|
10
4
|
//# sourceMappingURL=index.js.map
|
package/lib/analyze/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
function analyzeJsx(ast, schema) {
|
|
10
|
-
const validationContext = new validation_context_js_1.ValidationContext();
|
|
11
|
-
return new analysis_report_js_1.AnalysisReport().merge((0, element_tags_js_1.analyzeElementTags)(ast, schema, validationContext), (0, element_attributes_js_1.analyzeElementAttributes)(ast, schema, validationContext), (0, element_children_js_1.analyzeElementChildren)(ast, schema, validationContext));
|
|
1
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
2
|
+
import { ValidationContext } from "../validation-context.js";
|
|
3
|
+
import { analyzeElementAttributes } from "./element-attributes.js";
|
|
4
|
+
import { analyzeElementChildren } from "./element-children.js";
|
|
5
|
+
import { analyzeElementTags } from "./element-tags.js";
|
|
6
|
+
export function analyzeJsx(ast, schema) {
|
|
7
|
+
const validationContext = new ValidationContext();
|
|
8
|
+
return new AnalysisReport().merge(analyzeElementTags(ast, schema, validationContext), analyzeElementAttributes(ast, schema, validationContext), analyzeElementChildren(ast, schema, validationContext));
|
|
12
9
|
}
|
|
13
10
|
//# sourceMappingURL=analyze.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/analyze/jsx/analyze.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/analyze/jsx/analyze.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,MAAc;IACrD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAElD,OAAO,IAAI,cAAc,EAAE,CAAC,KAAK,CAC/B,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAClD,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EACxD,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,CACvD,CAAC;AACJ,CAAC"}
|
|
@@ -1,29 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
function analyzeElementAttributes(ast, schema, validationContext) {
|
|
10
|
-
const analysisReport = new analysis_report_js_1.AnalysisReport();
|
|
11
|
-
(0, traverse_js_1.traverse)(ast, {
|
|
1
|
+
import { traverse } from "../../traverse.js";
|
|
2
|
+
import { isAttributeAllowed, getAllowedAttributes, getRequiredAttributes, getAttributeSchema, getEnumValues, } from "../../schema.js";
|
|
3
|
+
import { isJsxAttribute, isJsxExpressionContainer } from "../../jsx.js";
|
|
4
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
5
|
+
import { getNodeRange, getAttributeSimilarityMatchers, getBestSimilarityMatcherSuggestion } from "../utils.js";
|
|
6
|
+
export function analyzeElementAttributes(ast, schema, validationContext) {
|
|
7
|
+
const analysisReport = new AnalysisReport();
|
|
8
|
+
traverse(ast, {
|
|
12
9
|
JSXElement(node) {
|
|
13
10
|
const tagName = node.openingElement.name.name;
|
|
14
11
|
validationContext.enterElement(tagName);
|
|
15
12
|
const currentContext = validationContext.getSnapshot();
|
|
16
|
-
const allowedAttributes =
|
|
17
|
-
const requiredAttributes =
|
|
13
|
+
const allowedAttributes = getAllowedAttributes(schema, tagName);
|
|
14
|
+
const requiredAttributes = getRequiredAttributes(schema, tagName);
|
|
18
15
|
for (const attribute of node.openingElement.attributes) {
|
|
19
|
-
if (!
|
|
16
|
+
if (!isJsxAttribute(attribute)) {
|
|
20
17
|
continue;
|
|
21
18
|
}
|
|
22
19
|
const attributeName = attribute.name.name;
|
|
23
|
-
const range =
|
|
24
|
-
if (!
|
|
25
|
-
const suggestions =
|
|
26
|
-
const suggestionMatch =
|
|
20
|
+
const range = getNodeRange(attribute);
|
|
21
|
+
if (!isAttributeAllowed(schema, tagName, attributeName)) {
|
|
22
|
+
const suggestions = getAttributeSimilarityMatchers(attributeName, allowedAttributes);
|
|
23
|
+
const suggestionMatch = getBestSimilarityMatcherSuggestion(attributeName, allowedAttributes);
|
|
27
24
|
let message = `Attribute "${attributeName}" not allowed on <${tagName}>`;
|
|
28
25
|
if (suggestionMatch) {
|
|
29
26
|
message += `. Did you mean "${suggestionMatch}"?`;
|
|
@@ -38,13 +35,13 @@ function analyzeElementAttributes(ast, schema, validationContext) {
|
|
|
38
35
|
analysisReport.addIssue("INVALID_ATTRIBUTE", message, range, currentContext, suggestions.map((suggestion) => suggestion.suggestion));
|
|
39
36
|
continue;
|
|
40
37
|
}
|
|
41
|
-
const attributeSchema =
|
|
42
|
-
const enumValues = attributeSchema ?
|
|
38
|
+
const attributeSchema = getAttributeSchema(schema, tagName, attributeName);
|
|
39
|
+
const enumValues = attributeSchema ? getEnumValues(attributeSchema) : undefined;
|
|
43
40
|
if (enumValues && enumValues.length > 0) {
|
|
44
41
|
const literalValue = getAttributeLiteralValue(attribute);
|
|
45
42
|
if (isEnumComparableValue(literalValue) && !enumValues.includes(literalValue)) {
|
|
46
43
|
const stringEnumValues = enumValues.map((value) => String(value));
|
|
47
|
-
const suggestionMatch =
|
|
44
|
+
const suggestionMatch = getBestSimilarityMatcherSuggestion(String(literalValue), stringEnumValues);
|
|
48
45
|
let message = `Value ${JSON.stringify(literalValue)} is not allowed for attribute "${attributeName}" on <${tagName}>`;
|
|
49
46
|
if (suggestionMatch) {
|
|
50
47
|
message += `. Did you mean "${suggestionMatch}"?`;
|
|
@@ -57,10 +54,10 @@ function analyzeElementAttributes(ast, schema, validationContext) {
|
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
56
|
// Check for missing required attributes
|
|
60
|
-
const providedAttributes = node.openingElement.attributes.filter(
|
|
57
|
+
const providedAttributes = node.openingElement.attributes.filter(isJsxAttribute).map((attr) => attr.name.name);
|
|
61
58
|
for (const requiredAttribute of requiredAttributes) {
|
|
62
59
|
if (!providedAttributes.includes(requiredAttribute)) {
|
|
63
|
-
analysisReport.addIssue("MISSING_REQUIRED_ATTRIBUTE", `Required attribute "${requiredAttribute}" missing on <${tagName}>`,
|
|
60
|
+
analysisReport.addIssue("MISSING_REQUIRED_ATTRIBUTE", `Required attribute "${requiredAttribute}" missing on <${tagName}>`, getNodeRange(node.openingElement), currentContext, [requiredAttribute]);
|
|
64
61
|
}
|
|
65
62
|
}
|
|
66
63
|
validationContext.exitElement();
|
|
@@ -78,7 +75,7 @@ function getAttributeLiteralValue(attribute) {
|
|
|
78
75
|
if (attribute.value.type === "Literal") {
|
|
79
76
|
return attribute.value.value;
|
|
80
77
|
}
|
|
81
|
-
if (
|
|
78
|
+
if (isJsxExpressionContainer(attribute.value)) {
|
|
82
79
|
const expression = attribute.value.expression;
|
|
83
80
|
if (expression?.type === "Literal") {
|
|
84
81
|
return expression.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-attributes.js","sourceRoot":"","sources":["../../../src/analyze/jsx/element-attributes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"element-attributes.js","sourceRoot":"","sources":["../../../src/analyze/jsx/element-attributes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,59 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
function analyzeElementChildren(ast, schema, validationContext) {
|
|
10
|
-
const analysisReport = new analysis_report_js_1.AnalysisReport();
|
|
11
|
-
(0, traverse_js_1.traverse)(ast, {
|
|
1
|
+
import { traverse } from "../../traverse.js";
|
|
2
|
+
import { getAllowedChildren, isSelfClosing } from "../../schema.js";
|
|
3
|
+
import { isJsxElement, isJsxFragment, isJsxText, isJsxLeafNode } from "../../jsx.js";
|
|
4
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
5
|
+
import { getNodeRange, getElementSimilarityMatchers, getBestSimilarityMatcherSuggestion } from "../utils.js";
|
|
6
|
+
export function analyzeElementChildren(ast, schema, validationContext) {
|
|
7
|
+
const analysisReport = new AnalysisReport();
|
|
8
|
+
traverse(ast, {
|
|
12
9
|
JSXElement(node) {
|
|
13
10
|
const parentTag = node.openingElement.name.name;
|
|
14
11
|
validationContext.enterElement(parentTag);
|
|
15
12
|
const currentContext = validationContext.getSnapshot();
|
|
16
|
-
const allowedChildren =
|
|
13
|
+
const allowedChildren = getAllowedChildren(schema, parentTag);
|
|
17
14
|
if (!allowedChildren) {
|
|
18
15
|
validationContext.exitElement();
|
|
19
16
|
return;
|
|
20
17
|
}
|
|
21
|
-
if (
|
|
18
|
+
if (isSelfClosing(schema, parentTag) && node.children.length > 0) {
|
|
22
19
|
const hasNonWhitespaceContent = node.children.some((child) => {
|
|
23
|
-
if (
|
|
20
|
+
if (isJsxText(child)) {
|
|
24
21
|
return child.value.trim().length > 0;
|
|
25
22
|
}
|
|
26
|
-
return !
|
|
23
|
+
return !isJsxLeafNode(child) || !isJsxText(child);
|
|
27
24
|
});
|
|
28
25
|
if (hasNonWhitespaceContent) {
|
|
29
26
|
const firstMeaningfulChild = node.children.find((child) => {
|
|
30
|
-
if (
|
|
27
|
+
if (isJsxText(child)) {
|
|
31
28
|
return child.value.trim().length > 0;
|
|
32
29
|
}
|
|
33
30
|
return true;
|
|
34
31
|
});
|
|
35
|
-
analysisReport.addIssue("SELF_CLOSING_WITH_CHILDREN", `Element <${parentTag}> cannot have children. It is self-closing.`,
|
|
32
|
+
analysisReport.addIssue("SELF_CLOSING_WITH_CHILDREN", `Element <${parentTag}> cannot have children. It is self-closing.`, getNodeRange(firstMeaningfulChild || node.children[0]), currentContext);
|
|
36
33
|
}
|
|
37
34
|
}
|
|
38
35
|
for (const child of node.children) {
|
|
39
|
-
if (
|
|
36
|
+
if (isJsxElement(child)) {
|
|
40
37
|
const childTag = child.openingElement.name.name;
|
|
41
38
|
if (!allowedChildren.includes(childTag)) {
|
|
42
|
-
const elementSimilarityMatchers =
|
|
43
|
-
const bestSimilarityMatcherSuggestion =
|
|
39
|
+
const elementSimilarityMatchers = getElementSimilarityMatchers(childTag, allowedChildren);
|
|
40
|
+
const bestSimilarityMatcherSuggestion = getBestSimilarityMatcherSuggestion(childTag, allowedChildren);
|
|
44
41
|
let message = `Element <${childTag}> not allowed in <${parentTag}>`;
|
|
45
42
|
if (bestSimilarityMatcherSuggestion) {
|
|
46
43
|
message += `. Did you mean <${bestSimilarityMatcherSuggestion}>?`;
|
|
47
44
|
}
|
|
48
45
|
message += `. Allowed children: ${allowedChildren.join(", ")}`;
|
|
49
|
-
analysisReport.addIssue("INVALID_CHILD_ELEMENT", message,
|
|
46
|
+
analysisReport.addIssue("INVALID_CHILD_ELEMENT", message, getNodeRange(child), currentContext, elementSimilarityMatchers.map((similarityMatcher) => similarityMatcher.suggestion));
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
|
-
else if (
|
|
49
|
+
else if (isJsxFragment(child)) {
|
|
53
50
|
// TODO: Recursively validate fragment children
|
|
54
51
|
// For now, we allow fragments but should add more specific validation in the future
|
|
55
52
|
}
|
|
56
|
-
else if (
|
|
53
|
+
else if (isJsxText(child)) {
|
|
57
54
|
const hasContent = child.value.trim().length > 0;
|
|
58
55
|
if (!hasContent) {
|
|
59
56
|
// Allow whitespace-only text nodes (very common in JSX formatting)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-children.js","sourceRoot":"","sources":["../../../src/analyze/jsx/element-children.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"element-children.js","sourceRoot":"","sources":["../../../src/analyze/jsx/element-children.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
function analyzeElementTags(ast, schema, validationContext) {
|
|
9
|
-
const analysisReport = new analysis_report_js_1.AnalysisReport();
|
|
10
|
-
(0, traverse_js_1.traverse)(ast, {
|
|
1
|
+
import { traverse } from "../../traverse.js";
|
|
2
|
+
import { isElementAllowed, getAllElements } from "../../schema.js";
|
|
3
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
4
|
+
import { getNodeRange, getElementSimilarityMatchers, getBestSimilarityMatcherSuggestion } from "../utils.js";
|
|
5
|
+
export function analyzeElementTags(ast, schema, validationContext) {
|
|
6
|
+
const analysisReport = new AnalysisReport();
|
|
7
|
+
traverse(ast, {
|
|
11
8
|
JSXElement(node) {
|
|
12
9
|
const tagName = node.openingElement.name.name;
|
|
13
10
|
validationContext.enterElement(tagName);
|
|
14
11
|
const snapshot = validationContext.getSnapshot();
|
|
15
|
-
const range =
|
|
16
|
-
if (!
|
|
17
|
-
const availableElements =
|
|
18
|
-
const elementSimilarityMatchers =
|
|
19
|
-
const bestSuggestionMatch =
|
|
12
|
+
const range = getNodeRange(node);
|
|
13
|
+
if (!isElementAllowed(schema, tagName)) {
|
|
14
|
+
const availableElements = getAllElements(schema);
|
|
15
|
+
const elementSimilarityMatchers = getElementSimilarityMatchers(tagName, availableElements);
|
|
16
|
+
const bestSuggestionMatch = getBestSimilarityMatcherSuggestion(tagName, availableElements);
|
|
20
17
|
let message = `Element <${tagName}> not allowed`;
|
|
21
18
|
if (snapshot.elements.length > 1) {
|
|
22
19
|
message += ` in ${validationContext.currentPath}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-tags.js","sourceRoot":"","sources":["../../../src/analyze/jsx/element-tags.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"element-tags.js","sourceRoot":"","sources":["../../../src/analyze/jsx/element-tags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAe,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;AAE7G,MAAM,UAAU,kBAAkB,CAAC,GAAY,EAAE,MAAc,EAAE,iBAAoC;IACnG,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAE5C,QAAQ,CAAC,GAAG,EAAE;QACZ,UAAU,CAAC,IAAI;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAE9C,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;gBACvC,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;gBACjD,MAAM,yBAAyB,GAAG,4BAA4B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAC3F,MAAM,mBAAmB,GAAG,kCAAkC,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAE3F,IAAI,OAAO,GAAG,YAAY,OAAO,eAAe,CAAC;gBAEjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,OAAO,IAAI,OAAO,iBAAiB,CAAC,WAAW,EAAE,CAAC;gBACpD,CAAC;gBAED,IAAI,mBAAmB,EAAE,CAAC;oBACxB,OAAO,IAAI,mBAAmB,mBAAmB,IAAI,CAAC;gBACxD,CAAC;qBAAM,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxC,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACtD,OAAO,IAAI,yBAAyB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjC,OAAO,IAAI,SAAS,iBAAiB,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC;oBAC3D,CAAC;gBACH,CAAC;gBAED,cAAc,CAAC,QAAQ,CACrB,iBAAiB,EACjB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,yBAAyB,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CACnF,CAAC;YACJ,CAAC;YAED,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
package/lib/analyze/jsx/index.js
CHANGED
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.analyzeJsx = void 0;
|
|
4
|
-
var analyze_js_1 = require("./analyze.js");
|
|
5
|
-
Object.defineProperty(exports, "analyzeJsx", { enumerable: true, get: function () { return analyze_js_1.analyzeJsx; } });
|
|
1
|
+
export { analyzeJsx } from "./analyze.js";
|
|
6
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyze/jsx/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyze/jsx/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
function analyzeSecurity(ast, schema) {
|
|
12
|
-
const validationContext = new validation_context_js_1.ValidationContext();
|
|
13
|
-
return new analysis_report_js_1.AnalysisReport().merge((0, declarations_js_1.analyzeDeclarations)(ast, schema, validationContext), (0, identifiers_js_1.analyzeIdentifiers)(ast, schema, validationContext), (0, expressions_js_1.analyzeExpressions)(ast, schema, validationContext), (0, member_access_js_1.analyzeMemberAccess)(ast, schema, validationContext), (0, call_expressions_js_1.analyzeCallExpressions)(ast, schema, validationContext));
|
|
1
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
2
|
+
import { ValidationContext } from "../validation-context.js";
|
|
3
|
+
import { analyzeCallExpressions } from "./call-expressions.js";
|
|
4
|
+
import { analyzeDeclarations } from "./declarations.js";
|
|
5
|
+
import { analyzeExpressions } from "./expressions.js";
|
|
6
|
+
import { analyzeIdentifiers } from "./identifiers.js";
|
|
7
|
+
import { analyzeMemberAccess } from "./member-access.js";
|
|
8
|
+
export function analyzeSecurity(ast, schema) {
|
|
9
|
+
const validationContext = new ValidationContext();
|
|
10
|
+
return new AnalysisReport().merge(analyzeDeclarations(ast, schema, validationContext), analyzeIdentifiers(ast, schema, validationContext), analyzeExpressions(ast, schema, validationContext), analyzeMemberAccess(ast, schema, validationContext), analyzeCallExpressions(ast, schema, validationContext));
|
|
14
11
|
}
|
|
15
12
|
//# sourceMappingURL=analyze.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/analyze/security/analyze.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/analyze/security/analyze.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,MAAc;IAC1D,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAElD,OAAO,IAAI,cAAc,EAAE,CAAC,KAAK,CAC/B,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EACnD,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAClD,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAClD,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EACnD,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,CACvD,CAAC;AACJ,CAAC"}
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
function analyzeCallExpressions(ast, _schema, validationContext) {
|
|
8
|
-
const analysisReport = new analysis_report_js_1.AnalysisReport();
|
|
9
|
-
(0, traverse_js_1.traverse)(ast, {
|
|
1
|
+
import { traverse } from "../../traverse.js";
|
|
2
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
3
|
+
import { getNodeRange } from "../utils.js";
|
|
4
|
+
export function analyzeCallExpressions(ast, _schema, validationContext) {
|
|
5
|
+
const analysisReport = new AnalysisReport();
|
|
6
|
+
traverse(ast, {
|
|
10
7
|
CallExpression(node) {
|
|
11
8
|
const { callee } = node;
|
|
12
9
|
if (callee.type !== "MemberExpression") {
|
|
13
|
-
analysisReport.addIssue("DIRECT_CALL_NOT_ALLOWED", "only member calls allowed",
|
|
10
|
+
analysisReport.addIssue("DIRECT_CALL_NOT_ALLOWED", "only member calls allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
14
11
|
return;
|
|
15
12
|
}
|
|
16
13
|
if (callee.property.type !== "Identifier" || callee.computed) {
|
|
17
|
-
analysisReport.addIssue("DYNAMIC_METHOD_NOT_ALLOWED", "only explicitly allowed methods are permitted",
|
|
14
|
+
analysisReport.addIssue("DYNAMIC_METHOD_NOT_ALLOWED", "only explicitly allowed methods are permitted", getNodeRange(callee), validationContext.getSnapshot());
|
|
18
15
|
}
|
|
19
16
|
},
|
|
20
17
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-expressions.js","sourceRoot":"","sources":["../../../src/analyze/security/call-expressions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"call-expressions.js","sourceRoot":"","sources":["../../../src/analyze/security/call-expressions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,sBAAsB,CACpC,GAAY,EACZ,OAAe,EACf,iBAAoC;IAEpC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAE5C,QAAQ,CAAC,GAAG,EAAE;QACZ,cAAc,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YAExB,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACvC,cAAc,CAAC,QAAQ,CACrB,yBAAyB,EACzB,2BAA2B,EAC3B,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC7D,cAAc,CAAC,QAAQ,CACrB,4BAA4B,EAC5B,+CAA+C,EAC/C,YAAY,CAAC,MAAM,CAAC,EACpB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -1,29 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
function analyzeDeclarations(ast, _schema, validationContext) {
|
|
8
|
-
const analysisReport = new analysis_report_js_1.AnalysisReport();
|
|
9
|
-
(0, traverse_js_1.traverse)(ast, {
|
|
1
|
+
import { traverse } from "../../traverse.js";
|
|
2
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
3
|
+
import { getNodeRange } from "../utils.js";
|
|
4
|
+
export function analyzeDeclarations(ast, _schema, validationContext) {
|
|
5
|
+
const analysisReport = new AnalysisReport();
|
|
6
|
+
traverse(ast, {
|
|
10
7
|
ImportDeclaration(node) {
|
|
11
|
-
analysisReport.addIssue("IMPORT_NOT_ALLOWED", "import not allowed",
|
|
8
|
+
analysisReport.addIssue("IMPORT_NOT_ALLOWED", "import not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
12
9
|
},
|
|
13
10
|
ExportNamedDeclaration(node) {
|
|
14
|
-
analysisReport.addIssue("EXPORT_NOT_ALLOWED", "export not allowed",
|
|
11
|
+
analysisReport.addIssue("EXPORT_NOT_ALLOWED", "export not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
15
12
|
},
|
|
16
13
|
ExportDefaultDeclaration(node) {
|
|
17
|
-
analysisReport.addIssue("EXPORT_NOT_ALLOWED", "export not allowed",
|
|
14
|
+
analysisReport.addIssue("EXPORT_NOT_ALLOWED", "export not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
18
15
|
},
|
|
19
16
|
FunctionDeclaration(node) {
|
|
20
|
-
analysisReport.addIssue("FUNCTION_NOT_ALLOWED", "function declarations not allowed",
|
|
17
|
+
analysisReport.addIssue("FUNCTION_NOT_ALLOWED", "function declarations not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
21
18
|
},
|
|
22
19
|
ClassDeclaration(node) {
|
|
23
|
-
analysisReport.addIssue("CLASS_NOT_ALLOWED", "classes not allowed",
|
|
20
|
+
analysisReport.addIssue("CLASS_NOT_ALLOWED", "classes not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
24
21
|
},
|
|
25
22
|
VariableDeclaration(node) {
|
|
26
|
-
analysisReport.addIssue("VARIABLE_NOT_ALLOWED", "variables not allowed",
|
|
23
|
+
analysisReport.addIssue("VARIABLE_NOT_ALLOWED", "variables not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
27
24
|
},
|
|
28
25
|
});
|
|
29
26
|
return analysisReport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declarations.js","sourceRoot":"","sources":["../../../src/analyze/security/declarations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"declarations.js","sourceRoot":"","sources":["../../../src/analyze/security/declarations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,mBAAmB,CACjC,GAAY,EACZ,OAAe,EACf,iBAAoC;IAEpC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAE5C,QAAQ,CAAC,GAAG,EAAE;QACZ,iBAAiB,CAAC,IAAI;YACpB,cAAc,CAAC,QAAQ,CACrB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,sBAAsB,CAAC,IAAI;YACzB,cAAc,CAAC,QAAQ,CACrB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,wBAAwB,CAAC,IAAI;YAC3B,cAAc,CAAC,QAAQ,CACrB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,mBAAmB,CAAC,IAAI;YACtB,cAAc,CAAC,QAAQ,CACrB,sBAAsB,EACtB,mCAAmC,EACnC,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,gBAAgB,CAAC,IAAI;YACnB,cAAc,CAAC,QAAQ,CACrB,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,mBAAmB,CAAC,IAAI;YACtB,cAAc,CAAC,QAAQ,CACrB,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -1,36 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
function analyzeExpressions(ast, _schema, validationContext) {
|
|
8
|
-
const analysisReport = new analysis_report_js_1.AnalysisReport();
|
|
9
|
-
(0, traverse_js_1.traverse)(ast, {
|
|
1
|
+
import { traverse } from "../../traverse.js";
|
|
2
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
3
|
+
import { getNodeRange } from "../utils.js";
|
|
4
|
+
export function analyzeExpressions(ast, _schema, validationContext) {
|
|
5
|
+
const analysisReport = new AnalysisReport();
|
|
6
|
+
traverse(ast, {
|
|
10
7
|
NewExpression(node) {
|
|
11
|
-
analysisReport.addIssue("NEW_NOT_ALLOWED", "new not allowed",
|
|
8
|
+
analysisReport.addIssue("NEW_NOT_ALLOWED", "new not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
12
9
|
},
|
|
13
10
|
ThisExpression(node) {
|
|
14
|
-
analysisReport.addIssue("THIS_NOT_ALLOWED", "this not allowed",
|
|
11
|
+
analysisReport.addIssue("THIS_NOT_ALLOWED", "this not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
15
12
|
},
|
|
16
13
|
WithStatement(node) {
|
|
17
|
-
analysisReport.addIssue("WITH_NOT_ALLOWED", "with not allowed",
|
|
14
|
+
analysisReport.addIssue("WITH_NOT_ALLOWED", "with not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
18
15
|
},
|
|
19
16
|
AwaitExpression(node) {
|
|
20
|
-
analysisReport.addIssue("AWAIT_NOT_ALLOWED", "await not allowed",
|
|
17
|
+
analysisReport.addIssue("AWAIT_NOT_ALLOWED", "await not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
21
18
|
},
|
|
22
19
|
YieldExpression(node) {
|
|
23
|
-
analysisReport.addIssue("YIELD_NOT_ALLOWED", "yield not allowed",
|
|
20
|
+
analysisReport.addIssue("YIELD_NOT_ALLOWED", "yield not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
24
21
|
},
|
|
25
22
|
ArrowFunctionExpression(node) {
|
|
26
23
|
if (node.body.type === "BlockStatement") {
|
|
27
|
-
analysisReport.addIssue("ARROW_FUNCTION_BLOCK_BODY_NOT_ALLOWED", "arrow functions with block body not allowed",
|
|
24
|
+
analysisReport.addIssue("ARROW_FUNCTION_BLOCK_BODY_NOT_ALLOWED", "arrow functions with block body not allowed", getNodeRange(node), validationContext.getSnapshot());
|
|
28
25
|
}
|
|
29
26
|
},
|
|
30
27
|
ObjectExpression(node) {
|
|
31
28
|
for (const property of node.properties) {
|
|
32
29
|
if (property.type === "Property" && property.computed) {
|
|
33
|
-
analysisReport.addIssue("COMPUTED_PROPERTY_NOT_ALLOWED", "computed object properties not allowed",
|
|
30
|
+
analysisReport.addIssue("COMPUTED_PROPERTY_NOT_ALLOWED", "computed object properties not allowed", getNodeRange(property), validationContext.getSnapshot());
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
33
|
},
|
|
@@ -40,7 +37,7 @@ function analyzeExpressions(ast, _schema, validationContext) {
|
|
|
40
37
|
if (node.property.type === "Literal" && typeof node.property.value === "number") {
|
|
41
38
|
return; // Allow numeric array indices
|
|
42
39
|
}
|
|
43
|
-
analysisReport.addIssue("COMPUTED_ACCESS_NOT_ALLOWED", "computed member access not allowed",
|
|
40
|
+
analysisReport.addIssue("COMPUTED_ACCESS_NOT_ALLOWED", "computed member access not allowed", getNodeRange(node), validationContext.getSnapshot(), [
|
|
44
41
|
"Use dot notation: obj.prop instead of obj[prop]",
|
|
45
42
|
"For arrays, use numeric indices: array[0] instead of array[variable]",
|
|
46
43
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../../src/analyze/security/expressions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../../src/analyze/security/expressions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,kBAAkB,CAChC,GAAY,EACZ,OAAe,EACf,iBAAoC;IAEpC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAE5C,QAAQ,CAAC,GAAG,EAAE;QACZ,aAAa,CAAC,IAAI;YAChB,cAAc,CAAC,QAAQ,CACrB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,cAAc,CAAC,IAAI;YACjB,cAAc,CAAC,QAAQ,CACrB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,aAAa,CAAC,IAAI;YAChB,cAAc,CAAC,QAAQ,CACrB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,IAAI;YAClB,cAAc,CAAC,QAAQ,CACrB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,IAAI;YAClB,cAAc,CAAC,QAAQ,CACrB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,uBAAuB,CAAC,IAAI;YAC1B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACxC,cAAc,CAAC,QAAQ,CACrB,uCAAuC,EACvC,6CAA6C,EAC7C,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;YACJ,CAAC;QACH,CAAC;QACD,gBAAgB,CAAC,IAAI;YACnB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvC,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtD,cAAc,CAAC,QAAQ,CACrB,+BAA+B,EAC/B,wCAAwC,EACxC,YAAY,CAAC,QAAQ,CAAC,EACtB,iBAAiB,CAAC,WAAW,EAAE,CAChC,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,gBAAgB,CAAC,IAAI;YACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,6DAA6D;gBAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAChF,OAAO,CAAC,8BAA8B;gBACxC,CAAC;gBAED,cAAc,CAAC,QAAQ,CACrB,6BAA6B,EAC7B,oCAAoC,EACpC,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,EAC/B;oBACE,iDAAiD;oBACjD,sEAAsE;iBACvE,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const utils_js_1 = require("../utils.js");
|
|
8
|
-
function analyzeIdentifiers(ast, _schema, validationContext) {
|
|
9
|
-
const analysisReport = new analysis_report_js_1.AnalysisReport();
|
|
1
|
+
import { traverse } from "../../traverse.js";
|
|
2
|
+
import { getBuiltinGlobals } from "../../builtins.js";
|
|
3
|
+
import { AnalysisReport } from "../analysis-report.js";
|
|
4
|
+
import { getNodeRange } from "../utils.js";
|
|
5
|
+
export function analyzeIdentifiers(ast, _schema, validationContext) {
|
|
6
|
+
const analysisReport = new AnalysisReport();
|
|
10
7
|
const arrowParamScopes = getArrowParamScopes(ast);
|
|
11
|
-
|
|
8
|
+
traverse(ast, {
|
|
12
9
|
Identifier(node) {
|
|
13
10
|
const { name } = node;
|
|
14
|
-
const allowedRoots = ["props", "data", ...
|
|
11
|
+
const allowedRoots = ["props", "data", ...getBuiltinGlobals()];
|
|
15
12
|
if (allowedRoots.includes(name)) {
|
|
16
13
|
return;
|
|
17
14
|
}
|
|
@@ -22,7 +19,7 @@ function analyzeIdentifiers(ast, _schema, validationContext) {
|
|
|
22
19
|
return;
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
analysisReport.addIssue("IDENTIFIER_NOT_ALLOWED", `Identifier "${name}" not allowed`,
|
|
22
|
+
analysisReport.addIssue("IDENTIFIER_NOT_ALLOWED", `Identifier "${name}" not allowed`, getNodeRange(node), validationContext.getSnapshot(), allowedRoots);
|
|
26
23
|
},
|
|
27
24
|
});
|
|
28
25
|
return analysisReport;
|
|
@@ -33,7 +30,7 @@ function analyzeIdentifiers(ast, _schema, validationContext) {
|
|
|
33
30
|
// main validation pass.
|
|
34
31
|
function getArrowParamScopes(ast) {
|
|
35
32
|
const arrowParamScopes = new Map();
|
|
36
|
-
|
|
33
|
+
traverse(ast, {
|
|
37
34
|
ArrowFunctionExpression(node) {
|
|
38
35
|
const { params } = node;
|
|
39
36
|
if (Array.isArray(params)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../../src/analyze/security/identifiers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../../src/analyze/security/identifiers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,kBAAkB,CAChC,GAAY,EACZ,OAAe,EACf,iBAAoC;IAEpC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAElD,QAAQ,CAAC,GAAG,EAAE;QACZ,UAAU,CAAC,IAAgB;YACzB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;YAEtB,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;YAE/D,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAE/C,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,cAAc,CAAC,QAAQ,CACrB,wBAAwB,EACxB,eAAe,IAAI,eAAe,EAClC,YAAY,CAAC,IAAI,CAAC,EAClB,iBAAiB,CAAC,WAAW,EAAE,EAC/B,YAAY,CACb,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,kFAAkF;AAClF,wBAAwB;AACxB,SAAS,mBAAmB,CAAC,GAAY;IACvC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAwC,CAAC;IACzE,QAAQ,CAAC,GAAG,EAAE;QACZ,uBAAuB,CAAC,IAAI;YAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACxB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACnB,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBAC5B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,kFAAkF;AAClF,SAAS,eAAe,CAAC,UAAmB,EAAE,QAAiB;IAC7D,IAAI,KAAK,GAAmC,IAAI,CAAC;IAEjD,SAAS,IAAI,CAAC,IAAa;QACzB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,yBAAyB,CAAC;QAExD,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,GAAG,IAA+B,CAAC;QAC1C,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAI,IAAY,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;4BACnD,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC"}
|