@lcap/nasl 3.8.2-beta.8 → 3.8.3-beta.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.
- package/ai-engineer.config.js +617 -0
- package/out/common/BaseNode.js +5 -3
- package/out/common/BaseNode.js.map +1 -1
- package/out/common/ComponentAPI.d.ts +9 -0
- package/out/concepts/AuthLogicForCallInterface__.js +21 -6
- package/out/concepts/AuthLogicForCallInterface__.js.map +1 -1
- package/out/concepts/BackendVariable__.js +16 -1
- package/out/concepts/BackendVariable__.js.map +1 -1
- package/out/concepts/BindAttribute__.js +12 -4
- package/out/concepts/BindAttribute__.js.map +1 -1
- package/out/concepts/BindDirective__.js +1 -1
- package/out/concepts/BindDirective__.js.map +1 -1
- package/out/concepts/BindStyle__.js +1 -1
- package/out/concepts/BindStyle__.js.map +1 -1
- package/out/concepts/BusinessComponent__.js +24 -8
- package/out/concepts/BusinessComponent__.js.map +1 -1
- package/out/concepts/BusinessLogic__.js +21 -6
- package/out/concepts/BusinessLogic__.js.map +1 -1
- package/out/concepts/CallInterface__.js +2 -1
- package/out/concepts/CallInterface__.js.map +1 -1
- package/out/concepts/CallLogic__.d.ts +1 -0
- package/out/concepts/CallLogic__.js +32 -11
- package/out/concepts/CallLogic__.js.map +1 -1
- package/out/concepts/CallQueryComponent__.d.ts +1 -0
- package/out/concepts/CallQueryComponent__.js +23 -12
- package/out/concepts/CallQueryComponent__.js.map +1 -1
- package/out/concepts/Destination__.js +11 -8
- package/out/concepts/Destination__.js.map +1 -1
- package/out/concepts/EntityProperty__.js +3 -2
- package/out/concepts/EntityProperty__.js.map +1 -1
- package/out/concepts/Entity__.js +1 -1
- package/out/concepts/Entity__.js.map +1 -1
- package/out/concepts/Interface__.js +1 -1
- package/out/concepts/Interface__.js.map +1 -1
- package/out/concepts/Logic__.js +49 -17
- package/out/concepts/Logic__.js.map +1 -1
- package/out/concepts/MemberExpression__.js +19 -13
- package/out/concepts/MemberExpression__.js.map +1 -1
- package/out/concepts/OqlQueryComponent__.js +37 -12
- package/out/concepts/OqlQueryComponent__.js.map +1 -1
- package/out/concepts/OverriddenLogic__.js +21 -6
- package/out/concepts/OverriddenLogic__.js.map +1 -1
- package/out/concepts/Param__.js +5 -4
- package/out/concepts/Param__.js.map +1 -1
- package/out/concepts/QueryOrderByExpression__.d.ts +0 -1
- package/out/concepts/QueryOrderByExpression__.js +0 -1
- package/out/concepts/QueryOrderByExpression__.js.map +1 -1
- package/out/concepts/Structure__.js +5 -7
- package/out/concepts/Structure__.js.map +1 -1
- package/out/concepts/Variable__.js +5 -0
- package/out/concepts/Variable__.js.map +1 -1
- package/out/concepts/ViewElement__.d.ts +1 -0
- package/out/concepts/ViewElement__.js +17 -7
- package/out/concepts/ViewElement__.js.map +1 -1
- package/out/concepts/View__.js +70 -14
- package/out/concepts/View__.js.map +1 -1
- package/out/concepts/basics/stdlib/nasl.processV2.js +78 -0
- package/out/concepts/basics/stdlib/nasl.processV2.js.map +1 -1
- package/out/concepts/basics/stdlib/nasl.ui.js +40 -40
- package/out/concepts/basics/stdlib/nasl.ui.js.map +1 -1
- package/out/generator/genBundleFiles.js +1 -1
- package/out/generator/genBundleFiles.js.map +1 -1
- package/out/generator/release-body/utils.js +1 -1
- package/out/natural/genNaturalTS.d.ts +45 -10
- package/out/natural/genNaturalTS.js +57 -33
- package/out/natural/genNaturalTS.js.map +1 -1
- package/out/natural/getContext/getUILib.js +6 -3
- package/out/natural/getContext/getUILib.js.map +1 -1
- package/out/natural/getContext/index.d.ts +20 -7
- package/out/natural/getContext/index.js +143 -23
- package/out/natural/getContext/index.js.map +1 -1
- package/out/natural/getContext/naslStdlibMap.js +8 -8
- package/out/natural/getContext/naslStdlibMap.js.map +1 -1
- package/out/natural/tools.d.ts +16 -0
- package/out/natural/tools.js +110 -2
- package/out/natural/tools.js.map +1 -1
- package/out/natural/transformTS2UI.js +361 -304
- package/out/natural/transformTS2UI.js.map +1 -1
- package/out/natural/transformTSCode.d.ts +3 -5
- package/out/natural/transformTSCode.js +30 -1089
- package/out/natural/transformTSCode.js.map +1 -1
- package/out/natural/transforms/registerTransform.d.ts +7 -0
- package/out/natural/transforms/registerTransform.js +24 -0
- package/out/natural/transforms/registerTransform.js.map +1 -0
- package/out/natural/transforms/transform2LogicItem.d.ts +24 -0
- package/out/natural/transforms/transform2LogicItem.js +1240 -0
- package/out/natural/transforms/transform2LogicItem.js.map +1 -0
- package/out/natural/transforms/transform2TypeAnnotation.d.ts +2 -0
- package/out/natural/transforms/transform2TypeAnnotation.js +86 -0
- package/out/natural/transforms/transform2TypeAnnotation.js.map +1 -0
- package/out/natural/transforms/utils.d.ts +8 -0
- package/out/natural/transforms/utils.js +59 -0
- package/out/natural/transforms/utils.js.map +1 -0
- package/out/server/getLogics.js +12 -12
- package/out/server/getLogics.js.map +1 -1
- package/out/server/getMemberIdentifier.js +11 -17
- package/out/server/getMemberIdentifier.js.map +1 -1
- package/out/server/naslServer.d.ts +2 -2
- package/out/server/naslServer.js +38 -18
- package/out/server/naslServer.js.map +1 -1
- package/out/server/translator.js +5 -0
- package/out/server/translator.js.map +1 -1
- package/out/templator/block2nasl/jsx2nasl/index.d.ts +5 -0
- package/out/templator/block2nasl/jsx2nasl/index.js +15 -0
- package/out/templator/block2nasl/jsx2nasl/index.js.map +1 -0
- package/out/templator/block2nasl/jsx2nasl/transform-expression2nasl.d.ts +3 -0
- package/out/templator/block2nasl/jsx2nasl/transform-expression2nasl.js +213 -0
- package/out/templator/block2nasl/jsx2nasl/transform-expression2nasl.js.map +1 -0
- package/out/templator/block2nasl/jsx2nasl/transform-func2nasl.d.ts +14 -0
- package/out/templator/block2nasl/jsx2nasl/transform-func2nasl.js +201 -0
- package/out/templator/block2nasl/jsx2nasl/transform-func2nasl.js.map +1 -0
- package/out/templator/block2nasl/jsx2nasl/transform-tstype2nasl.d.ts +4 -0
- package/out/templator/block2nasl/jsx2nasl/transform-tstype2nasl.js +186 -0
- package/out/templator/block2nasl/jsx2nasl/transform-tstype2nasl.js.map +1 -0
- package/out/templator/block2nasl/jsx2nasl/transform-tsx2nasl.d.ts +28 -0
- package/out/templator/block2nasl/jsx2nasl/transform-tsx2nasl.js +336 -0
- package/out/templator/block2nasl/jsx2nasl/transform-tsx2nasl.js.map +1 -0
- package/out/templator/block2nasl/jsx2nasl/utils.d.ts +2 -0
- package/out/templator/block2nasl/jsx2nasl/utils.js +26 -0
- package/out/templator/block2nasl/jsx2nasl/utils.js.map +1 -0
- package/out/templator/block2nasl/transformBlock2Nasl.d.ts +10 -0
- package/out/templator/block2nasl/transformBlock2Nasl.js +122 -0
- package/out/templator/block2nasl/transformBlock2Nasl.js.map +1 -0
- package/out/templator/block2nasl/viewMergeBlock.d.ts +9 -0
- package/out/templator/block2nasl/viewMergeBlock.js +110 -0
- package/out/templator/block2nasl/viewMergeBlock.js.map +1 -0
- package/out/translator/types.d.ts +2 -0
- package/out/translator/utils.js +1 -1
- package/out/translator/utils.js.map +1 -1
- package/out/utils/index.js +0 -4
- package/out/utils/index.js.map +1 -1
- package/out/utils/language-cache/constant.d.ts +2 -1
- package/out/utils/language-cache/constant.js +1 -0
- package/out/utils/language-cache/constant.js.map +1 -1
- package/out/utils/language-cache/nasl.d.ts +1 -0
- package/out/utils/language-cache/nasl.js +9 -1
- package/out/utils/language-cache/nasl.js.map +1 -1
- package/package.json +6 -2
- package/sandbox/stdlib/nasl.processV2.ts +19 -0
- package/sandbox/stdlib/nasl.ui.ts +8 -8
- package/sandbox-natural/stdlib/nasl.core.d.ts +54 -0
- package/sandbox-natural/stdlib/nasl.oql.d.ts +22 -0
- package/sandbox-natural/stdlib/nasl.ui.d.ts +78 -0
- package/sandbox-natural/stdlib/nasl.ui.h5.d.ts +1684 -1643
- package/sandbox-natural/stdlib/nasl.ui.h5.json +15746 -15045
- package/sandbox-natural/stdlib/nasl.ui.pc.d.ts +5341 -5154
- package/sandbox-natural/stdlib/nasl.ui.pc.json +31176 -30681
- package/sandbox-natural/stdlib/{nasl.util.ts → nasl.util.d.ts} +49 -43
- package/src/common/BaseNode.ts +5 -3
- package/src/common/ComponentAPI.ts +7 -0
- package/src/concepts/AuthLogicForCallInterface__.ts +23 -6
- package/src/concepts/BackendVariable__.ts +16 -1
- package/src/concepts/BindAttribute__.ts +18 -13
- package/src/concepts/BindDirective__.ts +1 -1
- package/src/concepts/BindStyle__.ts +1 -1
- package/src/concepts/BusinessComponent__.ts +26 -8
- package/src/concepts/BusinessLogic__.ts +23 -6
- package/src/concepts/CallInterface__.ts +2 -2
- package/src/concepts/CallLogic__.ts +50 -24
- package/src/concepts/CallQueryComponent__.ts +26 -12
- package/src/concepts/Destination__.ts +14 -12
- package/src/concepts/EntityProperty__.ts +5 -5
- package/src/concepts/Entity__.ts +1 -1
- package/src/concepts/Interface__.ts +1 -1
- package/src/concepts/Logic__.ts +62 -33
- package/src/concepts/MemberExpression__.ts +20 -13
- package/src/concepts/OqlQueryComponent__.ts +29 -5
- package/src/concepts/OverriddenLogic__.ts +23 -6
- package/src/concepts/Param__.ts +5 -4
- package/src/concepts/QueryOrderByExpression__.ts +0 -1
- package/src/concepts/Structure__.ts +5 -7
- package/src/concepts/Variable__.ts +9 -5
- package/src/concepts/ViewElement__.ts +25 -9
- package/src/concepts/View__.ts +97 -37
- package/src/concepts/basics/stdlib/nasl.processV2.ts +79 -0
- package/src/concepts/basics/stdlib/nasl.ui.ts +40 -40
- package/src/generator/genBundleFiles.ts +1 -1
- package/src/generator/release-body/utils.ts +1 -1
- package/src/natural/genNaturalTS.ts +88 -39
- package/src/natural/getContext/getUILib.ts +6 -3
- package/src/natural/getContext/index.ts +125 -23
- package/src/natural/getContext/naslStdlibMap.ts +8 -8
- package/src/natural/tools.ts +107 -2
- package/src/natural/transformTS2UI.ts +205 -147
- package/src/natural/transformTSCode.ts +29 -1055
- package/src/natural/transforms/registerTransform.ts +34 -0
- package/src/natural/transforms/transform2LogicItem.ts +1335 -0
- package/src/natural/transforms/transform2TypeAnnotation.ts +77 -0
- package/src/natural/transforms/utils.ts +25 -0
- package/src/server/getLogics.ts +12 -12
- package/src/server/getMemberIdentifier.ts +14 -14
- package/src/server/naslServer.ts +39 -19
- package/src/server/translator.ts +5 -0
- package/src/templator/block2nasl/jsx2nasl/index.ts +11 -0
- package/src/templator/block2nasl/jsx2nasl/transform-expression2nasl.ts +238 -0
- package/src/templator/block2nasl/jsx2nasl/transform-func2nasl.ts +241 -0
- package/src/templator/block2nasl/jsx2nasl/transform-tstype2nasl.ts +213 -0
- package/src/templator/block2nasl/jsx2nasl/transform-tsx2nasl.ts +422 -0
- package/src/templator/block2nasl/jsx2nasl/utils.ts +19 -0
- package/src/templator/block2nasl/transformBlock2Nasl.ts +99 -0
- package/src/templator/block2nasl/viewMergeBlock.ts +149 -0
- package/src/translator/types.ts +2 -0
- package/src/translator/utils.ts +1 -1
- package/src/utils/index.ts +0 -4
- package/src/utils/language-cache/constant.ts +1 -0
- package/src/utils/language-cache/nasl.ts +6 -0
- package/test/concepts/member-expression/__snapshots__/toJS.spec.ts.snap +1 -1
- package/test/concepts/member-expression/__snapshots__/toVue.spec.ts.snap +1 -1
- package/test/tdd/dataQuery/QueryFieldExpression/case1/ast.json +7 -0
- package/test/tdd/dataQuery/QueryFieldExpression/case1/natural.ts.txt +1 -0
- package/test/tdd/dataQuery/QueryFieldExpression/case2/ast.json +7 -0
- package/test/tdd/dataQuery/QueryFieldExpression/case2/natural.ts.txt +1 -0
- package/test/tdd/transform/case1/ast.json +243 -0
- package/test/tdd/transform/case1/natural.ts.md +20 -0
- package/test/tdd/transform/case2/ast.json +207 -0
- package/test/tdd/transform/case2/natural.ts.md +12 -0
- package/test/tdd.test.js +10 -0
- package/test/tdd.transform.test.js +38 -0
- package/test/utils.js +40 -0
- package/sandbox-natural/stdlib/nasl.core.ts +0 -36
- package/sandbox-natural/stdlib/nasl.oql.ts +0 -14
- package/sandbox-natural/stdlib/nasl.ui.pre.d.ts +0 -90
- package/sandbox-natural/stdlib/nasl.ui.ts +0 -63
|
@@ -0,0 +1,1335 @@
|
|
|
1
|
+
import { babelTypes, naslTypes, generate, DEBUG, throwError, tryParseTS } from './utils';
|
|
2
|
+
import { transform2TypeAnnotation } from './transform2TypeAnnotation';
|
|
3
|
+
import { firstUpperCase } from '../../utils';
|
|
4
|
+
|
|
5
|
+
export interface TransformOptions {
|
|
6
|
+
logic: naslTypes.Logic,
|
|
7
|
+
isPageLogic: boolean,
|
|
8
|
+
entityAsNames?: Array<string>,
|
|
9
|
+
typeAnnotation?: naslTypes.TypeAnnotation,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type TransformPair<B extends babelTypes.Node, N extends naslTypes.LogicItem> = [
|
|
13
|
+
B['type'] | ((node: B) => boolean),
|
|
14
|
+
(node: B, options: TransformOptions) => N
|
|
15
|
+
];
|
|
16
|
+
export type TransformCallExpressionPair = [
|
|
17
|
+
string | ((node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[]) => boolean),
|
|
18
|
+
(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions) => naslTypes.LogicItem
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
export class TransformManager {
|
|
22
|
+
private transforms: Array<TransformPair<babelTypes.Node, naslTypes.LogicItem>> = [];
|
|
23
|
+
private transformCallExpressions: Array<TransformCallExpressionPair> = [];
|
|
24
|
+
|
|
25
|
+
register<B extends babelTypes.Node, N extends naslTypes.LogicItem>(type: TransformPair<B, N>[0], transform: TransformPair<B, N>[1]) {
|
|
26
|
+
this.transforms.push([type, transform]);
|
|
27
|
+
}
|
|
28
|
+
registerCallExpression(type: TransformCallExpressionPair[0], transform: TransformCallExpressionPair[1]) {
|
|
29
|
+
this.transformCallExpressions.push([type, transform]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
apply(node: babelTypes.Node, options: TransformOptions) {
|
|
33
|
+
if (node.type === 'CallExpression' && node.callee.type !== 'CallExpression') {
|
|
34
|
+
const callee = flatMemberExpression(node.callee);
|
|
35
|
+
const calleeName = generate(node.callee as any).code;
|
|
36
|
+
for (const [type, transform] of this.transformCallExpressions) {
|
|
37
|
+
if (typeof type === 'function' ? type(node, calleeName, callee) : type === calleeName) {
|
|
38
|
+
return transform(node, calleeName, callee, options);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
throwError(`Unhandled node ${callee.map((item: babelTypes.Identifier) => item.name).join('.')} ${node.type}`);
|
|
42
|
+
} else {
|
|
43
|
+
for (const [type, transform] of this.transforms) {
|
|
44
|
+
if (typeof type === 'function' ? type(node) : type === node.type) {
|
|
45
|
+
return transform(node, options);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
throwError(`Unhandled node ${node.type}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function fixExpression(arg: any, options: TransformOptions) {
|
|
54
|
+
let expression = transform2LogicItem(arg, options);
|
|
55
|
+
if (expression?.concept === 'Identifier' && expression?.name === 'undefined') {
|
|
56
|
+
expression = undefined;
|
|
57
|
+
}
|
|
58
|
+
return expression;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 铺平点选表达式
|
|
63
|
+
*/
|
|
64
|
+
function flatMemberExpression(node: babelTypes.Node): Array<babelTypes.Node> {
|
|
65
|
+
if (node.type === 'MemberExpression')
|
|
66
|
+
return [...flatMemberExpression(node.object), node.property];
|
|
67
|
+
return [node];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 铺平链式调用表达式
|
|
72
|
+
*/
|
|
73
|
+
function flatChainCallExpression(node: babelTypes.CallExpression): Array<babelTypes.CallExpression> {
|
|
74
|
+
if (node.callee.type === 'MemberExpression') {
|
|
75
|
+
if (node.callee.object.type === 'CallExpression' && node.callee.property.type === 'Identifier')
|
|
76
|
+
return [...flatChainCallExpression(node.callee.object), babelTypes.callExpression(node.callee.property, node.arguments)];
|
|
77
|
+
else if (node.callee.object.type === 'Identifier' && node.callee.property.type === 'Identifier')
|
|
78
|
+
return [babelTypes.callExpression(node.callee.property, node.arguments)];
|
|
79
|
+
}
|
|
80
|
+
return [node];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function flatMembers(node: naslTypes.MemberExpression): Array<naslTypes.MemberExpression> {
|
|
84
|
+
if (node.concept === 'MemberExpression')
|
|
85
|
+
return [...flatMembers(((node as any)?.object)), node];
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function flatMatchPatternsExpression(node: any): Array<babelTypes.Node> {
|
|
90
|
+
if (node.concept === 'BinaryExpression') {
|
|
91
|
+
if (node.operator === '||') {
|
|
92
|
+
return [...flatMatchPatternsExpression(node.left), ...flatMatchPatternsExpression(node.right)];
|
|
93
|
+
}
|
|
94
|
+
if (node.operator === '==') {
|
|
95
|
+
return [node.right];
|
|
96
|
+
}
|
|
97
|
+
return [node];
|
|
98
|
+
}
|
|
99
|
+
return [node];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function flatIfStatement(node: any): Array<babelTypes.Node> {
|
|
103
|
+
if (node.alternate.type === 'IfStatement') {
|
|
104
|
+
return [...flatIfStatement(node.alternate), node];
|
|
105
|
+
}
|
|
106
|
+
return [node];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* 这个函数是修复 AI 翻译出错的情况,与正常的 transform 做个区分
|
|
112
|
+
* @param node
|
|
113
|
+
* @returns
|
|
114
|
+
*/
|
|
115
|
+
function fixLogicNode(node: babelTypes.Node): void {
|
|
116
|
+
if (node?.type === 'CallExpression') {
|
|
117
|
+
const calleeName = generate(node.callee as any).code;
|
|
118
|
+
if (calleeName === 'nasl.util.ForEach') {
|
|
119
|
+
const callee = flatMemberExpression(node.callee);
|
|
120
|
+
node.callee = callee[2] as babelTypes.Identifier;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function transform2Param(node: babelTypes.Identifier): naslTypes.Param {
|
|
126
|
+
const typeAnnotation = (node.typeAnnotation as babelTypes.TSTypeAnnotation)?.typeAnnotation;
|
|
127
|
+
return new naslTypes.Param({
|
|
128
|
+
name: node.name,
|
|
129
|
+
typeAnnotation: typeAnnotation ? transform2TypeAnnotation(typeAnnotation) : null,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function transformCallExpressionToBinaryExpression(node: babelTypes.CallExpression, calleeName: String, callee: babelTypes.Node[], options: TransformOptions) {
|
|
134
|
+
const argument = node?.arguments;
|
|
135
|
+
const map = {
|
|
136
|
+
plus: '+',
|
|
137
|
+
minus: '-',
|
|
138
|
+
multiply: '*',
|
|
139
|
+
divide: '/',
|
|
140
|
+
remainder: '%',
|
|
141
|
+
STARTWITH: 'startwith',
|
|
142
|
+
ENDWITH: 'endwith',
|
|
143
|
+
LIKE: 'like',
|
|
144
|
+
IN: 'in',
|
|
145
|
+
};
|
|
146
|
+
return new naslTypes.BinaryExpression({
|
|
147
|
+
operator: map[calleeName as keyof typeof map] as naslTypes.BinaryExpression['operator'],
|
|
148
|
+
left: transform2LogicItem(argument?.[0], options),
|
|
149
|
+
right: transform2LogicItem(argument?.[1], options),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function transform2BinaryExpression(node: babelTypes.BinaryExpression | babelTypes.LogicalExpression, options: TransformOptions): naslTypes.BinaryExpression {
|
|
154
|
+
if (node.operator === '===')
|
|
155
|
+
node.operator = '==';
|
|
156
|
+
if (node.operator === '!==')
|
|
157
|
+
node.operator = '!=';
|
|
158
|
+
if (['+', '-', '*', '/', '%', '==', '!=', '>', '<', '>=', '<=', '&&', '||', 'startwith', 'endwith', 'like', 'in'].includes(node.operator)) {
|
|
159
|
+
return new naslTypes.BinaryExpression({
|
|
160
|
+
operator: node.operator as any,
|
|
161
|
+
left: transform2LogicItem(node.left, options),
|
|
162
|
+
right: transform2LogicItem(node.right, options),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
throwError(`Unhandled node ${node.type}`);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
function transform2NewExpression(calleeName: String, node: babelTypes.CallExpression, options: TransformOptions) {
|
|
170
|
+
if (calleeName === 'NewList') {
|
|
171
|
+
return new naslTypes.NewList({
|
|
172
|
+
typeAnnotation: naslTypes.TypeAnnotation.createGeneric('List', {
|
|
173
|
+
typeArguments: node?.typeParameters?.params.map(transform2TypeAnnotation),
|
|
174
|
+
}),
|
|
175
|
+
items: (node?.arguments?.[0] as babelTypes.ArrayExpression).elements?.map((arg: any) => transform2LogicItem(arg, options)),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
if (calleeName === 'NewMap') {
|
|
179
|
+
const keys: any = [];
|
|
180
|
+
const values: any = [];
|
|
181
|
+
(node?.arguments?.[0] as babelTypes.ObjectExpression)?.properties.forEach((arg: any) => {
|
|
182
|
+
keys.push(transform2LogicItem(arg.key, options));
|
|
183
|
+
values.push(transform2LogicItem(arg.value, options));
|
|
184
|
+
});
|
|
185
|
+
return new naslTypes.NewMap({
|
|
186
|
+
typeAnnotation: naslTypes.TypeAnnotation.createGeneric('Map', {
|
|
187
|
+
typeArguments: node?.typeParameters?.params.map(transform2TypeAnnotation),
|
|
188
|
+
}),
|
|
189
|
+
keys,
|
|
190
|
+
values,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (calleeName === 'NewEntity') {
|
|
194
|
+
const properties: any = [];
|
|
195
|
+
const rights: any = [];
|
|
196
|
+
const assignmentLines: any = [];
|
|
197
|
+
(node?.arguments?.[0] as babelTypes.ObjectExpression)?.properties.forEach((arg: any, index: number) => {
|
|
198
|
+
properties.push(transform2LogicItem(arg.key, options));
|
|
199
|
+
if (arg.value.type === 'MemberExpression') {
|
|
200
|
+
const expression = flatMemberExpression(arg.value);
|
|
201
|
+
const members = flatMembers(transform2LogicItem(arg.value, options) as any);
|
|
202
|
+
rights.push(new naslTypes.SelectMembers({
|
|
203
|
+
expression: transform2LogicItem(expression[0], options),
|
|
204
|
+
members,
|
|
205
|
+
}));
|
|
206
|
+
if (arg?.value) {
|
|
207
|
+
assignmentLines.push(new naslTypes.AssignmentLine({
|
|
208
|
+
leftIndex: [0, index],
|
|
209
|
+
rightIndex: [index, index],
|
|
210
|
+
}));
|
|
211
|
+
}
|
|
212
|
+
} else {
|
|
213
|
+
rights.push(new naslTypes.SelectMembers({
|
|
214
|
+
expression: transform2LogicItem(arg.value, options)
|
|
215
|
+
}));
|
|
216
|
+
if (arg?.value) {
|
|
217
|
+
assignmentLines.push(new naslTypes.AssignmentLine({
|
|
218
|
+
leftIndex: [0, index],
|
|
219
|
+
rightIndex: [index],
|
|
220
|
+
}));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
const parameters = node?.typeParameters?.params?.[0] as babelTypes.TSTypeReference;
|
|
225
|
+
if (parameters && parameters?.type === 'TSTypeReference' && parameters?.typeName?.type === 'TSQualifiedName') {
|
|
226
|
+
const { left, right } = parameters?.typeName || {};
|
|
227
|
+
const typeNamespace = generate(left as any)?.code;
|
|
228
|
+
const typeName = right?.name;
|
|
229
|
+
return new naslTypes.NewComposite({
|
|
230
|
+
typeAnnotation: naslTypes.TypeAnnotation.createReference(typeName, {
|
|
231
|
+
typeNamespace,
|
|
232
|
+
typeName
|
|
233
|
+
}),
|
|
234
|
+
properties,
|
|
235
|
+
rights,
|
|
236
|
+
assignmentLines
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
const typeName = (parameters?.typeName as babelTypes.Identifier)?.name;
|
|
240
|
+
return new naslTypes.NewComposite({
|
|
241
|
+
typeAnnotation: naslTypes.TypeAnnotation.createReference(typeName, {
|
|
242
|
+
typeNamespace: 'app.dataSources.defaultDS.entities',
|
|
243
|
+
typeName
|
|
244
|
+
}),
|
|
245
|
+
properties,
|
|
246
|
+
rights,
|
|
247
|
+
assignmentLines
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (calleeName === 'NewStructure') {
|
|
251
|
+
const properties: any = [];
|
|
252
|
+
const rights: any = [];
|
|
253
|
+
const assignmentLines: any = [];
|
|
254
|
+
(node?.arguments?.[0] as babelTypes.ObjectExpression)?.properties.forEach((arg: any, index: number) => {
|
|
255
|
+
properties.push(transform2LogicItem(arg.key, options));
|
|
256
|
+
if (arg.value.type === 'MemberExpression') {
|
|
257
|
+
const expression = flatMemberExpression(arg.value);
|
|
258
|
+
const members = flatMembers(transform2LogicItem(arg.value, options) as any);
|
|
259
|
+
rights.push(new naslTypes.SelectMembers({
|
|
260
|
+
expression: transform2LogicItem(expression[0], options),
|
|
261
|
+
members,
|
|
262
|
+
}));
|
|
263
|
+
if (arg?.value) {
|
|
264
|
+
assignmentLines.push(new naslTypes.AssignmentLine({
|
|
265
|
+
leftIndex: [0, index],
|
|
266
|
+
rightIndex: [index, index],
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
rights.push(new naslTypes.SelectMembers({
|
|
271
|
+
expression: transform2LogicItem(arg.value, options)
|
|
272
|
+
}));
|
|
273
|
+
if (arg?.value) {
|
|
274
|
+
assignmentLines.push(new naslTypes.AssignmentLine({
|
|
275
|
+
leftIndex: [0, index],
|
|
276
|
+
rightIndex: [index],
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
const parameters = node?.typeParameters?.params?.[0] as babelTypes.TSTypeReference;
|
|
282
|
+
if (parameters && parameters?.type === 'TSTypeReference' && parameters?.typeName?.type === 'TSQualifiedName') {
|
|
283
|
+
const { left, right } = parameters?.typeName || {};
|
|
284
|
+
const typeNamespace = generate(left as any)?.code;
|
|
285
|
+
const typeName = right?.name;
|
|
286
|
+
return new naslTypes.NewComposite({
|
|
287
|
+
typeAnnotation: naslTypes.TypeAnnotation.createReference(typeName, {
|
|
288
|
+
typeNamespace,
|
|
289
|
+
typeName
|
|
290
|
+
}),
|
|
291
|
+
properties,
|
|
292
|
+
rights,
|
|
293
|
+
assignmentLines
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
const typeName = (parameters?.typeName as babelTypes.Identifier)?.name;
|
|
297
|
+
return new naslTypes.NewComposite({
|
|
298
|
+
typeAnnotation: naslTypes.TypeAnnotation.createReference(typeName, {
|
|
299
|
+
typeNamespace: 'app.structures',
|
|
300
|
+
typeName
|
|
301
|
+
}),
|
|
302
|
+
properties,
|
|
303
|
+
rights,
|
|
304
|
+
assignmentLines
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
if (calleeName === 'NewAnonymousStructure') {
|
|
308
|
+
const properties: any = [];
|
|
309
|
+
const rights: any = [];
|
|
310
|
+
const structureProperties: any = [];
|
|
311
|
+
const assignmentLines: any = [];
|
|
312
|
+
(node?.arguments?.[0] as babelTypes.ObjectExpression)?.properties?.forEach((arg: any, index: number) => {
|
|
313
|
+
properties.push(transform2LogicItem(arg.key, options));
|
|
314
|
+
if (arg.value.type === 'MemberExpression') {
|
|
315
|
+
const expression = flatMemberExpression(arg.value);
|
|
316
|
+
const members = flatMembers(transform2LogicItem(arg.value, options) as any);
|
|
317
|
+
rights.push(new naslTypes.SelectMembers({
|
|
318
|
+
expression: transform2LogicItem(expression[0], options),
|
|
319
|
+
members,
|
|
320
|
+
}));
|
|
321
|
+
if (arg?.value) {
|
|
322
|
+
assignmentLines.push(new naslTypes.AssignmentLine({
|
|
323
|
+
leftIndex: [0, index],
|
|
324
|
+
rightIndex: [index, index],
|
|
325
|
+
}));
|
|
326
|
+
}
|
|
327
|
+
} else {
|
|
328
|
+
rights.push(new naslTypes.SelectMembers({
|
|
329
|
+
expression: transform2LogicItem(arg.value, options)
|
|
330
|
+
}));
|
|
331
|
+
if (arg?.value) {
|
|
332
|
+
assignmentLines.push(new naslTypes.AssignmentLine({
|
|
333
|
+
leftIndex: [0, index],
|
|
334
|
+
rightIndex: [index],
|
|
335
|
+
}));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
structureProperties.push(new naslTypes.StructureProperty({
|
|
339
|
+
name: arg?.key?.name,
|
|
340
|
+
typeAnnotation: null
|
|
341
|
+
}));
|
|
342
|
+
});
|
|
343
|
+
return new naslTypes.NewComposite({
|
|
344
|
+
typeAnnotation: naslTypes.TypeAnnotation.createTypeAnonymousStructure(structureProperties),
|
|
345
|
+
properties,
|
|
346
|
+
rights,
|
|
347
|
+
assignmentLines
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
throwError(`Unhandled ArrowFunctionExpression node ${node.type}`);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function pushElseIf(ifNode: babelTypes.IfStatement, switchStatement: naslTypes.SwitchStatement, options: TransformOptions) {
|
|
354
|
+
switchStatement.cases.push(new naslTypes.SwitchCase({
|
|
355
|
+
test: transform2LogicItem(ifNode.test, options),
|
|
356
|
+
consequent: !ifNode.consequent ? [] : (ifNode.consequent as babelTypes.BlockStatement).body.map((item) => transform2LogicItem(item, options)).filter((item) => !!item),
|
|
357
|
+
}));
|
|
358
|
+
if (ifNode.alternate && ifNode.alternate.type === 'IfStatement') {
|
|
359
|
+
pushElseIf(ifNode.alternate, switchStatement, options);
|
|
360
|
+
} else {
|
|
361
|
+
switchStatement.cases.push(new naslTypes.SwitchCase({
|
|
362
|
+
test: undefined,
|
|
363
|
+
consequent: !ifNode?.alternate ? [] : (ifNode?.alternate as babelTypes.BlockStatement)?.body.map((item) => transform2LogicItem(item, options)).filter((item) => !!item),
|
|
364
|
+
}));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function transform2VariableAndAddAssignment(node: babelTypes.VariableDeclaration, options: TransformOptions): naslTypes.Assignment {
|
|
369
|
+
const declList = node?.declarations || [];
|
|
370
|
+
let newNode: naslTypes.Assignment;
|
|
371
|
+
declList?.forEach((decl) => {
|
|
372
|
+
const variableName = (decl.id as babelTypes.Identifier).name;
|
|
373
|
+
if (![...options.logic.variables, ...options.logic.returns].some((variable) => variable.name === variableName)) {
|
|
374
|
+
const varTypeAnnotation = ((decl.id as babelTypes.Identifier).typeAnnotation as babelTypes.TSTypeAnnotation)?.typeAnnotation;
|
|
375
|
+
options.logic.variables.push(new naslTypes.Variable({
|
|
376
|
+
name: variableName,
|
|
377
|
+
typeAnnotation: varTypeAnnotation && transform2TypeAnnotation(varTypeAnnotation),
|
|
378
|
+
}));
|
|
379
|
+
}
|
|
380
|
+
if (decl.init) {
|
|
381
|
+
if (decl.init.type !== 'ArrayExpression' && decl.init.type !== 'ObjectExpression') {
|
|
382
|
+
const calleeName = generate((decl?.init as any)?.callee).code;
|
|
383
|
+
const varTypeAnnotation = ((decl?.id as babelTypes.Identifier)?.typeAnnotation as babelTypes.TSTypeAnnotation)?.typeAnnotation;
|
|
384
|
+
if (calleeName === 'nasl.oql.query' && varTypeAnnotation) {
|
|
385
|
+
(decl.init as any).typeAnnotations = varTypeAnnotation;
|
|
386
|
+
}
|
|
387
|
+
newNode = new naslTypes.Assignment({
|
|
388
|
+
left: new naslTypes.Identifier({
|
|
389
|
+
name: variableName,
|
|
390
|
+
}),
|
|
391
|
+
right: transform2LogicItem(decl.init, options),
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
if (newNode) return newNode;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function transform2IfStatement(node: babelTypes.IfStatement, options: TransformOptions): naslTypes.SwitchStatement | naslTypes.IfStatement {
|
|
400
|
+
if (node.alternate && node.alternate.type === 'IfStatement') {
|
|
401
|
+
const switchStatement = new naslTypes.SwitchStatement({
|
|
402
|
+
cases: [],
|
|
403
|
+
});
|
|
404
|
+
pushElseIf(node, switchStatement, options);
|
|
405
|
+
return switchStatement;
|
|
406
|
+
}
|
|
407
|
+
let consequentIndex: number;
|
|
408
|
+
let alternateIndex: number;
|
|
409
|
+
const naslNode = new naslTypes.IfStatement({
|
|
410
|
+
test: transform2LogicItem(node.test, options),
|
|
411
|
+
consequent: !node.consequent ? [] : (node.consequent as babelTypes.BlockStatement).body.map((item: any, index: number) => {
|
|
412
|
+
if (item?.type === 'ReturnStatement') {
|
|
413
|
+
item.ends = true;
|
|
414
|
+
if (item?.argument) {
|
|
415
|
+
consequentIndex = index;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return transform2LogicItem(item, options);
|
|
419
|
+
}).filter((item) => !!item),
|
|
420
|
+
alternate: !node.alternate ? [] : (node.alternate as babelTypes.BlockStatement).body.map((item: any, index: number) => {
|
|
421
|
+
if (item?.type === 'ReturnStatement') {
|
|
422
|
+
item.ends = true;
|
|
423
|
+
if (item?.argument) {
|
|
424
|
+
alternateIndex = index;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return transform2LogicItem(item, options);
|
|
428
|
+
}).filter((item) => !!item),
|
|
429
|
+
}) as any;
|
|
430
|
+
if (consequentIndex !== undefined) {
|
|
431
|
+
naslNode?.consequent?.splice(consequentIndex + 1, 0, new naslTypes.End());
|
|
432
|
+
}
|
|
433
|
+
if (alternateIndex !== undefined) {
|
|
434
|
+
naslNode?.alternate?.splice(alternateIndex + 1, 0, new naslTypes.End());
|
|
435
|
+
}
|
|
436
|
+
return naslNode;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
function transform2WhileStatement(node: babelTypes.WhileStatement, options: TransformOptions): naslTypes.WhileStatement {
|
|
440
|
+
return new naslTypes.WhileStatement({
|
|
441
|
+
test: transform2LogicItem(node.test, options),
|
|
442
|
+
body: (node.body as babelTypes.BlockStatement).body.map((item) => transform2LogicItem(item, options)).filter((item) => !!item),
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function transformSwitchStatement2Match(node: babelTypes.SwitchStatement, options: TransformOptions): naslTypes.Match {
|
|
447
|
+
const match = new naslTypes.Match({
|
|
448
|
+
expression: transform2LogicItem(node.discriminant, options),
|
|
449
|
+
isExpression: false,
|
|
450
|
+
cases: node.cases.map((_case) => new naslTypes.MatchCase({
|
|
451
|
+
patterns: !_case.test ? [] : [transform2LogicItem(_case.test, options)],
|
|
452
|
+
body: _case.consequent.filter((item) => item.type !== 'BreakStatement').map((item) => transform2LogicItem(item, options)).filter((item) => !!item),
|
|
453
|
+
})),
|
|
454
|
+
});
|
|
455
|
+
if (!match.cases.length || match.cases[match.cases.length - 1].patterns.length) {
|
|
456
|
+
match.cases.push(new naslTypes.MatchCase({
|
|
457
|
+
patterns: [],
|
|
458
|
+
body: [],
|
|
459
|
+
}));
|
|
460
|
+
}
|
|
461
|
+
match.cases.forEach((case_: any) => {
|
|
462
|
+
if (case_.body.length && (case_.body[0].concept === 'BooleanLiteral' || case_.body[0].concept === 'StringLiteral')) {
|
|
463
|
+
case_.isMatchedTypeEnumable = true;
|
|
464
|
+
}
|
|
465
|
+
if (case_.patterns.length && case_.patterns[0].concept === 'MemberExpression') {
|
|
466
|
+
case_.isMatchedTypeEnumable = true;
|
|
467
|
+
case_.patterns[0].object.namespace = 'app.enums';
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
return match;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
function transformIdentifier(node: babelTypes.Identifier, options: TransformOptions): naslTypes.QueryFieldExpression | naslTypes.Identifier {
|
|
474
|
+
if (options.entityAsNames?.includes(node.name)) {
|
|
475
|
+
return new naslTypes.QueryFieldExpression({
|
|
476
|
+
isDotStar: false,
|
|
477
|
+
asName: undefined,
|
|
478
|
+
entityAsName: node.name,
|
|
479
|
+
propertyName: '',
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return new naslTypes.Identifier({
|
|
484
|
+
name: node.name,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
function transform2SelectQueryFieldExpression(node: babelTypes.ObjectProperty, options: TransformOptions): naslTypes.QueryFieldExpression {
|
|
489
|
+
// babelTypes.Identifier | babelTypes.MemberExpression
|
|
490
|
+
let expression: babelTypes.Identifier | babelTypes.MemberExpression;
|
|
491
|
+
let asNameNode: babelTypes.Identifier;
|
|
492
|
+
// if (node.type === 'ObjectProperty') {
|
|
493
|
+
expression = node.value as babelTypes.Identifier | babelTypes.MemberExpression;
|
|
494
|
+
asNameNode = node.key as babelTypes.Identifier;
|
|
495
|
+
// }
|
|
496
|
+
|
|
497
|
+
if (expression.type === 'Identifier') {
|
|
498
|
+
return new naslTypes.QueryFieldExpression({
|
|
499
|
+
isDotStar: true,
|
|
500
|
+
asName: firstUpperCase(asNameNode.name) === expression.name ? undefined : asNameNode.name,
|
|
501
|
+
entityAsName: expression.name,
|
|
502
|
+
propertyName: '',
|
|
503
|
+
});
|
|
504
|
+
} else {
|
|
505
|
+
return new naslTypes.QueryFieldExpression({
|
|
506
|
+
isDotStar: true,
|
|
507
|
+
asName: firstUpperCase(asNameNode.name) === (expression.property as babelTypes.Identifier).name ? undefined : asNameNode.name,
|
|
508
|
+
entityAsName: (expression.object as babelTypes.Identifier).name,
|
|
509
|
+
propertyName: (expression.property as babelTypes.Identifier).name,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function transform2QueryAggregateExpression(node: babelTypes.ObjectProperty, options: TransformOptions): naslTypes.QueryAggregateExpression {
|
|
515
|
+
const callExpression = node.value as babelTypes.CallExpression;
|
|
516
|
+
let asNameNode: babelTypes.Identifier = node.key as babelTypes.Identifier;
|
|
517
|
+
|
|
518
|
+
const arg = callExpression.arguments[0];
|
|
519
|
+
|
|
520
|
+
return new naslTypes.QueryAggregateExpression({
|
|
521
|
+
asName: asNameNode.name,
|
|
522
|
+
aggregateName: (callExpression.callee as babelTypes.Identifier).name as 'COUNT' | 'COUNTD' | 'SUM' | 'AVG' | 'MAX' | 'MIN',
|
|
523
|
+
aggregateParam: (arg.type === 'MemberExpression' ? transformMemberExpression(arg, options) : transformIdentifier(arg as babelTypes.Identifier, options)) as naslTypes.QueryFieldExpression,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
function transform2AnonymousFunction(node: babelTypes.ArrowFunctionExpression, options: TransformOptions): naslTypes.AnonymousFunction {
|
|
528
|
+
return new naslTypes.AnonymousFunction({
|
|
529
|
+
params: node.params.map((param: babelTypes.Identifier) => transform2Param(param)),
|
|
530
|
+
body: transform2LogicItem(node.body, options),
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
function transform2Assignment(node: babelTypes.AssignmentExpression, options: TransformOptions): naslTypes.Assignment {
|
|
535
|
+
if (node.operator === '+=' || node.operator === '-=') {
|
|
536
|
+
return new naslTypes.Assignment({
|
|
537
|
+
left: transform2LogicItem(node.left, options),
|
|
538
|
+
right: new naslTypes.BinaryExpression({
|
|
539
|
+
operator: node.operator[0] as '+' | '-',
|
|
540
|
+
left: transform2LogicItem(node.left, options),
|
|
541
|
+
right: transform2LogicItem(node.right, options),
|
|
542
|
+
}),
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
return new naslTypes.Assignment({
|
|
546
|
+
left: transform2LogicItem(node.left, options),
|
|
547
|
+
right: transform2LogicItem(node.right, options),
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
function transformUpdateExpression2Assignment(node: babelTypes.UpdateExpression, options: TransformOptions): naslTypes.Assignment {
|
|
552
|
+
if (node.operator === '++' || node.operator === '--') {
|
|
553
|
+
return new naslTypes.Assignment({
|
|
554
|
+
left: transform2LogicItem(node.argument, options),
|
|
555
|
+
right: new naslTypes.BinaryExpression({
|
|
556
|
+
operator: node.operator[0] as '+' | '-',
|
|
557
|
+
left: transform2LogicItem(node.argument, options),
|
|
558
|
+
right: new naslTypes.NumericLiteral({
|
|
559
|
+
value: '1',
|
|
560
|
+
typeAnnotation: naslTypes.TypeAnnotation.createPrimitive('Integer'),
|
|
561
|
+
}),
|
|
562
|
+
}),
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
function transform2BooleanLiteral(node: babelTypes.BooleanLiteral, options: TransformOptions): naslTypes.BooleanLiteral {
|
|
568
|
+
return new naslTypes.BooleanLiteral({
|
|
569
|
+
value: String(node.value),
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
function transform2StringLiteral(node: babelTypes.StringLiteral, options: TransformOptions): naslTypes.StringLiteral {
|
|
574
|
+
return new naslTypes.StringLiteral({
|
|
575
|
+
value: node.value,
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
function transform2NumericLiteral(node: babelTypes.NumericLiteral, options: TransformOptions): naslTypes.NumericLiteral {
|
|
580
|
+
const literal = new naslTypes.NumericLiteral({
|
|
581
|
+
value: String(node.value),
|
|
582
|
+
typeAnnotation: options.typeAnnotation || naslTypes.TypeAnnotation.createPrimitive('Integer'),
|
|
583
|
+
});
|
|
584
|
+
literal.typeAnnotation.typeName = literal.changeType(String(node.value));
|
|
585
|
+
return literal;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
function transform2NullLiteral(node: babelTypes.NullLiteral, options: TransformOptions): naslTypes.NullLiteral {
|
|
589
|
+
return new naslTypes.NullLiteral();
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
function transformReturnStatement2AssignmentOrEnd(node: babelTypes.ReturnStatement, options: TransformOptions): naslTypes.Assignment | naslTypes.End {
|
|
593
|
+
if (!node.argument) {
|
|
594
|
+
return new naslTypes.End();
|
|
595
|
+
}
|
|
596
|
+
const { logic } = options;
|
|
597
|
+
if (node.argument?.type === 'Identifier') {
|
|
598
|
+
if (!logic.returns.length) {
|
|
599
|
+
const curVariable = logic?.variables?.find((item) => item.name === (node?.argument as any)?.name);
|
|
600
|
+
if (curVariable) {
|
|
601
|
+
logic.variables = logic?.variables?.filter((item) => item.name !== (node?.argument as any)?.name);
|
|
602
|
+
logic.addReturn(curVariable as any);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
} else {
|
|
606
|
+
if (!logic.returns.length) {
|
|
607
|
+
logic.returns.push(new naslTypes.Return({
|
|
608
|
+
name: 'result',
|
|
609
|
+
}));
|
|
610
|
+
}
|
|
611
|
+
return new naslTypes.Assignment({
|
|
612
|
+
left: new naslTypes.Identifier({
|
|
613
|
+
name: logic.returns[0].name,
|
|
614
|
+
}),
|
|
615
|
+
right: transform2LogicItem(node.argument, options),
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
function transform2StringInterpolation(node: babelTypes.TemplateLiteral, options: TransformOptions): naslTypes.StringInterpolation {
|
|
621
|
+
const expressions = [...node.expressions as babelTypes.Expression[], ...node.quasis.map((element) => ({
|
|
622
|
+
type: 'StringLiteral',
|
|
623
|
+
value: element.value.raw,
|
|
624
|
+
start: element.start,
|
|
625
|
+
end: element.end,
|
|
626
|
+
})) as babelTypes.StringLiteral[]];
|
|
627
|
+
expressions.sort((a, b) => a.start - b.start);
|
|
628
|
+
|
|
629
|
+
return new naslTypes.StringInterpolation({
|
|
630
|
+
expressions: expressions.map((item) => transform2LogicItem(item, options)),
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
function transform2Comment(node: babelTypes.EmptyStatement, options: TransformOptions): naslTypes.Comment {
|
|
635
|
+
return node.leadingComments && new naslTypes.Comment({
|
|
636
|
+
value: String(node.leadingComments[0].value),
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
function transformBlockStatement(node: babelTypes.BlockStatement, options: TransformOptions): naslTypes.LogicItem {
|
|
641
|
+
return transform2LogicItem(node?.body?.[0], options);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
function transform2NewComposite(node: babelTypes.ObjectExpression, options: TransformOptions): naslTypes.NewComposite {
|
|
645
|
+
const properties: any = [];
|
|
646
|
+
const rights: any = [];
|
|
647
|
+
const structureProperties: any = [];
|
|
648
|
+
const assignmentLines: any = [];
|
|
649
|
+
node?.properties?.forEach((arg: any, index: number) => {
|
|
650
|
+
properties.push(transform2LogicItem(arg.key, options));
|
|
651
|
+
rights.push(new naslTypes.SelectMembers({
|
|
652
|
+
expression: transform2LogicItem(arg?.value, options)
|
|
653
|
+
}));
|
|
654
|
+
if (arg?.value) {
|
|
655
|
+
assignmentLines.push(new naslTypes.AssignmentLine({
|
|
656
|
+
leftIndex: [0, index],
|
|
657
|
+
rightIndex: [index],
|
|
658
|
+
}));
|
|
659
|
+
}
|
|
660
|
+
structureProperties.push(new naslTypes.StructureProperty({
|
|
661
|
+
name: arg?.key?.name,
|
|
662
|
+
typeAnnotation: null
|
|
663
|
+
}));
|
|
664
|
+
});
|
|
665
|
+
return new naslTypes.NewComposite({
|
|
666
|
+
typeAnnotation: naslTypes.TypeAnnotation.createTypeAnonymousStructure(structureProperties),
|
|
667
|
+
properties,
|
|
668
|
+
rights,
|
|
669
|
+
assignmentLines
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
function transformNewExpression(node: babelTypes.NewExpression, options: TransformOptions): naslTypes.LogicItem {
|
|
674
|
+
const calleeName = generate(node.callee as any).code;
|
|
675
|
+
if (['Boolean', 'Integer', 'Double', 'Decimal', 'Long'].includes(calleeName)) {
|
|
676
|
+
return transform2LogicItem(node.arguments[0], {
|
|
677
|
+
...options,
|
|
678
|
+
typeAnnotation: naslTypes.TypeAnnotation.createPrimitive(calleeName),
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
throwError(`Unhandled node ${node.type}`);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function transformMemberExpression(node: babelTypes.MemberExpression, options: TransformOptions): naslTypes.CallFunction | naslTypes.QueryFieldExpression | naslTypes.MemberExpression | naslTypes.Identifier {
|
|
685
|
+
if (options.entityAsNames?.includes((node.object as babelTypes.Identifier).name)) {
|
|
686
|
+
return new naslTypes.QueryFieldExpression({
|
|
687
|
+
isDotStar: false,
|
|
688
|
+
asName: undefined,
|
|
689
|
+
entityAsName: (node.object as babelTypes.Identifier).name,
|
|
690
|
+
propertyName: (node.property as babelTypes.Identifier).name,
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
const callee = flatMemberExpression(node);
|
|
695
|
+
const calleeName = generate(node)?.code;
|
|
696
|
+
if (calleeName?.includes('app.enums')) {
|
|
697
|
+
const name = (callee?.[3] as babelTypes.StringLiteral)?.value || (callee?.[3] as babelTypes.Identifier)?.name || (callee?.[3] as babelTypes.NumericLiteral)?.value;
|
|
698
|
+
return new naslTypes.MemberExpression({
|
|
699
|
+
object: new naslTypes.Identifier({
|
|
700
|
+
namespace: 'app.enums',
|
|
701
|
+
name: (callee?.[2] as babelTypes.Identifier)?.name,
|
|
702
|
+
}),
|
|
703
|
+
property: new naslTypes.Identifier({
|
|
704
|
+
name: String(name),
|
|
705
|
+
}),
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
if (calleeName?.includes('nasl.auth.')) {
|
|
709
|
+
return new naslTypes.MemberExpression({
|
|
710
|
+
object: new naslTypes.Identifier({
|
|
711
|
+
namespace: 'nasl.auth',
|
|
712
|
+
name: (callee?.[2] as babelTypes.Identifier)?.name,
|
|
713
|
+
}),
|
|
714
|
+
property: new naslTypes.Identifier({
|
|
715
|
+
name: (callee?.[3] as babelTypes.Identifier)?.name,
|
|
716
|
+
}),
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
const regex = /^(app\..+?)\.variables\.(.+)$/;
|
|
720
|
+
if (regex.test(calleeName)) {
|
|
721
|
+
const [, namespace, variableName] = calleeName.match(regex);
|
|
722
|
+
return new naslTypes.Identifier({
|
|
723
|
+
name: String(variableName),
|
|
724
|
+
namespace: `${namespace}.variables`
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
if (node.property.type === 'NumericLiteral') {
|
|
728
|
+
return new naslTypes.CallFunction({
|
|
729
|
+
calleeNamespace: 'nasl.util',
|
|
730
|
+
calleeName: 'Get',
|
|
731
|
+
arguments: [
|
|
732
|
+
new naslTypes.Argument({
|
|
733
|
+
expression: transform2LogicItem(node.object, options),
|
|
734
|
+
}),
|
|
735
|
+
new naslTypes.Argument({
|
|
736
|
+
expression: transform2LogicItem(node.property, options),
|
|
737
|
+
}),
|
|
738
|
+
],
|
|
739
|
+
});
|
|
740
|
+
}
|
|
741
|
+
return new naslTypes.MemberExpression({
|
|
742
|
+
object: transform2LogicItem(node.object, options),
|
|
743
|
+
property: transform2LogicItem(node.property, options),
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
function transformCallCall2Match(node: babelTypes.CallExpression, options: TransformOptions): naslTypes.Match {
|
|
748
|
+
// (function match() {})(...) 的情况
|
|
749
|
+
return undefined;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
function transformCall2CallViewElementLogic(node: babelTypes.CallExpression, calleeNmae: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
753
|
+
return new naslTypes.CallLogic({
|
|
754
|
+
calleeNamespace: `elements.${(callee[1] as babelTypes.Identifier).name}.logics`,
|
|
755
|
+
calleeName: (callee[2] as babelTypes.Identifier).name,
|
|
756
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
757
|
+
expression: fixExpression(arg, options),
|
|
758
|
+
})) as naslTypes.Argument[],
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
function transformCall2CallEntityLogic(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
763
|
+
const entityName = (callee[0] as babelTypes.Identifier).name.replace(/Entity/, '');
|
|
764
|
+
return new naslTypes.CallLogic({
|
|
765
|
+
calleeNamespace: `app.dataSources.defaultDS.entities.${entityName}.logics`,
|
|
766
|
+
calleeName: (callee[1] as babelTypes.Identifier).name,
|
|
767
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
768
|
+
expression: fixExpression(arg, options),
|
|
769
|
+
})) as naslTypes.Argument[],
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
function transformCall2CallDataSourceLogic(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
774
|
+
if (calleeName?.includes('.entities.')) {
|
|
775
|
+
const calleeNamespace = generate((node?.callee as any)?.object?.object)?.code;
|
|
776
|
+
const entityName = (node?.callee as any)?.object?.property?.name?.replace(/Entity/, '');
|
|
777
|
+
return new naslTypes.CallLogic({
|
|
778
|
+
calleeNamespace: `${calleeNamespace}.${entityName}.logics`,
|
|
779
|
+
calleeName: (node?.callee as any)?.property?.name,
|
|
780
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
781
|
+
expression: fixExpression(arg, options),
|
|
782
|
+
})) as naslTypes.Argument[],
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
return new naslTypes.CallLogic({
|
|
787
|
+
calleeNamespace: generate((node.callee as any).object).code,
|
|
788
|
+
calleeName: (callee[callee.length - 1] as babelTypes.Identifier).name,
|
|
789
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
790
|
+
expression: fixExpression(arg, options),
|
|
791
|
+
})) as naslTypes.Argument[],
|
|
792
|
+
});
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
function transformCall2OQLQuery(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.OqlQueryComponent {
|
|
796
|
+
if (!options.isPageLogic) {
|
|
797
|
+
// const _typeAnnotation = node?.typeParameters?.params?.length > 0 ? naslTypes.TypeAnnotation.createGeneric('List', {
|
|
798
|
+
// typeArguments: node?.typeParameters?.params.map((curType: any) => transform2TypeAnnotation({ ...curType })),
|
|
799
|
+
// }) : null;
|
|
800
|
+
let code = generate(node.arguments[0] as any).code.trim().slice(1, -1);
|
|
801
|
+
code = code?.replace(/app\.enums\.(\w+)\[(\d+)\]/g, "app.enums.$1.$2").replace(/app\.enums\.(\w+)\['(\w+)'\]/g, "app.enums.$1.$2");
|
|
802
|
+
return new naslTypes.OqlQueryComponent({
|
|
803
|
+
dataSource: 'app.dataSources.defaultDS',
|
|
804
|
+
code,
|
|
805
|
+
typeAnnotation: transform2TypeAnnotation((node as any)?.typeAnnotations)
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
function transformCall2ConsoleLog(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
811
|
+
if (options.isPageLogic) {
|
|
812
|
+
return new naslTypes.CallLogic({
|
|
813
|
+
calleeNamespace: 'nasl.util',
|
|
814
|
+
calleeName: 'consoleLog',
|
|
815
|
+
shortcut: true,
|
|
816
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
817
|
+
expression: fixExpression(arg, options),
|
|
818
|
+
})) as naslTypes.Argument[],
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
return new naslTypes.CallLogic({
|
|
822
|
+
calleeNamespace: 'nasl.logging',
|
|
823
|
+
calleeName: 'INFO',
|
|
824
|
+
shortcut: true,
|
|
825
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
826
|
+
expression: fixExpression(arg, options),
|
|
827
|
+
})) as naslTypes.Argument[],
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
function transformCall2Logging(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
832
|
+
return new naslTypes.CallLogic({
|
|
833
|
+
calleeNamespace: 'nasl.logging',
|
|
834
|
+
calleeName: (callee[2] as babelTypes.Identifier).name,
|
|
835
|
+
shortcut: true,
|
|
836
|
+
arguments: node.arguments.map((arg) => new naslTypes.Argument({
|
|
837
|
+
expression: fixExpression(arg, options),
|
|
838
|
+
})) as naslTypes.Argument[],
|
|
839
|
+
});
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
function transformCall2JSONFunctions(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
843
|
+
const curCalleeName = (node.callee as any).property.name;
|
|
844
|
+
return new naslTypes.CallLogic({
|
|
845
|
+
calleeNamespace: 'nasl.util',
|
|
846
|
+
calleeName: curCalleeName,
|
|
847
|
+
shortcut: true,
|
|
848
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
849
|
+
expression: fixExpression(arg, options),
|
|
850
|
+
})) as naslTypes.Argument[],
|
|
851
|
+
typeArguments: node?.typeParameters?.params.map((curType: any) => transform2TypeAnnotation({ ...curType })),
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
function transformCall2CallFunction(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.BinaryExpression | naslTypes.NewList | naslTypes.NewMap | naslTypes.NewComposite | naslTypes.CallFunction {
|
|
856
|
+
let curCalleeName: string;
|
|
857
|
+
if (callee.length === 3)
|
|
858
|
+
curCalleeName = (callee[callee.length - 1] as babelTypes.Identifier).name;
|
|
859
|
+
else {
|
|
860
|
+
let _callee = (callee[0] as any).callee;
|
|
861
|
+
while (_callee.type === 'CallExpression')
|
|
862
|
+
_callee = _callee.callee;
|
|
863
|
+
curCalleeName = _callee.property.name;
|
|
864
|
+
}
|
|
865
|
+
const argument = callee.length === 3 ? node.arguments : (callee[0] as any).arguments as any;
|
|
866
|
+
|
|
867
|
+
if (['plus', 'minus', 'multiply', 'divide', 'remainder', 'STARTWITH', 'ENDWITH', 'LIKE', 'IN'].includes(curCalleeName)) {
|
|
868
|
+
return transformCallExpressionToBinaryExpression(node, curCalleeName, callee, options);
|
|
869
|
+
};
|
|
870
|
+
|
|
871
|
+
if (['NewList', 'NewMap', 'NewEntity', 'NewStructure', 'NewAnonymousStructure'].includes(curCalleeName)) {
|
|
872
|
+
return transform2NewExpression(curCalleeName, node, options);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
// let typeNamespace: string;
|
|
876
|
+
// if (argument?.[argument.length - 1]?.type === 'ObjectExpression') {
|
|
877
|
+
// typeNamespace = argument.splice(-1)[0].properties[0].value.value;
|
|
878
|
+
// }
|
|
879
|
+
const nodeElement = new naslTypes.CallFunction({
|
|
880
|
+
calleeNamespace: 'nasl.util',
|
|
881
|
+
calleeName: curCalleeName,
|
|
882
|
+
arguments: argument.map((arg: any, index: number) => new naslTypes.Argument({
|
|
883
|
+
expression: fixExpression(arg, options),
|
|
884
|
+
keyword: `str${index + 1}`,
|
|
885
|
+
})) as naslTypes.Argument[],
|
|
886
|
+
typeArguments: node?.typeParameters?.params.map(transform2TypeAnnotation),
|
|
887
|
+
// typeArguments: node?.typeParameters?.params.map((curType: any) => transform2TypeAnnotation({ ...curType, typeNamespace })),
|
|
888
|
+
});
|
|
889
|
+
return nodeElement;
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
function transform2UIFunction(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.Destination | naslTypes.CallLogic {
|
|
893
|
+
if ((callee[2] as babelTypes.Identifier).name === 'destination') {
|
|
894
|
+
const namespace = (node.arguments[0] as babelTypes.StringLiteral).value;
|
|
895
|
+
const nsArr = namespace.split('.').map((item) => item.replace(/_view$/, ''));
|
|
896
|
+
const pageType = nsArr.shift();
|
|
897
|
+
const viewName = nsArr.pop();
|
|
898
|
+
const newArguments = node?.arguments?.slice(1);
|
|
899
|
+
let argument = [] as naslTypes.Argument[];
|
|
900
|
+
if (newArguments?.[0]?.type === 'ObjectExpression') {
|
|
901
|
+
argument = newArguments?.[0]?.properties?.map((property: any) => new naslTypes.Argument({
|
|
902
|
+
keyword: property?.key?.name,
|
|
903
|
+
expression: fixExpression(property?.value, options),
|
|
904
|
+
})) as naslTypes.Argument[];
|
|
905
|
+
} else {
|
|
906
|
+
argument = node.arguments.slice(1).map((arg) => new naslTypes.Argument({
|
|
907
|
+
expression: fixExpression(arg, options),
|
|
908
|
+
})) as naslTypes.Argument[];
|
|
909
|
+
}
|
|
910
|
+
return new naslTypes.Destination({
|
|
911
|
+
viewNamespace: `app.frontendTypes.${pageType}.frontends.${pageType}.views${nsArr?.map((item) => `.${item}.views`)?.join('')}`,
|
|
912
|
+
viewName,
|
|
913
|
+
arguments: argument,
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
return new naslTypes.CallLogic({
|
|
917
|
+
calleeNamespace: 'nasl.ui',
|
|
918
|
+
calleeName: (callee[2] as babelTypes.Identifier).name,
|
|
919
|
+
shortcut: true,
|
|
920
|
+
/**
|
|
921
|
+
* 这个函数是修复 AI 翻译出错的情况,与正常的 transform 做个区分
|
|
922
|
+
* @param node
|
|
923
|
+
* @returns
|
|
924
|
+
*/
|
|
925
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
926
|
+
expression: fixExpression(arg, options),
|
|
927
|
+
})) as naslTypes.Argument[],
|
|
928
|
+
});
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
function transformMap2ListTransform(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallFunction {
|
|
932
|
+
return new naslTypes.CallFunction({
|
|
933
|
+
calleeNamespace: 'nasl.util',
|
|
934
|
+
calleeName: 'ListTransform',
|
|
935
|
+
arguments: [new naslTypes.Argument({
|
|
936
|
+
expression: fixExpression((node.callee as babelTypes.MemberExpression).object, options),
|
|
937
|
+
}), ...node?.arguments?.map((arg: any) => new naslTypes.Argument({
|
|
938
|
+
expression: fixExpression(arg, options),
|
|
939
|
+
}))],
|
|
940
|
+
});
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
function transform2ForEachStatement(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.ForEachStatement {
|
|
944
|
+
const newCallee = node.arguments;
|
|
945
|
+
const arrowFunction = node.arguments[3] as babelTypes.ArrowFunctionExpression;
|
|
946
|
+
const nodeElement = new naslTypes.ForEachStatement({
|
|
947
|
+
each: transform2LogicItem(newCallee[0], options),
|
|
948
|
+
start: transform2LogicItem(newCallee[1], options),
|
|
949
|
+
end: transform2LogicItem(newCallee[2], options),
|
|
950
|
+
item: transform2Param(arrowFunction.params[0] as babelTypes.Identifier),
|
|
951
|
+
index: arrowFunction.params[1] ? transform2Param(arrowFunction.params[1] as babelTypes.Identifier) : new naslTypes.Param({
|
|
952
|
+
name: 'index', typeAnnotation: naslTypes.TypeAnnotation.createPrimitive('Long'),
|
|
953
|
+
}),
|
|
954
|
+
body: (arrowFunction.body as babelTypes.BlockStatement).body.map((item) => transform2LogicItem(item, options)).filter((item) => !!item),
|
|
955
|
+
});
|
|
956
|
+
return nodeElement;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
function transformForEach2ForEachStatement(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.ForEachStatement {
|
|
960
|
+
const newCallee = (node.callee as any).object;
|
|
961
|
+
const arrowFunction = node.arguments[0] as babelTypes.ArrowFunctionExpression;
|
|
962
|
+
const nodeElement = new naslTypes.ForEachStatement({
|
|
963
|
+
each: transform2LogicItem(newCallee.callee.object, options),
|
|
964
|
+
start: transform2LogicItem(newCallee?.arguments?.[0], options),
|
|
965
|
+
end: transform2LogicItem(newCallee?.arguments?.[1], options),
|
|
966
|
+
item: transform2Param(arrowFunction.params[0] as babelTypes.Identifier),
|
|
967
|
+
index: arrowFunction.params[1] ? transform2Param(arrowFunction.params[1] as babelTypes.Identifier) : new naslTypes.Param({
|
|
968
|
+
name: 'index', typeAnnotation: naslTypes.TypeAnnotation.createPrimitive('Long'),
|
|
969
|
+
}),
|
|
970
|
+
body: (arrowFunction.body as babelTypes.BlockStatement).body.map((item) => transform2LogicItem(item, options)).filter((item) => !!item),
|
|
971
|
+
});
|
|
972
|
+
return nodeElement;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
function transformAlert2ShowMessage(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
976
|
+
return new naslTypes.CallLogic({
|
|
977
|
+
calleeNamespace: 'nasl.ui',
|
|
978
|
+
calleeName: 'showMessage',
|
|
979
|
+
shortcut: true,
|
|
980
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
981
|
+
expression: fixExpression(arg, options),
|
|
982
|
+
})) as naslTypes.Argument[],
|
|
983
|
+
});
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
function transformCall2Interface(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallInterface {
|
|
987
|
+
return new naslTypes.CallInterface({
|
|
988
|
+
calleeNamespace: generate((node.callee as any).object).code,
|
|
989
|
+
calleeName: (callee[callee.length - 1] as babelTypes.Identifier).name,
|
|
990
|
+
arguments: node?.arguments?.map((arg: any) => arg?.properties?.map((item: any) => new naslTypes.Argument({
|
|
991
|
+
keyword: item?.key?.name,
|
|
992
|
+
expression: fixExpression(item?.value, options),
|
|
993
|
+
})) || []).flat() as naslTypes.Argument[] || [],
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
function transformCall2Connector(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallConnector {
|
|
998
|
+
const flatCalleeKey = generate(node?.callee as any)?.code;
|
|
999
|
+
const [, calleeConnectionName, calleeNamespace, calleeFunName] = flatCalleeKey?.match(/^(\w+)\.([\w.]+)\.(\w+)$/);
|
|
1000
|
+
return new naslTypes.CallConnector({
|
|
1001
|
+
calleeConnectionName,
|
|
1002
|
+
calleeNamespace,
|
|
1003
|
+
calleeName: calleeFunName,
|
|
1004
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
1005
|
+
expression: fixExpression(arg, options),
|
|
1006
|
+
})) as naslTypes.Argument[],
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
function transformCall2Extension(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
1011
|
+
return new naslTypes.CallLogic({
|
|
1012
|
+
calleeNamespace: generate((node?.callee as any)?.object)?.code,
|
|
1013
|
+
calleeName: (callee?.[callee?.length - 1] as babelTypes.Identifier)?.name,
|
|
1014
|
+
handleError: true,
|
|
1015
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
1016
|
+
expression: fixExpression(arg, options),
|
|
1017
|
+
})) as naslTypes.Argument[],
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
function transformArrowFunction2Match(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.Match | naslTypes.SwitchStatement {
|
|
1022
|
+
// NOTE: 适用于 if else
|
|
1023
|
+
const newCallee = ((node.callee as babelTypes.ArrowFunctionExpression).body as any).body;
|
|
1024
|
+
if (newCallee[newCallee.length - 1].argument?.callee?.name === '__MatchExpressionFuntion') {
|
|
1025
|
+
const match = new naslTypes.Match({
|
|
1026
|
+
expression: fixExpression(newCallee[0], options),
|
|
1027
|
+
isExpression: false,
|
|
1028
|
+
cases: flatIfStatement(newCallee[1].body.body[0]).map((_case: any) => new naslTypes.MatchCase({
|
|
1029
|
+
patterns: !_case.test ? [] : flatMatchPatternsExpression(transform2LogicItem(_case.test, options)) as any,
|
|
1030
|
+
body: _case.consequent.body.filter((item: any) => item.type !== 'BreakStatement').map((item: any) => transform2LogicItem(item, options)).filter((item: any) => !!item),
|
|
1031
|
+
})),
|
|
1032
|
+
});
|
|
1033
|
+
if (!match.cases.length || match.cases[match.cases.length - 1].patterns.length) {
|
|
1034
|
+
match.cases.push(new naslTypes.MatchCase({
|
|
1035
|
+
patterns: [],
|
|
1036
|
+
body: [],
|
|
1037
|
+
}));
|
|
1038
|
+
}
|
|
1039
|
+
match.cases.forEach((case_: any) => {
|
|
1040
|
+
if (case_.body.length && (case_.body[0].concept === 'BooleanLiteral' || case_.body[0].concept === 'StringLiteral')) {
|
|
1041
|
+
case_.isMatchedTypeEnumable = true;
|
|
1042
|
+
}
|
|
1043
|
+
if (case_.patterns.length && case_.patterns[0].concept === 'MemberExpression') {
|
|
1044
|
+
case_.isMatchedTypeEnumable = true;
|
|
1045
|
+
case_.patterns[0] = new naslTypes.MemberExpression({
|
|
1046
|
+
object: {
|
|
1047
|
+
concept: 'Identifier',
|
|
1048
|
+
name: case_.patterns[0].object.property.name,
|
|
1049
|
+
folded: false,
|
|
1050
|
+
namespace: 'app.enums'
|
|
1051
|
+
} as any,
|
|
1052
|
+
property: {
|
|
1053
|
+
concept: 'Identifier',
|
|
1054
|
+
name: case_.patterns[0].property.value,
|
|
1055
|
+
folded: false,
|
|
1056
|
+
} as any,
|
|
1057
|
+
});
|
|
1058
|
+
}
|
|
1059
|
+
});
|
|
1060
|
+
return match;
|
|
1061
|
+
}
|
|
1062
|
+
if (newCallee[newCallee.length - 1].argument?.callee?.name === '__SwitchExpressionFuntion') {
|
|
1063
|
+
const switchStatement = transform2LogicItem(newCallee[0].body.body[0], options) as naslTypes.SwitchStatement;
|
|
1064
|
+
return switchStatement;
|
|
1065
|
+
}
|
|
1066
|
+
throwError(`Unhandled ArrowFunctionExpression node ${node.type}`);
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
function transformCall2CallViewLogic(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
1070
|
+
return new naslTypes.CallLogic({
|
|
1071
|
+
calleeNamespace: '',
|
|
1072
|
+
calleeName: calleeName.slice('viewLogic_'.length),
|
|
1073
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
1074
|
+
expression: fixExpression(arg, options),
|
|
1075
|
+
})) as naslTypes.Argument[],
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
function transformCall2Logic(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
1080
|
+
return new naslTypes.CallLogic({
|
|
1081
|
+
calleeNamespace: ``,
|
|
1082
|
+
calleeName,
|
|
1083
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
1084
|
+
expression: fixExpression(arg, options),
|
|
1085
|
+
})) as naslTypes.Argument[],
|
|
1086
|
+
});
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
function transformCall2LogicWithAuth(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallLogic {
|
|
1090
|
+
return new naslTypes.CallLogic({
|
|
1091
|
+
calleeNamespace: `nasl.auth`,
|
|
1092
|
+
calleeName: (callee[callee.length - 1] as babelTypes.Identifier).name,
|
|
1093
|
+
arguments: node?.arguments?.map((arg) => new naslTypes.Argument({
|
|
1094
|
+
expression: fixExpression(arg, options),
|
|
1095
|
+
})) as naslTypes.Argument[],
|
|
1096
|
+
});
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
function transformCall2Paginate(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.Paginate {
|
|
1100
|
+
const newCallee = node.arguments || [];
|
|
1101
|
+
return new naslTypes.Paginate({
|
|
1102
|
+
list: newCallee[0] && transform2LogicItem(newCallee[0], options),
|
|
1103
|
+
page: newCallee[1] && transform2LogicItem(newCallee[1], options),
|
|
1104
|
+
size: newCallee[2] && transform2LogicItem(newCallee[2], options),
|
|
1105
|
+
});
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
type CallQueryComponentChainNode = {
|
|
1109
|
+
calleeName: 'FROM' | 'INNER_JOIN' | 'LEFT_JOIN' | 'RIGHT_JOIN' | 'OUTER_JOIN',
|
|
1110
|
+
arguments: [babelTypes.MemberExpression, babelTypes.Identifier, babelTypes.BinaryExpression | babelTypes.LogicalExpression],
|
|
1111
|
+
} | {
|
|
1112
|
+
calleeName: 'WHERE' | 'HAVING' | 'GROUP_BY' | 'ORDER_BY' | 'SELECT',
|
|
1113
|
+
arguments: Array<babelTypes.Expression>,
|
|
1114
|
+
};
|
|
1115
|
+
function flatCallQueryComponentChainNode(node: babelTypes.CallExpression): Array<CallQueryComponentChainNode> {
|
|
1116
|
+
if (node.callee.type === 'Identifier') {
|
|
1117
|
+
const calleeName = node.callee.name;
|
|
1118
|
+
if (['FROM', 'INNER_JOIN', 'LEFT_JOIN', 'RIGHT_JOIN', 'OUTER_JOIN'].includes(calleeName)) {
|
|
1119
|
+
if (node.arguments[1].type !== 'ArrowFunctionExpression')
|
|
1120
|
+
throwError('FROM should have a ArrowFunctionExpression as the second argument');
|
|
1121
|
+
|
|
1122
|
+
const arrowFunctionExpression = node.arguments[1] as babelTypes.ArrowFunctionExpression;
|
|
1123
|
+
if (arrowFunctionExpression.body.type !== 'CallExpression')
|
|
1124
|
+
throwError('FROM should have a CallExpression as the body of ArrowFunctionExpression');
|
|
1125
|
+
const body = arrowFunctionExpression.body as babelTypes.CallExpression;
|
|
1126
|
+
const callExpressions = flatChainCallExpression(body);
|
|
1127
|
+
|
|
1128
|
+
const result: Array<CallQueryComponentChainNode> = [{
|
|
1129
|
+
calleeName: calleeName as 'FROM' | 'INNER_JOIN' | 'LEFT_JOIN' | 'RIGHT_JOIN' | 'OUTER_JOIN',
|
|
1130
|
+
arguments: [node.arguments[0] as babelTypes.MemberExpression, arrowFunctionExpression.params[0] as babelTypes.Identifier, undefined as babelTypes.BinaryExpression | babelTypes.LogicalExpression],
|
|
1131
|
+
}];
|
|
1132
|
+
|
|
1133
|
+
callExpressions.forEach((item) => {
|
|
1134
|
+
if (item.callee.type === 'Identifier')
|
|
1135
|
+
if (item.callee.name === 'ON') {
|
|
1136
|
+
result[0].arguments[2] = item.arguments[0] as babelTypes.BinaryExpression | babelTypes.LogicalExpression;
|
|
1137
|
+
} else if (['INNER_JOIN', 'LEFT_JOIN', 'RIGHT_JOIN', 'OUTER_JOIN'].includes(item.callee.name)) {
|
|
1138
|
+
result.push(...flatCallQueryComponentChainNode(item as babelTypes.CallExpression));
|
|
1139
|
+
} else {
|
|
1140
|
+
result.push({
|
|
1141
|
+
calleeName: item.callee.name as 'WHERE' | 'GROUP_BY' | 'ORDER_BY' | 'SELECT',
|
|
1142
|
+
arguments: item.arguments as Array<babelTypes.Expression>,
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
});
|
|
1146
|
+
|
|
1147
|
+
return result;
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
return [];
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
function transformMemberExpression2Entity(node: babelTypes.MemberExpression, node2: babelTypes.Identifier) {
|
|
1154
|
+
const entityPath = flatMemberExpression(node);
|
|
1155
|
+
const entityNamespace = entityPath.slice(0, -1).map(n => (n as babelTypes.Identifier).name).join('.');
|
|
1156
|
+
const entityName = (entityPath[entityPath.length - 1] as babelTypes.Identifier).name.replace(/Entity/, '');
|
|
1157
|
+
const asName = node2.name === entityName ? undefined : node2.name;
|
|
1158
|
+
|
|
1159
|
+
return { entityNamespace, entityName, asName };
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
function transformCall2DataQuery(node: babelTypes.CallExpression, calleeName: string, callee: babelTypes.Node[], options: TransformOptions): naslTypes.CallQueryComponent {
|
|
1163
|
+
const flatted = flatCallQueryComponentChainNode(node);
|
|
1164
|
+
let from: naslTypes.CallQueryComponent['from'];
|
|
1165
|
+
let where: naslTypes.CallQueryComponent['where'];
|
|
1166
|
+
let having: naslTypes.CallQueryComponent['having'];
|
|
1167
|
+
let groupBy: naslTypes.CallQueryComponent['groupBy'] = [];
|
|
1168
|
+
let orderBy: naslTypes.CallQueryComponent['orderBy'] = [];
|
|
1169
|
+
let select: naslTypes.CallQueryComponent['select'];
|
|
1170
|
+
|
|
1171
|
+
const entityAsNames: Array<string> = [];
|
|
1172
|
+
let entity: ReturnType<typeof transformMemberExpression2Entity>;
|
|
1173
|
+
|
|
1174
|
+
// 这里只是一个示例,具体的逻辑需要根据flatted的内容来构建
|
|
1175
|
+
flatted.forEach((item) => {
|
|
1176
|
+
// console.log(item.calleeName)
|
|
1177
|
+
switch (item.calleeName) {
|
|
1178
|
+
case 'FROM':
|
|
1179
|
+
entity = transformMemberExpression2Entity(item.arguments[0], item.arguments[1]);
|
|
1180
|
+
entityAsNames.push(entity.asName || entity.entityName);
|
|
1181
|
+
from = new naslTypes.QueryFromExpression({
|
|
1182
|
+
...entity,
|
|
1183
|
+
joinParts: [],
|
|
1184
|
+
});
|
|
1185
|
+
break;
|
|
1186
|
+
case 'INNER_JOIN':
|
|
1187
|
+
case 'LEFT_JOIN':
|
|
1188
|
+
case 'RIGHT_JOIN':
|
|
1189
|
+
case 'OUTER_JOIN':
|
|
1190
|
+
entity = transformMemberExpression2Entity(item.arguments[0], item.arguments[1]);
|
|
1191
|
+
entityAsNames.push(entity.asName || entity.entityName);
|
|
1192
|
+
const rawJoinType = item.calleeName.slice(0, -5) as 'INNER' | 'LEFT' | 'RIGHT' | 'OUTER';
|
|
1193
|
+
const joinType = rawJoinType === 'OUTER' ? 'FULL' : rawJoinType;
|
|
1194
|
+
from.joinParts.push(new naslTypes.QueryJoinExpression({
|
|
1195
|
+
...entity,
|
|
1196
|
+
joinType,
|
|
1197
|
+
onExpressions: [transform2BinaryExpression(item.arguments[2], { ...options, entityAsNames })], // toArray
|
|
1198
|
+
}));
|
|
1199
|
+
break;
|
|
1200
|
+
case 'WHERE':
|
|
1201
|
+
where = transform2LogicItem(item.arguments[0], { ...options, entityAsNames });
|
|
1202
|
+
break;
|
|
1203
|
+
case 'HAVING':
|
|
1204
|
+
having = transform2LogicItem(item.arguments[0], { ...options, entityAsNames });
|
|
1205
|
+
break;
|
|
1206
|
+
case 'GROUP_BY':
|
|
1207
|
+
groupBy = item.arguments.map((arg) => new naslTypes.QueryGroupByExpression({
|
|
1208
|
+
groupElement: transform2LogicItem(arg, { ...options, entityAsNames }),
|
|
1209
|
+
}));
|
|
1210
|
+
break;
|
|
1211
|
+
case 'ORDER_BY':
|
|
1212
|
+
orderBy = item.arguments.map((arg: babelTypes.ArrayExpression) => new naslTypes.QueryOrderByExpression({
|
|
1213
|
+
orderElement: transform2LogicItem(arg.elements[0], { ...options, entityAsNames }),
|
|
1214
|
+
order: transform2LogicItem(arg.elements[1], { ...options, entityAsNames })
|
|
1215
|
+
}));
|
|
1216
|
+
break;
|
|
1217
|
+
case 'SELECT':
|
|
1218
|
+
select = new naslTypes.QuerySelectExpression({
|
|
1219
|
+
distinct: false,
|
|
1220
|
+
star: true,
|
|
1221
|
+
selectElements: [],
|
|
1222
|
+
});
|
|
1223
|
+
|
|
1224
|
+
const asNames: Array<string> = [];
|
|
1225
|
+
(item.arguments[0] as babelTypes.ObjectExpression).properties.forEach((arg: babelTypes.ObjectProperty) => {
|
|
1226
|
+
const selectElement = arg.value.type === 'CallExpression' ? transform2QueryAggregateExpression(arg, { ...options, entityAsNames }) : transform2SelectQueryFieldExpression(arg, { ...options, entityAsNames });
|
|
1227
|
+
asNames.push((arg.key as babelTypes.Identifier).name);
|
|
1228
|
+
|
|
1229
|
+
if (selectElement.concept === 'QueryFieldExpression') {
|
|
1230
|
+
const groupByExpression = groupBy.find((groupByExpression) => selectElement.propertyName === (groupByExpression.groupElement as naslTypes.QueryFieldExpression).propertyName);
|
|
1231
|
+
if (groupByExpression) {
|
|
1232
|
+
(groupByExpression.groupElement as naslTypes.QueryFieldExpression).asName = selectElement.asName;
|
|
1233
|
+
return;
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
select.selectElements.push(selectElement);
|
|
1237
|
+
});
|
|
1238
|
+
|
|
1239
|
+
orderBy.forEach((orderByExpression) => {
|
|
1240
|
+
const oe = orderByExpression.orderElement as naslTypes.Identifier;
|
|
1241
|
+
if (asNames.includes(oe.name)) {
|
|
1242
|
+
oe.namespace = 'inner';
|
|
1243
|
+
}
|
|
1244
|
+
});
|
|
1245
|
+
|
|
1246
|
+
break;
|
|
1247
|
+
}
|
|
1248
|
+
});
|
|
1249
|
+
|
|
1250
|
+
// 构建并返回 naslTypes.CallQueryComponent 实例
|
|
1251
|
+
const callQueryComponent = new naslTypes.CallQueryComponent({
|
|
1252
|
+
select: select || null,
|
|
1253
|
+
from: from || null,
|
|
1254
|
+
where: where || null,
|
|
1255
|
+
groupBy,
|
|
1256
|
+
having: having || null,
|
|
1257
|
+
orderBy,
|
|
1258
|
+
ideVersion: '2.22',
|
|
1259
|
+
});
|
|
1260
|
+
|
|
1261
|
+
// callQueryComponent.typeAnnotation = callQueryComponent.computeStructure();
|
|
1262
|
+
|
|
1263
|
+
return callQueryComponent;
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
export function transform2LogicItem(node: babelTypes.Node, options: TransformOptions): naslTypes.LogicItem {
|
|
1267
|
+
fixLogicNode(node);
|
|
1268
|
+
|
|
1269
|
+
const transformManager = new TransformManager();
|
|
1270
|
+
|
|
1271
|
+
transformManager.register('VariableDeclaration', transform2VariableAndAddAssignment);
|
|
1272
|
+
transformManager.register('IfStatement', transform2IfStatement);
|
|
1273
|
+
transformManager.register('WhileStatement', transform2WhileStatement);
|
|
1274
|
+
transformManager.register('SwitchStatement', transformSwitchStatement2Match);
|
|
1275
|
+
transformManager.register('Identifier', transformIdentifier);
|
|
1276
|
+
transformManager.register('ExpressionStatement', (node: babelTypes.ExpressionStatement, options) => transform2LogicItem(node.expression, options));
|
|
1277
|
+
transformManager.register('AssignmentExpression', transform2Assignment);
|
|
1278
|
+
transformManager.register('ArrowFunctionExpression', transform2AnonymousFunction);
|
|
1279
|
+
transformManager.register('BooleanLiteral', transform2BooleanLiteral);
|
|
1280
|
+
transformManager.register('StringLiteral', transform2StringLiteral);
|
|
1281
|
+
transformManager.register('NumericLiteral', transform2NumericLiteral);
|
|
1282
|
+
transformManager.register('NullLiteral', transform2NullLiteral);
|
|
1283
|
+
transformManager.register('TemplateLiteral', transform2StringInterpolation);
|
|
1284
|
+
transformManager.register('BinaryExpression', transform2BinaryExpression);
|
|
1285
|
+
transformManager.register('LogicalExpression', transform2BinaryExpression);
|
|
1286
|
+
transformManager.register('UpdateExpression', transformUpdateExpression2Assignment);
|
|
1287
|
+
transformManager.register('ReturnStatement', transformReturnStatement2AssignmentOrEnd);
|
|
1288
|
+
transformManager.register('EmptyStatement', transform2Comment);
|
|
1289
|
+
transformManager.register('BlockStatement', transformBlockStatement);
|
|
1290
|
+
transformManager.register('ObjectExpression', transform2NewComposite);
|
|
1291
|
+
transformManager.register('NewExpression', transformNewExpression);
|
|
1292
|
+
transformManager.register((node) => node.type === 'UnaryExpression' && ['!'].includes(node.operator), (node: babelTypes.UnaryExpression, options) => {
|
|
1293
|
+
return new naslTypes.UnaryExpression({
|
|
1294
|
+
operator: node.operator as any,
|
|
1295
|
+
argument: transform2LogicItem(node.argument, options),
|
|
1296
|
+
});
|
|
1297
|
+
});
|
|
1298
|
+
transformManager.register((node) => node.type === 'UnaryExpression' && ['-'].includes(node.operator) && node.argument.type === 'NumericLiteral', (node: babelTypes.UnaryExpression, options) => {
|
|
1299
|
+
return transform2NumericLiteral({
|
|
1300
|
+
type: 'NumericLiteral',
|
|
1301
|
+
value: -(node.argument as babelTypes.NumericLiteral).value,
|
|
1302
|
+
}, options);
|
|
1303
|
+
});
|
|
1304
|
+
transformManager.register('MemberExpression', transformMemberExpression);
|
|
1305
|
+
transformManager.register((node) => node.type === 'CallExpression' && node.callee.type === 'CallExpression', transformCallCall2Match);
|
|
1306
|
+
transformManager.registerCallExpression((node, calleeName) => /^\$refs\./.test(calleeName), transformCall2CallViewElementLogic);
|
|
1307
|
+
transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 2 && callee[0].type === 'Identifier' && callee[0].name.endsWith('Entity'), transformCall2CallEntityLogic);
|
|
1308
|
+
transformManager.registerCallExpression('nasl.oql.query', transformCall2OQLQuery);
|
|
1309
|
+
transformManager.registerCallExpression('nasl.util.consoleLog', transformCall2ConsoleLog);
|
|
1310
|
+
transformManager.registerCallExpression('console.log', transformCall2ConsoleLog);
|
|
1311
|
+
transformManager.registerCallExpression((node, calleeName) => calleeName.startsWith('nasl.logging.'), transformCall2Logging);
|
|
1312
|
+
transformManager.registerCallExpression('nasl.util.jsonSerialize', transformCall2JSONFunctions);
|
|
1313
|
+
transformManager.registerCallExpression('nasl.util.jsonDeserialize', transformCall2JSONFunctions);
|
|
1314
|
+
transformManager.registerCallExpression((node, calleeName) => calleeName.startsWith('nasl.util.'), transformCall2CallFunction);
|
|
1315
|
+
transformManager.registerCallExpression((node, calleeName) => calleeName.startsWith('nasl.auth.'), transformCall2LogicWithAuth);
|
|
1316
|
+
transformManager.registerCallExpression((node, calleeName) => calleeName.startsWith('nasl.ui.'), transform2UIFunction);
|
|
1317
|
+
transformManager.registerCallExpression((node, calleeName) => calleeName.endsWith('.map'), transformMap2ListTransform);
|
|
1318
|
+
transformManager.registerCallExpression('ForEach', transform2ForEachStatement);
|
|
1319
|
+
transformManager.registerCallExpression((node, calleeName) => calleeName.endsWith('.forEach'), transformForEach2ForEachStatement);
|
|
1320
|
+
transformManager.registerCallExpression('alert', transformAlert2ShowMessage);
|
|
1321
|
+
transformManager.registerCallExpression((node, calleeName) => /^app.dataSources|app.logics/.test(calleeName), transformCall2CallDataSourceLogic);
|
|
1322
|
+
transformManager.registerCallExpression((node, calleeName) => /interfaces\./.test(calleeName), transformCall2Interface);
|
|
1323
|
+
transformManager.registerCallExpression((node, calleeName) => /connectors\./.test(calleeName), transformCall2Connector);
|
|
1324
|
+
transformManager.registerCallExpression((node, calleeName) => /extensions\./.test(calleeName), transformCall2Extension);
|
|
1325
|
+
transformManager.registerCallExpression((node) => node.callee.type === 'ArrowFunctionExpression', transformArrowFunction2Match);
|
|
1326
|
+
transformManager.registerCallExpression((node, calleeName) => ['plus', 'minus', 'multiply', 'divide', 'remainder', 'STARTWITH', 'ENDWITH', 'LIKE', 'IN'].includes(calleeName), transformCallExpressionToBinaryExpression);
|
|
1327
|
+
transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 1 && calleeName.startsWith('viewLogic_'), transformCall2CallViewLogic);
|
|
1328
|
+
|
|
1329
|
+
transformManager.registerCallExpression('PAGINATE', transformCall2Paginate);
|
|
1330
|
+
transformManager.registerCallExpression('FROM', transformCall2DataQuery);
|
|
1331
|
+
|
|
1332
|
+
transformManager.registerCallExpression((node, calleeName, callee) => callee.length === 1, transformCall2Logic);
|
|
1333
|
+
|
|
1334
|
+
return transformManager.apply(node, options);
|
|
1335
|
+
}
|