@base44-preview/vite-plugin 0.2.28-pr.43.69b82a0 → 0.2.28-pr.43.8318823
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/dist/jsx-processor.d.ts +1 -0
- package/dist/jsx-processor.d.ts.map +1 -1
- package/dist/jsx-processor.js +4 -0
- package/dist/jsx-processor.js.map +1 -1
- package/dist/processors/collection-reference-field-processor.d.ts +31 -0
- package/dist/processors/collection-reference-field-processor.d.ts.map +1 -0
- package/dist/processors/collection-reference-field-processor.js +174 -0
- package/dist/processors/collection-reference-field-processor.js.map +1 -0
- package/dist/processors/static-array-processor.d.ts +2 -0
- package/dist/processors/static-array-processor.d.ts.map +1 -1
- package/dist/processors/static-array-processor.js +1 -0
- package/dist/processors/static-array-processor.js.map +1 -1
- package/package.json +1 -1
- package/src/jsx-processor.ts +5 -0
- package/src/processors/collection-reference-field-processor.ts +225 -0
- package/src/processors/static-array-processor.ts +1 -1
package/dist/jsx-processor.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-processor.d.ts","sourceRoot":"","sources":["../src/jsx-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"jsx-processor.d.ts","sourceRoot":"","sources":["../src/jsx-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAC;AAOvC,qBAAa,YAAY;IAQrB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IARlB,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,uBAAuB,CAA0B;IACzD,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,oBAAoB,CAAuB;gBAGzC,KAAK,EAAE,OAAO,CAAC,EACf,QAAQ,EAAE,MAAM;IAS1B,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAc5D,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,0BAA0B;IA2BlC,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,+BAA+B;CAgFxC"}
|
package/dist/jsx-processor.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CollectionIdProcessor } from "./processors/collection-id-processor.js";
|
|
2
|
+
import { ReferenceFieldProcessor } from "./processors/collection-reference-field-processor.js";
|
|
2
3
|
import { DataItemIdProcessor } from "./processors/collection-item-id-processor.js";
|
|
3
4
|
import { DataItemFieldProcessor } from "./processors/collection-item-field-processor.js";
|
|
4
5
|
import { StaticArrayProcessor } from "./processors/static-array-processor.js";
|
|
@@ -6,6 +7,7 @@ export class JSXProcessor {
|
|
|
6
7
|
types;
|
|
7
8
|
filename;
|
|
8
9
|
collectionIdProcessor;
|
|
10
|
+
referenceFieldProcessor;
|
|
9
11
|
dataItemIdProcessor;
|
|
10
12
|
dataItemFieldProcessor;
|
|
11
13
|
staticArrayProcessor;
|
|
@@ -13,6 +15,7 @@ export class JSXProcessor {
|
|
|
13
15
|
this.types = types;
|
|
14
16
|
this.filename = filename;
|
|
15
17
|
this.collectionIdProcessor = new CollectionIdProcessor(types);
|
|
18
|
+
this.referenceFieldProcessor = new ReferenceFieldProcessor(types);
|
|
16
19
|
this.dataItemIdProcessor = new DataItemIdProcessor(types);
|
|
17
20
|
this.dataItemFieldProcessor = new DataItemFieldProcessor(types);
|
|
18
21
|
this.staticArrayProcessor = new StaticArrayProcessor(types);
|
|
@@ -23,6 +26,7 @@ export class JSXProcessor {
|
|
|
23
26
|
this.addSourceLocationAttribute(path);
|
|
24
27
|
this.addDynamicContentAttribute(path);
|
|
25
28
|
this.collectionIdProcessor.process(path);
|
|
29
|
+
this.referenceFieldProcessor.process(path);
|
|
26
30
|
this.dataItemIdProcessor.process(path);
|
|
27
31
|
this.dataItemFieldProcessor.process(path);
|
|
28
32
|
this.staticArrayProcessor.process(path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-processor.js","sourceRoot":"","sources":["../src/jsx-processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAE9E,MAAM,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"jsx-processor.js","sourceRoot":"","sources":["../src/jsx-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { NodePath } from "@babel/traverse";
|
|
2
|
+
import type * as t from "@babel/types";
|
|
3
|
+
export declare class ReferenceFieldProcessor {
|
|
4
|
+
private types;
|
|
5
|
+
private attributeUtils;
|
|
6
|
+
private expressionUtils;
|
|
7
|
+
private typeCheckUtils;
|
|
8
|
+
constructor(types: typeof t);
|
|
9
|
+
process(path: NodePath<t.JSXOpeningElement>): void;
|
|
10
|
+
/**
|
|
11
|
+
* Strategy A: Element is the direct return of a .map() callback
|
|
12
|
+
* whose array is a reference variable (initialized via type-check pattern).
|
|
13
|
+
*/
|
|
14
|
+
private isReturnedFromReferenceMap;
|
|
15
|
+
/**
|
|
16
|
+
* Strategy B: Element is inside a && expression where the left operand
|
|
17
|
+
* references a field name that appears in an ancestor's data-collection-reference.
|
|
18
|
+
*/
|
|
19
|
+
private isInsideReferenceLogicalExpression;
|
|
20
|
+
/**
|
|
21
|
+
* Strategy C: Element is inside a .map() chain on a reference property.
|
|
22
|
+
* e.g. item.relatedProducts.map(...) or item.relatedProducts.filter(...).map(...)
|
|
23
|
+
*/
|
|
24
|
+
private isInReferencePropertyMapChain;
|
|
25
|
+
private findEnclosingMapCallback;
|
|
26
|
+
private isReferenceArray;
|
|
27
|
+
private extractFieldNameFromExpression;
|
|
28
|
+
private isFieldInAncestorReference;
|
|
29
|
+
private extractReferenceFieldFromMapChain;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=collection-reference-field-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-reference-field-processor.d.ts","sourceRoot":"","sources":["../../src/processors/collection-reference-field-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAC;AAWvC,qBAAa,uBAAuB;IAKtB,OAAO,CAAC,KAAK;IAJzB,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,cAAc,CAAiB;gBAEnB,KAAK,EAAE,OAAO,CAAC;IAMnC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAoBlD;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAsBlC;;;OAGG;IACH,OAAO,CAAC,kCAAkC;IAiB1C;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAuBrC,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,8BAA8B;IActC,OAAO,CAAC,0BAA0B;IAoBlC,OAAO,CAAC,iCAAiC;CAmC1C"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { DATA_COLLECTION_FIELD_REFERENCE, DATA_COLLECTION_REFERENCE, } from "../consts.js";
|
|
2
|
+
import { JSXAttributeUtils, ExpressionAnalysisUtils, TypeCheckUtils, } from "./shared-utils.js";
|
|
3
|
+
export class ReferenceFieldProcessor {
|
|
4
|
+
types;
|
|
5
|
+
attributeUtils;
|
|
6
|
+
expressionUtils;
|
|
7
|
+
typeCheckUtils;
|
|
8
|
+
constructor(types) {
|
|
9
|
+
this.types = types;
|
|
10
|
+
this.attributeUtils = new JSXAttributeUtils(types);
|
|
11
|
+
this.expressionUtils = new ExpressionAnalysisUtils(types);
|
|
12
|
+
this.typeCheckUtils = new TypeCheckUtils(types);
|
|
13
|
+
}
|
|
14
|
+
process(path) {
|
|
15
|
+
if (this.attributeUtils.hasAttribute(path, DATA_COLLECTION_FIELD_REFERENCE)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (this.isReturnedFromReferenceMap(path) ||
|
|
19
|
+
this.isInsideReferenceLogicalExpression(path) ||
|
|
20
|
+
this.isInReferencePropertyMapChain(path)) {
|
|
21
|
+
this.attributeUtils.addStringAttribute(path, DATA_COLLECTION_FIELD_REFERENCE, "true");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Strategy A: Element is the direct return of a .map() callback
|
|
26
|
+
* whose array is a reference variable (initialized via type-check pattern).
|
|
27
|
+
*/
|
|
28
|
+
isReturnedFromReferenceMap(path) {
|
|
29
|
+
const jsxElement = path.parentPath;
|
|
30
|
+
if (!jsxElement?.isJSXElement())
|
|
31
|
+
return false;
|
|
32
|
+
const parent = jsxElement.parentPath;
|
|
33
|
+
if (!parent)
|
|
34
|
+
return false;
|
|
35
|
+
const callbackFn = this.findEnclosingMapCallback(parent);
|
|
36
|
+
if (!callbackFn)
|
|
37
|
+
return false;
|
|
38
|
+
const mapCall = callbackFn.parentPath;
|
|
39
|
+
if (!mapCall?.isCallExpression())
|
|
40
|
+
return false;
|
|
41
|
+
const callee = mapCall.get("callee");
|
|
42
|
+
if (!callee.isMemberExpression())
|
|
43
|
+
return false;
|
|
44
|
+
const arrayObj = callee.get("object");
|
|
45
|
+
return this.isReferenceArray(arrayObj);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Strategy B: Element is inside a && expression where the left operand
|
|
49
|
+
* references a field name that appears in an ancestor's data-collection-reference.
|
|
50
|
+
*/
|
|
51
|
+
isInsideReferenceLogicalExpression(path) {
|
|
52
|
+
const jsxElement = path.parentPath;
|
|
53
|
+
if (!jsxElement?.isJSXElement())
|
|
54
|
+
return false;
|
|
55
|
+
const logicalParent = jsxElement.parentPath;
|
|
56
|
+
if (!logicalParent?.isLogicalExpression())
|
|
57
|
+
return false;
|
|
58
|
+
if (logicalParent.node.operator !== "&&")
|
|
59
|
+
return false;
|
|
60
|
+
const left = logicalParent.node.left;
|
|
61
|
+
const fieldName = this.extractFieldNameFromExpression(left);
|
|
62
|
+
if (!fieldName)
|
|
63
|
+
return false;
|
|
64
|
+
return this.isFieldInAncestorReference(path, fieldName);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Strategy C: Element is inside a .map() chain on a reference property.
|
|
68
|
+
* e.g. item.relatedProducts.map(...) or item.relatedProducts.filter(...).map(...)
|
|
69
|
+
*/
|
|
70
|
+
isInReferencePropertyMapChain(path) {
|
|
71
|
+
const jsxElement = path.parentPath;
|
|
72
|
+
if (!jsxElement?.isJSXElement())
|
|
73
|
+
return false;
|
|
74
|
+
let current = jsxElement;
|
|
75
|
+
while (current) {
|
|
76
|
+
if (current.isCallExpression()) {
|
|
77
|
+
const callee = current.get("callee");
|
|
78
|
+
if (callee.isMemberExpression()) {
|
|
79
|
+
const fieldName = this.extractReferenceFieldFromMapChain(callee);
|
|
80
|
+
if (fieldName && this.isFieldInAncestorReference(path, fieldName)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
current = current.parentPath;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
findEnclosingMapCallback(path) {
|
|
90
|
+
let current = path;
|
|
91
|
+
while (current) {
|
|
92
|
+
if (current.isArrowFunctionExpression() || current.isFunctionExpression()) {
|
|
93
|
+
const parent = current.parentPath;
|
|
94
|
+
if (parent?.isCallExpression()) {
|
|
95
|
+
const callee = parent.get("callee");
|
|
96
|
+
if (callee.isMemberExpression()) {
|
|
97
|
+
const prop = callee.get("property");
|
|
98
|
+
if (prop.isIdentifier() &&
|
|
99
|
+
(prop.node.name === "map" || prop.node.name === "flatMap")) {
|
|
100
|
+
return current;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
current = current.parentPath;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
isReferenceArray(path) {
|
|
110
|
+
if (!path.isIdentifier())
|
|
111
|
+
return false;
|
|
112
|
+
const binding = path.scope.getBinding(path.node.name);
|
|
113
|
+
if (!binding?.path.isVariableDeclarator())
|
|
114
|
+
return false;
|
|
115
|
+
const init = binding.path.get("init");
|
|
116
|
+
if (!init.isConditionalExpression())
|
|
117
|
+
return false;
|
|
118
|
+
const test = init.node.test;
|
|
119
|
+
return this.typeCheckUtils.isReferenceTypeCheck(test);
|
|
120
|
+
}
|
|
121
|
+
extractFieldNameFromExpression(node) {
|
|
122
|
+
if (this.types.isMemberExpression(node)) {
|
|
123
|
+
const prop = node.property;
|
|
124
|
+
if (this.types.isIdentifier(prop))
|
|
125
|
+
return prop.name;
|
|
126
|
+
}
|
|
127
|
+
if (this.types.isOptionalMemberExpression(node)) {
|
|
128
|
+
const prop = node.property;
|
|
129
|
+
if (this.types.isIdentifier(prop))
|
|
130
|
+
return prop.name;
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
isFieldInAncestorReference(path, fieldName) {
|
|
135
|
+
const ancestor = this.attributeUtils.findAncestorWithAttribute(path, DATA_COLLECTION_REFERENCE);
|
|
136
|
+
if (!ancestor)
|
|
137
|
+
return false;
|
|
138
|
+
const refValue = this.attributeUtils.getAttributeStringValue(ancestor, DATA_COLLECTION_REFERENCE);
|
|
139
|
+
if (!refValue)
|
|
140
|
+
return false;
|
|
141
|
+
const references = refValue.split(",").map((r) => r.trim());
|
|
142
|
+
return references.includes(fieldName);
|
|
143
|
+
}
|
|
144
|
+
extractReferenceFieldFromMapChain(callee) {
|
|
145
|
+
const prop = callee.get("property");
|
|
146
|
+
if (!prop.isIdentifier())
|
|
147
|
+
return null;
|
|
148
|
+
const methodName = prop.node.name;
|
|
149
|
+
const obj = callee.get("object");
|
|
150
|
+
if (methodName === "map" || methodName === "flatMap") {
|
|
151
|
+
if (obj.isMemberExpression()) {
|
|
152
|
+
const fieldProp = obj.get("property");
|
|
153
|
+
if (fieldProp.isIdentifier())
|
|
154
|
+
return fieldProp.node.name;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (methodName === "map" || methodName === "flatMap") {
|
|
158
|
+
if (obj.isCallExpression()) {
|
|
159
|
+
const innerCallee = obj.get("callee");
|
|
160
|
+
if (innerCallee.isMemberExpression()) {
|
|
161
|
+
return this.extractReferenceFieldFromMapChain(innerCallee);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (["filter", "sort", "slice"].includes(methodName) &&
|
|
166
|
+
obj.isMemberExpression()) {
|
|
167
|
+
const fieldProp = obj.get("property");
|
|
168
|
+
if (fieldProp.isIdentifier())
|
|
169
|
+
return fieldProp.node.name;
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=collection-reference-field-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-reference-field-processor.js","sourceRoot":"","sources":["../../src/processors/collection-reference-field-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { NodePath } from "@babel/traverse";
|
|
2
2
|
import type * as t from "@babel/types";
|
|
3
|
+
import { DATA_ARR_INDEX, DATA_ARR_VARIABLE_NAME, DATA_ARR_FIELD } from "../consts.js";
|
|
4
|
+
export { DATA_ARR_INDEX, DATA_ARR_VARIABLE_NAME, DATA_ARR_FIELD };
|
|
3
5
|
export declare class StaticArrayProcessor {
|
|
4
6
|
private types;
|
|
5
7
|
private attributeUtils;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-array-processor.d.ts","sourceRoot":"","sources":["../../src/processors/static-array-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"static-array-processor.d.ts","sourceRoot":"","sources":["../../src/processors/static-array-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,cAAc,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,cAAc,EAAE,CAAC;AAWlE,qBAAa,oBAAoB;IAInB,OAAO,CAAC,KAAK;IAHzB,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,gBAAgB,CAAmB;gBAEvB,KAAK,EAAE,OAAO,CAAC;IAKnC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAUlD,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,4BAA4B;IAmBpC,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,uBAAuB;CAKhC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DATA_ARR_INDEX, DATA_ARR_VARIABLE_NAME, DATA_ARR_FIELD, } from "../consts.js";
|
|
2
2
|
import { JSXAttributeUtils, StaticValueUtils } from "./shared-utils.js";
|
|
3
|
+
export { DATA_ARR_INDEX, DATA_ARR_VARIABLE_NAME, DATA_ARR_FIELD };
|
|
3
4
|
const GENERATED_INDEX_PARAM = "__arrIdx__";
|
|
4
5
|
export class StaticArrayProcessor {
|
|
5
6
|
types;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-array-processor.js","sourceRoot":"","sources":["../../src/processors/static-array-processor.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"static-array-processor.js","sourceRoot":"","sources":["../../src/processors/static-array-processor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/jsx-processor.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { NodePath } from "@babel/traverse";
|
|
2
2
|
import type * as t from "@babel/types";
|
|
3
3
|
import { CollectionIdProcessor } from "./processors/collection-id-processor.js";
|
|
4
|
+
import { ReferenceFieldProcessor } from "./processors/collection-reference-field-processor.js";
|
|
4
5
|
import { DataItemIdProcessor } from "./processors/collection-item-id-processor.js";
|
|
5
6
|
import { DataItemFieldProcessor } from "./processors/collection-item-field-processor.js";
|
|
6
7
|
import { StaticArrayProcessor } from "./processors/static-array-processor.js";
|
|
7
8
|
|
|
8
9
|
export class JSXProcessor {
|
|
9
10
|
private collectionIdProcessor: CollectionIdProcessor;
|
|
11
|
+
private referenceFieldProcessor: ReferenceFieldProcessor;
|
|
10
12
|
private dataItemIdProcessor: DataItemIdProcessor;
|
|
11
13
|
private dataItemFieldProcessor: DataItemFieldProcessor;
|
|
12
14
|
private staticArrayProcessor: StaticArrayProcessor;
|
|
@@ -16,6 +18,7 @@ export class JSXProcessor {
|
|
|
16
18
|
private filename: string
|
|
17
19
|
) {
|
|
18
20
|
this.collectionIdProcessor = new CollectionIdProcessor(types);
|
|
21
|
+
this.referenceFieldProcessor = new ReferenceFieldProcessor(types);
|
|
19
22
|
this.dataItemIdProcessor = new DataItemIdProcessor(types);
|
|
20
23
|
this.dataItemFieldProcessor = new DataItemFieldProcessor(types);
|
|
21
24
|
this.staticArrayProcessor = new StaticArrayProcessor(types);
|
|
@@ -28,9 +31,11 @@ export class JSXProcessor {
|
|
|
28
31
|
this.addDynamicContentAttribute(path);
|
|
29
32
|
|
|
30
33
|
this.collectionIdProcessor.process(path);
|
|
34
|
+
this.referenceFieldProcessor.process(path);
|
|
31
35
|
this.dataItemIdProcessor.process(path);
|
|
32
36
|
this.dataItemFieldProcessor.process(path);
|
|
33
37
|
this.staticArrayProcessor.process(path);
|
|
38
|
+
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
private addSourceLocationAttribute(
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import type { NodePath } from "@babel/traverse";
|
|
2
|
+
import type * as t from "@babel/types";
|
|
3
|
+
import {
|
|
4
|
+
DATA_COLLECTION_FIELD_REFERENCE,
|
|
5
|
+
DATA_COLLECTION_REFERENCE,
|
|
6
|
+
} from "../consts.js";
|
|
7
|
+
import {
|
|
8
|
+
JSXAttributeUtils,
|
|
9
|
+
ExpressionAnalysisUtils,
|
|
10
|
+
TypeCheckUtils,
|
|
11
|
+
} from "./shared-utils.js";
|
|
12
|
+
|
|
13
|
+
export class ReferenceFieldProcessor {
|
|
14
|
+
private attributeUtils: JSXAttributeUtils;
|
|
15
|
+
private expressionUtils: ExpressionAnalysisUtils;
|
|
16
|
+
private typeCheckUtils: TypeCheckUtils;
|
|
17
|
+
|
|
18
|
+
constructor(private types: typeof t) {
|
|
19
|
+
this.attributeUtils = new JSXAttributeUtils(types);
|
|
20
|
+
this.expressionUtils = new ExpressionAnalysisUtils(types);
|
|
21
|
+
this.typeCheckUtils = new TypeCheckUtils(types);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
process(path: NodePath<t.JSXOpeningElement>): void {
|
|
25
|
+
if (
|
|
26
|
+
this.attributeUtils.hasAttribute(path, DATA_COLLECTION_FIELD_REFERENCE)
|
|
27
|
+
) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (
|
|
32
|
+
this.isReturnedFromReferenceMap(path) ||
|
|
33
|
+
this.isInsideReferenceLogicalExpression(path) ||
|
|
34
|
+
this.isInReferencePropertyMapChain(path)
|
|
35
|
+
) {
|
|
36
|
+
this.attributeUtils.addStringAttribute(
|
|
37
|
+
path,
|
|
38
|
+
DATA_COLLECTION_FIELD_REFERENCE,
|
|
39
|
+
"true"
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Strategy A: Element is the direct return of a .map() callback
|
|
46
|
+
* whose array is a reference variable (initialized via type-check pattern).
|
|
47
|
+
*/
|
|
48
|
+
private isReturnedFromReferenceMap(
|
|
49
|
+
path: NodePath<t.JSXOpeningElement>
|
|
50
|
+
): boolean {
|
|
51
|
+
const jsxElement = path.parentPath;
|
|
52
|
+
if (!jsxElement?.isJSXElement()) return false;
|
|
53
|
+
|
|
54
|
+
const parent = jsxElement.parentPath;
|
|
55
|
+
if (!parent) return false;
|
|
56
|
+
|
|
57
|
+
const callbackFn = this.findEnclosingMapCallback(parent);
|
|
58
|
+
if (!callbackFn) return false;
|
|
59
|
+
|
|
60
|
+
const mapCall = callbackFn.parentPath;
|
|
61
|
+
if (!mapCall?.isCallExpression()) return false;
|
|
62
|
+
|
|
63
|
+
const callee = mapCall.get("callee");
|
|
64
|
+
if (!callee.isMemberExpression()) return false;
|
|
65
|
+
|
|
66
|
+
const arrayObj = callee.get("object") as NodePath<t.Expression>;
|
|
67
|
+
return this.isReferenceArray(arrayObj);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Strategy B: Element is inside a && expression where the left operand
|
|
72
|
+
* references a field name that appears in an ancestor's data-collection-reference.
|
|
73
|
+
*/
|
|
74
|
+
private isInsideReferenceLogicalExpression(
|
|
75
|
+
path: NodePath<t.JSXOpeningElement>
|
|
76
|
+
): boolean {
|
|
77
|
+
const jsxElement = path.parentPath;
|
|
78
|
+
if (!jsxElement?.isJSXElement()) return false;
|
|
79
|
+
|
|
80
|
+
const logicalParent = jsxElement.parentPath;
|
|
81
|
+
if (!logicalParent?.isLogicalExpression()) return false;
|
|
82
|
+
if (logicalParent.node.operator !== "&&") return false;
|
|
83
|
+
|
|
84
|
+
const left = logicalParent.node.left;
|
|
85
|
+
const fieldName = this.extractFieldNameFromExpression(left as t.Expression);
|
|
86
|
+
if (!fieldName) return false;
|
|
87
|
+
|
|
88
|
+
return this.isFieldInAncestorReference(path, fieldName);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Strategy C: Element is inside a .map() chain on a reference property.
|
|
93
|
+
* e.g. item.relatedProducts.map(...) or item.relatedProducts.filter(...).map(...)
|
|
94
|
+
*/
|
|
95
|
+
private isInReferencePropertyMapChain(
|
|
96
|
+
path: NodePath<t.JSXOpeningElement>
|
|
97
|
+
): boolean {
|
|
98
|
+
const jsxElement = path.parentPath;
|
|
99
|
+
if (!jsxElement?.isJSXElement()) return false;
|
|
100
|
+
|
|
101
|
+
let current: NodePath | null = jsxElement;
|
|
102
|
+
while (current) {
|
|
103
|
+
if (current.isCallExpression()) {
|
|
104
|
+
const callee = current.get("callee");
|
|
105
|
+
if (callee.isMemberExpression()) {
|
|
106
|
+
const fieldName = this.extractReferenceFieldFromMapChain(callee);
|
|
107
|
+
if (fieldName && this.isFieldInAncestorReference(path, fieldName)) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
current = current.parentPath;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private findEnclosingMapCallback(
|
|
119
|
+
path: NodePath
|
|
120
|
+
): NodePath<t.Function> | null {
|
|
121
|
+
let current: NodePath | null = path;
|
|
122
|
+
while (current) {
|
|
123
|
+
if (current.isArrowFunctionExpression() || current.isFunctionExpression()) {
|
|
124
|
+
const parent = current.parentPath;
|
|
125
|
+
if (parent?.isCallExpression()) {
|
|
126
|
+
const callee = parent.get("callee");
|
|
127
|
+
if (callee.isMemberExpression()) {
|
|
128
|
+
const prop = callee.get("property") as NodePath;
|
|
129
|
+
if (
|
|
130
|
+
prop.isIdentifier() &&
|
|
131
|
+
(prop.node.name === "map" || prop.node.name === "flatMap")
|
|
132
|
+
) {
|
|
133
|
+
return current as NodePath<t.Function>;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
current = current.parentPath;
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private isReferenceArray(path: NodePath<t.Expression>): boolean {
|
|
144
|
+
if (!path.isIdentifier()) return false;
|
|
145
|
+
|
|
146
|
+
const binding = path.scope.getBinding(path.node.name);
|
|
147
|
+
if (!binding?.path.isVariableDeclarator()) return false;
|
|
148
|
+
|
|
149
|
+
const init = binding.path.get("init");
|
|
150
|
+
if (!init.isConditionalExpression()) return false;
|
|
151
|
+
|
|
152
|
+
const test = init.node.test;
|
|
153
|
+
return this.typeCheckUtils.isReferenceTypeCheck(test as t.Expression);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private extractFieldNameFromExpression(
|
|
157
|
+
node: t.Expression
|
|
158
|
+
): string | null {
|
|
159
|
+
if (this.types.isMemberExpression(node)) {
|
|
160
|
+
const prop = node.property;
|
|
161
|
+
if (this.types.isIdentifier(prop)) return prop.name;
|
|
162
|
+
}
|
|
163
|
+
if (this.types.isOptionalMemberExpression(node)) {
|
|
164
|
+
const prop = node.property;
|
|
165
|
+
if (this.types.isIdentifier(prop)) return prop.name;
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private isFieldInAncestorReference(
|
|
171
|
+
path: NodePath,
|
|
172
|
+
fieldName: string
|
|
173
|
+
): boolean {
|
|
174
|
+
const ancestor = this.attributeUtils.findAncestorWithAttribute(
|
|
175
|
+
path,
|
|
176
|
+
DATA_COLLECTION_REFERENCE
|
|
177
|
+
);
|
|
178
|
+
if (!ancestor) return false;
|
|
179
|
+
|
|
180
|
+
const refValue = this.attributeUtils.getAttributeStringValue(
|
|
181
|
+
ancestor,
|
|
182
|
+
DATA_COLLECTION_REFERENCE
|
|
183
|
+
);
|
|
184
|
+
if (!refValue) return false;
|
|
185
|
+
|
|
186
|
+
const references = refValue.split(",").map((r) => r.trim());
|
|
187
|
+
return references.includes(fieldName);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private extractReferenceFieldFromMapChain(
|
|
191
|
+
callee: NodePath<t.MemberExpression>
|
|
192
|
+
): string | null {
|
|
193
|
+
const prop = callee.get("property") as NodePath;
|
|
194
|
+
if (!prop.isIdentifier()) return null;
|
|
195
|
+
|
|
196
|
+
const methodName = prop.node.name;
|
|
197
|
+
const obj = callee.get("object") as NodePath<t.Expression>;
|
|
198
|
+
|
|
199
|
+
if (methodName === "map" || methodName === "flatMap") {
|
|
200
|
+
if (obj.isMemberExpression()) {
|
|
201
|
+
const fieldProp = obj.get("property") as NodePath;
|
|
202
|
+
if (fieldProp.isIdentifier()) return fieldProp.node.name;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (methodName === "map" || methodName === "flatMap") {
|
|
207
|
+
if (obj.isCallExpression()) {
|
|
208
|
+
const innerCallee = obj.get("callee");
|
|
209
|
+
if (innerCallee.isMemberExpression()) {
|
|
210
|
+
return this.extractReferenceFieldFromMapChain(innerCallee);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (
|
|
216
|
+
["filter", "sort", "slice"].includes(methodName) &&
|
|
217
|
+
obj.isMemberExpression()
|
|
218
|
+
) {
|
|
219
|
+
const fieldProp = obj.get("property") as NodePath;
|
|
220
|
+
if (fieldProp.isIdentifier()) return fieldProp.node.name;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
}
|