@base44/vite-plugin 0.2.22 → 0.2.23

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.
@@ -0,0 +1,15 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type * as t from "@babel/types";
3
+ export declare class JSXProcessor {
4
+ private types;
5
+ private filename;
6
+ private staticArrayProcessor;
7
+ constructor(types: typeof t, filename: string);
8
+ processJSXElement(path: NodePath<t.JSXOpeningElement>): void;
9
+ private addSourceLocationAttribute;
10
+ private addDynamicContentAttribute;
11
+ private addContentEditableAttribute;
12
+ private hasAttribute;
13
+ private checkIfElementHasDynamicContent;
14
+ }
15
+ //# sourceMappingURL=jsx-processor.d.ts.map
@@ -0,0 +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;AAGvC,qBAAa,YAAY;IAIrB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAJlB,OAAO,CAAC,oBAAoB,CAAuB;gBAGzC,KAAK,EAAE,OAAO,CAAC,EACf,QAAQ,EAAE,MAAM;IAK1B,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAS5D,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,0BAA0B;IAkBlC,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,+BAA+B;CAoExC"}
@@ -0,0 +1,106 @@
1
+ import { StaticArrayProcessor } from "./processors/static-array-processor.js";
2
+ export class JSXProcessor {
3
+ types;
4
+ filename;
5
+ staticArrayProcessor;
6
+ constructor(types, filename) {
7
+ this.types = types;
8
+ this.filename = filename;
9
+ this.staticArrayProcessor = new StaticArrayProcessor(types);
10
+ }
11
+ processJSXElement(path) {
12
+ if (this.hasAttribute(path, "data-source-location"))
13
+ return;
14
+ this.addSourceLocationAttribute(path);
15
+ this.addDynamicContentAttribute(path);
16
+ this.addContentEditableAttribute(path);
17
+ this.staticArrayProcessor.process(path);
18
+ }
19
+ addSourceLocationAttribute(path) {
20
+ const { line, column } = path.node.loc?.start || { line: 1, column: 0 };
21
+ const value = `${this.filename}:${line}:${column}`;
22
+ path.node.attributes.push(this.types.jsxAttribute(this.types.jsxIdentifier("data-source-location"), this.types.stringLiteral(value)));
23
+ }
24
+ addDynamicContentAttribute(path) {
25
+ const parentElement = path.parentPath;
26
+ if (!parentElement?.isJSXElement())
27
+ return;
28
+ const isDynamic = this.checkIfElementHasDynamicContent(parentElement.node);
29
+ path.node.attributes.push(this.types.jsxAttribute(this.types.jsxIdentifier("data-dynamic-content"), this.types.stringLiteral(isDynamic ? "true" : "false")));
30
+ }
31
+ addContentEditableAttribute(path) {
32
+ path.node.attributes.push(this.types.jsxAttribute(this.types.jsxIdentifier("content-editable"), this.types.stringLiteral("true")));
33
+ }
34
+ hasAttribute(path, name) {
35
+ return path.node.attributes.some((attr) => this.types.isJSXAttribute(attr) &&
36
+ this.types.isJSXIdentifier(attr.name) &&
37
+ attr.name.name === name);
38
+ }
39
+ checkIfElementHasDynamicContent(jsxElement) {
40
+ let hasDynamicContent = false;
41
+ const checkNode = (node) => {
42
+ if (this.types.isJSXExpressionContainer(node)) {
43
+ const expression = node.expression;
44
+ if (this.types.isJSXEmptyExpression(expression))
45
+ return false;
46
+ if (!this.types.isLiteral(expression))
47
+ return true;
48
+ }
49
+ if (this.types.isTemplateLiteral(node) &&
50
+ node.expressions.length > 0) {
51
+ return true;
52
+ }
53
+ if (this.types.isMemberExpression(node))
54
+ return true;
55
+ if (this.types.isCallExpression(node))
56
+ return true;
57
+ if (this.types.isConditionalExpression(node))
58
+ return true;
59
+ if (this.types.isIdentifier(node)) {
60
+ const dynamicNames = [
61
+ "props",
62
+ "state",
63
+ "data",
64
+ "item",
65
+ "value",
66
+ "text",
67
+ "content",
68
+ ];
69
+ if (dynamicNames.some((name) => node.name.includes(name))) {
70
+ return true;
71
+ }
72
+ }
73
+ return false;
74
+ };
75
+ const traverseNode = (node) => {
76
+ if (hasDynamicContent)
77
+ return;
78
+ if (checkNode(node)) {
79
+ hasDynamicContent = true;
80
+ return;
81
+ }
82
+ for (const key of Object.keys(node)) {
83
+ if (hasDynamicContent)
84
+ return;
85
+ const value = node[key];
86
+ if (Array.isArray(value)) {
87
+ for (const child of value) {
88
+ if (child && typeof child === "object" && "type" in child) {
89
+ traverseNode(child);
90
+ }
91
+ }
92
+ }
93
+ else if (value && typeof value === "object" && "type" in value) {
94
+ traverseNode(value);
95
+ }
96
+ }
97
+ };
98
+ for (const child of jsxElement.children) {
99
+ if (hasDynamicContent)
100
+ break;
101
+ traverseNode(child);
102
+ }
103
+ return hasDynamicContent;
104
+ }
105
+ }
106
+ //# sourceMappingURL=jsx-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-processor.js","sourceRoot":"","sources":["../src/jsx-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type * as t from "@babel/types";
2
+ export declare class JSXUtils {
3
+ private static types;
4
+ static init(types: typeof t): void;
5
+ static getAttributeName(attr: t.JSXAttribute): string;
6
+ }
7
+ //# sourceMappingURL=jsx-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-utils.d.ts","sourceRoot":"","sources":["../src/jsx-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAC;AAEvC,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAW;IAE/B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;IAI3B,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,GAAG,MAAM;CAKtD"}
@@ -0,0 +1,12 @@
1
+ export class JSXUtils {
2
+ static types;
3
+ static init(types) {
4
+ this.types = types;
5
+ }
6
+ static getAttributeName(attr) {
7
+ return this.types.isJSXNamespacedName(attr.name)
8
+ ? `${attr.name.namespace.name}:${attr.name.name.name}`
9
+ : attr.name.name;
10
+ }
11
+ }
12
+ //# sourceMappingURL=jsx-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-utils.js","sourceRoot":"","sources":["../src/jsx-utils.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,QAAQ;IACX,MAAM,CAAC,KAAK,CAAW;IAE/B,MAAM,CAAC,IAAI,CAAC,KAAe;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,IAAoB;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACtD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type * as t from "@babel/types";
3
+ export declare class JSXAttributeUtils {
4
+ private types;
5
+ constructor(types: typeof t);
6
+ hasAttribute(path: NodePath<t.JSXOpeningElement>, attributeName: string): boolean;
7
+ addStringAttribute(path: NodePath<t.JSXOpeningElement>, attributeName: string, value: string): void;
8
+ addExpressionAttribute(path: NodePath<t.JSXOpeningElement>, attributeName: string, expression: t.Expression): void;
9
+ }
10
+ export declare class StaticValueUtils {
11
+ private types;
12
+ constructor(types: typeof t);
13
+ isPrimitiveLiteral(path: NodePath<t.Node>): boolean;
14
+ isStaticValue(path: NodePath<t.Node>, visited?: Set<string>): boolean;
15
+ isStaticIdentifier(path: NodePath<t.Identifier>, visited?: Set<string>): boolean;
16
+ isStaticObject(path: NodePath<t.ObjectExpression>, visited?: Set<string>): boolean;
17
+ isStaticArrayExpression(arrayExpression: NodePath<t.ArrayExpression>, visited?: Set<string>): boolean;
18
+ }
19
+ //# sourceMappingURL=shared-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-utils.d.ts","sourceRoot":"","sources":["../../src/processors/shared-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAC;AAGvC,qBAAa,iBAAiB;IAChB,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,OAAO,CAAC;IAEnC,YAAY,CACV,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,EACnC,aAAa,EAAE,MAAM,GACpB,OAAO;IAQV,kBAAkB,CAChB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,EACnC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI;IAWP,sBAAsB,CACpB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,EACnC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,CAAC,CAAC,UAAU,GACvB,IAAI;CAUR;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,OAAO,CAAC;IAEnC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO;IASnD,aAAa,CACX,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EACtB,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,OAAO;IASV,kBAAkB,CAChB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,EAC5B,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,OAAO;IAoBV,cAAc,CACZ,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAClC,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,OAAO;IAOV,uBAAuB,CACrB,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,EAC5C,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,OAAO;CAMX"}
@@ -0,0 +1,77 @@
1
+ import { JSXUtils } from "../jsx-utils.js";
2
+ export class JSXAttributeUtils {
3
+ types;
4
+ constructor(types) {
5
+ this.types = types;
6
+ }
7
+ hasAttribute(path, attributeName) {
8
+ return path.node.attributes.some((attr) => this.types.isJSXAttribute(attr) &&
9
+ JSXUtils.getAttributeName(attr) === attributeName);
10
+ }
11
+ addStringAttribute(path, attributeName, value) {
12
+ if (!this.hasAttribute(path, attributeName)) {
13
+ path.node.attributes.push(this.types.jsxAttribute(this.types.jsxIdentifier(attributeName), this.types.stringLiteral(value)));
14
+ }
15
+ }
16
+ addExpressionAttribute(path, attributeName, expression) {
17
+ if (!this.hasAttribute(path, attributeName)) {
18
+ path.node.attributes.push(this.types.jsxAttribute(this.types.jsxIdentifier(attributeName), this.types.jsxExpressionContainer(expression)));
19
+ }
20
+ }
21
+ }
22
+ export class StaticValueUtils {
23
+ types;
24
+ constructor(types) {
25
+ this.types = types;
26
+ }
27
+ isPrimitiveLiteral(path) {
28
+ return (path.isStringLiteral() ||
29
+ path.isNumericLiteral() ||
30
+ path.isBooleanLiteral() ||
31
+ path.isNullLiteral());
32
+ }
33
+ isStaticValue(path, visited = new Set()) {
34
+ if (this.isPrimitiveLiteral(path))
35
+ return true;
36
+ if (path.isIdentifier())
37
+ return this.isStaticIdentifier(path, visited);
38
+ if (path.isObjectExpression())
39
+ return this.isStaticObject(path, visited);
40
+ if (path.isArrayExpression())
41
+ return this.isStaticArrayExpression(path, visited);
42
+ return false;
43
+ }
44
+ isStaticIdentifier(path, visited = new Set()) {
45
+ const binding = path.scope.getBinding(path.node.name);
46
+ if (!binding)
47
+ return false;
48
+ if (binding.kind === "module")
49
+ return true;
50
+ if (binding.kind === "const" && binding.path.isVariableDeclarator()) {
51
+ const name = path.node.name;
52
+ if (visited.has(name))
53
+ return false;
54
+ visited.add(name);
55
+ const init = binding.path.get("init");
56
+ if (init.hasNode()) {
57
+ return this.isStaticValue(init, visited);
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+ isStaticObject(path, visited = new Set()) {
63
+ return path.get("properties").every((prop) => {
64
+ if (!prop.isObjectProperty())
65
+ return false;
66
+ return this.isStaticValue(prop.get("value"), visited);
67
+ });
68
+ }
69
+ isStaticArrayExpression(arrayExpression, visited = new Set()) {
70
+ return arrayExpression.get("elements").every((element) => {
71
+ if (!element.node || element.isSpreadElement())
72
+ return true;
73
+ return this.isStaticValue(element, visited);
74
+ });
75
+ }
76
+ }
77
+ //# sourceMappingURL=shared-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-utils.js","sourceRoot":"","sources":["../../src/processors/shared-utils.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 const DATA_ARR_INDEX = "data-arr-index";
4
+ export declare const DATA_ARR_VARIABLE_NAME = "data-arr-variable-name";
5
+ export declare const DATA_ARR_FIELD = "data-arr-field";
6
+ export declare class StaticArrayProcessor {
7
+ private types;
8
+ private attributeUtils;
9
+ private staticValueUtils;
10
+ constructor(types: typeof t);
11
+ process(path: NodePath<t.JSXOpeningElement>): void;
12
+ private addDataAttributes;
13
+ private findTextContentFieldPath;
14
+ private extractFieldPathFromChild;
15
+ private extractFieldPath;
16
+ private collectMemberExpressionParts;
17
+ private ensureIndexParam;
18
+ private addIndexParamToCallback;
19
+ private getMapCallback;
20
+ private findParentArrayMap;
21
+ private tryExtractMapInfo;
22
+ private isMapCall;
23
+ private extractArrayMapInfo;
24
+ private extractIndexParam;
25
+ private extractArrayVariableName;
26
+ private isStaticArray;
27
+ private resolveArrayExpression;
28
+ private resolveIdentifierToArray;
29
+ private isStaticArrayExpression;
30
+ }
31
+ //# sourceMappingURL=static-array-processor.d.ts.map
@@ -0,0 +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;AAGvC,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAW/C,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"}
@@ -0,0 +1,175 @@
1
+ import { JSXAttributeUtils, StaticValueUtils } from "./shared-utils.js";
2
+ export const DATA_ARR_INDEX = "data-arr-index";
3
+ export const DATA_ARR_VARIABLE_NAME = "data-arr-variable-name";
4
+ export const DATA_ARR_FIELD = "data-arr-field";
5
+ const GENERATED_INDEX_PARAM = "__arrIdx__";
6
+ export class StaticArrayProcessor {
7
+ types;
8
+ attributeUtils;
9
+ staticValueUtils;
10
+ constructor(types) {
11
+ this.types = types;
12
+ this.attributeUtils = new JSXAttributeUtils(types);
13
+ this.staticValueUtils = new StaticValueUtils(types);
14
+ }
15
+ process(path) {
16
+ const arrayInfo = this.findParentArrayMap(path);
17
+ if (!arrayInfo)
18
+ return;
19
+ if (!this.isStaticArray(arrayInfo.arrayExpression))
20
+ return;
21
+ const indexIdentifier = this.ensureIndexParam(arrayInfo);
22
+ this.addDataAttributes(path, arrayInfo, indexIdentifier);
23
+ }
24
+ addDataAttributes(path, arrayInfo, indexIdentifier) {
25
+ this.attributeUtils.addExpressionAttribute(path, DATA_ARR_INDEX, this.types.identifier(indexIdentifier));
26
+ if (arrayInfo.arrayVariableName) {
27
+ this.attributeUtils.addStringAttribute(path, DATA_ARR_VARIABLE_NAME, arrayInfo.arrayVariableName);
28
+ }
29
+ const fieldPath = this.findTextContentFieldPath(path, arrayInfo.callbackParam);
30
+ if (fieldPath) {
31
+ this.attributeUtils.addStringAttribute(path, DATA_ARR_FIELD, fieldPath);
32
+ }
33
+ }
34
+ findTextContentFieldPath(path, callbackParam) {
35
+ const parentElement = path.parentPath;
36
+ if (!parentElement?.isJSXElement())
37
+ return null;
38
+ for (const child of parentElement.get("children")) {
39
+ const fieldPath = this.extractFieldPathFromChild(child, callbackParam);
40
+ if (fieldPath)
41
+ return fieldPath;
42
+ }
43
+ return null;
44
+ }
45
+ extractFieldPathFromChild(child, callbackParam) {
46
+ if (!child.isJSXExpressionContainer())
47
+ return null;
48
+ const expression = child.get("expression");
49
+ if (!expression.isMemberExpression())
50
+ return null;
51
+ return this.extractFieldPath(expression, callbackParam);
52
+ }
53
+ extractFieldPath(expr, callbackParam) {
54
+ const parts = this.collectMemberExpressionParts(expr);
55
+ if (!parts)
56
+ return null;
57
+ const { rootName, propertyNames } = parts;
58
+ return rootName === callbackParam ? propertyNames.join(".") : null;
59
+ }
60
+ collectMemberExpressionParts(expr) {
61
+ const propertyNames = [];
62
+ let current = expr;
63
+ while (current.isMemberExpression()) {
64
+ const property = current.get("property");
65
+ if (!property.isIdentifier())
66
+ return null;
67
+ propertyNames.unshift(property.node.name);
68
+ current = current.get("object");
69
+ }
70
+ if (!current.isIdentifier())
71
+ return null;
72
+ return { rootName: current.node.name, propertyNames };
73
+ }
74
+ ensureIndexParam(arrayInfo) {
75
+ if (arrayInfo.indexParam) {
76
+ return arrayInfo.indexParam;
77
+ }
78
+ this.addIndexParamToCallback(arrayInfo.mapCallPath);
79
+ return GENERATED_INDEX_PARAM;
80
+ }
81
+ addIndexParamToCallback(mapCallPath) {
82
+ const callback = this.getMapCallback(mapCallPath);
83
+ if (!callback)
84
+ return;
85
+ const params = callback.get("params");
86
+ if (params.length === 1) {
87
+ callback.node.params.push(this.types.identifier(GENERATED_INDEX_PARAM));
88
+ }
89
+ }
90
+ getMapCallback(mapCallPath) {
91
+ const args = mapCallPath.get("arguments");
92
+ const firstArg = args[0];
93
+ if (firstArg && firstArg.isFunction()) {
94
+ return firstArg;
95
+ }
96
+ return null;
97
+ }
98
+ findParentArrayMap(path, maxDepth = 5) {
99
+ let currentPath = path;
100
+ let depth = 0;
101
+ while (currentPath.parentPath && depth < maxDepth) {
102
+ const mapInfo = this.tryExtractMapInfo(currentPath.parentPath);
103
+ if (mapInfo)
104
+ return mapInfo;
105
+ currentPath = currentPath.parentPath;
106
+ depth++;
107
+ }
108
+ return null;
109
+ }
110
+ tryExtractMapInfo(parent) {
111
+ if (!parent.isCallExpression())
112
+ return null;
113
+ if (!this.isMapCall(parent))
114
+ return null;
115
+ return this.extractArrayMapInfo(parent);
116
+ }
117
+ isMapCall(callExpr) {
118
+ const callee = callExpr.get("callee");
119
+ if (!callee.isMemberExpression())
120
+ return false;
121
+ const property = callee.get("property");
122
+ return property.isIdentifier() && property.node.name === "map";
123
+ }
124
+ extractArrayMapInfo(mapCall) {
125
+ const callback = this.getMapCallback(mapCall);
126
+ if (!callback)
127
+ return null;
128
+ const params = callback.get("params");
129
+ const firstParam = params[0];
130
+ if (!firstParam || !firstParam.isIdentifier())
131
+ return null;
132
+ const callee = mapCall.get("callee");
133
+ const arrayExpression = callee.get("object");
134
+ return {
135
+ arrayExpression,
136
+ callbackParam: firstParam.node.name,
137
+ indexParam: this.extractIndexParam(params),
138
+ arrayVariableName: this.extractArrayVariableName(arrayExpression),
139
+ mapCallPath: mapCall,
140
+ };
141
+ }
142
+ extractIndexParam(params) {
143
+ const secondParam = params[1];
144
+ return secondParam && secondParam.isIdentifier()
145
+ ? secondParam.node.name
146
+ : null;
147
+ }
148
+ extractArrayVariableName(arrayExpression) {
149
+ return arrayExpression.isIdentifier() ? arrayExpression.node.name : null;
150
+ }
151
+ isStaticArray(arrayExpression) {
152
+ const arrayExpr = this.resolveArrayExpression(arrayExpression);
153
+ return arrayExpr ? this.isStaticArrayExpression(arrayExpr) : false;
154
+ }
155
+ resolveArrayExpression(expression) {
156
+ if (expression.isArrayExpression()) {
157
+ return expression;
158
+ }
159
+ if (expression.isIdentifier()) {
160
+ return this.resolveIdentifierToArray(expression);
161
+ }
162
+ return null;
163
+ }
164
+ resolveIdentifierToArray(identifier) {
165
+ const binding = identifier.scope.getBinding(identifier.node.name);
166
+ if (!binding?.path.isVariableDeclarator())
167
+ return null;
168
+ const init = binding.path.get("init");
169
+ return init.isArrayExpression() ? init : null;
170
+ }
171
+ isStaticArrayExpression(arrayExpression) {
172
+ return this.staticValueUtils.isStaticArrayExpression(arrayExpression);
173
+ }
174
+ }
175
+ //# sourceMappingURL=static-array-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-array-processor.js","sourceRoot":"","sources":["../../src/processors/static-array-processor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"visual-edit-plugin.d.ts","sourceRoot":"","sources":["../src/visual-edit-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,GAAG,WA2G9D;AAED,wBAAgB,gBAAgB,IAuKzB,MAAM,CACZ"}
1
+ {"version":3,"file":"visual-edit-plugin.d.ts","sourceRoot":"","sources":["../src/visual-edit-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAKnC,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,GAAG,WA2G9D;AAED,wBAAgB,gBAAgB,IA2KzB,MAAM,CACZ"}
@@ -2,6 +2,8 @@ import { parse } from "@babel/parser";
2
2
  import { default as traverse } from "@babel/traverse";
3
3
  import { default as generate } from "@babel/generator";
4
4
  import * as t from "@babel/types";
5
+ import { StaticArrayProcessor } from "./processors/static-array-processor.js";
6
+ import { JSXUtils } from "./jsx-utils.js";
5
7
  // Helper function to check if JSX element contains dynamic content
6
8
  export function checkIfElementHasDynamicContent(jsxElement) {
7
9
  let hasDynamicContent = false;
@@ -190,6 +192,8 @@ export function visualEditPlugin() {
190
192
  ],
191
193
  });
192
194
  // Traverse the AST and add source location and dynamic content attributes to JSX elements
195
+ JSXUtils.init(t);
196
+ const staticArrayProcessor = new StaticArrayProcessor(t);
193
197
  let elementsProcessed = 0;
194
198
  traverse.default(ast, {
195
199
  JSXElement(path) {
@@ -217,6 +221,7 @@ export function visualEditPlugin() {
217
221
  const dynamicContentAttr = t.jsxAttribute(t.jsxIdentifier("data-dynamic-content"), t.stringLiteral(isDynamic ? "true" : "false"));
218
222
  // Add both attributes to the beginning of the attributes array
219
223
  openingElement.attributes.unshift(sourceLocationAttr, dynamicContentAttr);
224
+ staticArrayProcessor.process(path.get("openingElement"));
220
225
  elementsProcessed++;
221
226
  },
222
227
  });
@@ -1 +1 @@
1
- {"version":3,"file":"visual-edit-plugin.js","sourceRoot":"","sources":["../src/visual-edit-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visual-edit-plugin.js","sourceRoot":"","sources":["../src/visual-edit-plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44/vite-plugin",
3
- "version": "0.2.22",
3
+ "version": "0.2.23",
4
4
  "description": "The Vite plugin for base44 based applications",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,6 +23,7 @@
23
23
  "test:unit": "vitest run"
24
24
  },
25
25
  "devDependencies": {
26
+ "@babel/core": "^7.29.0",
26
27
  "@types/babel__generator": "^7.27.0",
27
28
  "@types/babel__traverse": "^7.28.0",
28
29
  "@types/node": "^24.6.2",
@@ -0,0 +1,147 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type * as t from "@babel/types";
3
+ import { StaticArrayProcessor } from "./processors/static-array-processor.js";
4
+
5
+ export class JSXProcessor {
6
+ private staticArrayProcessor: StaticArrayProcessor;
7
+
8
+ constructor(
9
+ private types: typeof t,
10
+ private filename: string
11
+ ) {
12
+ this.staticArrayProcessor = new StaticArrayProcessor(types);
13
+ }
14
+
15
+ processJSXElement(path: NodePath<t.JSXOpeningElement>): void {
16
+ if (this.hasAttribute(path, "data-source-location")) return;
17
+
18
+ this.addSourceLocationAttribute(path);
19
+ this.addDynamicContentAttribute(path);
20
+ this.addContentEditableAttribute(path);
21
+ this.staticArrayProcessor.process(path);
22
+ }
23
+
24
+ private addSourceLocationAttribute(
25
+ path: NodePath<t.JSXOpeningElement>
26
+ ): void {
27
+ const { line, column } = path.node.loc?.start || { line: 1, column: 0 };
28
+ const value = `${this.filename}:${line}:${column}`;
29
+
30
+ path.node.attributes.push(
31
+ this.types.jsxAttribute(
32
+ this.types.jsxIdentifier("data-source-location"),
33
+ this.types.stringLiteral(value)
34
+ )
35
+ );
36
+ }
37
+
38
+ private addDynamicContentAttribute(
39
+ path: NodePath<t.JSXOpeningElement>
40
+ ): void {
41
+ const parentElement = path.parentPath;
42
+ if (!parentElement?.isJSXElement()) return;
43
+
44
+ const isDynamic = this.checkIfElementHasDynamicContent(
45
+ parentElement.node as t.JSXElement
46
+ );
47
+
48
+ path.node.attributes.push(
49
+ this.types.jsxAttribute(
50
+ this.types.jsxIdentifier("data-dynamic-content"),
51
+ this.types.stringLiteral(isDynamic ? "true" : "false")
52
+ )
53
+ );
54
+ }
55
+
56
+ private addContentEditableAttribute(
57
+ path: NodePath<t.JSXOpeningElement>
58
+ ): void {
59
+ path.node.attributes.push(
60
+ this.types.jsxAttribute(
61
+ this.types.jsxIdentifier("content-editable"),
62
+ this.types.stringLiteral("true")
63
+ )
64
+ );
65
+ }
66
+
67
+ private hasAttribute(
68
+ path: NodePath<t.JSXOpeningElement>,
69
+ name: string
70
+ ): boolean {
71
+ return path.node.attributes.some(
72
+ (attr: t.JSXAttribute | t.JSXSpreadAttribute) =>
73
+ this.types.isJSXAttribute(attr) &&
74
+ this.types.isJSXIdentifier(attr.name) &&
75
+ attr.name.name === name
76
+ );
77
+ }
78
+
79
+ private checkIfElementHasDynamicContent(jsxElement: t.JSXElement): boolean {
80
+ let hasDynamicContent = false;
81
+
82
+ const checkNode = (node: t.Node): boolean => {
83
+ if (this.types.isJSXExpressionContainer(node)) {
84
+ const expression = (node as t.JSXExpressionContainer).expression;
85
+ if (this.types.isJSXEmptyExpression(expression)) return false;
86
+ if (!this.types.isLiteral(expression)) return true;
87
+ }
88
+
89
+ if (
90
+ this.types.isTemplateLiteral(node) &&
91
+ (node as t.TemplateLiteral).expressions.length > 0
92
+ ) {
93
+ return true;
94
+ }
95
+ if (this.types.isMemberExpression(node)) return true;
96
+ if (this.types.isCallExpression(node)) return true;
97
+ if (this.types.isConditionalExpression(node)) return true;
98
+
99
+ if (this.types.isIdentifier(node)) {
100
+ const dynamicNames = [
101
+ "props",
102
+ "state",
103
+ "data",
104
+ "item",
105
+ "value",
106
+ "text",
107
+ "content",
108
+ ];
109
+ if (dynamicNames.some((name) => (node as t.Identifier).name.includes(name))) {
110
+ return true;
111
+ }
112
+ }
113
+
114
+ return false;
115
+ };
116
+
117
+ const traverseNode = (node: Record<string, unknown>): void => {
118
+ if (hasDynamicContent) return;
119
+ if (checkNode(node as unknown as t.Node)) {
120
+ hasDynamicContent = true;
121
+ return;
122
+ }
123
+
124
+ for (const key of Object.keys(node)) {
125
+ if (hasDynamicContent) return;
126
+ const value = node[key];
127
+
128
+ if (Array.isArray(value)) {
129
+ for (const child of value) {
130
+ if (child && typeof child === "object" && "type" in child) {
131
+ traverseNode(child as Record<string, unknown>);
132
+ }
133
+ }
134
+ } else if (value && typeof value === "object" && "type" in value) {
135
+ traverseNode(value as Record<string, unknown>);
136
+ }
137
+ }
138
+ };
139
+
140
+ for (const child of jsxElement.children) {
141
+ if (hasDynamicContent) break;
142
+ traverseNode(child as unknown as Record<string, unknown>);
143
+ }
144
+
145
+ return hasDynamicContent;
146
+ }
147
+ }
@@ -0,0 +1,15 @@
1
+ import type * as t from "@babel/types";
2
+
3
+ export class JSXUtils {
4
+ private static types: typeof t;
5
+
6
+ static init(types: typeof t) {
7
+ this.types = types;
8
+ }
9
+
10
+ static getAttributeName(attr: t.JSXAttribute): string {
11
+ return this.types.isJSXNamespacedName(attr.name)
12
+ ? `${attr.name.namespace.name}:${attr.name.name.name}`
13
+ : attr.name.name;
14
+ }
15
+ }
@@ -0,0 +1,116 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type * as t from "@babel/types";
3
+ import { JSXUtils } from "../jsx-utils.js";
4
+
5
+ export class JSXAttributeUtils {
6
+ constructor(private types: typeof t) {}
7
+
8
+ hasAttribute(
9
+ path: NodePath<t.JSXOpeningElement>,
10
+ attributeName: string
11
+ ): boolean {
12
+ return path.node.attributes.some(
13
+ (attr: t.JSXAttribute | t.JSXSpreadAttribute) =>
14
+ this.types.isJSXAttribute(attr) &&
15
+ JSXUtils.getAttributeName(attr) === attributeName
16
+ );
17
+ }
18
+
19
+ addStringAttribute(
20
+ path: NodePath<t.JSXOpeningElement>,
21
+ attributeName: string,
22
+ value: string
23
+ ): void {
24
+ if (!this.hasAttribute(path, attributeName)) {
25
+ path.node.attributes.push(
26
+ this.types.jsxAttribute(
27
+ this.types.jsxIdentifier(attributeName),
28
+ this.types.stringLiteral(value)
29
+ )
30
+ );
31
+ }
32
+ }
33
+
34
+ addExpressionAttribute(
35
+ path: NodePath<t.JSXOpeningElement>,
36
+ attributeName: string,
37
+ expression: t.Expression
38
+ ): void {
39
+ if (!this.hasAttribute(path, attributeName)) {
40
+ path.node.attributes.push(
41
+ this.types.jsxAttribute(
42
+ this.types.jsxIdentifier(attributeName),
43
+ this.types.jsxExpressionContainer(expression)
44
+ )
45
+ );
46
+ }
47
+ }
48
+ }
49
+
50
+ export class StaticValueUtils {
51
+ constructor(private types: typeof t) {}
52
+
53
+ isPrimitiveLiteral(path: NodePath<t.Node>): boolean {
54
+ return (
55
+ path.isStringLiteral() ||
56
+ path.isNumericLiteral() ||
57
+ path.isBooleanLiteral() ||
58
+ path.isNullLiteral()
59
+ );
60
+ }
61
+
62
+ isStaticValue(
63
+ path: NodePath<t.Node>,
64
+ visited: Set<string> = new Set()
65
+ ): boolean {
66
+ if (this.isPrimitiveLiteral(path)) return true;
67
+ if (path.isIdentifier()) return this.isStaticIdentifier(path, visited);
68
+ if (path.isObjectExpression()) return this.isStaticObject(path, visited);
69
+ if (path.isArrayExpression())
70
+ return this.isStaticArrayExpression(path, visited);
71
+ return false;
72
+ }
73
+
74
+ isStaticIdentifier(
75
+ path: NodePath<t.Identifier>,
76
+ visited: Set<string> = new Set()
77
+ ): boolean {
78
+ const binding = path.scope.getBinding(path.node.name);
79
+ if (!binding) return false;
80
+
81
+ if (binding.kind === "module") return true;
82
+
83
+ if (binding.kind === "const" && binding.path.isVariableDeclarator()) {
84
+ const name = path.node.name;
85
+ if (visited.has(name)) return false;
86
+ visited.add(name);
87
+
88
+ const init = binding.path.get("init");
89
+ if (init.hasNode()) {
90
+ return this.isStaticValue(init as NodePath<t.Node>, visited);
91
+ }
92
+ }
93
+
94
+ return false;
95
+ }
96
+
97
+ isStaticObject(
98
+ path: NodePath<t.ObjectExpression>,
99
+ visited: Set<string> = new Set()
100
+ ): boolean {
101
+ return path.get("properties").every((prop: NodePath) => {
102
+ if (!prop.isObjectProperty()) return false;
103
+ return this.isStaticValue(prop.get("value") as NodePath<t.Node>, visited);
104
+ });
105
+ }
106
+
107
+ isStaticArrayExpression(
108
+ arrayExpression: NodePath<t.ArrayExpression>,
109
+ visited: Set<string> = new Set()
110
+ ): boolean {
111
+ return arrayExpression.get("elements").every((element) => {
112
+ if (!element.node || element.isSpreadElement()) return true;
113
+ return this.isStaticValue(element as unknown as NodePath<t.Node>, visited);
114
+ });
115
+ }
116
+ }
@@ -0,0 +1,257 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type * as t from "@babel/types";
3
+ import { JSXAttributeUtils, StaticValueUtils } from "./shared-utils.js";
4
+
5
+ export const DATA_ARR_INDEX = "data-arr-index";
6
+ export const DATA_ARR_VARIABLE_NAME = "data-arr-variable-name";
7
+ export const DATA_ARR_FIELD = "data-arr-field";
8
+ const GENERATED_INDEX_PARAM = "__arrIdx__";
9
+
10
+ interface ArrayMapInfo {
11
+ arrayExpression: NodePath<t.Expression>;
12
+ callbackParam: string;
13
+ indexParam: string | null;
14
+ arrayVariableName: string | null;
15
+ mapCallPath: NodePath<t.CallExpression>;
16
+ }
17
+
18
+ export class StaticArrayProcessor {
19
+ private attributeUtils: JSXAttributeUtils;
20
+ private staticValueUtils: StaticValueUtils;
21
+
22
+ constructor(private types: typeof t) {
23
+ this.attributeUtils = new JSXAttributeUtils(types);
24
+ this.staticValueUtils = new StaticValueUtils(types);
25
+ }
26
+
27
+ process(path: NodePath<t.JSXOpeningElement>): void {
28
+ const arrayInfo = this.findParentArrayMap(path);
29
+ if (!arrayInfo) return;
30
+
31
+ if (!this.isStaticArray(arrayInfo.arrayExpression)) return;
32
+
33
+ const indexIdentifier = this.ensureIndexParam(arrayInfo);
34
+ this.addDataAttributes(path, arrayInfo, indexIdentifier);
35
+ }
36
+
37
+ private addDataAttributes(
38
+ path: NodePath<t.JSXOpeningElement>,
39
+ arrayInfo: ArrayMapInfo,
40
+ indexIdentifier: string
41
+ ): void {
42
+ this.attributeUtils.addExpressionAttribute(
43
+ path,
44
+ DATA_ARR_INDEX,
45
+ this.types.identifier(indexIdentifier)
46
+ );
47
+
48
+ if (arrayInfo.arrayVariableName) {
49
+ this.attributeUtils.addStringAttribute(
50
+ path,
51
+ DATA_ARR_VARIABLE_NAME,
52
+ arrayInfo.arrayVariableName
53
+ );
54
+ }
55
+
56
+ const fieldPath = this.findTextContentFieldPath(
57
+ path,
58
+ arrayInfo.callbackParam
59
+ );
60
+ if (fieldPath) {
61
+ this.attributeUtils.addStringAttribute(path, DATA_ARR_FIELD, fieldPath);
62
+ }
63
+ }
64
+
65
+ private findTextContentFieldPath(
66
+ path: NodePath<t.JSXOpeningElement>,
67
+ callbackParam: string
68
+ ): string | null {
69
+ const parentElement = path.parentPath;
70
+ if (!parentElement?.isJSXElement()) return null;
71
+
72
+ for (const child of parentElement.get("children")) {
73
+ const fieldPath = this.extractFieldPathFromChild(child, callbackParam);
74
+ if (fieldPath) return fieldPath;
75
+ }
76
+
77
+ return null;
78
+ }
79
+
80
+ private extractFieldPathFromChild(
81
+ child: NodePath<t.JSXElement["children"][number]>,
82
+ callbackParam: string
83
+ ): string | null {
84
+ if (!child.isJSXExpressionContainer()) return null;
85
+
86
+ const expression = child.get("expression");
87
+ if (!expression.isMemberExpression()) return null;
88
+
89
+ return this.extractFieldPath(expression, callbackParam);
90
+ }
91
+
92
+ private extractFieldPath(
93
+ expr: NodePath<t.MemberExpression>,
94
+ callbackParam: string
95
+ ): string | null {
96
+ const parts = this.collectMemberExpressionParts(expr);
97
+ if (!parts) return null;
98
+
99
+ const { rootName, propertyNames } = parts;
100
+ return rootName === callbackParam ? propertyNames.join(".") : null;
101
+ }
102
+
103
+ private collectMemberExpressionParts(
104
+ expr: NodePath<t.MemberExpression>
105
+ ): { rootName: string; propertyNames: string[] } | null {
106
+ const propertyNames: string[] = [];
107
+ let current: NodePath<t.Expression> = expr;
108
+
109
+ while (current.isMemberExpression()) {
110
+ const property = current.get("property");
111
+ if (!property.isIdentifier()) return null;
112
+
113
+ propertyNames.unshift(property.node.name);
114
+ current = current.get("object") as NodePath<t.Expression>;
115
+ }
116
+
117
+ if (!current.isIdentifier()) return null;
118
+
119
+ return { rootName: current.node.name, propertyNames };
120
+ }
121
+
122
+ private ensureIndexParam(arrayInfo: ArrayMapInfo): string {
123
+ if (arrayInfo.indexParam) {
124
+ return arrayInfo.indexParam;
125
+ }
126
+
127
+ this.addIndexParamToCallback(arrayInfo.mapCallPath);
128
+ return GENERATED_INDEX_PARAM;
129
+ }
130
+
131
+ private addIndexParamToCallback(
132
+ mapCallPath: NodePath<t.CallExpression>
133
+ ): void {
134
+ const callback = this.getMapCallback(mapCallPath);
135
+ if (!callback) return;
136
+
137
+ const params = callback.get("params");
138
+ if (params.length === 1) {
139
+ callback.node.params.push(this.types.identifier(GENERATED_INDEX_PARAM));
140
+ }
141
+ }
142
+
143
+ private getMapCallback(
144
+ mapCallPath: NodePath<t.CallExpression>
145
+ ): NodePath<t.Function> | null {
146
+ const args = mapCallPath.get("arguments");
147
+ const firstArg = args[0];
148
+ if (firstArg && firstArg.isFunction()) {
149
+ return firstArg as NodePath<t.Function>;
150
+ }
151
+ return null;
152
+ }
153
+
154
+ private findParentArrayMap(
155
+ path: NodePath<t.JSXOpeningElement>,
156
+ maxDepth: number = 5
157
+ ): ArrayMapInfo | null {
158
+ let currentPath: NodePath = path;
159
+ let depth = 0;
160
+
161
+ while (currentPath.parentPath && depth < maxDepth) {
162
+ const mapInfo = this.tryExtractMapInfo(currentPath.parentPath);
163
+ if (mapInfo) return mapInfo;
164
+
165
+ currentPath = currentPath.parentPath;
166
+ depth++;
167
+ }
168
+
169
+ return null;
170
+ }
171
+
172
+ private tryExtractMapInfo(parent: NodePath): ArrayMapInfo | null {
173
+ if (!parent.isCallExpression()) return null;
174
+ if (!this.isMapCall(parent)) return null;
175
+
176
+ return this.extractArrayMapInfo(parent);
177
+ }
178
+
179
+ private isMapCall(callExpr: NodePath<t.CallExpression>): boolean {
180
+ const callee = callExpr.get("callee");
181
+ if (!callee.isMemberExpression()) return false;
182
+
183
+ const property = callee.get("property");
184
+ return property.isIdentifier() && property.node.name === "map";
185
+ }
186
+
187
+ private extractArrayMapInfo(
188
+ mapCall: NodePath<t.CallExpression>
189
+ ): ArrayMapInfo | null {
190
+ const callback = this.getMapCallback(mapCall);
191
+ if (!callback) return null;
192
+
193
+ const params = callback.get("params");
194
+ const firstParam = params[0];
195
+ if (!firstParam || !firstParam.isIdentifier()) return null;
196
+
197
+ const callee = mapCall.get("callee") as NodePath<t.MemberExpression>;
198
+ const arrayExpression = callee.get("object") as NodePath<t.Expression>;
199
+
200
+ return {
201
+ arrayExpression,
202
+ callbackParam: firstParam.node.name,
203
+ indexParam: this.extractIndexParam(params),
204
+ arrayVariableName: this.extractArrayVariableName(arrayExpression),
205
+ mapCallPath: mapCall,
206
+ };
207
+ }
208
+
209
+ private extractIndexParam(params: NodePath<t.Node>[]): string | null {
210
+ const secondParam = params[1];
211
+ return secondParam && secondParam.isIdentifier()
212
+ ? secondParam.node.name
213
+ : null;
214
+ }
215
+
216
+ private extractArrayVariableName(
217
+ arrayExpression: NodePath<t.Expression>
218
+ ): string | null {
219
+ return arrayExpression.isIdentifier() ? arrayExpression.node.name : null;
220
+ }
221
+
222
+ private isStaticArray(arrayExpression: NodePath<t.Expression>): boolean {
223
+ const arrayExpr = this.resolveArrayExpression(arrayExpression);
224
+ return arrayExpr ? this.isStaticArrayExpression(arrayExpr) : false;
225
+ }
226
+
227
+ private resolveArrayExpression(
228
+ expression: NodePath<t.Expression>
229
+ ): NodePath<t.ArrayExpression> | null {
230
+ if (expression.isArrayExpression()) {
231
+ return expression;
232
+ }
233
+
234
+ if (expression.isIdentifier()) {
235
+ return this.resolveIdentifierToArray(expression);
236
+ }
237
+
238
+ return null;
239
+ }
240
+
241
+ private resolveIdentifierToArray(
242
+ identifier: NodePath<t.Identifier>
243
+ ): NodePath<t.ArrayExpression> | null {
244
+ const binding = identifier.scope.getBinding(identifier.node.name);
245
+
246
+ if (!binding?.path.isVariableDeclarator()) return null;
247
+
248
+ const init = binding.path.get("init");
249
+ return init.isArrayExpression() ? init : null;
250
+ }
251
+
252
+ private isStaticArrayExpression(
253
+ arrayExpression: NodePath<t.ArrayExpression>
254
+ ): boolean {
255
+ return this.staticValueUtils.isStaticArrayExpression(arrayExpression);
256
+ }
257
+ }
@@ -3,6 +3,8 @@ import { default as traverse } from "@babel/traverse";
3
3
  import { default as generate } from "@babel/generator";
4
4
  import * as t from "@babel/types";
5
5
  import type { Plugin } from "vite";
6
+ import { StaticArrayProcessor } from "./processors/static-array-processor.js";
7
+ import { JSXUtils } from "./jsx-utils.js";
6
8
 
7
9
  // Helper function to check if JSX element contains dynamic content
8
10
  export function checkIfElementHasDynamicContent(jsxElement: any) {
@@ -213,6 +215,8 @@ export function visualEditPlugin() {
213
215
  });
214
216
 
215
217
  // Traverse the AST and add source location and dynamic content attributes to JSX elements
218
+ JSXUtils.init(t);
219
+ const staticArrayProcessor = new StaticArrayProcessor(t);
216
220
  let elementsProcessed = 0;
217
221
  traverse.default(ast, {
218
222
  JSXElement(path) {
@@ -258,6 +262,8 @@ export function visualEditPlugin() {
258
262
  sourceLocationAttr,
259
263
  dynamicContentAttr
260
264
  );
265
+
266
+ staticArrayProcessor.process(path.get("openingElement"));
261
267
  elementsProcessed++;
262
268
  },
263
269
  });