@lcap/nasl 4.1.0-beta.9 → 4.1.0-creator.1

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 (122) hide show
  1. package/out/generator/genBundleFiles.d.ts +1 -0
  2. package/out/generator/genBundleFiles.d.ts.map +1 -1
  3. package/out/generator/genBundleFiles.js +21 -96
  4. package/out/generator/genBundleFiles.js.map +1 -1
  5. package/out/generator/genSimpleBundleFile.d.ts +19 -0
  6. package/out/generator/genSimpleBundleFile.d.ts.map +1 -0
  7. package/out/generator/genSimpleBundleFile.js +114 -0
  8. package/out/generator/genSimpleBundleFile.js.map +1 -0
  9. package/out/generator/index.d.ts +1 -0
  10. package/out/generator/index.d.ts.map +1 -1
  11. package/out/generator/index.js +1 -0
  12. package/out/generator/index.js.map +1 -1
  13. package/out/generator/permission.d.ts.map +1 -1
  14. package/out/generator/permission.js +70 -34
  15. package/out/generator/permission.js.map +1 -1
  16. package/out/generator/release-body/body.d.ts.map +1 -1
  17. package/out/generator/release-body/body.js +3 -4
  18. package/out/generator/release-body/body.js.map +1 -1
  19. package/out/generator/release-body/utils.d.ts +7 -3
  20. package/out/generator/release-body/utils.d.ts.map +1 -1
  21. package/out/generator/release-body/utils.js +7 -5
  22. package/out/generator/release-body/utils.js.map +1 -1
  23. package/out/index.d.ts +1 -1
  24. package/out/index.d.ts.map +1 -1
  25. package/out/index.js +2 -1
  26. package/out/index.js.map +1 -1
  27. package/out/natural/index.d.ts +1 -0
  28. package/out/natural/index.d.ts.map +1 -1
  29. package/out/natural/index.js +1 -0
  30. package/out/natural/index.js.map +1 -1
  31. package/out/natural/parseNaturalTS.d.ts +1 -1
  32. package/out/natural/parseNaturalTS.d.ts.map +1 -1
  33. package/out/natural/parseNaturalTS.js +150 -4
  34. package/out/natural/parseNaturalTS.js.map +1 -1
  35. package/out/natural/parseNaturalTSXView.d.ts +6 -0
  36. package/out/natural/parseNaturalTSXView.d.ts.map +1 -0
  37. package/out/natural/parseNaturalTSXView.js +536 -0
  38. package/out/natural/parseNaturalTSXView.js.map +1 -0
  39. package/out/natural/transformTS2UI.d.ts.map +1 -1
  40. package/out/natural/transformTS2UI.js +6 -9
  41. package/out/natural/transformTS2UI.js.map +1 -1
  42. package/out/natural/transformTSCode.d.ts.map +1 -1
  43. package/out/natural/transformTSCode.js +1 -1
  44. package/out/natural/transformTSCode.js.map +1 -1
  45. package/out/natural/transforms/transform2Entity.d.ts.map +1 -1
  46. package/out/natural/transforms/transform2Entity.js +3 -1
  47. package/out/natural/transforms/transform2Entity.js.map +1 -1
  48. package/out/natural/transforms/transform2Enum.js +1 -1
  49. package/out/natural/transforms/transform2Enum.js.map +1 -1
  50. package/out/natural/transforms/transform2Logic.d.ts +3 -1
  51. package/out/natural/transforms/transform2Logic.d.ts.map +1 -1
  52. package/out/natural/transforms/transform2Logic.js +37 -6
  53. package/out/natural/transforms/transform2Logic.js.map +1 -1
  54. package/out/natural/transforms/transform2LogicItem.d.ts +34 -6
  55. package/out/natural/transforms/transform2LogicItem.d.ts.map +1 -1
  56. package/out/natural/transforms/transform2LogicItem.js +312 -140
  57. package/out/natural/transforms/transform2LogicItem.js.map +1 -1
  58. package/out/natural/transforms/transform2MetadataType.d.ts +3 -0
  59. package/out/natural/transforms/transform2MetadataType.d.ts.map +1 -0
  60. package/out/natural/transforms/transform2MetadataType.js +14 -0
  61. package/out/natural/transforms/transform2MetadataType.js.map +1 -0
  62. package/out/natural/transforms/transform2ValidationRule.d.ts +3 -0
  63. package/out/natural/transforms/transform2ValidationRule.d.ts.map +1 -0
  64. package/out/natural/transforms/transform2ValidationRule.js +19 -0
  65. package/out/natural/transforms/transform2ValidationRule.js.map +1 -0
  66. package/out/natural/transforms/transform2Variable.d.ts +1 -0
  67. package/out/natural/transforms/transform2Variable.d.ts.map +1 -1
  68. package/out/natural/transforms/transform2Variable.js +25 -1
  69. package/out/natural/transforms/transform2Variable.js.map +1 -1
  70. package/out/natural/transforms/transformThemeAndStyle.d.ts +24 -0
  71. package/out/natural/transforms/transformThemeAndStyle.d.ts.map +1 -0
  72. package/out/natural/transforms/transformThemeAndStyle.js +269 -0
  73. package/out/natural/transforms/transformThemeAndStyle.js.map +1 -0
  74. package/out/natural/transforms/utils.d.ts +16 -2
  75. package/out/natural/transforms/utils.d.ts.map +1 -1
  76. package/out/natural/transforms/utils.js +67 -11
  77. package/out/natural/transforms/utils.js.map +1 -1
  78. package/out/server/OQL/sqlCategory.json +410 -0
  79. package/out/server/OQL/sqlFunctions.json +695 -7
  80. package/out/server/client/nasl-server-client.d.ts +7 -0
  81. package/out/server/client/nasl-server-client.d.ts.map +1 -0
  82. package/out/server/client/nasl-server-client.js +9 -0
  83. package/out/server/client/nasl-server-client.js.map +1 -0
  84. package/out/server/extendBaseNode.d.ts.map +1 -1
  85. package/out/server/extendBaseNode.js +18 -9
  86. package/out/server/extendBaseNode.js.map +1 -1
  87. package/out/server/index.d.ts +1 -0
  88. package/out/server/index.d.ts.map +1 -1
  89. package/out/server/index.js +1 -0
  90. package/out/server/index.js.map +1 -1
  91. package/out/server/naslServer.d.ts +10 -1
  92. package/out/server/naslServer.d.ts.map +1 -1
  93. package/out/server/naslServer.js +119 -62
  94. package/out/server/naslServer.js.map +1 -1
  95. package/out/service/initial/form-designer.d.ts +1 -1
  96. package/out/service/initial/form-designer.d.ts.map +1 -1
  97. package/out/service/initial/form-designer.js +4 -1
  98. package/out/service/initial/form-designer.js.map +1 -1
  99. package/out/service/initial/processV2.d.ts +1 -1
  100. package/out/service/initial/processV2.d.ts.map +1 -1
  101. package/out/service/initial/processV2.js +4 -1
  102. package/out/service/initial/processV2.js.map +1 -1
  103. package/out/service/initial/types.d.ts +1 -0
  104. package/out/service/initial/types.d.ts.map +1 -1
  105. package/out/service/storage/api.d.ts +16 -7
  106. package/out/service/storage/api.js +6 -0
  107. package/out/service/storage/api.js.map +1 -1
  108. package/out/service/storage/cache/index.d.ts +3 -15
  109. package/out/service/storage/cache/index.d.ts.map +1 -1
  110. package/out/service/storage/cache/index.js +14 -299
  111. package/out/service/storage/cache/index.js.map +1 -1
  112. package/out/service/storage/cache/split.d.ts +0 -21
  113. package/out/service/storage/cache/split.d.ts.map +1 -1
  114. package/out/service/storage/cache/split.js +24 -33
  115. package/out/service/storage/cache/split.js.map +1 -1
  116. package/out/service/storage/init.d.ts +9 -0
  117. package/out/service/storage/init.d.ts.map +1 -1
  118. package/out/service/storage/init.js +61 -90
  119. package/out/service/storage/init.js.map +1 -1
  120. package/out/service/storage/service.js +1 -1
  121. package/out/service/storage/service.js.map +1 -1
  122. package/package.json +15 -13
@@ -3,8 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.transformCall2Extension = exports.transformCall2Connector = exports.transformCall2Interface = exports.transformAlert2ShowMessage = exports.transformForEach2ForEachStatement = exports.transformForOf2ForEachStatement = exports.transform2ForEachStatement = exports.transformMap2ListTransform = exports.transform2UIFunction = exports.transformCall2CallFunction = exports.transform2CallFunction = exports.transformCall2JSONFunctions = exports.transformCall2Logging = exports.transformCall2ConsoleLog = exports.transformCall2CallDataSourceLogic = exports.transformCall2CallEntityLogic = exports.transformCall2CallViewElementLogic = exports.transformCallCall2Match = exports.transformMemberExpression = exports.transformNewExpression = exports.transform2PartialNewComposite = exports.transform2Comment = exports.transform2StringInterpolation = exports.transformReturnStatement2AssignmentOrEnd = exports.transform2NullLiteral = exports.transform2NumericLiteral = exports.transform2DirectiveLiteral = exports.transform2StringLiteral = exports.transform2BooleanLiteral = exports.transformUpdateExpression2Assignment = exports.transform2Assignment = exports.transform2AnonymousFunction = exports.transformIdentifier = exports.transformSwitchStatement2Match = exports.transform2WhileStatement = exports.transform2Break = exports.transform2Continue = exports.transform2IfStatement = exports.transform2BinaryExpression = exports.transform2VariadicExpression = exports.transformCallExpressionToBinaryExpression = exports.transform2Param = exports.fixLogicNode = exports.flatIfStatement = exports.flatMatchPatternsExpression = exports.getSelectMembers = exports.unflatMemberExpression = exports.flatMemberExpression = exports.fixExpression = exports.TransformManager = void 0;
7
- exports.transform2LogicItem = exports.transformCall2Paginate = exports.transformCall2LogicWithAuth = exports.transformCall2Logic = exports.transformCall2CallViewLogic = exports.transformArrowFunction2Match = void 0;
6
+ exports.transformCall2Extension = exports.transformCall2Connector = exports.transformCall2Interface = exports.transformAlert2ShowMessage = exports.transformForEach2ForEachStatement = exports.transformForOf2ForEachStatement = exports.transform2ForEachStatement = exports.transformMap2ListTransform = exports.transform2UIFunction = exports.transformCall2CallFunction = exports.transform2CallFunction = exports.transformCall2JSONFunctions = exports.transformCall2Logging = exports.transformCall2ConsoleLog = exports.transformCall2CallDataSourceLogic = exports.transformCall2CallEntityLogic = exports.transformCall2CallViewElementLogic = exports.transformCallFunctionExpression2Match = exports.transformMemberExpression = exports.transformNewExpression = exports.transform2PartialNewComposite = exports.transform2Comment = exports.transform2StringInterpolation = exports.transformReturnStatement2AssignmentOrEnd = exports.transform2NullLiteral = exports.transform2NumericLiteral = exports.transform2DirectiveLiteral = exports.transform2StringLiteral = exports.transform2BooleanLiteral = exports.transformUpdateExpression2Assignment = exports.transform2Assignment = exports.transform2AnonymousFunction = exports.transformIdentifier = exports.transformSwitchStatement2Match = exports.transform2WhileStatement = exports.transform2Break = exports.transform2Continue = exports.transform2IfStatement = exports.transform2BinaryExpression = exports.transform2VariadicExpression = exports.transformCallExpressionToBinaryExpression = exports.transform2Param = exports.fixLogicNode = exports.flatIfStatementForMatch = exports.flatMatchPatternsExpression = exports.getSelectMembers = exports.unflatMemberExpression = exports.flatMemberExpression = exports.fixExpression = exports.TransformManager = void 0;
7
+ exports.transform2LogicItem = exports.transformCall2Paginate = exports.transformCall2LogicWithAuth = exports.transformCall2Logic = exports.transformCall2CallViewLogic = void 0;
8
8
  const utils_1 = require("./utils");
9
9
  const transform2TypeAnnotation_1 = require("./transform2TypeAnnotation");
10
10
  const utils_2 = require("../../utils");
@@ -24,7 +24,7 @@ class TransformManager {
24
24
  apply(node, options) {
25
25
  if (node.type === 'CallExpression') {
26
26
  if (node.callee.type === 'CallExpression')
27
- (0, utils_1.throwError)(`不支持连续调用!`);
27
+ (0, utils_1.throwError)('不支持连续调用!', node.callee);
28
28
  const callee = flatMemberExpression(node.callee);
29
29
  if (callee[0]
30
30
  && callee[0].type === 'CallExpression'
@@ -36,9 +36,8 @@ class TransformManager {
36
36
  }
37
37
  else {
38
38
  for (const calleeItem of callee) {
39
- if (calleeItem.type !== 'Identifier') {
40
- const calleeName = (0, utils_1.generate)(node.callee).code;
41
- (0, utils_1.throwError)(`不支持连续调用!${calleeName}`);
39
+ if (calleeItem.type !== 'Identifier' && !(calleeItem.type === 'FunctionExpression' && calleeItem.id?.name === 'match')) {
40
+ (0, utils_1.throwError)('不支持连续调用!', node.callee);
42
41
  }
43
42
  }
44
43
  }
@@ -48,7 +47,7 @@ class TransformManager {
48
47
  return transform(node, calleeName, callee, options);
49
48
  }
50
49
  }
51
- (0, utils_1.throwError)(`Unhandled node ${callee.map((item) => item.name).join('.')} ${node.type}`);
50
+ (0, utils_1.throwError)(`Unhandled node ${callee.map((item) => item.name).join('.')}`, node.type, node);
52
51
  }
53
52
  else {
54
53
  for (const [type, transform] of this.transforms) {
@@ -56,7 +55,7 @@ class TransformManager {
56
55
  return transform(node, options);
57
56
  }
58
57
  }
59
- (0, utils_1.throwError)(`Unhandled node ${node.type}`);
58
+ (0, utils_1.throwError)('Unhandled node', node.type, node);
60
59
  }
61
60
  }
62
61
  }
@@ -124,7 +123,7 @@ function transformTSCode2SubLogic(node, options) {
124
123
  }
125
124
  function assertAssignmentRightIsNotAnonymousFunction(expression) {
126
125
  if (expression?.concept === 'AnonymousFunction')
127
- (0, utils_1.throwError)('Anonymous function is not allowed in assignment');
126
+ (0, utils_1.throwError)('Anonymous function is not allowed in assignment', expression.toNaturalTS());
128
127
  return expression;
129
128
  }
130
129
  function fixExpression(arg, options, supportSubLogic = false) {
@@ -232,16 +231,29 @@ function flatMatchPatternsExpression(node) {
232
231
  }
233
232
  return [node];
234
233
  }
234
+ else if (node.concept === 'VariadicExpression') {
235
+ if (node.operator === '||') {
236
+ return node.expressions
237
+ ?.filter((item) => item?.concept === 'BinaryExpression' && item?.right?.concept === 'StringLiteral')
238
+ ?.map((item) => new utils_1.naslTypes.StringLiteral({ value: item?.right?.value })) || [node];
239
+ }
240
+ return [node];
241
+ }
235
242
  return [node];
236
243
  }
237
244
  exports.flatMatchPatternsExpression = flatMatchPatternsExpression;
238
- function flatIfStatement(node) {
245
+ function flatIfStatementForMatch(node) {
239
246
  if (node.alternate.type === 'IfStatement') {
240
- return [...flatIfStatement(node.alternate), node];
247
+ return [node, ...flatIfStatementForMatch(node.alternate)];
241
248
  }
242
- return [node];
249
+ return [node, {
250
+ type: 'IfStatement',
251
+ test: null,
252
+ consequent: node.alternate,
253
+ alternate: node.alternate,
254
+ }];
243
255
  }
244
- exports.flatIfStatement = flatIfStatement;
256
+ exports.flatIfStatementForMatch = flatIfStatementForMatch;
245
257
  /**
246
258
  * 这个函数是修复 AI 翻译出错的情况,与正常的 transform 做个区分
247
259
  * @param node
@@ -269,7 +281,7 @@ function transform2Param(node) {
269
281
  name,
270
282
  typeAnnotation,
271
283
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
272
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
284
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
273
285
  }),
274
286
  });
275
287
  }
@@ -283,7 +295,7 @@ function transform2Param(node) {
283
295
  name,
284
296
  typeAnnotation: typeAnnotation ? (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(typeAnnotation) : null,
285
297
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
286
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
298
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
287
299
  }),
288
300
  });
289
301
  }
@@ -298,7 +310,7 @@ function transform2Param(node) {
298
310
  required: !node.optional,
299
311
  typeAnnotation: typeAnnotation ? (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(typeAnnotation) : null,
300
312
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
301
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
313
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
302
314
  }),
303
315
  });
304
316
  }
@@ -321,12 +333,12 @@ function transform2Param(node) {
321
333
  name,
322
334
  typeAnnotation: typeAnnotation ? (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(typeAnnotation) : null,
323
335
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
324
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
336
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
325
337
  }),
326
338
  });
327
339
  }
328
340
  else {
329
- (0, utils_1.throwError)(`Unhandled node ${node}`);
341
+ (0, utils_1.throwError)('Unhandled node', node);
330
342
  }
331
343
  }
332
344
  exports.transform2Param = transform2Param;
@@ -345,6 +357,12 @@ function transformCallExpressionToBinaryExpression(node, calleeName, callee, opt
345
357
  IN: 'in',
346
358
  IS_NULL: 'isNull',
347
359
  };
360
+ if (calleeName === 'IS_NULL') {
361
+ return new utils_1.naslTypes.UnaryExpression({
362
+ operator: 'isNull',
363
+ argument: transformNodeFunction(argument?.[0], options),
364
+ });
365
+ }
348
366
  return new utils_1.naslTypes.BinaryExpression({
349
367
  operator: map[calleeName],
350
368
  left: transformNodeFunction(argument?.[0], options),
@@ -424,11 +442,21 @@ function transform2BinaryExpression(node, options) {
424
442
  right: transformNodeFunction(node.right, options),
425
443
  });
426
444
  }
427
- (0, utils_1.throwError)(`Unhandled node ${node.type}`);
445
+ (0, utils_1.throwError)('Unhandled node', node.type, node);
428
446
  }
429
447
  exports.transform2BinaryExpression = transform2BinaryExpression;
448
+ function transformDefaultExpression(node, options) {
449
+ const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
450
+ return transformNodeFunction(node.left, options);
451
+ }
430
452
  function transformConditionalExpression(node, options) {
431
453
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
454
+ if (options?.inCallQueryComponentField) {
455
+ const expr = (0, utils_1.generate)(node.test)?.code;
456
+ const then_expr = (0, utils_1.generate)(node.consequent)?.code;
457
+ const else_expr = (0, utils_1.generate)(node.alternate)?.code;
458
+ (0, utils_1.throwError)(`数据查询中不支持条件表达式!${(0, utils_1.generate)(node)?.code}, 请使用 SQL函数 IF(${expr} == null, ${then_expr}, ${else_expr})`);
459
+ }
432
460
  const test = transformNodeFunction(node.test, options);
433
461
  const consequent = transformNodeFunction(node.consequent, options);
434
462
  const alternate = transformNodeFunction(node.alternate, options);
@@ -455,7 +483,7 @@ function transformConditionalExpression(node, options) {
455
483
  isMatchedTypeEnumable: true,
456
484
  }),
457
485
  new utils_1.naslTypes.MatchCase({
458
- patterns: [alternate],
486
+ patterns: [],
459
487
  body: [alternate],
460
488
  }),
461
489
  ],
@@ -471,13 +499,30 @@ function transformArrayExpression(node, options) {
471
499
  });
472
500
  }
473
501
  function transform2NewAnonymousStructure(node, options) {
502
+ for (let i = 0; i < node.properties.length; i++) {
503
+ const item = node.properties[i];
504
+ const itemValue = item?.value;
505
+ if (itemValue.type === 'NullLiteral') {
506
+ const currentType = options?.typeAnnotation?.properties?.[i];
507
+ if (currentType?.typeAnnotation) {
508
+ item.naslType = currentType.typeAnnotation;
509
+ }
510
+ else {
511
+ (0, utils_1.throwError)('Do not allow NullLiteral without type, you can use as to carry the type', node);
512
+ }
513
+ }
514
+ else if (itemValue.type === 'TSAsExpression') {
515
+ const typeAnnotation = (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(itemValue.typeAnnotation);
516
+ item.naslType = typeAnnotation;
517
+ }
518
+ }
474
519
  const newComposite = transform2PartialNewComposite(node, options);
475
520
  const newProperties = node.properties.filter((prop) => prop.type === 'ObjectProperty' && prop.value.type !== 'ConditionalExpression');
476
521
  const structureProperties = [];
477
522
  newProperties.forEach((arg, index) => {
478
523
  structureProperties.push(new utils_1.naslTypes.StructureProperty({
479
524
  name: arg.key.name,
480
- typeAnnotation: null
525
+ typeAnnotation: arg.naslType || null,
481
526
  }));
482
527
  });
483
528
  newComposite.typeAnnotation = utils_1.naslTypes.TypeAnnotation.createTypeAnonymousStructure(structureProperties);
@@ -504,7 +549,7 @@ function transform2NewExpression(calleeName, node, options) {
504
549
  });
505
550
  }
506
551
  if (node?.arguments && node?.arguments?.[0]?.type !== 'ArrayExpression') {
507
- (0, utils_1.throwError)(`Not allowed code ${(0, utils_1.generate)(node).code} in NewList`);
552
+ (0, utils_1.throwError)('Not allowed code in NewList', node);
508
553
  }
509
554
  return new utils_1.naslTypes.NewList({
510
555
  typeAnnotation: node?.typeParameters ? typeAnnotation : undefined,
@@ -537,13 +582,13 @@ function transform2NewExpression(calleeName, node, options) {
537
582
  const typeParam = node.typeParameters?.params[0];
538
583
  const typeNamespaceAndName = typeParam ? (0, utils_1.generate)(typeParam).code : '';
539
584
  if (!typeNamespaceAndName)
540
- (0, utils_1.throwError)(`Not allowed empty namespace in NewEntity`);
585
+ (0, utils_1.throwError)('Not allowed empty namespace in NewEntity', node);
541
586
  return transform2NewStructure(typeNamespaceAndName, node.arguments[0], options);
542
587
  }
543
588
  if (calleeName === 'NewAnonymousStructure') {
544
589
  return transform2NewAnonymousStructure(node.arguments[0], options);
545
590
  }
546
- (0, utils_1.throwError)(`Unhandled ArrowFunctionExpression node ${node.type}`);
591
+ (0, utils_1.throwError)('Unhandled ArrowFunctionExpression node', node.type, node);
547
592
  }
548
593
  function pushElseIf(ifNode, switchStatement, options) {
549
594
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
@@ -640,7 +685,7 @@ function transform2VariableAndAddAssignment(node, options) {
640
685
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
641
686
  const declList = node?.declarations || [];
642
687
  let newNode;
643
- declList?.forEach((decl) => {
688
+ declList.forEach((decl) => {
644
689
  const variableName = decl.id.name;
645
690
  const isArrayPattern = decl.id?.type === 'ArrayPattern';
646
691
  if (isArrayPattern && decl.init) {
@@ -777,6 +822,16 @@ function transformIdentifier(node, options) {
777
822
  if (placeholderMap.includes(node.name)) {
778
823
  return new utils_1.naslTypes.Identifier({});
779
824
  }
825
+ if (node.name === '$self') {
826
+ return new utils_1.naslTypes.MemberExpression({
827
+ object: new utils_1.naslTypes.Identifier({
828
+ name: 'elements',
829
+ }),
830
+ property: new utils_1.naslTypes.Identifier({
831
+ name: '$ce',
832
+ }),
833
+ });
834
+ }
780
835
  return new utils_1.naslTypes.Identifier({
781
836
  name: node.name,
782
837
  });
@@ -805,7 +860,7 @@ function transform2SelectQueryFieldExpression(node, options) {
805
860
  // @TODO
806
861
  }
807
862
  else {
808
- (0, utils_1.throwError)(`Unsupported expression type: ${expression.type} for QueryFieldExpression`);
863
+ (0, utils_1.throwError)('Unsupported expression type for QueryFieldExpression', expression.type, expression);
809
864
  }
810
865
  }
811
866
  function transform2QueryAggregateExpression(node, options) {
@@ -827,7 +882,7 @@ function transform2QueryAggregateExpression(node, options) {
827
882
  }
828
883
  function transform2AnonymousFunction(node, options) {
829
884
  if (node.body.type === 'BlockStatement')
830
- (0, utils_1.throwError)('Anonymous function with block statement is not supported');
885
+ (0, utils_1.throwError)('Anonymous function with block statement is not supported', node);
831
886
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
832
887
  return new utils_1.naslTypes.AnonymousFunction({
833
888
  params: node.params.map((param) => transform2Param(param)),
@@ -994,7 +1049,7 @@ function transform2PartialNewComposite(node, options) {
994
1049
  const rights = [];
995
1050
  const structureProperties = [];
996
1051
  const assignmentLines = [];
997
- const newProperties = (node?.properties || node?.arguments?.[0]?.properties)?.filter((arg) => arg?.value?.type !== 'ConditionalExpression');
1052
+ const newProperties = (node?.properties || node?.arguments?.[0]?.properties);
998
1053
  let idx = 0;
999
1054
  newProperties?.forEach((arg, index) => {
1000
1055
  properties.push(transformNodeFunction(arg.key, options));
@@ -1087,8 +1142,7 @@ function transformNewExpression(node, options) {
1087
1142
  else if (calleeName.includes('.entities.') || calleeName.includes('.structures.')) {
1088
1143
  return transform2NewStructure(calleeName, node.arguments[0], options);
1089
1144
  }
1090
- const errCode = (0, utils_1.generate)(node).code;
1091
- (0, utils_1.throwError)(`Unhandled node ${node.type}: ${errCode}`);
1145
+ (0, utils_1.throwError)('Unhandled node', node.type, node);
1092
1146
  }
1093
1147
  exports.transformNewExpression = transformNewExpression;
1094
1148
  function transformMemberExpression(node, options) {
@@ -1125,18 +1179,31 @@ function transformMemberExpression(node, options) {
1125
1179
  });
1126
1180
  }
1127
1181
  if (calleeName?.startsWith('$refs.')) {
1128
- const componentName = callee?.[1]?.name;
1129
- const propertyName = callee?.[2]?.name;
1130
- return new utils_1.naslTypes.MemberExpression({
1131
- object: new utils_1.naslTypes.Identifier({
1132
- namespace: `elements.${componentName}.property`,
1133
- name: componentName,
1134
- }),
1135
- property: new utils_1.naslTypes.Identifier({
1136
- namespace: propertyName,
1137
- name: propertyName,
1138
- }),
1139
- });
1182
+ if (callee[0].type === 'CallExpression') {
1183
+ const callExpression = callee[0];
1184
+ const callCallee = flatMemberExpression(callExpression.callee);
1185
+ const callCalleeName = (0, utils_1.generate)(callExpression)?.code;
1186
+ let callResult = transformCall2CallViewElementLogic(callExpression, callCalleeName, callCallee, options);
1187
+ const remainingCallee = callee.slice(1);
1188
+ if (remainingCallee.length > 0) {
1189
+ return unflatMemberExpression(remainingCallee, options, callResult);
1190
+ }
1191
+ return callResult;
1192
+ }
1193
+ else {
1194
+ const componentName = callee?.[1]?.name;
1195
+ const propertyName = callee?.[2]?.name;
1196
+ return new utils_1.naslTypes.MemberExpression({
1197
+ object: new utils_1.naslTypes.Identifier({
1198
+ namespace: `elements.${componentName}.property`,
1199
+ name: componentName,
1200
+ }),
1201
+ property: new utils_1.naslTypes.Identifier({
1202
+ namespace: propertyName,
1203
+ name: propertyName,
1204
+ }),
1205
+ });
1206
+ }
1140
1207
  }
1141
1208
  const regex = /^(app\..+?)\.variables\.(.+)$/;
1142
1209
  if (regex.test(calleeName)) {
@@ -1191,12 +1258,87 @@ function transformMemberExpression(node, options) {
1191
1258
  });
1192
1259
  }
1193
1260
  exports.transformMemberExpression = transformMemberExpression;
1194
- function transformCallCall2Match(node, options) {
1195
- // (function match() {})(...) 的情况
1196
- return undefined;
1261
+ /**
1262
+ * @example (function match(_value) {
1263
+ if (_value === true) {
1264
+ return 'green'
1265
+ } else {
1266
+ return 'red'
1267
+ }
1268
+ })(nasl.util.Convert<Boolean>(enabled))
1269
+ */
1270
+ function transformCallFunctionExpression2Match(node, calleeName, callee, options) {
1271
+ const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
1272
+ const arg = node.arguments[0];
1273
+ const ifStatement = node.callee.body.body[0];
1274
+ if (ifStatement.type !== 'IfStatement') {
1275
+ (0, utils_1.throwError)('Match 函数体内必须是一个 if 语句', ifStatement);
1276
+ }
1277
+ const flatedIfStatements = flatIfStatementForMatch(ifStatement);
1278
+ const match = new utils_1.naslTypes.Match({
1279
+ expression: transformNodeFunction(arg, options),
1280
+ isExpression: true,
1281
+ cases: flatedIfStatements.map((_case) => {
1282
+ let argument;
1283
+ if (_case.consequent.type === 'BlockStatement') {
1284
+ if (_case.consequent.body.length === 1 && _case.consequent.body[0].type === 'ReturnStatement') {
1285
+ argument = _case.consequent.body[0].argument;
1286
+ }
1287
+ else {
1288
+ (0, utils_1.throwError)('Match Case 的 if 中只能写一个 return 语句', _case.consequent);
1289
+ }
1290
+ }
1291
+ else {
1292
+ if (_case.consequent.type === 'ReturnStatement') {
1293
+ argument = _case.consequent.argument;
1294
+ }
1295
+ else {
1296
+ (0, utils_1.throwError)('Match Case 的 if 中只能写一个 return 语句', _case.consequent);
1297
+ }
1298
+ }
1299
+ return new utils_1.naslTypes.MatchCase({
1300
+ isMatchedTypeEnumable: false,
1301
+ patterns: !_case.test ? [] : flatMatchPatternsExpression(transformNodeFunction(_case.test, options)),
1302
+ body: [transformNodeFunction(argument, options)],
1303
+ });
1304
+ }),
1305
+ });
1306
+ if (!match.cases.length || match.cases[match.cases.length - 1].patterns.length) {
1307
+ match.cases.push(new utils_1.naslTypes.MatchCase({
1308
+ isMatchedTypeEnumable: false,
1309
+ patterns: [],
1310
+ body: [],
1311
+ }));
1312
+ }
1313
+ match.cases.forEach((case_) => {
1314
+ if (case_.patterns.length) {
1315
+ if (case_.patterns[0].concept === 'BooleanLiteral' || case_.patterns[0].concept === 'StringLiteral') {
1316
+ case_.isMatchedTypeEnumable = true;
1317
+ }
1318
+ if (case_.patterns[0].concept === 'MemberExpression') {
1319
+ case_.isMatchedTypeEnumable = true;
1320
+ case_.patterns[0] = new utils_1.naslTypes.MemberExpression({
1321
+ object: {
1322
+ concept: 'Identifier',
1323
+ name: case_.patterns[0].object.property.name,
1324
+ folded: false,
1325
+ namespace: 'app.enums'
1326
+ },
1327
+ property: {
1328
+ concept: 'Identifier',
1329
+ name: case_.patterns[0].property.value,
1330
+ folded: false,
1331
+ },
1332
+ });
1333
+ }
1334
+ }
1335
+ });
1336
+ return match;
1197
1337
  }
1198
- exports.transformCallCall2Match = transformCallCall2Match;
1338
+ exports.transformCallFunctionExpression2Match = transformCallFunctionExpression2Match;
1199
1339
  function transformCall2CallViewElementLogic(node, calleeName, callee, options) {
1340
+ if (options?.isRestricted)
1341
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1200
1342
  if (calleeName?.includes('getPropValue') || calleeName?.includes('setPropValue')) {
1201
1343
  const componentName = callee?.[1]?.name;
1202
1344
  const propertyName = node?.arguments?.[0]?.value;
@@ -1231,6 +1373,8 @@ function transformCall2CallViewElementLogic(node, calleeName, callee, options) {
1231
1373
  }
1232
1374
  exports.transformCall2CallViewElementLogic = transformCall2CallViewElementLogic;
1233
1375
  function transformCall2CallEntityLogic(node, calleeName, callee, options) {
1376
+ if (options?.isRestricted)
1377
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1234
1378
  const entityName = callee[0].name.replace(/Entity$/, '');
1235
1379
  // console.log('callee', callee);
1236
1380
  return new utils_1.naslTypes.CallLogic({
@@ -1243,6 +1387,8 @@ function transformCall2CallEntityLogic(node, calleeName, callee, options) {
1243
1387
  }
1244
1388
  exports.transformCall2CallEntityLogic = transformCall2CallEntityLogic;
1245
1389
  function transformCall2CallDataSourceLogic(node, calleeName, callee, options) {
1390
+ if (options?.isRestricted)
1391
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1246
1392
  if (calleeName?.includes('.entities.')) {
1247
1393
  const calleeNamespace = (0, utils_1.generate)(node?.callee?.object?.object)?.code;
1248
1394
  const entityName = node?.callee?.object?.property?.name?.replace(/Entity$/, '');
@@ -1301,6 +1447,10 @@ function transformCall2CallDataSourceLogic(node, calleeName, callee, options) {
1301
1447
  }
1302
1448
  exports.transformCall2CallDataSourceLogic = transformCall2CallDataSourceLogic;
1303
1449
  function transformCall2OQLQuery(node, calleeName, callee, options) {
1450
+ if (options?.isInFrontend)
1451
+ (0, utils_1.throwError)('OQL组件不支持在前端使用', node);
1452
+ if (options?.isRestricted)
1453
+ (0, utils_1.throwError)('OQL组件不支持在组件或默认值表达式中使用', node);
1304
1454
  if (options.transformType === 'logic' && options?.logicType === 'global_logic') {
1305
1455
  // const _typeAnnotation = node?.typeParameters?.params?.length > 0 ? naslTypes.TypeAnnotation.createGeneric('List', {
1306
1456
  // typeArguments: node?.typeParameters?.params.map((curType: any) => transform2TypeAnnotation({ ...curType })),
@@ -1315,6 +1465,8 @@ function transformCall2OQLQuery(node, calleeName, callee, options) {
1315
1465
  }
1316
1466
  }
1317
1467
  function transformCall2ConsoleLog(node, calleeName, callee, options) {
1468
+ if (options?.isRestricted)
1469
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1318
1470
  return new utils_1.naslTypes.CallLogic({
1319
1471
  calleeNamespace: 'nasl.logging',
1320
1472
  calleeName: 'INFO',
@@ -1326,6 +1478,8 @@ function transformCall2ConsoleLog(node, calleeName, callee, options) {
1326
1478
  }
1327
1479
  exports.transformCall2ConsoleLog = transformCall2ConsoleLog;
1328
1480
  function transformCall2Logging(node, calleeName, callee, options) {
1481
+ if (options?.isRestricted)
1482
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1329
1483
  const newArguments = node.arguments.map((arg) => new utils_1.naslTypes.Argument({
1330
1484
  expression: arg?.name === "undefined" ?
1331
1485
  new utils_1.naslTypes.StringLiteral()
@@ -1375,11 +1529,11 @@ function transform2CallFunction(node, calleeName, argument, options) {
1375
1529
  });
1376
1530
  });
1377
1531
  let newTypeArguments = node?.typeParameters?.params.map(transform2TypeAnnotation_1.transform2TypeAnnotation);
1378
- if (calleeName === 'ListRepeat') {
1379
- newTypeArguments = [
1380
- new utils_1.naslTypes.TypeAnnotation()
1381
- ];
1382
- }
1532
+ // if (calleeName === 'ListRepeat') {
1533
+ // newTypeArguments = [
1534
+ // new naslTypes.TypeAnnotation()
1535
+ // ];
1536
+ // }
1383
1537
  if (calleeName === 'Concat') {
1384
1538
  const expressions = newArguments.map((item) => item.expression);
1385
1539
  return new utils_1.naslTypes.StringInterpolation({
@@ -1441,7 +1595,7 @@ function transform2CallFunction(node, calleeName, argument, options) {
1441
1595
  });
1442
1596
  }
1443
1597
  else {
1444
- (0, utils_1.throwError)(`函数${calleeName}不存在`);
1598
+ (0, utils_1.throwError)(`函数${calleeName}不存在`, node.callee);
1445
1599
  }
1446
1600
  if (!func.params?.length) {
1447
1601
  const needDefaultParam = ['CurrDate', 'CurrTime', 'CurrDateTime'];
@@ -1483,7 +1637,7 @@ function transform2CallFunction(node, calleeName, argument, options) {
1483
1637
  return new utils_1.naslTypes.CallFunction((0, utils_1.handleListSort)(nodeElement?.toJSON()));
1484
1638
  }
1485
1639
  if (options.transformType === 'logic' && options?.inCallQueryComponentField) {
1486
- (0, utils_1.throwError)(`数据查询中不支持内置函数${nodeElement.calleeName}`);
1640
+ (0, utils_1.throwError)('数据查询中不支持使用内置函数', nodeElement.calleeName, node);
1487
1641
  }
1488
1642
  return nodeElement;
1489
1643
  }
@@ -1493,6 +1647,8 @@ function transform2SqlFunction(node, calleeName, argument, options) {
1493
1647
  (0, utils_1.throwError)(`数据查询中只有 WHERE, HAVING, ORDER_BY 支持 SQL 函数,而当前字段为 ${options.inCallQueryComponentField}`);
1494
1648
  }
1495
1649
  const specFunList = ['COUNT', 'COUNTD', 'SUM', 'AVG', 'MAX', 'MIN'];
1650
+ // TODO: 先写死了 mysql,后续需要传入: 参考 requestSqlFunctions
1651
+ const func = server_1.default ? server_1.default?.getSqlFunction('mysql', calleeName) : null;
1496
1652
  let addArguments = [];
1497
1653
  if (specFunList.includes(calleeName)) {
1498
1654
  const value = calleeName === 'COUNTD' ? 'DISTINCT' : 'ALL';
@@ -1505,7 +1661,7 @@ function transform2SqlFunction(node, calleeName, argument, options) {
1505
1661
  }
1506
1662
  const newArguments = argument.map((arg, index) => new utils_1.naslTypes.Argument({
1507
1663
  expression: fixExpression(arg, options),
1508
- keyword: 'str', // `arg${index + 1}`,
1664
+ keyword: func?.params[index]?.name || `param${index + 1}`,
1509
1665
  }));
1510
1666
  const nodeElement = new utils_1.naslTypes.CallFunction({
1511
1667
  calleeNamespace: 'nasl.sqlFunction',
@@ -1518,7 +1674,7 @@ function transform2SqlFunction(node, calleeName, argument, options) {
1518
1674
  }
1519
1675
  function transformCall2CallFunction(node, calleeName, callee, options) {
1520
1676
  let curCalleeName;
1521
- if (callee.length === 3)
1677
+ if (callee.length >= 3)
1522
1678
  curCalleeName = callee[callee.length - 1].name;
1523
1679
  else {
1524
1680
  let _callee = callee[0].callee;
@@ -1526,11 +1682,10 @@ function transformCall2CallFunction(node, calleeName, callee, options) {
1526
1682
  _callee = _callee.callee;
1527
1683
  curCalleeName = _callee.property.name;
1528
1684
  }
1529
- const argument = callee.length === 3 ? node.arguments : callee[0].arguments;
1530
- if (['plus', 'minus', 'multiply', 'divide', 'remainder', 'STARTS_WITH', 'ENDS_WITH', 'LIKE', 'IN'].includes(curCalleeName)) {
1531
- return transformCallExpressionToBinaryExpression(node, curCalleeName, callee, options);
1532
- }
1533
- ;
1685
+ const argument = callee.length >= 3 ? node.arguments : callee[0].arguments;
1686
+ // if (['plus', 'minus', 'multiply', 'divide', 'remainder', 'STARTS_WITH', 'ENDS_WITH', 'LIKE', 'IN'].includes(curCalleeName)) {
1687
+ // return transformCallExpressionToBinaryExpression(node, curCalleeName, callee, options);
1688
+ // };
1534
1689
  if (['NewList', 'NewMap', 'NewEntity', 'NewStructure', 'NewAnonymousStructure'].includes(curCalleeName)) {
1535
1690
  return transform2NewExpression(curCalleeName, node, options);
1536
1691
  }
@@ -1539,10 +1694,31 @@ function transformCall2CallFunction(node, calleeName, callee, options) {
1539
1694
  exports.transformCall2CallFunction = transformCall2CallFunction;
1540
1695
  function transform2UIFunction(node, calleeName, callee, options) {
1541
1696
  if (callee[2].name === 'destination') {
1542
- const namespace = node.arguments[0].value;
1543
- const nsArr = namespace.split('.').map((item) => item.replace(/_view$/, ''));
1544
- const pageType = nsArr.shift();
1545
- const viewName = nsArr.pop();
1697
+ let namespaceNode = node.arguments[0];
1698
+ let namespace = '';
1699
+ if (namespaceNode.type === 'TemplateLiteral') {
1700
+ namespace = namespaceNode.quasis[0]?.value?.cooked;
1701
+ }
1702
+ else if (namespaceNode.type === 'StringLiteral') {
1703
+ namespace = namespaceNode.value;
1704
+ }
1705
+ else {
1706
+ namespace = (0, utils_1.generate)(namespaceNode).code;
1707
+ }
1708
+ let nsArr;
1709
+ let viewNamespace = '';
1710
+ let viewName = '';
1711
+ if (namespace.startsWith('app.frontendTypes.')) {
1712
+ nsArr = namespace.split('.');
1713
+ viewName = nsArr.pop();
1714
+ viewNamespace = nsArr.join('.');
1715
+ }
1716
+ else {
1717
+ nsArr = namespace.split('.').map((item) => item.replace(/_view$/, ''));
1718
+ const pageType = nsArr.shift();
1719
+ viewName = nsArr.pop();
1720
+ viewNamespace = `app.frontendTypes.${pageType}.frontends.${pageType}.views${nsArr?.map((item) => `.${item}.views`)?.join('')}`;
1721
+ }
1546
1722
  const newArguments = node?.arguments?.slice(1);
1547
1723
  let argument = [];
1548
1724
  if (newArguments?.[0]?.type === 'ObjectExpression') {
@@ -1558,7 +1734,7 @@ function transform2UIFunction(node, calleeName, callee, options) {
1558
1734
  }));
1559
1735
  }
1560
1736
  return new utils_1.naslTypes.Destination({
1561
- viewNamespace: `app.frontendTypes.${pageType}.frontends.${pageType}.views${nsArr?.map((item) => `.${item}.views`)?.join('')}`,
1737
+ viewNamespace,
1562
1738
  viewName,
1563
1739
  arguments: argument,
1564
1740
  });
@@ -1568,6 +1744,8 @@ function transform2UIFunction(node, calleeName, callee, options) {
1568
1744
  link: fixExpression(node?.arguments[0], options),
1569
1745
  });
1570
1746
  }
1747
+ if (options?.isRestricted)
1748
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1571
1749
  return new utils_1.naslTypes.CallLogic({
1572
1750
  calleeNamespace: 'nasl.ui',
1573
1751
  calleeName: callee[2].name,
@@ -1687,6 +1865,8 @@ function transformForEach2ForEachStatement(node, calleeName, callee, options) {
1687
1865
  }
1688
1866
  exports.transformForEach2ForEachStatement = transformForEach2ForEachStatement;
1689
1867
  function transformAlert2ShowMessage(node, calleeName, callee, options) {
1868
+ if (options?.isRestricted)
1869
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1690
1870
  return new utils_1.naslTypes.CallLogic({
1691
1871
  calleeNamespace: 'nasl.ui',
1692
1872
  calleeName: 'showMessage',
@@ -1698,6 +1878,8 @@ function transformAlert2ShowMessage(node, calleeName, callee, options) {
1698
1878
  }
1699
1879
  exports.transformAlert2ShowMessage = transformAlert2ShowMessage;
1700
1880
  function transformCall2Interface(node, calleeName, callee, options) {
1881
+ if (options?.isRestricted)
1882
+ (0, utils_1.throwError)('调用接口不支持在组件或默认值表达式中使用', node);
1701
1883
  return new utils_1.naslTypes.CallInterface({
1702
1884
  calleeNamespace: (0, utils_1.generate)(node.callee.object).code,
1703
1885
  calleeName: callee[callee.length - 1].name,
@@ -1709,13 +1891,15 @@ function transformCall2Interface(node, calleeName, callee, options) {
1709
1891
  }
1710
1892
  exports.transformCall2Interface = transformCall2Interface;
1711
1893
  function transformCall2Connector(node, calleeName, callee, options) {
1894
+ if (options?.isRestricted)
1895
+ (0, utils_1.throwError)('调用连接器不支持在组件或默认值表达式中使用', node);
1712
1896
  let calleeConnectionName = undefined;
1713
1897
  let calleeNamespace = undefined;
1714
1898
  let calleeNamespacePrefix = `connector.${callee[1].name}`;
1715
1899
  if (callee.length === 5) {
1716
1900
  const connectArg = callee[2].arguments[0];
1717
1901
  if (!connectArg || connectArg.type !== 'StringLiteral') {
1718
- (0, utils_1.throwError)(`调用 connector 的 connect 参数不正确,只允许使用字符串字面量`);
1902
+ (0, utils_1.throwError)('调用 connector 的 connect 参数不正确,只允许使用字符串字面量', node);
1719
1903
  }
1720
1904
  calleeConnectionName = connectArg.value;
1721
1905
  const noNamespace = callee[3].name === 'logics';
@@ -1730,7 +1914,7 @@ function transformCall2Connector(node, calleeName, callee, options) {
1730
1914
  calleeNamespace = calleeNamespacePrefix;
1731
1915
  }
1732
1916
  else {
1733
- (0, utils_1.throwError)(`调用 connector,参数数量不正确,当前参数数量为 ${callee.length},${calleeName}`);
1917
+ (0, utils_1.throwError)(`调用 connector,参数数量不正确,当前参数数量为 ${callee.length},${calleeName}`, node);
1734
1918
  }
1735
1919
  return new utils_1.naslTypes.CallConnector({
1736
1920
  calleeConnectionName,
@@ -1743,6 +1927,8 @@ function transformCall2Connector(node, calleeName, callee, options) {
1743
1927
  }
1744
1928
  exports.transformCall2Connector = transformCall2Connector;
1745
1929
  function transformCall2Extension(node, calleeName, callee, options) {
1930
+ if (options?.isRestricted)
1931
+ (0, utils_1.throwError)('调用扩展逻辑不支持在组件或默认值表达式中使用', node);
1746
1932
  return new utils_1.naslTypes.CallLogic({
1747
1933
  calleeNamespace: (0, utils_1.generate)(node?.callee?.object)?.code,
1748
1934
  calleeName: callee?.[callee?.length - 1]?.name,
@@ -1752,55 +1938,6 @@ function transformCall2Extension(node, calleeName, callee, options) {
1752
1938
  });
1753
1939
  }
1754
1940
  exports.transformCall2Extension = transformCall2Extension;
1755
- function transformArrowFunction2Match(node, calleeName, callee, options) {
1756
- const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
1757
- // NOTE: 适用于 if else
1758
- const newCallee = node.callee.body.body;
1759
- if (newCallee[newCallee.length - 1].argument?.callee?.name === '__MatchExpressionFunction') {
1760
- const match = new utils_1.naslTypes.Match({
1761
- expression: fixExpression(newCallee[0], options),
1762
- isExpression: options.transformType !== 'logic',
1763
- cases: flatIfStatement(newCallee[1].body.body[0]).map((_case) => new utils_1.naslTypes.MatchCase({
1764
- patterns: !_case.test ? [] : flatMatchPatternsExpression(transformNodeFunction(_case.test, options)),
1765
- body: transformBlockBody(_case.consequent.body.filter((item) => item.type !== 'BreakStatement'), options),
1766
- })),
1767
- });
1768
- if (!match.cases.length || match.cases[match.cases.length - 1].patterns.length) {
1769
- match.cases.push(new utils_1.naslTypes.MatchCase({
1770
- patterns: [],
1771
- body: [],
1772
- }));
1773
- }
1774
- match.cases.forEach((case_) => {
1775
- if (case_.body.length && (case_.body[0].concept === 'BooleanLiteral' || case_.body[0].concept === 'StringLiteral')) {
1776
- case_.isMatchedTypeEnumable = true;
1777
- }
1778
- if (case_.patterns.length && case_.patterns[0].concept === 'MemberExpression') {
1779
- case_.isMatchedTypeEnumable = true;
1780
- case_.patterns[0] = new utils_1.naslTypes.MemberExpression({
1781
- object: {
1782
- concept: 'Identifier',
1783
- name: case_.patterns[0].object.property.name,
1784
- folded: false,
1785
- namespace: 'app.enums'
1786
- },
1787
- property: {
1788
- concept: 'Identifier',
1789
- name: case_.patterns[0].property.value,
1790
- folded: false,
1791
- },
1792
- });
1793
- }
1794
- });
1795
- return match;
1796
- }
1797
- if (newCallee[newCallee.length - 1].argument?.callee?.name === '__SwitchExpressionFuntion') {
1798
- const switchStatement = transformNodeFunction(newCallee[0].body.body[0], options);
1799
- return switchStatement;
1800
- }
1801
- (0, utils_1.throwError)(`Unhandled ArrowFunctionExpression node ${node.type}`);
1802
- }
1803
- exports.transformArrowFunction2Match = transformArrowFunction2Match;
1804
1941
  function transformTSAsExpression(node, options) {
1805
1942
  if (node.expression.type === 'NumericLiteral') {
1806
1943
  return transform2NumericLiteral(node.expression, { ...options, typeAnnotation: (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(node.typeAnnotation) });
@@ -1811,11 +1948,16 @@ function transformTSAsExpression(node, options) {
1811
1948
  (0, utils_1.throwError)(`列表 as 必须为 List 类型`);
1812
1949
  return transformArrayExpression(node.expression, { ...options, typeAnnotation });
1813
1950
  }
1951
+ else if (node.expression.type === 'NullLiteral') {
1952
+ return transform2NullLiteral(node.expression, options);
1953
+ }
1814
1954
  else {
1815
- (0, utils_1.throwError)(`表达式 ${node.expression.type} 不支持使用 as 关键字`);
1955
+ (0, utils_1.throwError)('表达式不支持使用 as 关键字', node.expression.type, node.expression);
1816
1956
  }
1817
1957
  }
1818
1958
  function transformCall2CallViewLogic(node, calleeName, callee, options) {
1959
+ if (options?.isRestricted)
1960
+ (0, utils_1.throwError)('调用页面逻辑不支持在组件或默认值表达式中使用', node);
1819
1961
  return new utils_1.naslTypes.CallLogic({
1820
1962
  calleeNamespace: '',
1821
1963
  calleeName: calleeName.slice('viewLogic_'.length),
@@ -1826,11 +1968,13 @@ function transformCall2CallViewLogic(node, calleeName, callee, options) {
1826
1968
  }
1827
1969
  exports.transformCall2CallViewLogic = transformCall2CallViewLogic;
1828
1970
  function transformCall2Logic(node, calleeName, callee, options) {
1971
+ if (options?.isRestricted)
1972
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1829
1973
  if (utils_1.callFunctionMap.includes(calleeName)) {
1830
1974
  // 未带前缀,补一下
1831
1975
  return transform2CallFunction(node, calleeName, node?.arguments || [], options);
1832
1976
  }
1833
- else if (utils_1.sqlFunctions.includes(calleeName) || calleeName === 'COUNTD') {
1977
+ else if (server_1.default.getSqlFunction('mysql', calleeName) || calleeName === 'COUNTD') {
1834
1978
  return transform2SqlFunction(node, calleeName, node?.arguments || [], options);
1835
1979
  }
1836
1980
  let newCalleeName = calleeName?.includes('__IDENTIFIER__') ? undefined : calleeName;
@@ -1850,6 +1994,8 @@ function transformCall2Logic(node, calleeName, callee, options) {
1850
1994
  }
1851
1995
  exports.transformCall2Logic = transformCall2Logic;
1852
1996
  function transformCall2LogicWithAuth(node, calleeName, callee, options) {
1997
+ if (options?.isRestricted)
1998
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1853
1999
  return new utils_1.naslTypes.CallLogic({
1854
2000
  calleeNamespace: `nasl.auth`,
1855
2001
  calleeName: callee[callee.length - 1].name,
@@ -1874,10 +2020,10 @@ function flatCallQueryComponentChainNode(node, options) {
1874
2020
  const calleeName = node.callee.name;
1875
2021
  if (['FROM', 'INNER_JOIN', 'LEFT_JOIN', 'RIGHT_JOIN', 'OUTER_JOIN'].includes(calleeName)) {
1876
2022
  if (node.arguments[1].type !== 'ArrowFunctionExpression')
1877
- (0, utils_1.throwError)('FROM should have a ArrowFunctionExpression as the second argument');
2023
+ (0, utils_1.throwError)('FROM should have a ArrowFunctionExpression as the second argument', node.arguments[1]);
1878
2024
  const arrowFunctionExpression = node.arguments[1];
1879
2025
  if (arrowFunctionExpression.body.type !== 'CallExpression')
1880
- (0, utils_1.throwError)('FROM should have a CallExpression as the body of ArrowFunctionExpression');
2026
+ (0, utils_1.throwError)('FROM should have a CallExpression as the body of ArrowFunctionExpression', arrowFunctionExpression.body);
1881
2027
  const body = arrowFunctionExpression.body;
1882
2028
  const callExpressions = flatChainCallExpression(body);
1883
2029
  const joinNode = callExpressions?.filter((item) => item?.callee?.name.includes('_JOIN'));
@@ -1893,7 +2039,7 @@ FROM(T1Entity, T1 => ${name}(T2Entity, T2 => ON(T1.id == T2.id).SELECT(...))); /
1893
2039
  const count = joinCode.match(/_JOIN/g)?.length || 0;
1894
2040
  const errorOrder = count >= 1 && !callExpressions?.[callExpressions?.length - 1]?.callee?.name?.includes('_JOIN');
1895
2041
  if (errorOrder) {
1896
- (0, utils_1.throwError)('调用顺序错误,期望的调用顺序为 FROM -> JOIN -> WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY。其中,FROM在最外层,FROM内部是零到多层JOIN嵌套调用,在最内层的JOIN内部是 WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY 的调用顺序。', options.needThrowError);
2042
+ (0, utils_1.throwError)('调用顺序错误,期望的调用顺序为 FROM -> JOIN -> WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY。其中,FROM在最外层,FROM内部是零到多层JOIN嵌套调用,在最内层的JOIN内部是 WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY 的调用顺序。');
1897
2043
  }
1898
2044
  const result = [{
1899
2045
  calleeName: calleeName,
@@ -1943,7 +2089,7 @@ function transformMemberExpression2Entity(node, node2) {
1943
2089
  const entityNamespace = entityPath.slice(0, -1).map(n => n.name).join('.');
1944
2090
  const entityName = entityPath[entityPath.length - 1].name.replace(/Entity$/, '');
1945
2091
  if (!entityNamespace?.includes('.entities')) {
1946
- (0, utils_1.throwError)(`${entityNamespace}.${entityName} 不是一个数据库表,无法使用数据查询。`);
2092
+ (0, utils_1.throwError)(`${entityNamespace}.${entityName} 不是一个数据库表,无法使用数据查询`);
1947
2093
  }
1948
2094
  const asName = node2.name === entityName ? undefined : node2.name;
1949
2095
  if (asName) {
@@ -1952,19 +2098,23 @@ function transformMemberExpression2Entity(node, node2) {
1952
2098
  return { entityNamespace, entityName, asName };
1953
2099
  }
1954
2100
  function transformCall2DataQuery(node, calleeName, callee, options) {
2101
+ if (options?.isInFrontend)
2102
+ (0, utils_1.throwError)('数据查询组件不支持在前端使用', node);
2103
+ if (options?.isRestricted)
2104
+ (0, utils_1.throwError)('数据查询组件不支持在组件或默认值表达式中使用', node);
1955
2105
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
1956
2106
  const code = (0, utils_1.generate)(node)?.code || '';
1957
2107
  if (code?.includes('nasl.util')) {
1958
- (0, utils_1.throwError)('数据查询中不支持nasl.util内的库函数,请将对应操作放在数据查询外部进行处理');
2108
+ (0, utils_1.throwError)('数据查询中不支持nasl.util内的库函数,请将对应操作放在数据查询外部进行处理', code);
1959
2109
  }
1960
2110
  if (!code?.includes('.SELECT(') && !code?.includes('.AGGR_SELECT(')) {
1961
- (0, utils_1.throwError)('缺少 SELECT 或 AGGR_SELECT 语句');
2111
+ (0, utils_1.throwError)('缺少 SELECT 或 AGGR_SELECT 语句', code);
1962
2112
  }
1963
2113
  const flatted = flatCallQueryComponentChainNode(node, options);
1964
2114
  const calleeNames = flatted.map((item) => item?.calleeName).filter((name) => name !== '$');
1965
2115
  const isOrderCorrect = (0, utils_1.checkOQLCalleeNameOrder)(calleeNames);
1966
2116
  if (!isOrderCorrect) {
1967
- (0, utils_1.throwError)('调用顺序错误,期望的调用顺序为 FROM -> JOIN -> WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY。其中,FROM在最外层,FROM内部是零到多层JOIN嵌套调用,在最内层的JOIN内部是 WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY 的调用顺序。', options.needThrowError);
2117
+ (0, utils_1.throwError)('调用顺序错误,期望的调用顺序为 FROM -> JOIN -> WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY。其中,FROM在最外层,FROM内部是零到多层JOIN嵌套调用,在最内层的JOIN内部是 WHERE -> GROUP_BY -> SELECT/AGGR_SELECT -> HAVING -> ORDER_BY 的调用顺序。');
1968
2118
  }
1969
2119
  let from;
1970
2120
  let where;
@@ -2025,16 +2175,35 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2025
2175
  propertyName: '',
2026
2176
  })],
2027
2177
  });
2028
- item.arguments[0].properties?.forEach((arg) => {
2029
- if (arg?.value.type === 'CallExpression') {
2030
- let selectElements = transform2QueryAggregateExpression(arg, { ...options, entityAsNames, inCallQueryComponentField: item.calleeName });
2031
- const newSelectElements = [...select.selectElements, selectElements];
2032
- select.setSelectElements(newSelectElements);
2033
- }
2034
- else {
2035
- (0, utils_1.throwError)(`Unsupported expression type: ${arg?.value.type} for QueryAggregateExpression`);
2036
- }
2037
- });
2178
+ if (item.arguments[0].type === 'ObjectExpression') {
2179
+ item.arguments[0].properties?.forEach((arg) => {
2180
+ if (arg?.value.type === 'CallExpression') {
2181
+ let selectElements = transform2QueryAggregateExpression(arg, { ...options, entityAsNames, inCallQueryComponentField: item.calleeName });
2182
+ const newSelectElements = [...select.selectElements, selectElements];
2183
+ select.setSelectElements(newSelectElements);
2184
+ }
2185
+ else {
2186
+ (0, utils_1.throwError)(`Unsupported expression type for QueryAggregateExpression`, arg?.value.type, arg?.value);
2187
+ }
2188
+ });
2189
+ }
2190
+ else if (item.arguments[0].type === 'CallExpression') { // 只有一个的简写:AGGR_SELECT(SUM(Entity1.age))
2191
+ const selectElements = transform2QueryAggregateExpression({
2192
+ type: 'ObjectProperty',
2193
+ key: {
2194
+ type: 'Identifier',
2195
+ name: 'resultItem',
2196
+ },
2197
+ value: item.arguments[0],
2198
+ computed: false,
2199
+ shorthand: false,
2200
+ }, { ...options, entityAsNames, inCallQueryComponentField: item.calleeName });
2201
+ const newSelectElements = [...select.selectElements, selectElements];
2202
+ select.setSelectElements(newSelectElements);
2203
+ }
2204
+ else {
2205
+ (0, utils_1.throwError)('Unsupported expression type for QueryAggregateExpression', item.arguments[0].type, item.arguments[0]);
2206
+ }
2038
2207
  break;
2039
2208
  case 'SELECT':
2040
2209
  select = new utils_1.naslTypes.QuerySelectExpression({
@@ -2106,7 +2275,7 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2106
2275
  }
2107
2276
  }
2108
2277
  else {
2109
- (0, utils_1.throwError)('HAVING 不符合规范,请使用箭头函数');
2278
+ (0, utils_1.throwError)('HAVING 不符合规范,请使用箭头函数', havingNode);
2110
2279
  }
2111
2280
  having = transformNodeFunction(havingNode, { ...options, ...restParams });
2112
2281
  break;
@@ -2121,7 +2290,7 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2121
2290
  }
2122
2291
  }
2123
2292
  else {
2124
- (0, utils_1.throwError)('ORDER_BY 不符合规范,请使用箭头函数');
2293
+ (0, utils_1.throwError)('ORDER_BY 不符合规范,请使用箭头函数', orderNode);
2125
2294
  }
2126
2295
  orderBy = orderNode.map((arg) => {
2127
2296
  let orderElementCode = (0, utils_1.generate)(arg)?.code || '';
@@ -2165,6 +2334,8 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2165
2334
  return callQueryComponent;
2166
2335
  }
2167
2336
  function transformCall2LaunchProcess(node, calleeName, callee, options) {
2337
+ if (options?.isRestricted)
2338
+ (0, utils_1.throwError)('调用流程逻辑不支持在组件或默认值表达式中使用', node);
2168
2339
  const args = node.arguments;
2169
2340
  const dataArg = args?.[0];
2170
2341
  const procDefKeyArg = args?.[1];
@@ -2203,6 +2374,7 @@ function transform2LogicItem(node, options) {
2203
2374
  transformManager.register('NumericLiteral', transform2NumericLiteral);
2204
2375
  transformManager.register('NullLiteral', transform2NullLiteral);
2205
2376
  transformManager.register('TemplateLiteral', transform2StringInterpolation);
2377
+ transformManager.register((node) => node.type === 'LogicalExpression' && node.operator === '??', transformDefaultExpression);
2206
2378
  transformManager.register('BinaryExpression', transform2BinaryExpression);
2207
2379
  transformManager.register('LogicalExpression', transform2BinaryExpression);
2208
2380
  transformManager.register('UpdateExpression', transformUpdateExpression2Assignment);
@@ -2240,7 +2412,8 @@ function transform2LogicItem(node, options) {
2240
2412
  }
2241
2413
  });
2242
2414
  transformManager.register('MemberExpression', transformMemberExpression);
2243
- transformManager.register((node) => node.type === 'CallExpression' && node.callee.type === 'CallExpression', transformCallCall2Match);
2415
+ transformManager.register('OptionalMemberExpression', transformMemberExpression);
2416
+ transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 1 && (node.callee.type === 'FunctionExpression' && node.callee.id?.name === 'match' || node.callee.type === 'ArrowFunctionExpression'), transformCallFunctionExpression2Match);
2244
2417
  transformManager.registerCallExpression((node, calleeName) => /^\$refs\./.test(calleeName), transformCall2CallViewElementLogic);
2245
2418
  transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 2 && callee[0].type === 'Identifier' && callee[0].name.endsWith('Entity'), transformCall2CallEntityLogic);
2246
2419
  transformManager.registerCallExpression('nasl.oql.query', transformCall2OQLQuery);
@@ -2262,12 +2435,11 @@ function transform2LogicItem(node, options) {
2262
2435
  transformManager.registerCallExpression('extensions.lcap_process_framework.logics.launchProcess', transformCall2LaunchProcess);
2263
2436
  transformManager.registerCallExpression((node, calleeName) => /extensions\./.test(calleeName), transformCall2Extension);
2264
2437
  transformManager.registerCallExpression((node, calleeName) => /connectors\./.test(calleeName), transformCall2Connector);
2265
- transformManager.registerCallExpression((node) => node.callee.type === 'ArrowFunctionExpression', transformArrowFunction2Match);
2266
2438
  transformManager.registerCallExpression((node, calleeName) => ['plus', 'minus', 'multiply', 'divide', 'remainder', 'STARTS_WITH', 'ENDS_WITH', 'LIKE', 'IN', 'IS_NULL'].includes(calleeName), transformCallExpressionToBinaryExpression);
2267
2439
  transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 1 && calleeName.startsWith('viewLogic_'), transformCall2CallViewLogic);
2268
2440
  transformManager.registerCallExpression('PAGINATE', transformCall2Paginate);
2269
2441
  transformManager.registerCallExpression('FROM', transformCall2DataQuery);
2270
- transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 1, transformCall2Logic);
2442
+ transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 1 && !['ArrowFunctionExpression', 'FunctionExpression'].includes(callee[0].type), transformCall2Logic);
2271
2443
  let result = transformManager.apply(node, options);
2272
2444
  delete options.typeAnnotation;
2273
2445
  return result;