@lcap/nasl 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/automate/engine/utils.js +16 -0
- package/out/automate/engine/utils.js.map +1 -1
- package/out/common/BaseNode.d.ts +1 -1
- package/out/common/BaseNode.js +13 -3
- package/out/common/BaseNode.js.map +1 -1
- package/out/concepts/App__.d.ts +1 -0
- package/out/concepts/App__.js +4 -1
- package/out/concepts/App__.js.map +1 -1
- package/out/concepts/Assignee__.d.ts +11 -0
- package/out/concepts/Assignee__.js +34 -0
- package/out/concepts/Assignee__.js.map +1 -1
- package/out/concepts/CallFunction__.js +1 -2
- package/out/concepts/CallFunction__.js.map +1 -1
- package/out/concepts/CallQueryComponent__.d.ts +31 -2
- package/out/concepts/CallQueryComponent__.js +286 -51
- package/out/concepts/CallQueryComponent__.js.map +1 -1
- package/out/concepts/Constant__.js +6 -6
- package/out/concepts/Constant__.js.map +1 -1
- package/out/concepts/Destination__.js +18 -4
- package/out/concepts/Destination__.js.map +1 -1
- package/out/concepts/EntityIndex__.js +4 -2
- package/out/concepts/EntityIndex__.js.map +1 -1
- package/out/concepts/EntityProperty__.js +3 -5
- package/out/concepts/EntityProperty__.js.map +1 -1
- package/out/concepts/Entity__.d.ts +1 -0
- package/out/concepts/Entity__.js +7 -1
- package/out/concepts/Entity__.js.map +1 -1
- package/out/concepts/Enum__.d.ts +1 -0
- package/out/concepts/Enum__.js +6 -2
- package/out/concepts/Enum__.js.map +1 -1
- package/out/concepts/Identifier__.js +1 -1
- package/out/concepts/Identifier__.js.map +1 -1
- package/out/concepts/InterfaceParam__.js +9 -4
- package/out/concepts/InterfaceParam__.js.map +1 -1
- package/out/concepts/Param__.d.ts +1 -1
- package/out/concepts/Param__.js +14 -7
- package/out/concepts/Param__.js.map +1 -1
- package/out/concepts/ProcessElement__.js +8 -2
- package/out/concepts/ProcessElement__.js.map +1 -1
- package/out/concepts/QueryAggregateExpression__.js +1 -1
- package/out/concepts/QueryAggregateExpression__.js.map +1 -1
- package/out/concepts/QueryFieldExpression__.d.ts +1 -0
- package/out/concepts/QueryFieldExpression__.js +3 -0
- package/out/concepts/QueryFieldExpression__.js.map +1 -1
- package/out/concepts/QueryGroupByExpression__.d.ts +3 -0
- package/out/concepts/QueryGroupByExpression__.js +20 -0
- package/out/concepts/QueryGroupByExpression__.js.map +1 -1
- package/out/concepts/Return__.d.ts +1 -1
- package/out/concepts/Return__.js +15 -10
- package/out/concepts/Return__.js.map +1 -1
- package/out/concepts/StringLiteral__.js +1 -8
- package/out/concepts/StringLiteral__.js.map +1 -1
- package/out/concepts/StructureProperty__.js +5 -5
- package/out/concepts/StructureProperty__.js.map +1 -1
- package/out/concepts/TypeAnnotation__.js +12 -4
- package/out/concepts/TypeAnnotation__.js.map +1 -1
- package/out/concepts/Variable__.d.ts +1 -1
- package/out/concepts/Variable__.js +15 -10
- package/out/concepts/Variable__.js.map +1 -1
- package/out/concepts/ViewElement__.js +1 -1
- package/out/concepts/ViewElement__.js.map +1 -1
- package/out/concepts/View__.d.ts +1 -1
- package/out/concepts/View__.js +15 -4
- package/out/concepts/View__.js.map +1 -1
- package/out/concepts/basics/stdlib/nasl.configuration.js +1 -1
- package/out/concepts/basics/stdlib/nasl.configuration.js.map +1 -1
- package/out/concepts/basics/stdlib/nasl.interface.d.ts +2 -0
- package/out/concepts/basics/stdlib/nasl.interface.js +4 -4
- package/out/concepts/basics/stdlib/nasl.interface.js.map +1 -1
- package/out/concepts/basics/stdlib/nasl.util.js +21 -37
- package/out/concepts/basics/stdlib/nasl.util.js.map +1 -1
- package/out/concepts/basics/stdlib/reference2TypeAnnotationList.js +1 -1
- package/out/concepts/basics/stdlib/reference2TypeAnnotationList.js.map +1 -1
- package/out/concepts/basics/types/index.d.ts +1 -0
- package/out/concepts/basics/types/index.js +3 -1
- package/out/concepts/basics/types/index.js.map +1 -1
- package/out/enums/KEYWORDS.js +0 -7
- package/out/enums/KEYWORDS.js.map +1 -1
- package/out/manager/diagnostic.d.ts +1 -1
- package/out/{test/integration/connect-file copy.d.ts → server/extendBaseNode.d.ts} +0 -0
- package/out/server/extendBaseNode.js +323 -0
- package/out/server/extendBaseNode.js.map +1 -0
- package/out/server/getLogics.js +22 -1
- package/out/server/getLogics.js.map +1 -1
- package/out/server/getMemberIdentifier.js +47 -2
- package/out/server/getMemberIdentifier.js.map +1 -1
- package/out/server/getProcesses.d.ts +4 -2
- package/out/server/getProcesses.js +160 -20
- package/out/server/getProcesses.js.map +1 -1
- package/out/server/getScope.d.ts +1 -0
- package/out/server/getScope.js +4 -0
- package/out/server/getScope.js.map +1 -1
- package/out/server/index.d.ts +1 -0
- package/out/server/index.js +1 -0
- package/out/server/index.js.map +1 -1
- package/out/server/naslServer.d.ts +7 -5
- package/out/server/naslServer.js +96 -362
- package/out/server/naslServer.js.map +1 -1
- package/out/server/translator.d.ts +1 -1
- package/out/server/translator.js +3 -1
- package/out/server/translator.js.map +1 -1
- package/out/service/storage/init.js +18 -10
- package/out/service/storage/init.js.map +1 -1
- package/out/templator/genGetBlock.js +1 -1
- package/out/templator/genGetBlock.js.map +1 -1
- package/out/templator/genQueryComponent.js +7 -4
- package/out/templator/genQueryComponent.js.map +1 -1
- package/out/templator/genSelectBlock.js +5 -15
- package/out/templator/genSelectBlock.js.map +1 -1
- package/out/templator/genUpdateBlock.js +1 -1
- package/out/templator/genUpdateBlock.js.map +1 -1
- package/out/templator/utils.d.ts +3 -1
- package/out/templator/utils.js +2 -1
- package/out/templator/utils.js.map +1 -1
- package/package.json +1 -2
- package/src/automate/engine/utils.js +16 -2
- package/src/common/BaseNode.ts +14 -3
- package/src/concepts/App__.ts +6 -39
- package/src/concepts/Assignee__.ts +30 -0
- package/src/concepts/CallFunction__.ts +1 -2
- package/src/concepts/CallQueryComponent__.ts +294 -54
- package/src/concepts/Constant__.ts +6 -6
- package/src/concepts/Destination__.ts +18 -20
- package/src/concepts/EntityIndex__.ts +4 -2
- package/src/concepts/EntityProperty__.ts +3 -5
- package/src/concepts/Entity__.ts +15 -3
- package/src/concepts/Enum__.ts +7 -15
- package/src/concepts/Identifier__.ts +1 -10
- package/src/concepts/InterfaceParam__.ts +9 -4
- package/src/concepts/Param__.ts +14 -7
- package/src/concepts/ProcessElement__.ts +9 -3
- package/src/concepts/QueryAggregateExpression__.ts +1 -1
- package/src/concepts/QueryFieldExpression__.ts +4 -0
- package/src/concepts/QueryGroupByExpression__.ts +23 -0
- package/src/concepts/Return__.ts +15 -10
- package/src/concepts/StringLiteral__.ts +1 -8
- package/src/concepts/StructureProperty__.ts +5 -5
- package/src/concepts/TypeAnnotation__.ts +12 -4
- package/src/concepts/Variable__.ts +15 -10
- package/src/concepts/ViewElement__.ts +2 -2
- package/src/concepts/View__.ts +16 -4
- package/src/concepts/basics/stdlib/nasl.configuration.ts +1 -1
- package/src/concepts/basics/stdlib/nasl.interface.ts +1 -1
- package/src/concepts/basics/stdlib/nasl.util.ts +21 -37
- package/src/concepts/basics/stdlib/reference2TypeAnnotationList.ts +1 -1
- package/src/concepts/basics/types/index.ts +1 -0
- package/src/enums/KEYWORDS.ts +0 -7
- package/src/manager/diagnostic.ts +1 -1
- package/src/server/extendBaseNode.ts +318 -0
- package/src/server/getLogics.ts +22 -1
- package/src/server/getMemberIdentifier.ts +49 -2
- package/src/server/getProcesses.ts +170 -21
- package/src/server/getScope.ts +5 -0
- package/src/server/index.ts +1 -0
- package/src/server/naslServer.ts +100 -355
- package/src/server/translator.ts +3 -1
- package/src/service/storage/init.ts +18 -11
- package/src/templator/genGetBlock.ts +1 -1
- package/src/templator/genQueryComponent.ts +7 -4
- package/src/templator/genSelectBlock.ts +5 -15
- package/src/templator/genUpdateBlock.ts +1 -1
- package/src/templator/utils.ts +3 -0
- package/out/concepts/basics/stdlib/nasl.browser copy.d.ts +0 -3
- package/out/concepts/basics/stdlib/nasl.browser copy.js +0 -70
- package/out/concepts/basics/stdlib/nasl.browser copy.js.map +0 -1
- package/out/terms/LEVEL_NAME_MAP.d.ts +0 -26
- package/out/terms/LEVEL_NAME_MAP.js +0 -30
- package/out/terms/LEVEL_NAME_MAP.js.map +0 -1
- package/out/test/integration/connect-file copy.js +0 -50
- package/out/test/integration/connect-file copy.js.map +0 -1
- package/out/test/integration/node-nasl-server.d.ts +0 -1
- package/out/test/integration/node-nasl-server.js +0 -41
- package/out/test/integration/node-nasl-server.js.map +0 -1
package/src/server/getScope.ts
CHANGED
|
@@ -5,6 +5,7 @@ type wordScope = {
|
|
|
5
5
|
Return?: string[]
|
|
6
6
|
Variable?: string[]
|
|
7
7
|
Constant?: string[]
|
|
8
|
+
Logic?: string[]
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
export function getLogicScopeWords(logic: Logic): wordScope {
|
|
@@ -13,6 +14,7 @@ export function getLogicScopeWords(logic: Logic): wordScope {
|
|
|
13
14
|
Return: logic.returns.map((p) => p.name),
|
|
14
15
|
Variable: logic.variables.map((p) => p.name),
|
|
15
16
|
Constant: [],
|
|
17
|
+
Logic: []
|
|
16
18
|
};
|
|
17
19
|
return scope;
|
|
18
20
|
}
|
|
@@ -23,6 +25,7 @@ export function getViewScopeWords(view: View): wordScope {
|
|
|
23
25
|
Variable: view.variables.map((p) => p.name),
|
|
24
26
|
Return: [],
|
|
25
27
|
Constant: [],
|
|
28
|
+
Logic: view.logics.map(l => l.name),
|
|
26
29
|
};
|
|
27
30
|
return scope;
|
|
28
31
|
}
|
|
@@ -34,6 +37,7 @@ export function getProcessScopeWords(process: Process): wordScope {
|
|
|
34
37
|
Return: process.returns.map((p) => `${processName}.${p.name}`),
|
|
35
38
|
Constant: process.constants.map((p) => `${processName}.${p.name}`),
|
|
36
39
|
Variable: [],
|
|
40
|
+
Logic: []
|
|
37
41
|
};
|
|
38
42
|
|
|
39
43
|
process.elements.forEach((el) => {
|
|
@@ -57,6 +61,7 @@ export function combineScope(a: wordScope, b: wordScope) : wordScope {
|
|
|
57
61
|
Return: [...a.Return, ...b.Return],
|
|
58
62
|
Constant: [...a.Constant, ...b.Constant],
|
|
59
63
|
Variable: [...a.Variable, ...b.Variable],
|
|
64
|
+
Logic: [...a.Logic, ...b.Logic],
|
|
60
65
|
};
|
|
61
66
|
return scope;
|
|
62
67
|
}
|
package/src/server/index.ts
CHANGED
package/src/server/naslServer.ts
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
QueryFromExpression,
|
|
24
24
|
QueryJoinExpression,
|
|
25
25
|
QueryFieldExpression,
|
|
26
|
+
QueryGroupByExpression,
|
|
26
27
|
Identifier,
|
|
27
28
|
CallLogic,
|
|
28
29
|
EnumItem,
|
|
@@ -43,6 +44,7 @@ import {
|
|
|
43
44
|
Namespace,
|
|
44
45
|
Theme,
|
|
45
46
|
Variable,
|
|
47
|
+
Assignee,
|
|
46
48
|
} from '../concepts';
|
|
47
49
|
import { lsp2tspNumber, SourceMap, SourceMapItem, embeddedTSEmitter } from '../translator';
|
|
48
50
|
import axios from '../service/storage';
|
|
@@ -51,6 +53,7 @@ import { EventPayload, invokeCommand, registerCommand } from '../common';
|
|
|
51
53
|
import { DiagnosticRecord, Diagnostic, default as diagnosticManager } from '../manager/diagnostic';
|
|
52
54
|
import formatUiTs from './createUiTs';
|
|
53
55
|
import { primitiveTypeList } from '../concepts/basics/types/coreTypeList';
|
|
56
|
+
import { traverse } from '../utils';
|
|
54
57
|
|
|
55
58
|
const EmbeddedTSFileLineMap: { [name: string]: number } = {
|
|
56
59
|
Entity: 3,
|
|
@@ -58,7 +61,7 @@ const EmbeddedTSFileLineMap: { [name: string]: number } = {
|
|
|
58
61
|
// 要Check的文件
|
|
59
62
|
const filesToCheck: Set<string> = new Set();
|
|
60
63
|
|
|
61
|
-
interface FileNode extends BaseNode {
|
|
64
|
+
export interface FileNode extends BaseNode {
|
|
62
65
|
getEmbeddedFilePath(name?: string): string;
|
|
63
66
|
toEmbeddedTSFile(): {
|
|
64
67
|
code: string;
|
|
@@ -86,7 +89,7 @@ const messager = new Messager({
|
|
|
86
89
|
},
|
|
87
90
|
});
|
|
88
91
|
|
|
89
|
-
interface
|
|
92
|
+
interface RenameMinRange extends MinRange {
|
|
90
93
|
newValue?: any;
|
|
91
94
|
setTypeMethods?: string;
|
|
92
95
|
}
|
|
@@ -377,28 +380,34 @@ const naslServer = {
|
|
|
377
380
|
* fileNode
|
|
378
381
|
*/
|
|
379
382
|
const { currentSource, fileNode } = naslServer.getCurrentSource(callFunction);
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
if (quickInfo.responseRequired) {
|
|
386
|
-
const displayString = quickInfo?.response?.displayString || '';
|
|
387
|
-
const typeList = naslServer.getDisplayString2Type(displayString);
|
|
388
|
-
let res: Array<TypeAnnotation> = [];
|
|
389
|
-
typeList.forEach((type) => {
|
|
390
|
-
const typeAnnotation = primitiveTypeList.find((typeAnnotation) => typeAnnotation.typeName === type);
|
|
391
|
-
if (typeAnnotation) {
|
|
392
|
-
res.push(typeAnnotation);
|
|
393
|
-
} else if (type === 'unknown' || type === 'never') {
|
|
394
|
-
return null;
|
|
395
|
-
}
|
|
383
|
+
try {
|
|
384
|
+
const quickInfo = await naslServer._getTypeQuickinfo({
|
|
385
|
+
file: (fileNode as FileNode).getEmbeddedFilePath(),
|
|
386
|
+
line: lsp2tspNumber(currentSource.range.start.line),
|
|
387
|
+
offset: lsp2tspNumber(currentSource.range.start.character) + `nasl.util.C`.length,
|
|
396
388
|
});
|
|
397
|
-
if (
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
389
|
+
if (quickInfo.responseRequired) {
|
|
390
|
+
const displayString = quickInfo?.response?.displayString || '';
|
|
391
|
+
const typeList = naslServer.getDisplayString2Type(displayString);
|
|
392
|
+
const res: Array<TypeAnnotation> = [];
|
|
393
|
+
typeList.forEach((type) => {
|
|
394
|
+
const typeAnnotation = primitiveTypeList.find((typeAnnotation) => typeAnnotation.typeName === type);
|
|
395
|
+
if (typeAnnotation) {
|
|
396
|
+
res.push(typeAnnotation);
|
|
397
|
+
} else if (type === 'unknown' || type === 'never') {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
if (!res.length) {
|
|
402
|
+
return [];
|
|
403
|
+
} else {
|
|
404
|
+
return [{ title: '基础类型', children: res }];
|
|
405
|
+
}
|
|
401
406
|
}
|
|
407
|
+
} catch (err) {
|
|
408
|
+
console.log(err);
|
|
409
|
+
// 如果有异常就先放开全部可选,兜底逻辑
|
|
410
|
+
return [];
|
|
402
411
|
}
|
|
403
412
|
} else {
|
|
404
413
|
// 字符串 和 inter
|
|
@@ -477,6 +486,7 @@ const naslServer = {
|
|
|
477
486
|
record.semanticDiagnostics = record.semanticDiagnostics
|
|
478
487
|
.map((diag) => this._resolveDiagnostic(diag as unknown as tsProtocol.DiagnosticWithFileName, node as FileNode))
|
|
479
488
|
.filter((diag) => !!diag);
|
|
489
|
+
record.semanticDiagnostics.push(...this._attachDiagnostics(node));
|
|
480
490
|
|
|
481
491
|
// 建议诊断
|
|
482
492
|
// 实体下的建议不用展示,因为都是平台自己写的逻辑
|
|
@@ -499,6 +509,29 @@ const naslServer = {
|
|
|
499
509
|
});
|
|
500
510
|
return records;
|
|
501
511
|
},
|
|
512
|
+
_attachDiagnostics(fileNode: BaseNode): Diagnostic[] {
|
|
513
|
+
const diagnostics: Diagnostic[] = [];
|
|
514
|
+
if (fileNode instanceof View) {
|
|
515
|
+
traverse((current) => {
|
|
516
|
+
if (current.node.tag) {
|
|
517
|
+
current.node.bindAttrs.forEach((bindAttr) => {
|
|
518
|
+
if ((bindAttr.model || bindAttr.sync)
|
|
519
|
+
&& bindAttr.expression && bindAttr.expression.concept !== 'Identifier' && bindAttr.expression.concept !== 'MemberExpression') {
|
|
520
|
+
const diagnostic = {
|
|
521
|
+
node: bindAttr,
|
|
522
|
+
severity: 'error',
|
|
523
|
+
message: '页面元素双向绑定:只允许绑定可赋值的变量和字段。',
|
|
524
|
+
};
|
|
525
|
+
bindAttr.tsErrorDetail = diagnostic;
|
|
526
|
+
diagnostics.push(diagnostic);
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
}, { node: { children: fileNode.elements } as ViewElement });
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
return diagnostics;
|
|
534
|
+
},
|
|
502
535
|
_resolveDiagnostic(diagnostic: tsProtocol.DiagnosticWithFileName, fileNode: FileNode): Diagnostic {
|
|
503
536
|
const minRange = this._findMinRange(diagnostic, fileNode);
|
|
504
537
|
const tsErrorDetail = {
|
|
@@ -698,7 +731,7 @@ const naslServer = {
|
|
|
698
731
|
const fileNode = this.file2NodeMap.get(record.file);
|
|
699
732
|
if (!fileNode)
|
|
700
733
|
return null;
|
|
701
|
-
const minRange:
|
|
734
|
+
const minRange: RenameMinRange = this._findMinRange(record, fileNode as FileNode);
|
|
702
735
|
if (minRange) {
|
|
703
736
|
// 如果节点是TypeAnnotation类型,
|
|
704
737
|
// 很复杂,可能是多级嵌套结构
|
|
@@ -950,6 +983,9 @@ const naslServer = {
|
|
|
950
983
|
if (minRange.node instanceof QueryFieldExpression && node instanceof Entity) {
|
|
951
984
|
minRange.setTypeMethods = 'setEntityAsName';
|
|
952
985
|
}
|
|
986
|
+
if (minRange.node instanceof QueryGroupByExpression && node instanceof Entity) {
|
|
987
|
+
minRange.setTypeMethods = 'setEntityAsName';
|
|
988
|
+
}
|
|
953
989
|
|
|
954
990
|
if ((minRange.node instanceof QueryFromExpression || minRange.node instanceof QueryJoinExpression) && node instanceof Entity) {
|
|
955
991
|
minRange.setTypeMethods = 'setEntityName';
|
|
@@ -957,6 +993,9 @@ const naslServer = {
|
|
|
957
993
|
if (minRange.node instanceof QueryFieldExpression && node instanceof EntityProperty) {
|
|
958
994
|
minRange.setTypeMethods = 'setPropertyName';
|
|
959
995
|
}
|
|
996
|
+
if (minRange.node instanceof QueryGroupByExpression && node instanceof EntityProperty) {
|
|
997
|
+
minRange.setTypeMethods = 'setPropertyName';
|
|
998
|
+
}
|
|
960
999
|
|
|
961
1000
|
// 如果跳转链接或者页面变量同一个param和TypeAnnotation 有两个过滤掉一个
|
|
962
1001
|
if ((minRange.node instanceof Param || minRange.node instanceof Variable || minRange.node instanceof Return) && (node instanceof Entity || node instanceof Enum || node instanceof Structure)) {
|
|
@@ -965,6 +1004,9 @@ const naslServer = {
|
|
|
965
1004
|
if (minRange.node instanceof Destination && (node instanceof Process || node instanceof ProcessElement)) {
|
|
966
1005
|
return null;
|
|
967
1006
|
}
|
|
1007
|
+
if (minRange.node instanceof Assignee && (node instanceof Process || node instanceof ProcessElement)) {
|
|
1008
|
+
return null;
|
|
1009
|
+
}
|
|
968
1010
|
// 枚举修改枚举名,比较特殊
|
|
969
1011
|
if (minRange.node instanceof EnumItem && node instanceof Enum) {
|
|
970
1012
|
// 什么都不做,用来跳过修改
|
|
@@ -1026,18 +1068,9 @@ const naslServer = {
|
|
|
1026
1068
|
console.log(result);
|
|
1027
1069
|
return result;
|
|
1028
1070
|
},
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
const parantNode = node
|
|
1032
|
-
// 收集修改
|
|
1033
|
-
App.emit('collect:start', {
|
|
1034
|
-
actionMsg: '增加逻辑参数',
|
|
1035
|
-
});
|
|
1036
|
-
node.create({
|
|
1037
|
-
index: 0,
|
|
1038
|
-
parentNode: parantNode,
|
|
1039
|
-
parentKey: node.parentKey,
|
|
1040
|
-
});
|
|
1071
|
+
// 增加参数的副作用,用于更新logic和view
|
|
1072
|
+
_addParamsEffect(refsList: any[], node: Param) {
|
|
1073
|
+
const parantNode = node?.parentNode as Logic | View;
|
|
1041
1074
|
refsList.forEach((record) => {
|
|
1042
1075
|
const fileNode = this.file2NodeMap.get(record.file);
|
|
1043
1076
|
if (!fileNode)
|
|
@@ -1054,19 +1087,37 @@ const naslServer = {
|
|
|
1054
1087
|
}
|
|
1055
1088
|
}
|
|
1056
1089
|
});
|
|
1057
|
-
|
|
1058
|
-
|
|
1090
|
+
},
|
|
1091
|
+
_addParamsPrepare(node: BaseNode, refsList: any[], needAdd: boolean) {
|
|
1092
|
+
if (needAdd) {
|
|
1093
|
+
const App = node?.rootNode;
|
|
1094
|
+
const parantNode = node?.parentNode as Logic | View;
|
|
1095
|
+
// 收集修改
|
|
1096
|
+
App.emit('collect:start', {
|
|
1097
|
+
actionMsg: '增加逻辑参数',
|
|
1098
|
+
});
|
|
1099
|
+
node.create({
|
|
1100
|
+
index: 0,
|
|
1101
|
+
parentNode: parantNode,
|
|
1102
|
+
parentKey: node.parentKey,
|
|
1103
|
+
});
|
|
1104
|
+
naslServer._addParamsEffect(refsList, (node) as Param);
|
|
1105
|
+
// 结束修改 ,批量操作
|
|
1106
|
+
App.emit('collect:end');
|
|
1107
|
+
return node;
|
|
1108
|
+
}
|
|
1109
|
+
naslServer._addParamsEffect(refsList, (node) as Param);
|
|
1110
|
+
return node;
|
|
1059
1111
|
},
|
|
1060
1112
|
// 查找引用
|
|
1061
1113
|
async findReferences(node: BaseNode) {
|
|
1062
1114
|
let refsList = await naslServer._isHaveRef(node);
|
|
1063
1115
|
// 如果查找引用查到自己里面的引用不展示
|
|
1064
|
-
refsList = refsList.filter((item) =>
|
|
1116
|
+
refsList = refsList.filter((item) =>
|
|
1065
1117
|
// 自己引用自己的过滤掉
|
|
1066
1118
|
// 删除的时候过滤一把组件删除提示
|
|
1067
1119
|
// 展示组件自己屏蔽掉
|
|
1068
|
-
|
|
1069
|
-
});
|
|
1120
|
+
!item.isDefinition && !(item.lineText.includes(' = new nasl.ui.')));
|
|
1070
1121
|
// 最后返回的结果
|
|
1071
1122
|
let result = new Map();
|
|
1072
1123
|
// 树的构造,key: 一个file的node, 值是 [[logic, params],[logic, returns]]
|
|
@@ -1098,14 +1149,15 @@ const naslServer = {
|
|
|
1098
1149
|
// 获取节点的上层渲染
|
|
1099
1150
|
_getTreeMap(minRange: MinRange, fileNode: BaseNode, resMap: Map<BaseNode, Array<Array<QuoteNode>>>, nodeMap: Map<BaseNode, QuoteNode>) {
|
|
1100
1151
|
const minRangeNode = minRange.node;
|
|
1101
|
-
let
|
|
1152
|
+
let currentNode = minRangeNode;
|
|
1153
|
+
let parantNode = currentNode.parentNode;
|
|
1102
1154
|
// 顺序队列
|
|
1103
1155
|
const queue: any[] = [];
|
|
1104
1156
|
// 先插入自己,如果没有在往上找,
|
|
1105
1157
|
// 一直到file节点的父级
|
|
1106
1158
|
while (!(parantNode instanceof App)) {
|
|
1107
1159
|
// 找到上一级 在map对象中构造出他的子集
|
|
1108
|
-
|
|
1160
|
+
currentNode = parantNode;
|
|
1109
1161
|
parantNode = parantNode.parentNode;
|
|
1110
1162
|
// 如果第一次就塞入子集和父节点,以后就只用父节点了
|
|
1111
1163
|
// 因为部分节点没有name,先过滤掉
|
|
@@ -1153,11 +1205,11 @@ const naslServer = {
|
|
|
1153
1205
|
}
|
|
1154
1206
|
|
|
1155
1207
|
// 一个logic 或者 view可能会有多个顺序队列
|
|
1156
|
-
if (resMap.get(
|
|
1208
|
+
if (resMap.get(currentNode)) {
|
|
1157
1209
|
// 是否展示两个内容全等,但是两个queue的node可能不一样,但是只需要展示一个
|
|
1158
|
-
resMap.get(
|
|
1210
|
+
resMap.get(currentNode).push(queue);
|
|
1159
1211
|
} else {
|
|
1160
|
-
resMap.set(
|
|
1212
|
+
resMap.set(currentNode, [queue]);
|
|
1161
1213
|
}
|
|
1162
1214
|
},
|
|
1163
1215
|
handleTreeMap(resMap: Map<BaseNode, Array<Array<QuoteNode>>>) {
|
|
@@ -1297,313 +1349,6 @@ async function handleDelete(fileNode: BaseNode, targetNode: BaseNode, result: Re
|
|
|
1297
1349
|
|
|
1298
1350
|
newRefs.refs.forEach((ref) => filesToCheck.add(ref.file));
|
|
1299
1351
|
}
|
|
1300
|
-
BaseNode.prototype.findReadOnlyLogicUsage = function () {
|
|
1301
|
-
let targetNode;
|
|
1302
|
-
|
|
1303
|
-
if (this.parentNode.concept === 'Namespace' || this.parentNode.parentNode.concept === 'Namespace') {
|
|
1304
|
-
const sourceMap = this.parentNode.concept === 'Namespace' ? this.parentNode.parentNode.sourceMap : this.parentNode.parentNode.parentNode.sourceMap;
|
|
1305
|
-
for (const item of sourceMap) {
|
|
1306
|
-
const logic = item[0] as Logic;
|
|
1307
|
-
if (this.concept === 'Logic') {
|
|
1308
|
-
if (logic instanceof Logic)
|
|
1309
|
-
if (logic.calleewholeKey === (this as Logic).calleewholeKey) {
|
|
1310
|
-
targetNode = logic;
|
|
1311
|
-
break;
|
|
1312
|
-
}
|
|
1313
|
-
} else {
|
|
1314
|
-
if (logic instanceof Logic)
|
|
1315
|
-
if (logic.calleewholeKey === (this.parentNode as Logic).calleewholeKey) {
|
|
1316
|
-
targetNode = logic;
|
|
1317
|
-
break;
|
|
1318
|
-
}
|
|
1319
|
-
}
|
|
1320
|
-
}
|
|
1321
|
-
} else if (this.parentNode.concept === 'Module') {
|
|
1322
|
-
// 父级是模块的还是用它本身去查找引用
|
|
1323
|
-
targetNode = this;
|
|
1324
|
-
} else {
|
|
1325
|
-
const sourceMap = this.parentNode.sourceMap;
|
|
1326
|
-
for (const item of sourceMap) {
|
|
1327
|
-
const logic = item[0] as Logic;
|
|
1328
|
-
if (logic.getNamespace && logic.getNamespace() === (this as Logic).getNamespace()) {
|
|
1329
|
-
targetNode = logic;
|
|
1330
|
-
break;
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
}
|
|
1334
|
-
|
|
1335
|
-
try {
|
|
1336
|
-
return naslServer.findReferences(targetNode);
|
|
1337
|
-
} catch (err) {
|
|
1338
|
-
console.log(err);
|
|
1339
|
-
}
|
|
1340
|
-
};
|
|
1341
|
-
// 查找引用
|
|
1342
|
-
BaseNode.prototype.findUsage = function findUsage() {
|
|
1343
|
-
try {
|
|
1344
|
-
return naslServer.findReferences(this);
|
|
1345
|
-
} catch (err) {
|
|
1346
|
-
console.log(err);
|
|
1347
|
-
}
|
|
1348
|
-
};
|
|
1349
|
-
BaseNode.prototype.changeName = async function changeName(newValue: string, updateAll: boolean = false) {
|
|
1350
|
-
console.log(newValue);
|
|
1351
|
-
console.log(this);
|
|
1352
|
-
try {
|
|
1353
|
-
/**
|
|
1354
|
-
* 查找这个节点是不是有依赖
|
|
1355
|
-
*/
|
|
1356
|
-
const refsList = await naslServer._isHaveRef(this);
|
|
1357
|
-
// 是不是有引用有的话,就返回
|
|
1358
|
-
/**
|
|
1359
|
-
* @param this 当前重命名的节点
|
|
1360
|
-
* @param newValue 传递过来的新值,给MemberExpression用的比较特殊
|
|
1361
|
-
* 而且,这个新值不一定会用到,MemberExpression在批量更新的时候,可以取到新的value, 这里需要位置信息防止 a.a.a.a 中的一个a发生修改
|
|
1362
|
-
* @returns 找到的引用
|
|
1363
|
-
*/
|
|
1364
|
-
const res = naslServer._renamePrepare(this, refsList, newValue);
|
|
1365
|
-
if (res.length <= 1) {
|
|
1366
|
-
(this as SetNameNode).setName(newValue);
|
|
1367
|
-
} else {
|
|
1368
|
-
const callback = (value: boolean) => {
|
|
1369
|
-
if (value) {
|
|
1370
|
-
const App = this.rootNode;
|
|
1371
|
-
// 收集修改
|
|
1372
|
-
App.emit('collect:start', {
|
|
1373
|
-
actionMsg: '重命名并更新引用',
|
|
1374
|
-
});
|
|
1375
|
-
res.forEach((item) => {
|
|
1376
|
-
const itemNode = item.node as SetNameNode;
|
|
1377
|
-
if (item.newValue) {
|
|
1378
|
-
// 如果有指定的修改方法,就用那个,没有就修改名字
|
|
1379
|
-
item.setTypeMethods ? itemNode[item.setTypeMethods](item.newValue) : itemNode.setName?.(item.newValue);
|
|
1380
|
-
} else {
|
|
1381
|
-
item.setTypeMethods ? itemNode[item.setTypeMethods](newValue) : itemNode.setName?.(newValue);
|
|
1382
|
-
}
|
|
1383
|
-
});
|
|
1384
|
-
// 结束修改 ,批量操作
|
|
1385
|
-
App.emit('collect:end');
|
|
1386
|
-
} else {
|
|
1387
|
-
(this as SetNameNode).setName(newValue);
|
|
1388
|
-
}
|
|
1389
|
-
};
|
|
1390
|
-
const confirmParms = {
|
|
1391
|
-
actionType: 'rename',
|
|
1392
|
-
node: this,
|
|
1393
|
-
newValue,
|
|
1394
|
-
};
|
|
1395
|
-
/**
|
|
1396
|
-
* nasl和vue的通信,回退,要触发vue的watch。
|
|
1397
|
-
* 因为如果没修改的话nasl不会修改view,就不会通知到页面改成旧值
|
|
1398
|
-
* 先修改之
|
|
1399
|
-
*/
|
|
1400
|
-
const closeCallBack = () => {
|
|
1401
|
-
if (this.concept === 'EnumItem') {
|
|
1402
|
-
const oldValue = (this as EnumItem).value;
|
|
1403
|
-
(this as EnumItem).value = oldValue + ' ';
|
|
1404
|
-
setTimeout(() => {
|
|
1405
|
-
(this as EnumItem).value = oldValue;
|
|
1406
|
-
}, 0);
|
|
1407
|
-
} else {
|
|
1408
|
-
const oldValue = this.name;
|
|
1409
|
-
this.name = oldValue + ' ';
|
|
1410
|
-
setTimeout(() => {
|
|
1411
|
-
this.name = oldValue;
|
|
1412
|
-
}, 0);
|
|
1413
|
-
}
|
|
1414
|
-
};
|
|
1415
|
-
updateAll ? callback(true) : invokeCommand('tsConfirm.open', confirmParms, callback, closeCallBack);
|
|
1416
|
-
|
|
1417
|
-
return;
|
|
1418
|
-
}
|
|
1419
|
-
} catch (err) {
|
|
1420
|
-
console.log(err);
|
|
1421
|
-
}
|
|
1422
|
-
};
|
|
1423
|
-
|
|
1424
|
-
/**
|
|
1425
|
-
* 准备删除
|
|
1426
|
-
*/
|
|
1427
|
-
BaseNode.prototype.prepareDelete = async function prepareDelete() {
|
|
1428
|
-
try {
|
|
1429
|
-
/**
|
|
1430
|
-
* 查找这个节点是不是有依赖
|
|
1431
|
-
*/
|
|
1432
|
-
const node = this;
|
|
1433
|
-
let refsList = await naslServer._isHaveRef(node);
|
|
1434
|
-
// 删除的时候过滤一把组件删除提示
|
|
1435
|
-
refsList = refsList.filter((item) => {
|
|
1436
|
-
// 因为ui组件本身会多渲染一次,就先过滤一个
|
|
1437
|
-
return !(item.lineText.includes(': nasl.ui.'));
|
|
1438
|
-
});
|
|
1439
|
-
// 删除参数单独处理
|
|
1440
|
-
if (node instanceof Param) {
|
|
1441
|
-
const methodRefs: tsProtocol.ReferencesResponseItem[] = [];
|
|
1442
|
-
refsList.forEach((item) => {
|
|
1443
|
-
// 入参查找引用,查到logic 和自己,内容完全一样,就保留一个
|
|
1444
|
-
const find = methodRefs.find((findItem) => item.lineText === findItem.lineText);
|
|
1445
|
-
if (!find) {
|
|
1446
|
-
methodRefs.push(item);
|
|
1447
|
-
}
|
|
1448
|
-
});
|
|
1449
|
-
refsList = methodRefs;
|
|
1450
|
-
}
|
|
1451
|
-
|
|
1452
|
-
// delete的弹框展示
|
|
1453
|
-
const confirmParms = {
|
|
1454
|
-
actionType: 'delete',
|
|
1455
|
-
tipFlag: false,
|
|
1456
|
-
node,
|
|
1457
|
-
icon: 'warning',
|
|
1458
|
-
};
|
|
1459
|
-
let callback = null;
|
|
1460
|
-
if (refsList.length <= 1) {
|
|
1461
|
-
// 页面组件直接删除然后return
|
|
1462
|
-
if (node instanceof ViewElement) {
|
|
1463
|
-
this.delete();
|
|
1464
|
-
return;
|
|
1465
|
-
}
|
|
1466
|
-
callback = () => {
|
|
1467
|
-
// Structure 和 Interface是内部有delete方法
|
|
1468
|
-
if (node instanceof Structure || node instanceof Interface) {
|
|
1469
|
-
(this as any).deleteLogincAndModule();
|
|
1470
|
-
} else {
|
|
1471
|
-
this.delete();
|
|
1472
|
-
}
|
|
1473
|
-
};
|
|
1474
|
-
} else {
|
|
1475
|
-
// 如果有依赖就有一个查找引用提示
|
|
1476
|
-
confirmParms.tipFlag = true;
|
|
1477
|
-
const node = this;
|
|
1478
|
-
|
|
1479
|
-
// 删除页面或者流程
|
|
1480
|
-
if (node instanceof View || node instanceof Process) {
|
|
1481
|
-
/**
|
|
1482
|
-
* 查找这个页面是不是有依赖
|
|
1483
|
-
*/
|
|
1484
|
-
let viewPath = (this as FileNode).getEmbeddedFilePath();
|
|
1485
|
-
viewPath = viewPath.slice(0, viewPath.length - 3);
|
|
1486
|
-
const find = refsList.find((record) => !record.file.includes(viewPath));
|
|
1487
|
-
// 如果没有别的文件的依赖,就直接delete
|
|
1488
|
-
if (!find) {
|
|
1489
|
-
this.delete();
|
|
1490
|
-
return;
|
|
1491
|
-
}
|
|
1492
|
-
}
|
|
1493
|
-
callback = () => {
|
|
1494
|
-
// removeParam
|
|
1495
|
-
// 跟rename 还不太一样,部分修改依赖修改好的值,然后在下面的修改需要把自己传递进去
|
|
1496
|
-
if (node instanceof Param) {
|
|
1497
|
-
const App = this.rootNode;
|
|
1498
|
-
const parentNode = this.parentNode;
|
|
1499
|
-
// 收集修改
|
|
1500
|
-
App.emit('collect:start', {
|
|
1501
|
-
actionMsg: '删除参数',
|
|
1502
|
-
});
|
|
1503
|
-
this.delete();
|
|
1504
|
-
refsList.forEach((record) => {
|
|
1505
|
-
const fileNode = naslServer.file2NodeMap.get(record.file);
|
|
1506
|
-
if (!fileNode)
|
|
1507
|
-
return null;
|
|
1508
|
-
const minRange: MinRange = naslServer._findMinRange(record, fileNode as FileNode);
|
|
1509
|
-
if (minRange) {
|
|
1510
|
-
if (minRange.node instanceof CallLogic) {
|
|
1511
|
-
minRange.node.setCalleeArgName(parentNode as Logic);
|
|
1512
|
-
}
|
|
1513
|
-
if (minRange.node instanceof Destination) {
|
|
1514
|
-
minRange.node.setViewArgument(parentNode as View);
|
|
1515
|
-
}
|
|
1516
|
-
}
|
|
1517
|
-
});
|
|
1518
|
-
// 结束修改 ,批量操作
|
|
1519
|
-
App.emit('collect:end');
|
|
1520
|
-
return;
|
|
1521
|
-
}
|
|
1522
|
-
// 删除logic节点,如果有对应的interface要一起删除
|
|
1523
|
-
if (node instanceof Logic) {
|
|
1524
|
-
const App = this.rootNode;
|
|
1525
|
-
// 收集修改
|
|
1526
|
-
App.emit('collect:start', {
|
|
1527
|
-
actionMsg: '删除逻辑并删除导出的接口',
|
|
1528
|
-
});
|
|
1529
|
-
this.delete();
|
|
1530
|
-
refsList.forEach((record) => {
|
|
1531
|
-
const fileNode = naslServer.file2NodeMap.get(record.file);
|
|
1532
|
-
if (!fileNode)
|
|
1533
|
-
return null;
|
|
1534
|
-
const minRange: MinRange = naslServer._findMinRange(record, fileNode as FileNode);
|
|
1535
|
-
if (minRange) {
|
|
1536
|
-
if (minRange.node instanceof Interface) {
|
|
1537
|
-
minRange.node.delete();
|
|
1538
|
-
}
|
|
1539
|
-
}
|
|
1540
|
-
});
|
|
1541
|
-
// 结束修改 ,批量操作
|
|
1542
|
-
App.emit('collect:end');
|
|
1543
|
-
return;
|
|
1544
|
-
}
|
|
1545
|
-
// 删除权限节点
|
|
1546
|
-
if (node instanceof Role) {
|
|
1547
|
-
const App = this.rootNode;
|
|
1548
|
-
// 收集修改
|
|
1549
|
-
App.emit('collect:start', {
|
|
1550
|
-
actionMsg: '删除权限',
|
|
1551
|
-
});
|
|
1552
|
-
this.delete();
|
|
1553
|
-
refsList.forEach((record) => {
|
|
1554
|
-
const fileNode = naslServer.file2NodeMap.get(record.file);
|
|
1555
|
-
if (!fileNode)
|
|
1556
|
-
return null;
|
|
1557
|
-
const minRange: MinRange = naslServer._findMinRange(record, fileNode as FileNode);
|
|
1558
|
-
if (minRange) {
|
|
1559
|
-
if (minRange.node instanceof View || minRange.node instanceof ViewElement) {
|
|
1560
|
-
// oldName旧的节点存的值
|
|
1561
|
-
// newValue用户输入值
|
|
1562
|
-
// node.bindRoles 存的
|
|
1563
|
-
const str = minRange.node.bindRoles.toString().replace(this.name, '');
|
|
1564
|
-
const newBindRoles = str.split(',').filter((item) => !!item);
|
|
1565
|
-
minRange.node.setBindRoles(newBindRoles);
|
|
1566
|
-
}
|
|
1567
|
-
}
|
|
1568
|
-
});
|
|
1569
|
-
// 结束修改 ,批量操作
|
|
1570
|
-
App.emit('collect:end');
|
|
1571
|
-
return;
|
|
1572
|
-
}
|
|
1573
|
-
|
|
1574
|
-
// 删除页面或者流程,如果上一步没有return 就说明他是有别的引用的,会有引用弹框
|
|
1575
|
-
if (node instanceof View || node instanceof Process) {
|
|
1576
|
-
this.delete();
|
|
1577
|
-
}
|
|
1578
|
-
// 其余的都直接调用删除
|
|
1579
|
-
// Structure 和 Interface是内部有delete方法
|
|
1580
|
-
if (node instanceof Structure || node instanceof Interface) {
|
|
1581
|
-
(this as any).deleteLogincAndModule();
|
|
1582
|
-
} else {
|
|
1583
|
-
this.delete();
|
|
1584
|
-
}
|
|
1585
|
-
};
|
|
1586
|
-
}
|
|
1587
|
-
invokeCommand('tsConfirm.open', confirmParms, callback);
|
|
1588
|
-
} catch (err) {
|
|
1589
|
-
console.log(err);
|
|
1590
|
-
}
|
|
1591
|
-
};
|
|
1592
|
-
|
|
1593
|
-
/**
|
|
1594
|
-
* 如果添加需要触发查找引用并且在之后,对内容产生影响
|
|
1595
|
-
*/
|
|
1596
|
-
BaseNode.prototype.addParamsPrepare = async function addParamsPrepare() {
|
|
1597
|
-
try {
|
|
1598
|
-
/**
|
|
1599
|
-
* 查找这个节点是不是有依赖
|
|
1600
|
-
*/
|
|
1601
|
-
const refsList = await naslServer._isHaveRef(this);
|
|
1602
|
-
return naslServer._addParamsPrepare(this, refsList);
|
|
1603
|
-
} catch (err) {
|
|
1604
|
-
console.log(err);
|
|
1605
|
-
}
|
|
1606
|
-
};
|
|
1607
1352
|
|
|
1608
1353
|
/**
|
|
1609
1354
|
* 除去rename场景下的更新
|
|
@@ -1750,7 +1495,7 @@ async function incidentalAction(action: string, fileNode: BaseNode, targetNode:
|
|
|
1750
1495
|
await handleRename(fileNodeItem, fileNodeItem, result, currentOldPath);
|
|
1751
1496
|
await incidentalAction(action, fileNodeItem, fileNodeItem, currentOldPath);
|
|
1752
1497
|
}
|
|
1753
|
-
}
|
|
1498
|
+
}
|
|
1754
1499
|
}
|
|
1755
1500
|
// 删除或新增模块
|
|
1756
1501
|
// 需要把下面的哦内容全部都更新一遍
|
|
@@ -1766,7 +1511,7 @@ async function incidentalAction(action: string, fileNode: BaseNode, targetNode:
|
|
|
1766
1511
|
} else {
|
|
1767
1512
|
await handleDelete(node, node, result);
|
|
1768
1513
|
}
|
|
1769
|
-
}
|
|
1514
|
+
}
|
|
1770
1515
|
|
|
1771
1516
|
// 删除模块通知更新列表
|
|
1772
1517
|
if (action === 'delete') {
|
|
@@ -1841,7 +1586,7 @@ embeddedTSEmitter.on('change', ($event: EventPayload) => {
|
|
|
1841
1586
|
// 异步状态机,一个完成了在执行下一个
|
|
1842
1587
|
function next() {
|
|
1843
1588
|
const item = stackList.shift();
|
|
1844
|
-
receiveHandleChange(item).then(async() => {
|
|
1589
|
+
receiveHandleChange(item).then(async () => {
|
|
1845
1590
|
if (stackList.length) {
|
|
1846
1591
|
next();
|
|
1847
1592
|
} else {
|
package/src/server/translator.ts
CHANGED
|
@@ -401,7 +401,9 @@ export function naslNodeTranslateMessage(minRange: MinRange, tsErrorDetail: Diag
|
|
|
401
401
|
// 变量type的报错放到内部
|
|
402
402
|
node = node.parentNode;
|
|
403
403
|
let str = tsErrorDetail.message;
|
|
404
|
-
|
|
404
|
+
if (node) {
|
|
405
|
+
str = (node as any).constructor.nodeTitle + ':' + str;
|
|
406
|
+
}
|
|
405
407
|
tsErrorDetail.message = str;
|
|
406
408
|
}
|
|
407
409
|
}
|