@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.
Files changed (73) hide show
  1. package/out/natural/index.d.ts +1 -0
  2. package/out/natural/index.d.ts.map +1 -1
  3. package/out/natural/index.js +3 -0
  4. package/out/natural/index.js.map +1 -1
  5. package/out/natural/parseNaturalTS.d.ts +4 -7
  6. package/out/natural/parseNaturalTS.d.ts.map +1 -1
  7. package/out/natural/parseNaturalTS.js +84 -69
  8. package/out/natural/parseNaturalTS.js.map +1 -1
  9. package/out/natural/parseNaturalTSXView.d.ts +16 -4
  10. package/out/natural/parseNaturalTSXView.d.ts.map +1 -1
  11. package/out/natural/parseNaturalTSXView.js +196 -91
  12. package/out/natural/parseNaturalTSXView.js.map +1 -1
  13. package/out/natural/transformTS2UI.d.ts.map +1 -1
  14. package/out/natural/transformTS2UI.js +9 -8
  15. package/out/natural/transformTS2UI.js.map +1 -1
  16. package/out/natural/transformTSCode.js +3 -3
  17. package/out/natural/transformTSCode.js.map +1 -1
  18. package/out/natural/transforms/transform2Entity.d.ts +3 -1
  19. package/out/natural/transforms/transform2Entity.d.ts.map +1 -1
  20. package/out/natural/transforms/transform2Entity.js +28 -6
  21. package/out/natural/transforms/transform2Entity.js.map +1 -1
  22. package/out/natural/transforms/transform2Enum.d.ts +3 -1
  23. package/out/natural/transforms/transform2Enum.d.ts.map +1 -1
  24. package/out/natural/transforms/transform2Enum.js +20 -4
  25. package/out/natural/transforms/transform2Enum.js.map +1 -1
  26. package/out/natural/transforms/transform2GlobalLogicDeclaration.d.ts +3 -1
  27. package/out/natural/transforms/transform2GlobalLogicDeclaration.d.ts.map +1 -1
  28. package/out/natural/transforms/transform2GlobalLogicDeclaration.js +3 -3
  29. package/out/natural/transforms/transform2GlobalLogicDeclaration.js.map +1 -1
  30. package/out/natural/transforms/transform2Logic.d.ts +9 -3
  31. package/out/natural/transforms/transform2Logic.d.ts.map +1 -1
  32. package/out/natural/transforms/transform2Logic.js +14 -8
  33. package/out/natural/transforms/transform2Logic.js.map +1 -1
  34. package/out/natural/transforms/transform2LogicItem.d.ts +30 -26
  35. package/out/natural/transforms/transform2LogicItem.d.ts.map +1 -1
  36. package/out/natural/transforms/transform2LogicItem.js +199 -132
  37. package/out/natural/transforms/transform2LogicItem.js.map +1 -1
  38. package/out/natural/transforms/transform2MetadataType.d.ts +3 -1
  39. package/out/natural/transforms/transform2MetadataType.d.ts.map +1 -1
  40. package/out/natural/transforms/transform2MetadataType.js +2 -2
  41. package/out/natural/transforms/transform2MetadataType.js.map +1 -1
  42. package/out/natural/transforms/transform2Structure.d.ts +3 -1
  43. package/out/natural/transforms/transform2Structure.d.ts.map +1 -1
  44. package/out/natural/transforms/transform2Structure.js +4 -4
  45. package/out/natural/transforms/transform2Structure.js.map +1 -1
  46. package/out/natural/transforms/transform2TypeAnnotation.d.ts +3 -1
  47. package/out/natural/transforms/transform2TypeAnnotation.d.ts.map +1 -1
  48. package/out/natural/transforms/transform2TypeAnnotation.js +10 -11
  49. package/out/natural/transforms/transform2TypeAnnotation.js.map +1 -1
  50. package/out/natural/transforms/transform2ValidationRule.d.ts +3 -1
  51. package/out/natural/transforms/transform2ValidationRule.d.ts.map +1 -1
  52. package/out/natural/transforms/transform2ValidationRule.js +9 -4
  53. package/out/natural/transforms/transform2ValidationRule.js.map +1 -1
  54. package/out/natural/transforms/transform2Variable.d.ts +6 -2
  55. package/out/natural/transforms/transform2Variable.d.ts.map +1 -1
  56. package/out/natural/transforms/transform2Variable.js +10 -10
  57. package/out/natural/transforms/transform2Variable.js.map +1 -1
  58. package/out/natural/transforms/transformThemeAndStyle.d.ts +6 -2
  59. package/out/natural/transforms/transformThemeAndStyle.d.ts.map +1 -1
  60. package/out/natural/transforms/transformThemeAndStyle.js +7 -7
  61. package/out/natural/transforms/transformThemeAndStyle.js.map +1 -1
  62. package/out/natural/transforms/utils.d.ts +8 -3
  63. package/out/natural/transforms/utils.d.ts.map +1 -1
  64. package/out/natural/transforms/utils.js +20 -8
  65. package/out/natural/transforms/utils.js.map +1 -1
  66. package/out/server/findReference.d.ts.map +1 -1
  67. package/out/server/findReference.js +4 -0
  68. package/out/server/findReference.js.map +1 -1
  69. package/package.json +10 -10
  70. package/out/natural/transforms/registerTransform.d.ts +0 -8
  71. package/out/natural/transforms/registerTransform.d.ts.map +0 -1
  72. package/out/natural/transforms/registerTransform.js +0 -24
  73. 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
- return [(0, transform2Logic_1.transform2Logic)(node, eventName)];
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
- return (0, transform2Logic_1.transform2Logic)(node, eventName);
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
- viewElement.children.push(transformJSXElement2ViewElement(node));
108
+ const child = transformJSXElement2ViewElement(node, options);
109
+ child && viewElement.children.push(child);
105
110
  }
106
111
  else {
107
- viewElement.children.push(new utils_1.naslTypes.ViewElement({
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: 'template_' + (0, utils_2.uuidv4)().slice(0, 5),
121
+ name: templateName,
110
122
  slotTarget,
111
123
  slotScope,
112
- children: [transformJSXElement2ViewElement(node)],
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
- viewElement.children.push(new utils_1.naslTypes.ViewElement({
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: 'template_' + (0, utils_2.uuidv4)().slice(0, 5),
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 开头`, node);
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.type === 'StringLiteral') {
163
- viewElement.name = attr.value.value;
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.type === 'StringLiteral') {
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.type === 'StringLiteral') {
179
- viewElement.cssRules = (0, transformThemeAndStyle_1.transformStyle)(attr.value.value);
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.type === 'JSXExpressionContainer') {
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.type === 'StringLiteral') {
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.type === 'JSXExpressionContainer') {
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.type === 'JSXExpressionContainer') {
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.type === 'StringLiteral') {
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 (attrName === 'rules') {
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
- viewElement.name = viewElement.tag.replace(/-/g, '_') + '_' + (0, utils_2.uuidv4)().slice(0, 5);
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
- view.params.push((0, transform2LogicItem_1.transform2Param)(param));
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
- view.params.push((0, transform2LogicItem_1.transform2Param)(property));
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
- view.elements = [transformJSXElement2ViewElement(arg)];
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 parseNaturalTSXView(tsCode) {
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