@lcap/nasl 4.1.0-beta.8 → 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 (125) 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/memory-optimization.d.ts.map +1 -1
  20. package/out/generator/release-body/memory-optimization.js +3 -2
  21. package/out/generator/release-body/memory-optimization.js.map +1 -1
  22. package/out/generator/release-body/utils.d.ts +7 -3
  23. package/out/generator/release-body/utils.d.ts.map +1 -1
  24. package/out/generator/release-body/utils.js +7 -5
  25. package/out/generator/release-body/utils.js.map +1 -1
  26. package/out/index.d.ts +1 -1
  27. package/out/index.d.ts.map +1 -1
  28. package/out/index.js +2 -1
  29. package/out/index.js.map +1 -1
  30. package/out/natural/index.d.ts +1 -0
  31. package/out/natural/index.d.ts.map +1 -1
  32. package/out/natural/index.js +1 -0
  33. package/out/natural/index.js.map +1 -1
  34. package/out/natural/parseNaturalTS.d.ts +1 -1
  35. package/out/natural/parseNaturalTS.d.ts.map +1 -1
  36. package/out/natural/parseNaturalTS.js +150 -4
  37. package/out/natural/parseNaturalTS.js.map +1 -1
  38. package/out/natural/parseNaturalTSXView.d.ts +6 -0
  39. package/out/natural/parseNaturalTSXView.d.ts.map +1 -0
  40. package/out/natural/parseNaturalTSXView.js +536 -0
  41. package/out/natural/parseNaturalTSXView.js.map +1 -0
  42. package/out/natural/transformTS2UI.d.ts.map +1 -1
  43. package/out/natural/transformTS2UI.js +6 -9
  44. package/out/natural/transformTS2UI.js.map +1 -1
  45. package/out/natural/transformTSCode.d.ts.map +1 -1
  46. package/out/natural/transformTSCode.js +1 -1
  47. package/out/natural/transformTSCode.js.map +1 -1
  48. package/out/natural/transforms/transform2Entity.d.ts.map +1 -1
  49. package/out/natural/transforms/transform2Entity.js +3 -1
  50. package/out/natural/transforms/transform2Entity.js.map +1 -1
  51. package/out/natural/transforms/transform2Enum.js +1 -1
  52. package/out/natural/transforms/transform2Enum.js.map +1 -1
  53. package/out/natural/transforms/transform2Logic.d.ts +3 -1
  54. package/out/natural/transforms/transform2Logic.d.ts.map +1 -1
  55. package/out/natural/transforms/transform2Logic.js +37 -6
  56. package/out/natural/transforms/transform2Logic.js.map +1 -1
  57. package/out/natural/transforms/transform2LogicItem.d.ts +34 -6
  58. package/out/natural/transforms/transform2LogicItem.d.ts.map +1 -1
  59. package/out/natural/transforms/transform2LogicItem.js +333 -151
  60. package/out/natural/transforms/transform2LogicItem.js.map +1 -1
  61. package/out/natural/transforms/transform2MetadataType.d.ts +3 -0
  62. package/out/natural/transforms/transform2MetadataType.d.ts.map +1 -0
  63. package/out/natural/transforms/transform2MetadataType.js +14 -0
  64. package/out/natural/transforms/transform2MetadataType.js.map +1 -0
  65. package/out/natural/transforms/transform2ValidationRule.d.ts +3 -0
  66. package/out/natural/transforms/transform2ValidationRule.d.ts.map +1 -0
  67. package/out/natural/transforms/transform2ValidationRule.js +19 -0
  68. package/out/natural/transforms/transform2ValidationRule.js.map +1 -0
  69. package/out/natural/transforms/transform2Variable.d.ts +1 -0
  70. package/out/natural/transforms/transform2Variable.d.ts.map +1 -1
  71. package/out/natural/transforms/transform2Variable.js +25 -1
  72. package/out/natural/transforms/transform2Variable.js.map +1 -1
  73. package/out/natural/transforms/transformThemeAndStyle.d.ts +24 -0
  74. package/out/natural/transforms/transformThemeAndStyle.d.ts.map +1 -0
  75. package/out/natural/transforms/transformThemeAndStyle.js +269 -0
  76. package/out/natural/transforms/transformThemeAndStyle.js.map +1 -0
  77. package/out/natural/transforms/utils.d.ts +16 -2
  78. package/out/natural/transforms/utils.d.ts.map +1 -1
  79. package/out/natural/transforms/utils.js +67 -11
  80. package/out/natural/transforms/utils.js.map +1 -1
  81. package/out/server/OQL/sqlCategory.json +410 -0
  82. package/out/server/OQL/sqlFunctions.json +695 -7
  83. package/out/server/client/nasl-server-client.d.ts +7 -0
  84. package/out/server/client/nasl-server-client.d.ts.map +1 -0
  85. package/out/server/client/nasl-server-client.js +9 -0
  86. package/out/server/client/nasl-server-client.js.map +1 -0
  87. package/out/server/extendBaseNode.d.ts.map +1 -1
  88. package/out/server/extendBaseNode.js +18 -9
  89. package/out/server/extendBaseNode.js.map +1 -1
  90. package/out/server/index.d.ts +1 -0
  91. package/out/server/index.d.ts.map +1 -1
  92. package/out/server/index.js +1 -0
  93. package/out/server/index.js.map +1 -1
  94. package/out/server/naslServer.d.ts +10 -1
  95. package/out/server/naslServer.d.ts.map +1 -1
  96. package/out/server/naslServer.js +125 -64
  97. package/out/server/naslServer.js.map +1 -1
  98. package/out/service/initial/form-designer.d.ts +1 -1
  99. package/out/service/initial/form-designer.d.ts.map +1 -1
  100. package/out/service/initial/form-designer.js +4 -1
  101. package/out/service/initial/form-designer.js.map +1 -1
  102. package/out/service/initial/processV2.d.ts +1 -1
  103. package/out/service/initial/processV2.d.ts.map +1 -1
  104. package/out/service/initial/processV2.js +4 -1
  105. package/out/service/initial/processV2.js.map +1 -1
  106. package/out/service/initial/types.d.ts +1 -0
  107. package/out/service/initial/types.d.ts.map +1 -1
  108. package/out/service/storage/api.d.ts +16 -7
  109. package/out/service/storage/api.js +6 -0
  110. package/out/service/storage/api.js.map +1 -1
  111. package/out/service/storage/cache/index.d.ts +3 -15
  112. package/out/service/storage/cache/index.d.ts.map +1 -1
  113. package/out/service/storage/cache/index.js +14 -299
  114. package/out/service/storage/cache/index.js.map +1 -1
  115. package/out/service/storage/cache/split.d.ts +0 -21
  116. package/out/service/storage/cache/split.d.ts.map +1 -1
  117. package/out/service/storage/cache/split.js +24 -33
  118. package/out/service/storage/cache/split.js.map +1 -1
  119. package/out/service/storage/init.d.ts +9 -0
  120. package/out/service/storage/init.d.ts.map +1 -1
  121. package/out/service/storage/init.js +61 -90
  122. package/out/service/storage/init.js.map +1 -1
  123. package/out/service/storage/service.js +1 -1
  124. package/out/service/storage/service.js.map +1 -1
  125. 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,17 +123,21 @@ 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) {
131
130
  let expression;
132
131
  if (options.transformType === 'logic' && supportSubLogic &&
133
- (arg?.type === 'FunctionExpression' ||
134
- (arg?.type === 'ArrowFunctionExpression' && arg?.body?.type === 'BlockStatement'))) {
135
- // 如果是匿名函数,且有多个表达式,返回 SubLogic
136
- // 如果是具名函数,返回 SubLogic
137
- expression = transformTSCode2SubLogic(arg, options);
132
+ (arg?.type === 'FunctionExpression' || (arg?.type === 'ArrowFunctionExpression'))) {
133
+ if (arg?.body?.type === 'BlockStatement') {
134
+ expression = transformTSCode2SubLogic(arg, options);
135
+ }
136
+ else {
137
+ const babelReturnStatement = utils_1.babelTypes.returnStatement(arg.body);
138
+ arg.body = utils_1.babelTypes.blockStatement([babelReturnStatement]);
139
+ expression = transformTSCode2SubLogic(arg, options);
140
+ }
138
141
  }
139
142
  else {
140
143
  if (arg?.body?.type === 'ReturnStatement') {
@@ -228,16 +231,29 @@ function flatMatchPatternsExpression(node) {
228
231
  }
229
232
  return [node];
230
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
+ }
231
242
  return [node];
232
243
  }
233
244
  exports.flatMatchPatternsExpression = flatMatchPatternsExpression;
234
- function flatIfStatement(node) {
245
+ function flatIfStatementForMatch(node) {
235
246
  if (node.alternate.type === 'IfStatement') {
236
- return [...flatIfStatement(node.alternate), node];
247
+ return [node, ...flatIfStatementForMatch(node.alternate)];
237
248
  }
238
- return [node];
249
+ return [node, {
250
+ type: 'IfStatement',
251
+ test: null,
252
+ consequent: node.alternate,
253
+ alternate: node.alternate,
254
+ }];
239
255
  }
240
- exports.flatIfStatement = flatIfStatement;
256
+ exports.flatIfStatementForMatch = flatIfStatementForMatch;
241
257
  /**
242
258
  * 这个函数是修复 AI 翻译出错的情况,与正常的 transform 做个区分
243
259
  * @param node
@@ -265,7 +281,7 @@ function transform2Param(node) {
265
281
  name,
266
282
  typeAnnotation,
267
283
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
268
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
284
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
269
285
  }),
270
286
  });
271
287
  }
@@ -279,7 +295,7 @@ function transform2Param(node) {
279
295
  name,
280
296
  typeAnnotation: typeAnnotation ? (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(typeAnnotation) : null,
281
297
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
282
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
298
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
283
299
  }),
284
300
  });
285
301
  }
@@ -294,7 +310,7 @@ function transform2Param(node) {
294
310
  required: !node.optional,
295
311
  typeAnnotation: typeAnnotation ? (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(typeAnnotation) : null,
296
312
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
297
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
313
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
298
314
  }),
299
315
  });
300
316
  }
@@ -317,12 +333,12 @@ function transform2Param(node) {
317
333
  name,
318
334
  typeAnnotation: typeAnnotation ? (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(typeAnnotation) : null,
319
335
  defaultValue: defaultValueExpression && new utils_1.naslTypes.DefaultValue({
320
- expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr' }),
336
+ expression: transform2LogicItem(defaultValueExpression, { transformType: 'attr', isRestricted: true }),
321
337
  }),
322
338
  });
323
339
  }
324
340
  else {
325
- (0, utils_1.throwError)(`Unhandled node ${node}`);
341
+ (0, utils_1.throwError)('Unhandled node', node);
326
342
  }
327
343
  }
328
344
  exports.transform2Param = transform2Param;
@@ -341,6 +357,12 @@ function transformCallExpressionToBinaryExpression(node, calleeName, callee, opt
341
357
  IN: 'in',
342
358
  IS_NULL: 'isNull',
343
359
  };
360
+ if (calleeName === 'IS_NULL') {
361
+ return new utils_1.naslTypes.UnaryExpression({
362
+ operator: 'isNull',
363
+ argument: transformNodeFunction(argument?.[0], options),
364
+ });
365
+ }
344
366
  return new utils_1.naslTypes.BinaryExpression({
345
367
  operator: map[calleeName],
346
368
  left: transformNodeFunction(argument?.[0], options),
@@ -420,11 +442,21 @@ function transform2BinaryExpression(node, options) {
420
442
  right: transformNodeFunction(node.right, options),
421
443
  });
422
444
  }
423
- (0, utils_1.throwError)(`Unhandled node ${node.type}`);
445
+ (0, utils_1.throwError)('Unhandled node', node.type, node);
424
446
  }
425
447
  exports.transform2BinaryExpression = transform2BinaryExpression;
448
+ function transformDefaultExpression(node, options) {
449
+ const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
450
+ return transformNodeFunction(node.left, options);
451
+ }
426
452
  function transformConditionalExpression(node, options) {
427
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
+ }
428
460
  const test = transformNodeFunction(node.test, options);
429
461
  const consequent = transformNodeFunction(node.consequent, options);
430
462
  const alternate = transformNodeFunction(node.alternate, options);
@@ -451,7 +483,7 @@ function transformConditionalExpression(node, options) {
451
483
  isMatchedTypeEnumable: true,
452
484
  }),
453
485
  new utils_1.naslTypes.MatchCase({
454
- patterns: [alternate],
486
+ patterns: [],
455
487
  body: [alternate],
456
488
  }),
457
489
  ],
@@ -467,13 +499,30 @@ function transformArrayExpression(node, options) {
467
499
  });
468
500
  }
469
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
+ }
470
519
  const newComposite = transform2PartialNewComposite(node, options);
471
520
  const newProperties = node.properties.filter((prop) => prop.type === 'ObjectProperty' && prop.value.type !== 'ConditionalExpression');
472
521
  const structureProperties = [];
473
522
  newProperties.forEach((arg, index) => {
474
523
  structureProperties.push(new utils_1.naslTypes.StructureProperty({
475
524
  name: arg.key.name,
476
- typeAnnotation: null
525
+ typeAnnotation: arg.naslType || null,
477
526
  }));
478
527
  });
479
528
  newComposite.typeAnnotation = utils_1.naslTypes.TypeAnnotation.createTypeAnonymousStructure(structureProperties);
@@ -500,7 +549,7 @@ function transform2NewExpression(calleeName, node, options) {
500
549
  });
501
550
  }
502
551
  if (node?.arguments && node?.arguments?.[0]?.type !== 'ArrayExpression') {
503
- (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);
504
553
  }
505
554
  return new utils_1.naslTypes.NewList({
506
555
  typeAnnotation: node?.typeParameters ? typeAnnotation : undefined,
@@ -533,13 +582,13 @@ function transform2NewExpression(calleeName, node, options) {
533
582
  const typeParam = node.typeParameters?.params[0];
534
583
  const typeNamespaceAndName = typeParam ? (0, utils_1.generate)(typeParam).code : '';
535
584
  if (!typeNamespaceAndName)
536
- (0, utils_1.throwError)(`Not allowed empty namespace in NewEntity`);
585
+ (0, utils_1.throwError)('Not allowed empty namespace in NewEntity', node);
537
586
  return transform2NewStructure(typeNamespaceAndName, node.arguments[0], options);
538
587
  }
539
588
  if (calleeName === 'NewAnonymousStructure') {
540
589
  return transform2NewAnonymousStructure(node.arguments[0], options);
541
590
  }
542
- (0, utils_1.throwError)(`Unhandled ArrowFunctionExpression node ${node.type}`);
591
+ (0, utils_1.throwError)('Unhandled ArrowFunctionExpression node', node.type, node);
543
592
  }
544
593
  function pushElseIf(ifNode, switchStatement, options) {
545
594
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
@@ -636,7 +685,7 @@ function transform2VariableAndAddAssignment(node, options) {
636
685
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
637
686
  const declList = node?.declarations || [];
638
687
  let newNode;
639
- declList?.forEach((decl) => {
688
+ declList.forEach((decl) => {
640
689
  const variableName = decl.id.name;
641
690
  const isArrayPattern = decl.id?.type === 'ArrayPattern';
642
691
  if (isArrayPattern && decl.init) {
@@ -773,6 +822,16 @@ function transformIdentifier(node, options) {
773
822
  if (placeholderMap.includes(node.name)) {
774
823
  return new utils_1.naslTypes.Identifier({});
775
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
+ }
776
835
  return new utils_1.naslTypes.Identifier({
777
836
  name: node.name,
778
837
  });
@@ -801,7 +860,7 @@ function transform2SelectQueryFieldExpression(node, options) {
801
860
  // @TODO
802
861
  }
803
862
  else {
804
- (0, utils_1.throwError)(`Unsupported expression type: ${expression.type} for QueryFieldExpression`);
863
+ (0, utils_1.throwError)('Unsupported expression type for QueryFieldExpression', expression.type, expression);
805
864
  }
806
865
  }
807
866
  function transform2QueryAggregateExpression(node, options) {
@@ -823,7 +882,7 @@ function transform2QueryAggregateExpression(node, options) {
823
882
  }
824
883
  function transform2AnonymousFunction(node, options) {
825
884
  if (node.body.type === 'BlockStatement')
826
- (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);
827
886
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
828
887
  return new utils_1.naslTypes.AnonymousFunction({
829
888
  params: node.params.map((param) => transform2Param(param)),
@@ -990,7 +1049,7 @@ function transform2PartialNewComposite(node, options) {
990
1049
  const rights = [];
991
1050
  const structureProperties = [];
992
1051
  const assignmentLines = [];
993
- const newProperties = (node?.properties || node?.arguments?.[0]?.properties)?.filter((arg) => arg?.value?.type !== 'ConditionalExpression');
1052
+ const newProperties = (node?.properties || node?.arguments?.[0]?.properties);
994
1053
  let idx = 0;
995
1054
  newProperties?.forEach((arg, index) => {
996
1055
  properties.push(transformNodeFunction(arg.key, options));
@@ -1083,8 +1142,7 @@ function transformNewExpression(node, options) {
1083
1142
  else if (calleeName.includes('.entities.') || calleeName.includes('.structures.')) {
1084
1143
  return transform2NewStructure(calleeName, node.arguments[0], options);
1085
1144
  }
1086
- const errCode = (0, utils_1.generate)(node).code;
1087
- (0, utils_1.throwError)(`Unhandled node ${node.type}: ${errCode}`);
1145
+ (0, utils_1.throwError)('Unhandled node', node.type, node);
1088
1146
  }
1089
1147
  exports.transformNewExpression = transformNewExpression;
1090
1148
  function transformMemberExpression(node, options) {
@@ -1121,18 +1179,31 @@ function transformMemberExpression(node, options) {
1121
1179
  });
1122
1180
  }
1123
1181
  if (calleeName?.startsWith('$refs.')) {
1124
- const componentName = callee?.[1]?.name;
1125
- const propertyName = callee?.[2]?.name;
1126
- return new utils_1.naslTypes.MemberExpression({
1127
- object: new utils_1.naslTypes.Identifier({
1128
- namespace: `elements.${componentName}.property`,
1129
- name: componentName,
1130
- }),
1131
- property: new utils_1.naslTypes.Identifier({
1132
- namespace: propertyName,
1133
- name: propertyName,
1134
- }),
1135
- });
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
+ }
1136
1207
  }
1137
1208
  const regex = /^(app\..+?)\.variables\.(.+)$/;
1138
1209
  if (regex.test(calleeName)) {
@@ -1187,12 +1258,87 @@ function transformMemberExpression(node, options) {
1187
1258
  });
1188
1259
  }
1189
1260
  exports.transformMemberExpression = transformMemberExpression;
1190
- function transformCallCall2Match(node, options) {
1191
- // (function match() {})(...) 的情况
1192
- 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;
1193
1337
  }
1194
- exports.transformCallCall2Match = transformCallCall2Match;
1338
+ exports.transformCallFunctionExpression2Match = transformCallFunctionExpression2Match;
1195
1339
  function transformCall2CallViewElementLogic(node, calleeName, callee, options) {
1340
+ if (options?.isRestricted)
1341
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1196
1342
  if (calleeName?.includes('getPropValue') || calleeName?.includes('setPropValue')) {
1197
1343
  const componentName = callee?.[1]?.name;
1198
1344
  const propertyName = node?.arguments?.[0]?.value;
@@ -1227,6 +1373,8 @@ function transformCall2CallViewElementLogic(node, calleeName, callee, options) {
1227
1373
  }
1228
1374
  exports.transformCall2CallViewElementLogic = transformCall2CallViewElementLogic;
1229
1375
  function transformCall2CallEntityLogic(node, calleeName, callee, options) {
1376
+ if (options?.isRestricted)
1377
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1230
1378
  const entityName = callee[0].name.replace(/Entity$/, '');
1231
1379
  // console.log('callee', callee);
1232
1380
  return new utils_1.naslTypes.CallLogic({
@@ -1239,6 +1387,8 @@ function transformCall2CallEntityLogic(node, calleeName, callee, options) {
1239
1387
  }
1240
1388
  exports.transformCall2CallEntityLogic = transformCall2CallEntityLogic;
1241
1389
  function transformCall2CallDataSourceLogic(node, calleeName, callee, options) {
1390
+ if (options?.isRestricted)
1391
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1242
1392
  if (calleeName?.includes('.entities.')) {
1243
1393
  const calleeNamespace = (0, utils_1.generate)(node?.callee?.object?.object)?.code;
1244
1394
  const entityName = node?.callee?.object?.property?.name?.replace(/Entity$/, '');
@@ -1297,6 +1447,10 @@ function transformCall2CallDataSourceLogic(node, calleeName, callee, options) {
1297
1447
  }
1298
1448
  exports.transformCall2CallDataSourceLogic = transformCall2CallDataSourceLogic;
1299
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);
1300
1454
  if (options.transformType === 'logic' && options?.logicType === 'global_logic') {
1301
1455
  // const _typeAnnotation = node?.typeParameters?.params?.length > 0 ? naslTypes.TypeAnnotation.createGeneric('List', {
1302
1456
  // typeArguments: node?.typeParameters?.params.map((curType: any) => transform2TypeAnnotation({ ...curType })),
@@ -1311,6 +1465,8 @@ function transformCall2OQLQuery(node, calleeName, callee, options) {
1311
1465
  }
1312
1466
  }
1313
1467
  function transformCall2ConsoleLog(node, calleeName, callee, options) {
1468
+ if (options?.isRestricted)
1469
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1314
1470
  return new utils_1.naslTypes.CallLogic({
1315
1471
  calleeNamespace: 'nasl.logging',
1316
1472
  calleeName: 'INFO',
@@ -1322,6 +1478,8 @@ function transformCall2ConsoleLog(node, calleeName, callee, options) {
1322
1478
  }
1323
1479
  exports.transformCall2ConsoleLog = transformCall2ConsoleLog;
1324
1480
  function transformCall2Logging(node, calleeName, callee, options) {
1481
+ if (options?.isRestricted)
1482
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1325
1483
  const newArguments = node.arguments.map((arg) => new utils_1.naslTypes.Argument({
1326
1484
  expression: arg?.name === "undefined" ?
1327
1485
  new utils_1.naslTypes.StringLiteral()
@@ -1360,16 +1518,22 @@ exports.transformCall2JSONFunctions = transformCall2JSONFunctions;
1360
1518
  function transform2CallFunction(node, calleeName, argument, options) {
1361
1519
  calleeName = utils_1.replaceCallFunctionMap?.[calleeName] || calleeName;
1362
1520
  const func = server_1.default ? server_1.default.getBuildInFunction(calleeName) : null;
1363
- let newArguments = argument.map((arg, index) => new utils_1.naslTypes.Argument({
1364
- expression: fixExpression(arg, options, true),
1365
- keyword: func && func?.params[index]?.name || `param${index + 1}`,
1366
- }));
1521
+ let newArguments = argument.map((arg, index) => {
1522
+ let supportSubLogic = false;
1523
+ if (arg?.type === 'FunctionExpression' || (arg?.type === 'ArrowFunctionExpression' && arg?.body?.type === 'BlockStatement')) {
1524
+ supportSubLogic = true;
1525
+ }
1526
+ return new utils_1.naslTypes.Argument({
1527
+ expression: fixExpression(arg, options, supportSubLogic),
1528
+ keyword: func && func?.params[index]?.name || `param${index + 1}`,
1529
+ });
1530
+ });
1367
1531
  let newTypeArguments = node?.typeParameters?.params.map(transform2TypeAnnotation_1.transform2TypeAnnotation);
1368
- if (calleeName === 'ListRepeat') {
1369
- newTypeArguments = [
1370
- new utils_1.naslTypes.TypeAnnotation()
1371
- ];
1372
- }
1532
+ // if (calleeName === 'ListRepeat') {
1533
+ // newTypeArguments = [
1534
+ // new naslTypes.TypeAnnotation()
1535
+ // ];
1536
+ // }
1373
1537
  if (calleeName === 'Concat') {
1374
1538
  const expressions = newArguments.map((item) => item.expression);
1375
1539
  return new utils_1.naslTypes.StringInterpolation({
@@ -1431,7 +1595,7 @@ function transform2CallFunction(node, calleeName, argument, options) {
1431
1595
  });
1432
1596
  }
1433
1597
  else {
1434
- (0, utils_1.throwError)(`函数${calleeName}不存在`);
1598
+ (0, utils_1.throwError)(`函数${calleeName}不存在`, node.callee);
1435
1599
  }
1436
1600
  if (!func.params?.length) {
1437
1601
  const needDefaultParam = ['CurrDate', 'CurrTime', 'CurrDateTime'];
@@ -1473,7 +1637,7 @@ function transform2CallFunction(node, calleeName, argument, options) {
1473
1637
  return new utils_1.naslTypes.CallFunction((0, utils_1.handleListSort)(nodeElement?.toJSON()));
1474
1638
  }
1475
1639
  if (options.transformType === 'logic' && options?.inCallQueryComponentField) {
1476
- (0, utils_1.throwError)(`数据查询中不支持内置函数${nodeElement.calleeName}`);
1640
+ (0, utils_1.throwError)('数据查询中不支持使用内置函数', nodeElement.calleeName, node);
1477
1641
  }
1478
1642
  return nodeElement;
1479
1643
  }
@@ -1483,6 +1647,8 @@ function transform2SqlFunction(node, calleeName, argument, options) {
1483
1647
  (0, utils_1.throwError)(`数据查询中只有 WHERE, HAVING, ORDER_BY 支持 SQL 函数,而当前字段为 ${options.inCallQueryComponentField}`);
1484
1648
  }
1485
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;
1486
1652
  let addArguments = [];
1487
1653
  if (specFunList.includes(calleeName)) {
1488
1654
  const value = calleeName === 'COUNTD' ? 'DISTINCT' : 'ALL';
@@ -1495,7 +1661,7 @@ function transform2SqlFunction(node, calleeName, argument, options) {
1495
1661
  }
1496
1662
  const newArguments = argument.map((arg, index) => new utils_1.naslTypes.Argument({
1497
1663
  expression: fixExpression(arg, options),
1498
- keyword: 'str', // `arg${index + 1}`,
1664
+ keyword: func?.params[index]?.name || `param${index + 1}`,
1499
1665
  }));
1500
1666
  const nodeElement = new utils_1.naslTypes.CallFunction({
1501
1667
  calleeNamespace: 'nasl.sqlFunction',
@@ -1508,7 +1674,7 @@ function transform2SqlFunction(node, calleeName, argument, options) {
1508
1674
  }
1509
1675
  function transformCall2CallFunction(node, calleeName, callee, options) {
1510
1676
  let curCalleeName;
1511
- if (callee.length === 3)
1677
+ if (callee.length >= 3)
1512
1678
  curCalleeName = callee[callee.length - 1].name;
1513
1679
  else {
1514
1680
  let _callee = callee[0].callee;
@@ -1516,11 +1682,10 @@ function transformCall2CallFunction(node, calleeName, callee, options) {
1516
1682
  _callee = _callee.callee;
1517
1683
  curCalleeName = _callee.property.name;
1518
1684
  }
1519
- const argument = callee.length === 3 ? node.arguments : callee[0].arguments;
1520
- if (['plus', 'minus', 'multiply', 'divide', 'remainder', 'STARTS_WITH', 'ENDS_WITH', 'LIKE', 'IN'].includes(curCalleeName)) {
1521
- return transformCallExpressionToBinaryExpression(node, curCalleeName, callee, options);
1522
- }
1523
- ;
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
+ // };
1524
1689
  if (['NewList', 'NewMap', 'NewEntity', 'NewStructure', 'NewAnonymousStructure'].includes(curCalleeName)) {
1525
1690
  return transform2NewExpression(curCalleeName, node, options);
1526
1691
  }
@@ -1529,10 +1694,31 @@ function transformCall2CallFunction(node, calleeName, callee, options) {
1529
1694
  exports.transformCall2CallFunction = transformCall2CallFunction;
1530
1695
  function transform2UIFunction(node, calleeName, callee, options) {
1531
1696
  if (callee[2].name === 'destination') {
1532
- const namespace = node.arguments[0].value;
1533
- const nsArr = namespace.split('.').map((item) => item.replace(/_view$/, ''));
1534
- const pageType = nsArr.shift();
1535
- 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
+ }
1536
1722
  const newArguments = node?.arguments?.slice(1);
1537
1723
  let argument = [];
1538
1724
  if (newArguments?.[0]?.type === 'ObjectExpression') {
@@ -1548,7 +1734,7 @@ function transform2UIFunction(node, calleeName, callee, options) {
1548
1734
  }));
1549
1735
  }
1550
1736
  return new utils_1.naslTypes.Destination({
1551
- viewNamespace: `app.frontendTypes.${pageType}.frontends.${pageType}.views${nsArr?.map((item) => `.${item}.views`)?.join('')}`,
1737
+ viewNamespace,
1552
1738
  viewName,
1553
1739
  arguments: argument,
1554
1740
  });
@@ -1558,6 +1744,8 @@ function transform2UIFunction(node, calleeName, callee, options) {
1558
1744
  link: fixExpression(node?.arguments[0], options),
1559
1745
  });
1560
1746
  }
1747
+ if (options?.isRestricted)
1748
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1561
1749
  return new utils_1.naslTypes.CallLogic({
1562
1750
  calleeNamespace: 'nasl.ui',
1563
1751
  calleeName: callee[2].name,
@@ -1677,6 +1865,8 @@ function transformForEach2ForEachStatement(node, calleeName, callee, options) {
1677
1865
  }
1678
1866
  exports.transformForEach2ForEachStatement = transformForEach2ForEachStatement;
1679
1867
  function transformAlert2ShowMessage(node, calleeName, callee, options) {
1868
+ if (options?.isRestricted)
1869
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1680
1870
  return new utils_1.naslTypes.CallLogic({
1681
1871
  calleeNamespace: 'nasl.ui',
1682
1872
  calleeName: 'showMessage',
@@ -1688,6 +1878,8 @@ function transformAlert2ShowMessage(node, calleeName, callee, options) {
1688
1878
  }
1689
1879
  exports.transformAlert2ShowMessage = transformAlert2ShowMessage;
1690
1880
  function transformCall2Interface(node, calleeName, callee, options) {
1881
+ if (options?.isRestricted)
1882
+ (0, utils_1.throwError)('调用接口不支持在组件或默认值表达式中使用', node);
1691
1883
  return new utils_1.naslTypes.CallInterface({
1692
1884
  calleeNamespace: (0, utils_1.generate)(node.callee.object).code,
1693
1885
  calleeName: callee[callee.length - 1].name,
@@ -1699,13 +1891,15 @@ function transformCall2Interface(node, calleeName, callee, options) {
1699
1891
  }
1700
1892
  exports.transformCall2Interface = transformCall2Interface;
1701
1893
  function transformCall2Connector(node, calleeName, callee, options) {
1894
+ if (options?.isRestricted)
1895
+ (0, utils_1.throwError)('调用连接器不支持在组件或默认值表达式中使用', node);
1702
1896
  let calleeConnectionName = undefined;
1703
1897
  let calleeNamespace = undefined;
1704
1898
  let calleeNamespacePrefix = `connector.${callee[1].name}`;
1705
1899
  if (callee.length === 5) {
1706
1900
  const connectArg = callee[2].arguments[0];
1707
1901
  if (!connectArg || connectArg.type !== 'StringLiteral') {
1708
- (0, utils_1.throwError)(`调用 connector 的 connect 参数不正确,只允许使用字符串字面量`);
1902
+ (0, utils_1.throwError)('调用 connector 的 connect 参数不正确,只允许使用字符串字面量', node);
1709
1903
  }
1710
1904
  calleeConnectionName = connectArg.value;
1711
1905
  const noNamespace = callee[3].name === 'logics';
@@ -1720,7 +1914,7 @@ function transformCall2Connector(node, calleeName, callee, options) {
1720
1914
  calleeNamespace = calleeNamespacePrefix;
1721
1915
  }
1722
1916
  else {
1723
- (0, utils_1.throwError)(`调用 connector,参数数量不正确,当前参数数量为 ${callee.length},${calleeName}`);
1917
+ (0, utils_1.throwError)(`调用 connector,参数数量不正确,当前参数数量为 ${callee.length},${calleeName}`, node);
1724
1918
  }
1725
1919
  return new utils_1.naslTypes.CallConnector({
1726
1920
  calleeConnectionName,
@@ -1733,64 +1927,17 @@ function transformCall2Connector(node, calleeName, callee, options) {
1733
1927
  }
1734
1928
  exports.transformCall2Connector = transformCall2Connector;
1735
1929
  function transformCall2Extension(node, calleeName, callee, options) {
1930
+ if (options?.isRestricted)
1931
+ (0, utils_1.throwError)('调用扩展逻辑不支持在组件或默认值表达式中使用', node);
1736
1932
  return new utils_1.naslTypes.CallLogic({
1737
1933
  calleeNamespace: (0, utils_1.generate)(node?.callee?.object)?.code,
1738
1934
  calleeName: callee?.[callee?.length - 1]?.name,
1739
1935
  arguments: node?.arguments?.map((arg) => new utils_1.naslTypes.Argument({
1740
- expression: fixExpression(arg, options),
1936
+ expression: fixExpression(arg, options, true),
1741
1937
  })),
1742
1938
  });
1743
1939
  }
1744
1940
  exports.transformCall2Extension = transformCall2Extension;
1745
- function transformArrowFunction2Match(node, calleeName, callee, options) {
1746
- const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
1747
- // NOTE: 适用于 if else
1748
- const newCallee = node.callee.body.body;
1749
- if (newCallee[newCallee.length - 1].argument?.callee?.name === '__MatchExpressionFunction') {
1750
- const match = new utils_1.naslTypes.Match({
1751
- expression: fixExpression(newCallee[0], options),
1752
- isExpression: options.transformType !== 'logic',
1753
- cases: flatIfStatement(newCallee[1].body.body[0]).map((_case) => new utils_1.naslTypes.MatchCase({
1754
- patterns: !_case.test ? [] : flatMatchPatternsExpression(transformNodeFunction(_case.test, options)),
1755
- body: transformBlockBody(_case.consequent.body.filter((item) => item.type !== 'BreakStatement'), options),
1756
- })),
1757
- });
1758
- if (!match.cases.length || match.cases[match.cases.length - 1].patterns.length) {
1759
- match.cases.push(new utils_1.naslTypes.MatchCase({
1760
- patterns: [],
1761
- body: [],
1762
- }));
1763
- }
1764
- match.cases.forEach((case_) => {
1765
- if (case_.body.length && (case_.body[0].concept === 'BooleanLiteral' || case_.body[0].concept === 'StringLiteral')) {
1766
- case_.isMatchedTypeEnumable = true;
1767
- }
1768
- if (case_.patterns.length && case_.patterns[0].concept === 'MemberExpression') {
1769
- case_.isMatchedTypeEnumable = true;
1770
- case_.patterns[0] = new utils_1.naslTypes.MemberExpression({
1771
- object: {
1772
- concept: 'Identifier',
1773
- name: case_.patterns[0].object.property.name,
1774
- folded: false,
1775
- namespace: 'app.enums'
1776
- },
1777
- property: {
1778
- concept: 'Identifier',
1779
- name: case_.patterns[0].property.value,
1780
- folded: false,
1781
- },
1782
- });
1783
- }
1784
- });
1785
- return match;
1786
- }
1787
- if (newCallee[newCallee.length - 1].argument?.callee?.name === '__SwitchExpressionFuntion') {
1788
- const switchStatement = transformNodeFunction(newCallee[0].body.body[0], options);
1789
- return switchStatement;
1790
- }
1791
- (0, utils_1.throwError)(`Unhandled ArrowFunctionExpression node ${node.type}`);
1792
- }
1793
- exports.transformArrowFunction2Match = transformArrowFunction2Match;
1794
1941
  function transformTSAsExpression(node, options) {
1795
1942
  if (node.expression.type === 'NumericLiteral') {
1796
1943
  return transform2NumericLiteral(node.expression, { ...options, typeAnnotation: (0, transform2TypeAnnotation_1.transform2TypeAnnotation)(node.typeAnnotation) });
@@ -1801,11 +1948,16 @@ function transformTSAsExpression(node, options) {
1801
1948
  (0, utils_1.throwError)(`列表 as 必须为 List 类型`);
1802
1949
  return transformArrayExpression(node.expression, { ...options, typeAnnotation });
1803
1950
  }
1951
+ else if (node.expression.type === 'NullLiteral') {
1952
+ return transform2NullLiteral(node.expression, options);
1953
+ }
1804
1954
  else {
1805
- (0, utils_1.throwError)(`表达式 ${node.expression.type} 不支持使用 as 关键字`);
1955
+ (0, utils_1.throwError)('表达式不支持使用 as 关键字', node.expression.type, node.expression);
1806
1956
  }
1807
1957
  }
1808
1958
  function transformCall2CallViewLogic(node, calleeName, callee, options) {
1959
+ if (options?.isRestricted)
1960
+ (0, utils_1.throwError)('调用页面逻辑不支持在组件或默认值表达式中使用', node);
1809
1961
  return new utils_1.naslTypes.CallLogic({
1810
1962
  calleeNamespace: '',
1811
1963
  calleeName: calleeName.slice('viewLogic_'.length),
@@ -1816,11 +1968,13 @@ function transformCall2CallViewLogic(node, calleeName, callee, options) {
1816
1968
  }
1817
1969
  exports.transformCall2CallViewLogic = transformCall2CallViewLogic;
1818
1970
  function transformCall2Logic(node, calleeName, callee, options) {
1971
+ if (options?.isRestricted)
1972
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1819
1973
  if (utils_1.callFunctionMap.includes(calleeName)) {
1820
1974
  // 未带前缀,补一下
1821
1975
  return transform2CallFunction(node, calleeName, node?.arguments || [], options);
1822
1976
  }
1823
- else if (utils_1.sqlFunctions.includes(calleeName) || calleeName === 'COUNTD') {
1977
+ else if (server_1.default.getSqlFunction('mysql', calleeName) || calleeName === 'COUNTD') {
1824
1978
  return transform2SqlFunction(node, calleeName, node?.arguments || [], options);
1825
1979
  }
1826
1980
  let newCalleeName = calleeName?.includes('__IDENTIFIER__') ? undefined : calleeName;
@@ -1834,12 +1988,14 @@ function transformCall2Logic(node, calleeName, callee, options) {
1834
1988
  calleeNamespace,
1835
1989
  calleeName: newCalleeName,
1836
1990
  arguments: node?.arguments?.map((arg) => new utils_1.naslTypes.Argument({
1837
- expression: fixExpression(arg, options),
1991
+ expression: fixExpression(arg, options, true),
1838
1992
  })),
1839
1993
  });
1840
1994
  }
1841
1995
  exports.transformCall2Logic = transformCall2Logic;
1842
1996
  function transformCall2LogicWithAuth(node, calleeName, callee, options) {
1997
+ if (options?.isRestricted)
1998
+ (0, utils_1.throwError)('调用逻辑不支持在组件或默认值表达式中使用', node);
1843
1999
  return new utils_1.naslTypes.CallLogic({
1844
2000
  calleeNamespace: `nasl.auth`,
1845
2001
  calleeName: callee[callee.length - 1].name,
@@ -1864,10 +2020,10 @@ function flatCallQueryComponentChainNode(node, options) {
1864
2020
  const calleeName = node.callee.name;
1865
2021
  if (['FROM', 'INNER_JOIN', 'LEFT_JOIN', 'RIGHT_JOIN', 'OUTER_JOIN'].includes(calleeName)) {
1866
2022
  if (node.arguments[1].type !== 'ArrowFunctionExpression')
1867
- (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]);
1868
2024
  const arrowFunctionExpression = node.arguments[1];
1869
2025
  if (arrowFunctionExpression.body.type !== 'CallExpression')
1870
- (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);
1871
2027
  const body = arrowFunctionExpression.body;
1872
2028
  const callExpressions = flatChainCallExpression(body);
1873
2029
  const joinNode = callExpressions?.filter((item) => item?.callee?.name.includes('_JOIN'));
@@ -1883,7 +2039,7 @@ FROM(T1Entity, T1 => ${name}(T2Entity, T2 => ON(T1.id == T2.id).SELECT(...))); /
1883
2039
  const count = joinCode.match(/_JOIN/g)?.length || 0;
1884
2040
  const errorOrder = count >= 1 && !callExpressions?.[callExpressions?.length - 1]?.callee?.name?.includes('_JOIN');
1885
2041
  if (errorOrder) {
1886
- (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 的调用顺序。');
1887
2043
  }
1888
2044
  const result = [{
1889
2045
  calleeName: calleeName,
@@ -1933,7 +2089,7 @@ function transformMemberExpression2Entity(node, node2) {
1933
2089
  const entityNamespace = entityPath.slice(0, -1).map(n => n.name).join('.');
1934
2090
  const entityName = entityPath[entityPath.length - 1].name.replace(/Entity$/, '');
1935
2091
  if (!entityNamespace?.includes('.entities')) {
1936
- (0, utils_1.throwError)(`${entityNamespace}.${entityName} 不是一个数据库表,无法使用数据查询。`);
2092
+ (0, utils_1.throwError)(`${entityNamespace}.${entityName} 不是一个数据库表,无法使用数据查询`);
1937
2093
  }
1938
2094
  const asName = node2.name === entityName ? undefined : node2.name;
1939
2095
  if (asName) {
@@ -1942,19 +2098,23 @@ function transformMemberExpression2Entity(node, node2) {
1942
2098
  return { entityNamespace, entityName, asName };
1943
2099
  }
1944
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);
1945
2105
  const transformNodeFunction = options?.transformNodeFunction || transform2LogicItem;
1946
2106
  const code = (0, utils_1.generate)(node)?.code || '';
1947
2107
  if (code?.includes('nasl.util')) {
1948
- (0, utils_1.throwError)('数据查询中不支持nasl.util内的库函数,请将对应操作放在数据查询外部进行处理');
2108
+ (0, utils_1.throwError)('数据查询中不支持nasl.util内的库函数,请将对应操作放在数据查询外部进行处理', code);
1949
2109
  }
1950
2110
  if (!code?.includes('.SELECT(') && !code?.includes('.AGGR_SELECT(')) {
1951
- (0, utils_1.throwError)('缺少 SELECT 或 AGGR_SELECT 语句');
2111
+ (0, utils_1.throwError)('缺少 SELECT 或 AGGR_SELECT 语句', code);
1952
2112
  }
1953
2113
  const flatted = flatCallQueryComponentChainNode(node, options);
1954
2114
  const calleeNames = flatted.map((item) => item?.calleeName).filter((name) => name !== '$');
1955
2115
  const isOrderCorrect = (0, utils_1.checkOQLCalleeNameOrder)(calleeNames);
1956
2116
  if (!isOrderCorrect) {
1957
- (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 的调用顺序。');
1958
2118
  }
1959
2119
  let from;
1960
2120
  let where;
@@ -2015,16 +2175,35 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2015
2175
  propertyName: '',
2016
2176
  })],
2017
2177
  });
2018
- item.arguments[0].properties?.forEach((arg) => {
2019
- if (arg?.value.type === 'CallExpression') {
2020
- let selectElements = transform2QueryAggregateExpression(arg, { ...options, entityAsNames, inCallQueryComponentField: item.calleeName });
2021
- const newSelectElements = [...select.selectElements, selectElements];
2022
- select.setSelectElements(newSelectElements);
2023
- }
2024
- else {
2025
- (0, utils_1.throwError)(`Unsupported expression type: ${arg?.value.type} for QueryAggregateExpression`);
2026
- }
2027
- });
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
+ }
2028
2207
  break;
2029
2208
  case 'SELECT':
2030
2209
  select = new utils_1.naslTypes.QuerySelectExpression({
@@ -2096,7 +2275,7 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2096
2275
  }
2097
2276
  }
2098
2277
  else {
2099
- (0, utils_1.throwError)('HAVING 不符合规范,请使用箭头函数');
2278
+ (0, utils_1.throwError)('HAVING 不符合规范,请使用箭头函数', havingNode);
2100
2279
  }
2101
2280
  having = transformNodeFunction(havingNode, { ...options, ...restParams });
2102
2281
  break;
@@ -2111,7 +2290,7 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2111
2290
  }
2112
2291
  }
2113
2292
  else {
2114
- (0, utils_1.throwError)('ORDER_BY 不符合规范,请使用箭头函数');
2293
+ (0, utils_1.throwError)('ORDER_BY 不符合规范,请使用箭头函数', orderNode);
2115
2294
  }
2116
2295
  orderBy = orderNode.map((arg) => {
2117
2296
  let orderElementCode = (0, utils_1.generate)(arg)?.code || '';
@@ -2155,6 +2334,8 @@ function transformCall2DataQuery(node, calleeName, callee, options) {
2155
2334
  return callQueryComponent;
2156
2335
  }
2157
2336
  function transformCall2LaunchProcess(node, calleeName, callee, options) {
2337
+ if (options?.isRestricted)
2338
+ (0, utils_1.throwError)('调用流程逻辑不支持在组件或默认值表达式中使用', node);
2158
2339
  const args = node.arguments;
2159
2340
  const dataArg = args?.[0];
2160
2341
  const procDefKeyArg = args?.[1];
@@ -2193,6 +2374,7 @@ function transform2LogicItem(node, options) {
2193
2374
  transformManager.register('NumericLiteral', transform2NumericLiteral);
2194
2375
  transformManager.register('NullLiteral', transform2NullLiteral);
2195
2376
  transformManager.register('TemplateLiteral', transform2StringInterpolation);
2377
+ transformManager.register((node) => node.type === 'LogicalExpression' && node.operator === '??', transformDefaultExpression);
2196
2378
  transformManager.register('BinaryExpression', transform2BinaryExpression);
2197
2379
  transformManager.register('LogicalExpression', transform2BinaryExpression);
2198
2380
  transformManager.register('UpdateExpression', transformUpdateExpression2Assignment);
@@ -2230,7 +2412,8 @@ function transform2LogicItem(node, options) {
2230
2412
  }
2231
2413
  });
2232
2414
  transformManager.register('MemberExpression', transformMemberExpression);
2233
- 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);
2234
2417
  transformManager.registerCallExpression((node, calleeName) => /^\$refs\./.test(calleeName), transformCall2CallViewElementLogic);
2235
2418
  transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 2 && callee[0].type === 'Identifier' && callee[0].name.endsWith('Entity'), transformCall2CallEntityLogic);
2236
2419
  transformManager.registerCallExpression('nasl.oql.query', transformCall2OQLQuery);
@@ -2252,12 +2435,11 @@ function transform2LogicItem(node, options) {
2252
2435
  transformManager.registerCallExpression('extensions.lcap_process_framework.logics.launchProcess', transformCall2LaunchProcess);
2253
2436
  transformManager.registerCallExpression((node, calleeName) => /extensions\./.test(calleeName), transformCall2Extension);
2254
2437
  transformManager.registerCallExpression((node, calleeName) => /connectors\./.test(calleeName), transformCall2Connector);
2255
- transformManager.registerCallExpression((node) => node.callee.type === 'ArrowFunctionExpression', transformArrowFunction2Match);
2256
2438
  transformManager.registerCallExpression((node, calleeName) => ['plus', 'minus', 'multiply', 'divide', 'remainder', 'STARTS_WITH', 'ENDS_WITH', 'LIKE', 'IN', 'IS_NULL'].includes(calleeName), transformCallExpressionToBinaryExpression);
2257
2439
  transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 1 && calleeName.startsWith('viewLogic_'), transformCall2CallViewLogic);
2258
2440
  transformManager.registerCallExpression('PAGINATE', transformCall2Paginate);
2259
2441
  transformManager.registerCallExpression('FROM', transformCall2DataQuery);
2260
- 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);
2261
2443
  let result = transformManager.apply(node, options);
2262
2444
  delete options.typeAnnotation;
2263
2445
  return result;