@lcap/nasl 4.1.0-creator.1 → 4.1.0-creator.10
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/out/natural/index.d.ts +1 -0
- package/out/natural/index.d.ts.map +1 -1
- package/out/natural/index.js +3 -0
- package/out/natural/index.js.map +1 -1
- package/out/natural/parseNaturalTS.d.ts +4 -7
- package/out/natural/parseNaturalTS.d.ts.map +1 -1
- package/out/natural/parseNaturalTS.js +84 -69
- package/out/natural/parseNaturalTS.js.map +1 -1
- package/out/natural/parseNaturalTSXView.d.ts +16 -4
- package/out/natural/parseNaturalTSXView.d.ts.map +1 -1
- package/out/natural/parseNaturalTSXView.js +196 -91
- package/out/natural/parseNaturalTSXView.js.map +1 -1
- package/out/natural/transformTS2UI.d.ts.map +1 -1
- package/out/natural/transformTS2UI.js +9 -8
- package/out/natural/transformTS2UI.js.map +1 -1
- package/out/natural/transformTSCode.js +3 -3
- package/out/natural/transformTSCode.js.map +1 -1
- package/out/natural/transforms/transform2Entity.d.ts +3 -1
- package/out/natural/transforms/transform2Entity.d.ts.map +1 -1
- package/out/natural/transforms/transform2Entity.js +28 -6
- package/out/natural/transforms/transform2Entity.js.map +1 -1
- package/out/natural/transforms/transform2Enum.d.ts +3 -1
- package/out/natural/transforms/transform2Enum.d.ts.map +1 -1
- package/out/natural/transforms/transform2Enum.js +20 -4
- package/out/natural/transforms/transform2Enum.js.map +1 -1
- package/out/natural/transforms/transform2GlobalLogicDeclaration.d.ts +3 -1
- package/out/natural/transforms/transform2GlobalLogicDeclaration.d.ts.map +1 -1
- package/out/natural/transforms/transform2GlobalLogicDeclaration.js +3 -3
- package/out/natural/transforms/transform2GlobalLogicDeclaration.js.map +1 -1
- package/out/natural/transforms/transform2Logic.d.ts +9 -3
- package/out/natural/transforms/transform2Logic.d.ts.map +1 -1
- package/out/natural/transforms/transform2Logic.js +14 -8
- package/out/natural/transforms/transform2Logic.js.map +1 -1
- package/out/natural/transforms/transform2LogicItem.d.ts +30 -26
- package/out/natural/transforms/transform2LogicItem.d.ts.map +1 -1
- package/out/natural/transforms/transform2LogicItem.js +199 -132
- package/out/natural/transforms/transform2LogicItem.js.map +1 -1
- package/out/natural/transforms/transform2MetadataType.d.ts +3 -1
- package/out/natural/transforms/transform2MetadataType.d.ts.map +1 -1
- package/out/natural/transforms/transform2MetadataType.js +2 -2
- package/out/natural/transforms/transform2MetadataType.js.map +1 -1
- package/out/natural/transforms/transform2Structure.d.ts +3 -1
- package/out/natural/transforms/transform2Structure.d.ts.map +1 -1
- package/out/natural/transforms/transform2Structure.js +4 -4
- package/out/natural/transforms/transform2Structure.js.map +1 -1
- package/out/natural/transforms/transform2TypeAnnotation.d.ts +3 -1
- package/out/natural/transforms/transform2TypeAnnotation.d.ts.map +1 -1
- package/out/natural/transforms/transform2TypeAnnotation.js +10 -11
- package/out/natural/transforms/transform2TypeAnnotation.js.map +1 -1
- package/out/natural/transforms/transform2ValidationRule.d.ts +3 -1
- package/out/natural/transforms/transform2ValidationRule.d.ts.map +1 -1
- package/out/natural/transforms/transform2ValidationRule.js +9 -4
- package/out/natural/transforms/transform2ValidationRule.js.map +1 -1
- package/out/natural/transforms/transform2Variable.d.ts +6 -2
- package/out/natural/transforms/transform2Variable.d.ts.map +1 -1
- package/out/natural/transforms/transform2Variable.js +10 -10
- package/out/natural/transforms/transform2Variable.js.map +1 -1
- package/out/natural/transforms/transformThemeAndStyle.d.ts +6 -2
- package/out/natural/transforms/transformThemeAndStyle.d.ts.map +1 -1
- package/out/natural/transforms/transformThemeAndStyle.js +7 -7
- package/out/natural/transforms/transformThemeAndStyle.js.map +1 -1
- package/out/natural/transforms/utils.d.ts +8 -3
- package/out/natural/transforms/utils.d.ts.map +1 -1
- package/out/natural/transforms/utils.js +20 -8
- package/out/natural/transforms/utils.js.map +1 -1
- package/out/server/findReference.d.ts.map +1 -1
- package/out/server/findReference.js +4 -0
- package/out/server/findReference.js.map +1 -1
- package/package.json +10 -10
- package/out/natural/transforms/registerTransform.d.ts +0 -8
- package/out/natural/transforms/registerTransform.d.ts.map +0 -1
- package/out/natural/transforms/registerTransform.js +0 -24
- package/out/natural/transforms/registerTransform.js.map +0 -1
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.parseNaturalTSXView = exports.transform2View = exports.transformJSXElement2ViewElement = exports.transform2Variables = void 0;
|
|
26
|
+
exports.parseNaturalTSXView = exports.transformTSDeclareFunction2View = exports.transform2View = exports.transformJSXElement2ViewElement = exports.transform2Variables = void 0;
|
|
27
27
|
/* eslint-disable global-require */
|
|
28
28
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
29
29
|
const utils_1 = require("./transforms/utils");
|
|
@@ -35,19 +35,19 @@ const transform2LogicItem_1 = require("./transforms/transform2LogicItem");
|
|
|
35
35
|
const transform2Logic_1 = require("./transforms/transform2Logic");
|
|
36
36
|
const transform2ValidationRule_1 = require("./transforms/transform2ValidationRule");
|
|
37
37
|
const transformThemeAndStyle_1 = require("./transforms/transformThemeAndStyle");
|
|
38
|
-
function transform2Variables(node) {
|
|
38
|
+
function transform2Variables(node, options) {
|
|
39
39
|
const variables = [];
|
|
40
40
|
const declList = node?.declarations || [];
|
|
41
41
|
declList.forEach((decl) => {
|
|
42
42
|
const variableName = decl.id.name;
|
|
43
|
-
let typeAnnotation = (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(decl.id.typeAnnotation?.typeAnnotation);
|
|
43
|
+
let typeAnnotation = (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(decl.id.typeAnnotation?.typeAnnotation, options) || undefined;
|
|
44
44
|
const variable = new utils_1.naslTypes.Variable({
|
|
45
45
|
name: variableName,
|
|
46
46
|
typeAnnotation,
|
|
47
47
|
});
|
|
48
48
|
if (decl.init) {
|
|
49
49
|
variable.defaultValue = new utils_1.naslTypes.DefaultValue({
|
|
50
|
-
expression: (0, transform2LogicItem_1.transform2LogicItem)(decl.init, { transformType: 'attr', typeAnnotation, isRestricted: true, isInFrontend: true }),
|
|
50
|
+
expression: (0, transform2LogicItem_1.transform2LogicItem)(decl.init, { ...options, transformType: 'attr', typeAnnotation, isRestricted: true, isInFrontend: true }),
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
variables.push(variable);
|
|
@@ -55,31 +55,35 @@ function transform2Variables(node) {
|
|
|
55
55
|
return variables;
|
|
56
56
|
}
|
|
57
57
|
exports.transform2Variables = transform2Variables;
|
|
58
|
-
function transform2EventLogics(node, eventName) {
|
|
58
|
+
function transform2EventLogics(node, eventName, options) {
|
|
59
59
|
if (node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') {
|
|
60
|
-
|
|
60
|
+
const logic = (0, transform2Logic_1.transform2Logic)(node, eventName, options);
|
|
61
|
+
logic.params = [];
|
|
62
|
+
return [logic];
|
|
61
63
|
}
|
|
62
64
|
else if (node.type === 'CallExpression') {
|
|
63
65
|
if (node.callee.type === 'Identifier' && node.callee.name === '$all') {
|
|
64
66
|
const args = node.arguments;
|
|
65
67
|
return args.map((node) => {
|
|
66
68
|
if (node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') {
|
|
67
|
-
|
|
69
|
+
const logic = (0, transform2Logic_1.transform2Logic)(node, eventName, options);
|
|
70
|
+
logic.params = [];
|
|
71
|
+
return logic;
|
|
68
72
|
}
|
|
69
73
|
else {
|
|
70
|
-
(0, utils_1.throwError)('事件逻辑参数不支持的类型', node.type, node);
|
|
74
|
+
return (0, utils_1.throwError)(options?.parsingId, '事件逻辑参数不支持的类型', node.type, node);
|
|
71
75
|
}
|
|
72
|
-
});
|
|
76
|
+
}).filter(Boolean);
|
|
73
77
|
}
|
|
74
78
|
else {
|
|
75
|
-
(0, utils_1.throwError)('事件逻辑参数不正确', node);
|
|
79
|
+
return (0, utils_1.throwError)(options?.parsingId, '事件逻辑参数不正确', node);
|
|
76
80
|
}
|
|
77
81
|
}
|
|
78
82
|
else {
|
|
79
|
-
(0, utils_1.throwError)('事件逻辑参数不正确', node);
|
|
83
|
+
return (0, utils_1.throwError)(options?.parsingId, '事件逻辑参数不正确', node);
|
|
80
84
|
}
|
|
81
85
|
}
|
|
82
|
-
function transformJSXElement2ViewElement(node) {
|
|
86
|
+
function transformJSXElement2ViewElement(node, options) {
|
|
83
87
|
const el = node.openingElement;
|
|
84
88
|
if (el.name.type === 'JSXIdentifier') {
|
|
85
89
|
let tag = (0, lodash_1.kebabCase)(el.name.name);
|
|
@@ -101,41 +105,61 @@ function transformJSXElement2ViewElement(node) {
|
|
|
101
105
|
function addJSXChild(node, slotTarget = 'default', slotScope = '') {
|
|
102
106
|
if (node.type === 'JSXElement') {
|
|
103
107
|
if (slotTarget === 'default' && !slotScope) {
|
|
104
|
-
|
|
108
|
+
const child = transformJSXElement2ViewElement(node, options);
|
|
109
|
+
child && viewElement.children.push(child);
|
|
105
110
|
}
|
|
106
111
|
else {
|
|
107
|
-
|
|
112
|
+
const child = transformJSXElement2ViewElement(node, options);
|
|
113
|
+
let templateName = 'template_' + (0, utils_2.uuidv4)().slice(0, 5);
|
|
114
|
+
// 确保模板名称也不重复
|
|
115
|
+
while (options.nameMap.has(templateName)) {
|
|
116
|
+
templateName = 'template_' + (0, utils_2.uuidv4)().slice(0, 5);
|
|
117
|
+
}
|
|
118
|
+
options.nameMap.set(templateName, true);
|
|
119
|
+
const templateChild = new utils_1.naslTypes.ViewElement({
|
|
108
120
|
tag: 'template',
|
|
109
|
-
name:
|
|
121
|
+
name: templateName,
|
|
110
122
|
slotTarget,
|
|
111
123
|
slotScope,
|
|
112
|
-
children: [
|
|
113
|
-
})
|
|
124
|
+
children: child ? [child] : [],
|
|
125
|
+
});
|
|
126
|
+
if (viewElement.children.some((child) => child.tag === 'template' && child.slotTarget === slotTarget))
|
|
127
|
+
(0, utils_1.throwError)(options?.parsingId, `slot${(0, utils_2.firstUpperCase)(slotTarget)} 不能重复`, node);
|
|
128
|
+
viewElement.children.push(templateChild);
|
|
114
129
|
}
|
|
115
130
|
}
|
|
116
131
|
else if (node.type === 'JSXFragment') {
|
|
117
132
|
const children = node.children;
|
|
118
133
|
if (slotTarget === 'default' && !slotScope) {
|
|
119
|
-
viewElement.children.push(...children.filter((child) => child.type === 'JSXElement').map(transformJSXElement2ViewElement));
|
|
134
|
+
viewElement.children.push(...children.filter((child) => child.type === 'JSXElement').map((child) => transformJSXElement2ViewElement(child, options)).filter(Boolean));
|
|
120
135
|
}
|
|
121
136
|
else {
|
|
122
|
-
|
|
137
|
+
let templateName = 'template_' + (0, utils_2.uuidv4)().slice(0, 5);
|
|
138
|
+
// 确保模板名称也不重复
|
|
139
|
+
while (options.nameMap.has(templateName)) {
|
|
140
|
+
templateName = 'template_' + (0, utils_2.uuidv4)().slice(0, 5);
|
|
141
|
+
}
|
|
142
|
+
options.nameMap.set(templateName, true);
|
|
143
|
+
const templateChild = new utils_1.naslTypes.ViewElement({
|
|
123
144
|
tag: 'template',
|
|
124
|
-
name:
|
|
145
|
+
name: templateName,
|
|
125
146
|
slotTarget,
|
|
126
147
|
slotScope,
|
|
127
|
-
children: children.filter((child) => child.type === 'JSXElement').map(transformJSXElement2ViewElement),
|
|
128
|
-
})
|
|
148
|
+
children: children.filter((child) => child.type === 'JSXElement').map((child) => transformJSXElement2ViewElement(child, options)).filter(Boolean),
|
|
149
|
+
});
|
|
150
|
+
if (viewElement.children.some((child) => child.tag === 'template' && child.slotTarget === slotTarget))
|
|
151
|
+
(0, utils_1.throwError)(options?.parsingId, `slot${(0, utils_2.firstUpperCase)(slotTarget)} 不能重复`, node);
|
|
152
|
+
viewElement.children.push(templateChild);
|
|
129
153
|
}
|
|
130
154
|
}
|
|
131
155
|
else {
|
|
132
|
-
(0, utils_1.throwError)('不支持的JSX子元素类型', node);
|
|
156
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的JSX子元素类型', node);
|
|
133
157
|
}
|
|
134
158
|
}
|
|
135
159
|
function addArrowFunctionJSXChild(node, slotTarget = 'default') {
|
|
136
160
|
const slotScopeName = node.params[0]?.name;
|
|
137
161
|
if (slotScopeName && slotScopeName !== 'current' && !slotScopeName?.startsWith('current')) {
|
|
138
|
-
(0, utils_1.throwError)(`slotScope 需以 current
|
|
162
|
+
return (0, utils_1.throwError)(options?.parsingId, `slotScope 需以 current 参数名开头`, node);
|
|
139
163
|
}
|
|
140
164
|
let slotScope = '';
|
|
141
165
|
if (slotScopeName) {
|
|
@@ -152,51 +176,62 @@ function transformJSXElement2ViewElement(node) {
|
|
|
152
176
|
});
|
|
153
177
|
}
|
|
154
178
|
else {
|
|
155
|
-
(0, utils_1.throwError)('不支持的JSX子元素类型', body.type, body);
|
|
179
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的JSX子元素类型', body.type, body);
|
|
156
180
|
}
|
|
157
181
|
}
|
|
158
182
|
attrs.forEach((attr) => {
|
|
159
183
|
if (attr.type === 'JSXAttribute') {
|
|
160
184
|
const attrName = attr.name.name;
|
|
161
185
|
if (attrName === 'ref') {
|
|
162
|
-
if (attr.value
|
|
163
|
-
|
|
186
|
+
if (attr.value?.type === 'StringLiteral') {
|
|
187
|
+
const proposedName = attr.value.value;
|
|
188
|
+
if (options.nameMap.has(proposedName)) {
|
|
189
|
+
return (0, utils_1.throwError)(options?.parsingId, `ref 属性值 "${proposedName}" 已存在,不能重复使用`, attr);
|
|
190
|
+
}
|
|
191
|
+
viewElement.name = proposedName;
|
|
192
|
+
options.nameMap.set(proposedName, true);
|
|
164
193
|
}
|
|
165
194
|
else {
|
|
166
|
-
(0, utils_1.throwError)('ref 属性值不正确', attr.value);
|
|
195
|
+
return (0, utils_1.throwError)(options?.parsingId, 'ref 属性值不正确', attr.value);
|
|
167
196
|
}
|
|
168
197
|
}
|
|
169
198
|
else if (attrName === 'style') {
|
|
170
|
-
if (attr.value
|
|
199
|
+
if (attr.value?.type === 'StringLiteral') {
|
|
171
200
|
viewElement.staticStyle = attr.value.value;
|
|
172
201
|
}
|
|
173
202
|
else {
|
|
174
|
-
(0, utils_1.throwError)('style 属性只能用字符串字面量', attr.value);
|
|
203
|
+
return (0, utils_1.throwError)(options?.parsingId, 'style 属性只能用字符串字面量', attr.value);
|
|
175
204
|
}
|
|
176
205
|
}
|
|
177
206
|
else if (attrName === '$extraStyle') {
|
|
178
|
-
if (attr.value
|
|
179
|
-
|
|
207
|
+
if (!attr.value) {
|
|
208
|
+
(0, utils_1.throwError)(options?.parsingId, '$extraStyle 属性只能用字符串字面量', attr);
|
|
209
|
+
}
|
|
210
|
+
else if (attr.value.type === 'StringLiteral') {
|
|
211
|
+
viewElement.cssRules = (0, transformThemeAndStyle_1.transformStyle)(attr.value.value, options);
|
|
180
212
|
}
|
|
181
213
|
else if (attr.value.type === 'JSXExpressionContainer') {
|
|
182
214
|
const templateLiteral = attr.value.expression;
|
|
183
215
|
if (templateLiteral.type === 'TemplateLiteral') {
|
|
184
216
|
if (templateLiteral.expressions.length > 0) {
|
|
185
|
-
(0, utils_1.throwError)('不支持在 $theme 中使用动态表达式');
|
|
217
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持在 $theme 中使用动态表达式');
|
|
186
218
|
}
|
|
187
219
|
const css = templateLiteral.quasis[0].value.raw;
|
|
188
|
-
viewElement.cssRules = (0, transformThemeAndStyle_1.transformStyle)(css);
|
|
220
|
+
viewElement.cssRules = (0, transformThemeAndStyle_1.transformStyle)(css, options);
|
|
189
221
|
}
|
|
190
222
|
else {
|
|
191
|
-
(0, utils_1.throwError)('$extraStyle 属性只能用字符串字面量', attr.value);
|
|
223
|
+
return (0, utils_1.throwError)(options?.parsingId, '$extraStyle 属性只能用字符串字面量', attr.value);
|
|
192
224
|
}
|
|
193
225
|
}
|
|
194
226
|
else {
|
|
195
|
-
(0, utils_1.throwError)('$extraStyle 属性只能用字符串字面量', attr.value);
|
|
227
|
+
return (0, utils_1.throwError)(options?.parsingId, '$extraStyle 属性只能用字符串字面量', attr.value);
|
|
196
228
|
}
|
|
197
229
|
}
|
|
198
230
|
else if (attrName === '$dynamicStyle') {
|
|
199
|
-
if (attr.value
|
|
231
|
+
if (!attr.value) {
|
|
232
|
+
(0, utils_1.throwError)(options?.parsingId, '$dynamicStyle 属性只能用字符串字面量', attr);
|
|
233
|
+
}
|
|
234
|
+
else if (attr.value.type === 'JSXExpressionContainer') {
|
|
200
235
|
const expression = attr.value.expression;
|
|
201
236
|
if (expression.type === 'ObjectExpression') {
|
|
202
237
|
const properties = expression.properties;
|
|
@@ -207,6 +242,7 @@ function transformJSXElement2ViewElement(node) {
|
|
|
207
242
|
viewElement.addBindStyle(new utils_1.naslTypes.BindStyle({
|
|
208
243
|
name,
|
|
209
244
|
expression: (0, transform2LogicItem_1.transform2LogicItem)(property.value, {
|
|
245
|
+
...options,
|
|
210
246
|
transformType: 'attr',
|
|
211
247
|
isRestricted: true,
|
|
212
248
|
isInFrontend: true,
|
|
@@ -217,7 +253,7 @@ function transformJSXElement2ViewElement(node) {
|
|
|
217
253
|
}
|
|
218
254
|
}
|
|
219
255
|
else {
|
|
220
|
-
(0, utils_1.throwError)('style 属性值不正确', attr.value);
|
|
256
|
+
return (0, utils_1.throwError)(options?.parsingId, 'style 属性值不正确', attr.value);
|
|
221
257
|
}
|
|
222
258
|
}
|
|
223
259
|
else if (attrName.startsWith(directivePrefix)) {
|
|
@@ -225,7 +261,11 @@ function transformJSXElement2ViewElement(node) {
|
|
|
225
261
|
const directive = new utils_1.naslTypes.BindDirective({
|
|
226
262
|
name: directiveName,
|
|
227
263
|
});
|
|
228
|
-
if (attr.value
|
|
264
|
+
if (!attr.value) {
|
|
265
|
+
directive.type = 'static';
|
|
266
|
+
directive.value = 'true';
|
|
267
|
+
}
|
|
268
|
+
else if (attr.value.type === 'StringLiteral') {
|
|
229
269
|
directive.type = 'string';
|
|
230
270
|
directive.value = attr.value.value;
|
|
231
271
|
}
|
|
@@ -237,8 +277,9 @@ function transformJSXElement2ViewElement(node) {
|
|
|
237
277
|
else {
|
|
238
278
|
directive.type = 'dynamic';
|
|
239
279
|
if (attr.value.expression.type === 'FunctionExpression')
|
|
240
|
-
(0, utils_1.throwError)('指令不支持传函数表达式', attr);
|
|
280
|
+
return (0, utils_1.throwError)(options?.parsingId, '指令不支持传函数表达式', attr);
|
|
241
281
|
directive.expression = (0, transform2LogicItem_1.transform2LogicItem)(attr.value.expression, {
|
|
282
|
+
...options,
|
|
242
283
|
transformType: 'attr',
|
|
243
284
|
isRestricted: true,
|
|
244
285
|
isInFrontend: true,
|
|
@@ -246,7 +287,7 @@ function transformJSXElement2ViewElement(node) {
|
|
|
246
287
|
}
|
|
247
288
|
}
|
|
248
289
|
else {
|
|
249
|
-
(0, utils_1.throwError)('不支持的指令类型', attr.value.type, attr.value);
|
|
290
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的指令类型', attr.value.type, attr.value);
|
|
250
291
|
}
|
|
251
292
|
if (directiveName !== 'for') {
|
|
252
293
|
viewElement.addBindDirective(directive);
|
|
@@ -254,20 +295,20 @@ function transformJSXElement2ViewElement(node) {
|
|
|
254
295
|
}
|
|
255
296
|
else if (attrName.startsWith(eventPrefix)) {
|
|
256
297
|
const eventName = (0, utils_2.firstLowerCase)(attrName.slice(eventPrefix.length));
|
|
257
|
-
if (attr.value
|
|
298
|
+
if (attr.value?.type === 'JSXExpressionContainer') {
|
|
258
299
|
const bindEvent = new utils_1.naslTypes.BindEvent({
|
|
259
300
|
name: eventName,
|
|
260
|
-
logics: transform2EventLogics(attr.value.expression, eventName),
|
|
301
|
+
logics: transform2EventLogics(attr.value.expression, eventName, options) || [],
|
|
261
302
|
});
|
|
262
303
|
viewElement.addBindEvent(bindEvent);
|
|
263
304
|
}
|
|
264
305
|
else {
|
|
265
|
-
(0, utils_1.throwError)('事件逻辑参数不正确', attr.value);
|
|
306
|
+
return (0, utils_1.throwError)(options?.parsingId, '事件逻辑参数不正确', attr.value);
|
|
266
307
|
}
|
|
267
308
|
}
|
|
268
309
|
else if (attrName.startsWith(slotPrefix)) {
|
|
269
310
|
const slotTarget = (0, utils_2.firstLowerCase)(attrName.slice(slotPrefix.length));
|
|
270
|
-
if (attr.value
|
|
311
|
+
if (attr.value?.type === 'JSXExpressionContainer') {
|
|
271
312
|
const expression = attr.value.expression;
|
|
272
313
|
if (expression.type === 'JSXElement' || expression.type === 'JSXFragment') {
|
|
273
314
|
addJSXChild(expression, slotTarget);
|
|
@@ -276,39 +317,52 @@ function transformJSXElement2ViewElement(node) {
|
|
|
276
317
|
addArrowFunctionJSXChild(expression, slotTarget);
|
|
277
318
|
}
|
|
278
319
|
else {
|
|
279
|
-
(0, utils_1.throwError)('slot 属性值不正确', attr.value);
|
|
320
|
+
return (0, utils_1.throwError)(options?.parsingId, 'slot 属性值不正确', attr.value);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else if (attrName === 'rules') {
|
|
325
|
+
const bindAttribute = new utils_1.naslTypes.BindAttribute({
|
|
326
|
+
name: attrName,
|
|
327
|
+
});
|
|
328
|
+
if (attr.value?.type === 'JSXExpressionContainer') {
|
|
329
|
+
if (attr.value.expression.type === 'ArrayExpression') {
|
|
330
|
+
const elements = attr.value.expression.elements;
|
|
331
|
+
bindAttribute.rules = elements.map((node) => (0, transform2ValidationRule_1.transform2ValidationRule)(node, options)).filter(Boolean);
|
|
332
|
+
}
|
|
333
|
+
else if (attr.value.expression.type === 'CallExpression') {
|
|
334
|
+
const callee = (0, utils_1.generate)(attr.value.expression.callee).code;
|
|
335
|
+
if (callee === 'nasl.util.NewList' || callee === 'NewList') {
|
|
336
|
+
const elements = attr.value.expression.arguments[0].elements;
|
|
337
|
+
bindAttribute.rules = elements.map((node) => (0, transform2ValidationRule_1.transform2ValidationRule)(node, options)).filter(Boolean);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
return (0, utils_1.throwError)(options?.parsingId, 'rules 属性值不正确', attr.value);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
return (0, utils_1.throwError)(options?.parsingId, 'rules 属性值不正确', attr.value);
|
|
280
345
|
}
|
|
281
346
|
}
|
|
347
|
+
else {
|
|
348
|
+
return (0, utils_1.throwError)(options?.parsingId, 'rules 属性值不正确', attr.value);
|
|
349
|
+
}
|
|
350
|
+
viewElement.addBindAttribute(bindAttribute);
|
|
282
351
|
}
|
|
283
352
|
else {
|
|
284
353
|
const bindAttribute = new utils_1.naslTypes.BindAttribute({
|
|
285
354
|
name: attrName,
|
|
286
355
|
});
|
|
287
|
-
if (attr.value
|
|
356
|
+
if (!attr.value) {
|
|
357
|
+
bindAttribute.type = 'static';
|
|
358
|
+
bindAttribute.value = 'true';
|
|
359
|
+
}
|
|
360
|
+
else if (attr.value.type === 'StringLiteral') {
|
|
288
361
|
bindAttribute.type = 'string';
|
|
289
362
|
bindAttribute.value = attr.value.value;
|
|
290
363
|
}
|
|
291
364
|
else if (attr.value.type === 'JSXExpressionContainer') {
|
|
292
|
-
if (
|
|
293
|
-
if (attr.value.expression.type === 'ArrayExpression') {
|
|
294
|
-
const elements = attr.value.expression.elements;
|
|
295
|
-
bindAttribute.rules = elements.map(transform2ValidationRule_1.transform2ValidationRule);
|
|
296
|
-
}
|
|
297
|
-
else if (attr.value.expression.type === 'CallExpression') {
|
|
298
|
-
const callee = (0, utils_1.generate)(attr.value.expression.callee).code;
|
|
299
|
-
if (callee === 'nasl.util.NewList' || callee === 'NewList') {
|
|
300
|
-
const elements = attr.value.expression.arguments[0].elements;
|
|
301
|
-
bindAttribute.rules = elements.map(transform2ValidationRule_1.transform2ValidationRule);
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
(0, utils_1.throwError)('rules 属性值不正确', attr.value);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
(0, utils_1.throwError)('rules 属性值不正确', attr.value);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
else if (attr.value.expression.type === 'BooleanLiteral' || attr.value.expression.type === 'NumericLiteral' || attr.value.expression.type === 'NullLiteral' || attr.value.expression.type === 'StringLiteral') {
|
|
365
|
+
if (attr.value.expression.type === 'BooleanLiteral' || attr.value.expression.type === 'NumericLiteral' || attr.value.expression.type === 'NullLiteral' || attr.value.expression.type === 'StringLiteral') {
|
|
312
366
|
bindAttribute.type = 'static';
|
|
313
367
|
bindAttribute.value = (0, utils_1.generate)(attr.value.expression).code;
|
|
314
368
|
}
|
|
@@ -332,12 +386,13 @@ function transformJSXElement2ViewElement(node) {
|
|
|
332
386
|
if (expr.arguments.length > 0) {
|
|
333
387
|
expr = expr.arguments[0];
|
|
334
388
|
if (!expr)
|
|
335
|
-
(0, utils_1.throwError)('$sync 的参数不能为空', attr);
|
|
389
|
+
return (0, utils_1.throwError)(options?.parsingId, '$sync 的参数不能为空', attr);
|
|
336
390
|
}
|
|
337
391
|
}
|
|
338
392
|
if (expr.type === 'FunctionExpression')
|
|
339
|
-
(0, utils_1.throwError)('属性不支持传函数表达式', attr);
|
|
393
|
+
return (0, utils_1.throwError)(options?.parsingId, '属性不支持传函数表达式', attr);
|
|
340
394
|
const expression = (0, transform2LogicItem_1.transform2LogicItem)(expr, {
|
|
395
|
+
...options,
|
|
341
396
|
transformType: 'attr',
|
|
342
397
|
isRestricted: attrName !== 'dataSource',
|
|
343
398
|
isInFrontend: true,
|
|
@@ -354,15 +409,21 @@ function transformJSXElement2ViewElement(node) {
|
|
|
354
409
|
}
|
|
355
410
|
}
|
|
356
411
|
else {
|
|
357
|
-
(0, utils_1.throwError)('不支持的指令类型', attr.value.type, attr.value);
|
|
412
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的指令类型', attr.value.type, attr.value);
|
|
358
413
|
}
|
|
359
414
|
viewElement.addBindAttribute(bindAttribute);
|
|
360
415
|
}
|
|
361
416
|
}
|
|
362
417
|
else {
|
|
363
|
-
(0, utils_1.throwError)('不支持的JSX属性类型', attr.type, attr);
|
|
418
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的JSX属性类型', attr.type, attr);
|
|
364
419
|
}
|
|
365
420
|
});
|
|
421
|
+
{ /* 临时补救 EnumToList 问题 */
|
|
422
|
+
if (viewElement.bindAttrs.some((bindAttr) => bindAttr.name === 'dataSource' && bindAttr.expression?.concept === 'CallFunction' && bindAttr.expression?.calleeName === 'EnumToList')) {
|
|
423
|
+
const index = viewElement.bindAttrs.findIndex((bindAttr) => bindAttr.name === 'valueField');
|
|
424
|
+
~index && viewElement.bindAttrs.splice(index, 1);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
366
427
|
node.children.forEach((child) => {
|
|
367
428
|
if (child.type === 'JSXElement' || child.type === 'JSXFragment') {
|
|
368
429
|
addJSXChild(child);
|
|
@@ -379,28 +440,36 @@ function transformJSXElement2ViewElement(node) {
|
|
|
379
440
|
// ignore
|
|
380
441
|
}
|
|
381
442
|
else {
|
|
382
|
-
(0, utils_1.throwError)('不支持的JSX子元素类型', expression.type, expression);
|
|
443
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的JSX子元素类型', expression.type, expression);
|
|
383
444
|
}
|
|
384
445
|
}
|
|
385
446
|
else if (child.type === 'JSXText') {
|
|
386
447
|
// ignore
|
|
387
448
|
}
|
|
388
449
|
else {
|
|
389
|
-
(0, utils_1.throwError)('不支持的JSX子元素类型', child.type, child);
|
|
450
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的JSX子元素类型', child.type, child);
|
|
390
451
|
}
|
|
391
452
|
});
|
|
392
453
|
if (!viewElement.name) {
|
|
393
|
-
|
|
454
|
+
let generatedName = viewElement.tag.replace(/-/g, '_') + '_' + (0, utils_2.uuidv4)().slice(0, 5);
|
|
455
|
+
// 确保生成的名称也不重复
|
|
456
|
+
while (options.nameMap.has(generatedName)) {
|
|
457
|
+
generatedName = viewElement.tag.replace(/-/g, '_') + '_' + (0, utils_2.uuidv4)().slice(0, 5);
|
|
458
|
+
}
|
|
459
|
+
viewElement.name = generatedName;
|
|
460
|
+
options.nameMap.set(generatedName, true);
|
|
394
461
|
}
|
|
395
462
|
return viewElement;
|
|
396
463
|
}
|
|
397
464
|
else {
|
|
398
|
-
(0, utils_1.throwError)('不支持的JSX元素类型', el.name.type, el);
|
|
465
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的JSX元素类型', el.name.type, el);
|
|
399
466
|
}
|
|
400
467
|
}
|
|
401
468
|
exports.transformJSXElement2ViewElement = transformJSXElement2ViewElement;
|
|
402
|
-
function transform2View(func, decorator) {
|
|
469
|
+
function transform2View(func, decorator, options) {
|
|
403
470
|
const statements = func.body.body;
|
|
471
|
+
// 为每个视图创建独立的 nameMap
|
|
472
|
+
const nameMap = new Map();
|
|
404
473
|
const view = new utils_1.naslTypes.View({
|
|
405
474
|
name: func.id?.name,
|
|
406
475
|
});
|
|
@@ -414,19 +483,20 @@ function transform2View(func, decorator) {
|
|
|
414
483
|
'auth',
|
|
415
484
|
'authDescription',
|
|
416
485
|
'isIndex',
|
|
417
|
-
]));
|
|
486
|
+
]), options);
|
|
418
487
|
Object.assign(view, viewObj);
|
|
419
488
|
view.crumb = new utils_1.naslTypes.StaticString({
|
|
420
489
|
value: viewObj.crumb,
|
|
421
490
|
});
|
|
422
491
|
}
|
|
423
492
|
else {
|
|
424
|
-
(0, utils_1.throwError)('不支持的装饰器类型', decorator.type, decorator);
|
|
493
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的装饰器类型', decorator.type, decorator);
|
|
425
494
|
}
|
|
426
495
|
}
|
|
427
496
|
func.params.forEach((param) => {
|
|
428
497
|
if (param.type === 'Identifier') {
|
|
429
|
-
|
|
498
|
+
const _param = (0, transform2LogicItem_1.transform2Param)(param, { ...options, transformType: 'attr' });
|
|
499
|
+
_param && view.params.push(_param);
|
|
430
500
|
}
|
|
431
501
|
else if (param.type === 'ObjectPattern') {
|
|
432
502
|
const propertyMap = {};
|
|
@@ -443,13 +513,13 @@ function transform2View(func, decorator) {
|
|
|
443
513
|
propertyMap[property.value.left.name] = property.value;
|
|
444
514
|
}
|
|
445
515
|
else {
|
|
446
|
-
(0, utils_1.throwError)('不支持的参数类型', property.value.type, property.value);
|
|
516
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的参数类型', property.value.type, property.value);
|
|
447
517
|
}
|
|
448
518
|
}
|
|
449
519
|
});
|
|
450
520
|
const type = param.typeAnnotation?.typeAnnotation;
|
|
451
521
|
if (!type)
|
|
452
|
-
(0, utils_1.throwError)('param 没有对应的类型', param);
|
|
522
|
+
return (0, utils_1.throwError)(options?.parsingId, 'param 没有对应的类型', param);
|
|
453
523
|
type.members.forEach((member) => {
|
|
454
524
|
if (member.type === 'TSPropertySignature') {
|
|
455
525
|
const name = member.key.name;
|
|
@@ -459,7 +529,8 @@ function transform2View(func, decorator) {
|
|
|
459
529
|
}
|
|
460
530
|
});
|
|
461
531
|
Object.values(propertyMap).forEach((property) => {
|
|
462
|
-
|
|
532
|
+
const param = (0, transform2LogicItem_1.transform2Param)(property, { ...options, transformType: 'attr' });
|
|
533
|
+
param && view.params.push(param);
|
|
463
534
|
});
|
|
464
535
|
}
|
|
465
536
|
});
|
|
@@ -471,7 +542,7 @@ function transform2View(func, decorator) {
|
|
|
471
542
|
});
|
|
472
543
|
}
|
|
473
544
|
else if (statement.type === 'FunctionDeclaration') {
|
|
474
|
-
const logic = (0, transform2Logic_1.transform2Logic)(statement);
|
|
545
|
+
const logic = (0, transform2Logic_1.transform2Logic)(statement, undefined, options);
|
|
475
546
|
view.addLogic(logic);
|
|
476
547
|
}
|
|
477
548
|
else if (statement.type === 'ExpressionStatement' && statement.expression.type === 'CallExpression') {
|
|
@@ -481,34 +552,68 @@ function transform2View(func, decorator) {
|
|
|
481
552
|
const arg = expression.arguments[0];
|
|
482
553
|
const bindEvent = new utils_1.naslTypes.BindEvent({
|
|
483
554
|
name: eventName,
|
|
484
|
-
logics: transform2EventLogics(arg, eventName),
|
|
555
|
+
logics: transform2EventLogics(arg, eventName, options) || [],
|
|
485
556
|
});
|
|
486
557
|
view.addBindEvent(bindEvent);
|
|
487
558
|
}
|
|
488
559
|
else {
|
|
489
|
-
(0, utils_1.throwError)('不支持的表达式', statement);
|
|
560
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的表达式', statement);
|
|
490
561
|
}
|
|
491
562
|
}
|
|
492
563
|
else if (statement.type === 'ReturnStatement') {
|
|
493
564
|
const arg = statement.argument;
|
|
494
565
|
if (arg.type === 'JSXElement') {
|
|
495
|
-
|
|
566
|
+
const child = transformJSXElement2ViewElement(arg, { ...options, nameMap });
|
|
567
|
+
view.elements = child ? [child] : [];
|
|
496
568
|
}
|
|
497
569
|
else if (arg.type === 'JSXFragment') {
|
|
498
|
-
view.elements = arg.children.filter((child) => child.type === 'JSXElement').map(transformJSXElement2ViewElement);
|
|
570
|
+
view.elements = arg.children.filter((child) => child.type === 'JSXElement').map((child) => transformJSXElement2ViewElement(child, { ...options, nameMap })).filter(Boolean);
|
|
499
571
|
}
|
|
500
572
|
else {
|
|
501
|
-
(0, utils_1.throwError)('返回值不正确', arg);
|
|
573
|
+
return (0, utils_1.throwError)(options?.parsingId, '返回值不正确', arg);
|
|
502
574
|
}
|
|
503
575
|
}
|
|
504
576
|
else {
|
|
505
|
-
(0, utils_1.throwError)('不支持的表达式', statement);
|
|
577
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的表达式', statement);
|
|
506
578
|
}
|
|
507
579
|
});
|
|
508
580
|
return view;
|
|
509
581
|
}
|
|
510
582
|
exports.transform2View = transform2View;
|
|
511
|
-
function
|
|
583
|
+
function transformTSDeclareFunction2View(func, decorator, options) {
|
|
584
|
+
const view = new utils_1.naslTypes.View({
|
|
585
|
+
name: func.id?.name,
|
|
586
|
+
});
|
|
587
|
+
if (decorator) {
|
|
588
|
+
if (decorator.arguments[0].type === 'ObjectExpression') {
|
|
589
|
+
const viewObj = (0, utils_1.pickDecoratorObject)(decorator.arguments[0], new Set([
|
|
590
|
+
'pageTemplateId',
|
|
591
|
+
'uuid',
|
|
592
|
+
'title',
|
|
593
|
+
'crumb',
|
|
594
|
+
'auth',
|
|
595
|
+
'authDescription',
|
|
596
|
+
'isIndex',
|
|
597
|
+
]), options);
|
|
598
|
+
Object.assign(view, viewObj);
|
|
599
|
+
view.crumb = new utils_1.naslTypes.StaticString({
|
|
600
|
+
value: viewObj.crumb,
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
return (0, utils_1.throwError)(options?.parsingId, '不支持的装饰器类型', decorator.type, decorator);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
func.params.forEach((param) => {
|
|
608
|
+
if (param.type === 'Identifier') {
|
|
609
|
+
const _param = (0, transform2LogicItem_1.transform2Param)(param, { ...options, transformType: 'attr' });
|
|
610
|
+
_param && view.params.push(_param);
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
return view;
|
|
614
|
+
}
|
|
615
|
+
exports.transformTSDeclareFunction2View = transformTSDeclareFunction2View;
|
|
616
|
+
function parseNaturalTSXView(tsCode, options) {
|
|
512
617
|
const root = babel.parseSync(tsCode, {
|
|
513
618
|
filename: 'result.tsx',
|
|
514
619
|
presets: [require('@babel/preset-typescript')],
|
|
@@ -530,7 +635,7 @@ function parseNaturalTSXView(tsCode) {
|
|
|
530
635
|
decorator = prevStatement.expression;
|
|
531
636
|
}
|
|
532
637
|
});
|
|
533
|
-
return transform2View(func, decorator);
|
|
638
|
+
return transform2View(func, decorator, options);
|
|
534
639
|
}
|
|
535
640
|
exports.parseNaturalTSXView = parseNaturalTSXView;
|
|
536
641
|
//# sourceMappingURL=parseNaturalTSXView.js.map
|