@lcap/nasl 1.0.0-alpha.8 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/out/automate/engine/index.d.ts +3 -0
  2. package/out/automate/engine/index.js +414 -0
  3. package/out/automate/engine/index.js.map +1 -0
  4. package/out/automate/engine/operators.d.ts +13 -0
  5. package/out/automate/engine/operators.js +63 -0
  6. package/out/automate/engine/operators.js.map +1 -0
  7. package/out/automate/engine/uniqueName.d.ts +6 -0
  8. package/out/automate/engine/uniqueName.js +39 -0
  9. package/out/automate/engine/uniqueName.js.map +1 -0
  10. package/out/automate/engine/utils.d.ts +24 -0
  11. package/out/automate/engine/utils.js +363 -0
  12. package/out/automate/engine/utils.js.map +1 -0
  13. package/out/common/BaseNode.d.ts +20 -0
  14. package/out/common/BaseNode.js +219 -81
  15. package/out/common/BaseNode.js.map +1 -1
  16. package/out/concepts/App__.d.ts +18 -1
  17. package/out/concepts/App__.js +84 -44
  18. package/out/concepts/App__.js.map +1 -1
  19. package/out/concepts/Argument__.d.ts +5 -1
  20. package/out/concepts/Argument__.js +21 -3
  21. package/out/concepts/Argument__.js.map +1 -1
  22. package/out/concepts/Assignee__.d.ts +190 -0
  23. package/out/concepts/Assignee__.js +264 -0
  24. package/out/concepts/Assignee__.js.map +1 -0
  25. package/out/concepts/Assignment__.js +5 -0
  26. package/out/concepts/Assignment__.js.map +1 -1
  27. package/out/concepts/BinaryExpression__.js +8 -7
  28. package/out/concepts/BinaryExpression__.js.map +1 -1
  29. package/out/concepts/BindAttribute__.d.ts +19 -0
  30. package/out/concepts/BindAttribute__.js +55 -10
  31. package/out/concepts/BindAttribute__.js.map +1 -1
  32. package/out/concepts/BindDirective__.js +23 -3
  33. package/out/concepts/BindDirective__.js.map +1 -1
  34. package/out/concepts/BindEvent__.d.ts +2 -2
  35. package/out/concepts/BindEvent__.js +67 -34
  36. package/out/concepts/BindEvent__.js.map +1 -1
  37. package/out/concepts/BooleanLiteral__.d.ts +2 -0
  38. package/out/concepts/BooleanLiteral__.js +10 -0
  39. package/out/concepts/BooleanLiteral__.js.map +1 -1
  40. package/out/concepts/CallFunction__.js +57 -23
  41. package/out/concepts/CallFunction__.js.map +1 -1
  42. package/out/concepts/CallInterface__.d.ts +5 -0
  43. package/out/concepts/CallInterface__.js +238 -31
  44. package/out/concepts/CallInterface__.js.map +1 -1
  45. package/out/concepts/CallLogic__.d.ts +4 -4
  46. package/out/concepts/CallLogic__.js +107 -50
  47. package/out/concepts/CallLogic__.js.map +1 -1
  48. package/out/concepts/CallQueryComponent__.d.ts +7 -1
  49. package/out/concepts/CallQueryComponent__.js +45 -26
  50. package/out/concepts/CallQueryComponent__.js.map +1 -1
  51. package/out/concepts/Comment__.js +6 -2
  52. package/out/concepts/Comment__.js.map +1 -1
  53. package/out/concepts/CompletionProperty__.d.ts +3 -1
  54. package/out/concepts/CompletionProperty__.js +2 -0
  55. package/out/concepts/CompletionProperty__.js.map +1 -1
  56. package/out/concepts/ConfigGroup__.js +3 -3
  57. package/out/concepts/ConfigGroup__.js.map +1 -1
  58. package/out/concepts/ConfigProperty__.js +3 -3
  59. package/out/concepts/ConfigProperty__.js.map +1 -1
  60. package/out/concepts/Configuration__.js +3 -3
  61. package/out/concepts/Configuration__.js.map +1 -1
  62. package/out/concepts/Constant__.d.ts +1 -0
  63. package/out/concepts/Constant__.js +14 -0
  64. package/out/concepts/Constant__.js.map +1 -1
  65. package/out/concepts/Destination__.d.ts +12 -0
  66. package/out/concepts/Destination__.js +98 -19
  67. package/out/concepts/Destination__.js.map +1 -1
  68. package/out/concepts/End__.js +9 -1
  69. package/out/concepts/End__.js.map +1 -1
  70. package/out/concepts/EntityProperty__.d.ts +11 -0
  71. package/out/concepts/EntityProperty__.js +73 -5
  72. package/out/concepts/EntityProperty__.js.map +1 -1
  73. package/out/concepts/Entity__.d.ts +4 -4
  74. package/out/concepts/Entity__.js +30 -20
  75. package/out/concepts/Entity__.js.map +1 -1
  76. package/out/concepts/Enum__.d.ts +4 -0
  77. package/out/concepts/Enum__.js +18 -10
  78. package/out/concepts/Enum__.js.map +1 -1
  79. package/out/concepts/Event__.js +3 -3
  80. package/out/concepts/Event__.js.map +1 -1
  81. package/out/concepts/ForEachStatement__.d.ts +1 -1
  82. package/out/concepts/ForEachStatement__.js +11 -15
  83. package/out/concepts/ForEachStatement__.js.map +1 -1
  84. package/out/concepts/Function__.js +13 -13
  85. package/out/concepts/Function__.js.map +1 -1
  86. package/out/concepts/Identifier__.d.ts +3 -0
  87. package/out/concepts/Identifier__.js +76 -29
  88. package/out/concepts/Identifier__.js.map +1 -1
  89. package/out/concepts/IfStatement__.js +4 -4
  90. package/out/concepts/IfStatement__.js.map +1 -1
  91. package/out/concepts/InterfaceParam__.d.ts +6 -4
  92. package/out/concepts/InterfaceParam__.js +52 -19
  93. package/out/concepts/InterfaceParam__.js.map +1 -1
  94. package/out/concepts/Interface__.d.ts +42 -30
  95. package/out/concepts/Interface__.js +133 -17
  96. package/out/concepts/Interface__.js.map +1 -1
  97. package/out/concepts/JSBlock__.d.ts +1 -0
  98. package/out/concepts/JSBlock__.js +3 -0
  99. package/out/concepts/JSBlock__.js.map +1 -1
  100. package/out/concepts/LogicItem__.d.ts +2 -1
  101. package/out/concepts/LogicItem__.js +14 -0
  102. package/out/concepts/LogicItem__.js.map +1 -1
  103. package/out/concepts/Logic__.d.ts +20 -1
  104. package/out/concepts/Logic__.js +194 -37
  105. package/out/concepts/Logic__.js.map +1 -1
  106. package/out/concepts/MemberExpression__.d.ts +2 -0
  107. package/out/concepts/MemberExpression__.js +49 -13
  108. package/out/concepts/MemberExpression__.js.map +1 -1
  109. package/out/concepts/Module__.d.ts +126 -120
  110. package/out/concepts/Module__.js +36 -26
  111. package/out/concepts/Module__.js.map +1 -1
  112. package/out/concepts/Namespace__.d.ts +5 -1
  113. package/out/concepts/Namespace__.js +48 -37
  114. package/out/concepts/Namespace__.js.map +1 -1
  115. package/out/concepts/NullLiteral__.d.ts +3 -0
  116. package/out/concepts/NullLiteral__.js +11 -1
  117. package/out/concepts/NullLiteral__.js.map +1 -1
  118. package/out/concepts/NumericLiteral__.d.ts +1 -1
  119. package/out/concepts/NumericLiteral__.js +17 -6
  120. package/out/concepts/NumericLiteral__.js.map +1 -1
  121. package/out/concepts/Param__.d.ts +7 -3
  122. package/out/concepts/Param__.js +57 -28
  123. package/out/concepts/Param__.js.map +1 -1
  124. package/out/concepts/ProcessComponent__.js +6 -6
  125. package/out/concepts/ProcessComponent__.js.map +1 -1
  126. package/out/concepts/ProcessElement__.d.ts +0 -4
  127. package/out/concepts/ProcessElement__.js +117 -54
  128. package/out/concepts/ProcessElement__.js.map +1 -1
  129. package/out/concepts/ProcessOutcome__.js +1 -1
  130. package/out/concepts/ProcessOutcome__.js.map +1 -1
  131. package/out/concepts/Process__.d.ts +7 -1
  132. package/out/concepts/Process__.js +81 -85
  133. package/out/concepts/Process__.js.map +1 -1
  134. package/out/concepts/QueryAggregateExpression__.js +1 -1
  135. package/out/concepts/QueryAggregateExpression__.js.map +1 -1
  136. package/out/concepts/QueryFromExpression__.js +2 -2
  137. package/out/concepts/QueryFromExpression__.js.map +1 -1
  138. package/out/concepts/QueryJoinExpression__.js +5 -5
  139. package/out/concepts/QueryJoinExpression__.js.map +1 -1
  140. package/out/concepts/QueryLimitExpression__.js +2 -2
  141. package/out/concepts/QueryLimitExpression__.js.map +1 -1
  142. package/out/concepts/QuerySelectExpression__.js +3 -3
  143. package/out/concepts/QuerySelectExpression__.js.map +1 -1
  144. package/out/concepts/Return__.d.ts +4 -1
  145. package/out/concepts/Return__.js +67 -21
  146. package/out/concepts/Return__.js.map +1 -1
  147. package/out/concepts/Role__.d.ts +4 -0
  148. package/out/concepts/Role__.js +13 -4
  149. package/out/concepts/Role__.js.map +1 -1
  150. package/out/concepts/SqlQueryComponent__.js +2 -2
  151. package/out/concepts/SqlQueryComponent__.js.map +1 -1
  152. package/out/concepts/StringLiteral__.d.ts +1 -1
  153. package/out/concepts/StringLiteral__.js +21 -31
  154. package/out/concepts/StringLiteral__.js.map +1 -1
  155. package/out/concepts/StructureProperty__.d.ts +5 -4
  156. package/out/concepts/StructureProperty__.js +55 -26
  157. package/out/concepts/StructureProperty__.js.map +1 -1
  158. package/out/concepts/Structure__.d.ts +44 -30
  159. package/out/concepts/Structure__.js +44 -12
  160. package/out/concepts/Structure__.js.map +1 -1
  161. package/out/concepts/SwitchCase__.js +4 -4
  162. package/out/concepts/SwitchCase__.js.map +1 -1
  163. package/out/concepts/SwitchStatement__.js +2 -2
  164. package/out/concepts/SwitchStatement__.js.map +1 -1
  165. package/out/concepts/TypeAnnotation__.d.ts +5 -5
  166. package/out/concepts/TypeAnnotation__.js +74 -20
  167. package/out/concepts/TypeAnnotation__.js.map +1 -1
  168. package/out/concepts/UnaryExpression__.js +10 -8
  169. package/out/concepts/UnaryExpression__.js.map +1 -1
  170. package/out/concepts/Unparsed__.js +1 -1
  171. package/out/concepts/Unparsed__.js.map +1 -1
  172. package/out/concepts/ValidationRule__.d.ts +1 -0
  173. package/out/concepts/ValidationRule__.js +48 -13
  174. package/out/concepts/ValidationRule__.js.map +1 -1
  175. package/out/concepts/Variable__.d.ts +10 -1
  176. package/out/concepts/Variable__.js +70 -18
  177. package/out/concepts/Variable__.js.map +1 -1
  178. package/out/concepts/ViewComponent__.js +15 -15
  179. package/out/concepts/ViewComponent__.js.map +1 -1
  180. package/out/concepts/ViewElement__.d.ts +17 -11
  181. package/out/concepts/ViewElement__.js +302 -204
  182. package/out/concepts/ViewElement__.js.map +1 -1
  183. package/out/concepts/View__.d.ts +12 -11
  184. package/out/concepts/View__.js +109 -98
  185. package/out/concepts/View__.js.map +1 -1
  186. package/out/concepts/WhileStatement__.js +3 -3
  187. package/out/concepts/WhileStatement__.js.map +1 -1
  188. package/out/concepts/basics/stdlib/index.js +4 -1
  189. package/out/concepts/basics/stdlib/index.js.map +1 -1
  190. package/out/concepts/basics/stdlib/{nasl.validate.d.ts → nasl.auth.d.ts} +0 -0
  191. package/out/concepts/basics/stdlib/nasl.auth.js +30 -0
  192. package/out/concepts/basics/stdlib/nasl.auth.js.map +1 -0
  193. package/out/concepts/basics/stdlib/nasl.browser copy.d.ts +3 -0
  194. package/out/concepts/basics/stdlib/nasl.browser copy.js +70 -0
  195. package/out/concepts/basics/stdlib/nasl.browser copy.js.map +1 -0
  196. package/out/concepts/basics/stdlib/nasl.browser.d.ts +3 -0
  197. package/out/concepts/basics/stdlib/nasl.browser.js +41 -0
  198. package/out/concepts/basics/stdlib/nasl.browser.js.map +1 -0
  199. package/out/concepts/basics/stdlib/nasl.configuration.d.ts +3 -0
  200. package/out/concepts/basics/stdlib/nasl.configuration.js +25 -0
  201. package/out/concepts/basics/stdlib/nasl.configuration.js.map +1 -0
  202. package/out/concepts/basics/stdlib/nasl.ui.js +20 -0
  203. package/out/concepts/basics/stdlib/nasl.ui.js.map +1 -1
  204. package/out/concepts/basics/stdlib/nasl.util.js +149 -13
  205. package/out/concepts/basics/stdlib/nasl.util.js.map +1 -1
  206. package/out/concepts/basics/stdlib/nasl.validation.js +54 -20
  207. package/out/concepts/basics/stdlib/nasl.validation.js.map +1 -1
  208. package/out/concepts/basics/types/coreTypeList.js +11 -10
  209. package/out/concepts/basics/types/coreTypeList.js.map +1 -1
  210. package/out/concepts/index__.d.ts +1 -0
  211. package/out/concepts/index__.js +1 -0
  212. package/out/concepts/index__.js.map +1 -1
  213. package/out/config.d.ts +1 -2
  214. package/out/config.js +1 -2
  215. package/out/config.js.map +1 -1
  216. package/out/enums/KEYWORDS.d.ts +3 -0
  217. package/out/enums/KEYWORDS.js +1206 -0
  218. package/out/enums/KEYWORDS.js.map +1 -0
  219. package/out/enums/LEVEL_NAME_MAP.d.ts +26 -0
  220. package/out/enums/LEVEL_NAME_MAP.js +30 -0
  221. package/out/enums/LEVEL_NAME_MAP.js.map +1 -0
  222. package/out/eventBus.d.ts +3 -0
  223. package/out/eventBus.js +7 -0
  224. package/out/eventBus.js.map +1 -0
  225. package/out/generator/genBundleFiles.d.ts +7 -2
  226. package/out/generator/genBundleFiles.js +168 -27
  227. package/out/generator/genBundleFiles.js.map +1 -1
  228. package/out/generator/genMetaData.d.ts +20 -20
  229. package/out/generator/genMetaData.js +50 -15
  230. package/out/generator/genMetaData.js.map +1 -1
  231. package/out/index.d.ts +2 -0
  232. package/out/index.js +2 -0
  233. package/out/index.js.map +1 -1
  234. package/out/manager/diagnostic.d.ts +1 -1
  235. package/out/server/createUiTs.d.ts +1 -0
  236. package/out/server/createUiTs.js +49 -5
  237. package/out/server/createUiTs.js.map +1 -1
  238. package/out/server/entity2LogicNamespace.js +38 -23
  239. package/out/server/entity2LogicNamespace.js.map +1 -1
  240. package/out/server/getExtensionModules.js +2 -0
  241. package/out/server/getExtensionModules.js.map +1 -1
  242. package/out/server/getFunctions.d.ts +1 -0
  243. package/out/server/getFunctions.js +7 -1
  244. package/out/server/getFunctions.js.map +1 -1
  245. package/out/server/getLogics.js +63 -18
  246. package/out/server/getLogics.js.map +1 -1
  247. package/out/server/getMemberIdentifier.d.ts +16 -1
  248. package/out/server/getMemberIdentifier.js +279 -36
  249. package/out/server/getMemberIdentifier.js.map +1 -1
  250. package/out/server/getProcesses.d.ts +6 -1
  251. package/out/server/getProcesses.js +243 -1
  252. package/out/server/getProcesses.js.map +1 -1
  253. package/out/server/getScope.d.ts +12 -0
  254. package/out/server/getScope.js +57 -0
  255. package/out/server/getScope.js.map +1 -0
  256. package/out/server/index.js +4 -0
  257. package/out/server/index.js.map +1 -1
  258. package/out/server/naslServer.d.ts +30 -53
  259. package/out/server/naslServer.js +721 -381
  260. package/out/server/naslServer.js.map +1 -1
  261. package/out/server/process2LogicNamespace.d.ts +10 -0
  262. package/out/server/process2LogicNamespace.js +29 -1
  263. package/out/server/process2LogicNamespace.js.map +1 -1
  264. package/out/server/translator.d.ts +22 -3
  265. package/out/server/translator.js +367 -123
  266. package/out/server/translator.js.map +1 -1
  267. package/out/service/creator/add.configs.d.ts +1 -0
  268. package/out/service/creator/add.configs.js +68 -0
  269. package/out/service/creator/add.configs.js.map +1 -0
  270. package/out/service/creator/errHandles.d.ts +18 -0
  271. package/out/service/creator/errHandles.js +60 -0
  272. package/out/service/creator/errHandles.js.map +1 -0
  273. package/out/service/creator/index.d.ts +1 -0
  274. package/out/service/creator/index.js +72 -0
  275. package/out/service/creator/index.js.map +1 -0
  276. package/out/service/storage/api.d.ts +18 -0
  277. package/out/service/storage/api.js +17 -0
  278. package/out/service/storage/api.js.map +1 -0
  279. package/out/service/storage/init.js +213 -37
  280. package/out/service/storage/init.js.map +1 -1
  281. package/out/service/storage/service.d.ts +2 -0
  282. package/out/service/storage/service.js +10 -0
  283. package/out/service/storage/service.js.map +1 -0
  284. package/out/service/storage/storagePoint.d.ts +1 -14
  285. package/out/service/storage/storagePoint.js +16 -16
  286. package/out/service/storage/storagePoint.js.map +1 -1
  287. package/out/templator/genCreateBlock.js +6 -6
  288. package/out/templator/genCreateBlock.js.map +1 -1
  289. package/out/templator/genCurdEditMultipleKeyBlock.js +13 -17
  290. package/out/templator/genCurdEditMultipleKeyBlock.js.map +1 -1
  291. package/out/templator/genCurdMultipleKeyBlock.js +11 -11
  292. package/out/templator/genCurdMultipleKeyBlock.js.map +1 -1
  293. package/out/templator/genEditTableBlock.js +5 -5
  294. package/out/templator/genEditTableBlock.js.map +1 -1
  295. package/out/templator/genEnumSelectBlock.js +2 -2
  296. package/out/templator/genEnumSelectBlock.js.map +1 -1
  297. package/out/templator/genGetBlock.js +5 -3
  298. package/out/templator/genGetBlock.js.map +1 -1
  299. package/out/templator/genGridViewBlock.d.ts +3 -1
  300. package/out/templator/genGridViewBlock.js +61 -6
  301. package/out/templator/genGridViewBlock.js.map +1 -1
  302. package/out/templator/genQueryComponent.d.ts +2 -0
  303. package/out/templator/genQueryComponent.js +27 -14
  304. package/out/templator/genQueryComponent.js.map +1 -1
  305. package/out/templator/genTableBlock.d.ts +1 -1
  306. package/out/templator/genTableBlock.js +4 -5
  307. package/out/templator/genTableBlock.js.map +1 -1
  308. package/out/templator/genUpdateBlock.js +9 -10
  309. package/out/templator/genUpdateBlock.js.map +1 -1
  310. package/out/templator/utils.d.ts +13 -4
  311. package/out/templator/utils.js +8 -4
  312. package/out/templator/utils.js.map +1 -1
  313. package/out/test/fixtures/env.js +0 -1
  314. package/out/test/fixtures/env.js.map +1 -1
  315. package/out/test/integration/connect-file copy.d.ts +1 -0
  316. package/out/test/integration/connect-file copy.js +50 -0
  317. package/out/test/integration/connect-file copy.js.map +1 -0
  318. package/out/test/integration/node-nasl-server.d.ts +1 -0
  319. package/out/test/integration/node-nasl-server.js +41 -0
  320. package/out/test/integration/node-nasl-server.js.map +1 -0
  321. package/out/test/units/page/Element.spec.js +3 -3
  322. package/out/test/units/page/Element.spec.js.map +1 -1
  323. package/out/test/units/temp/temp.spec.js +1 -1
  324. package/out/test/units/temp/temp.spec.js.map +1 -1
  325. package/out/utils/index.d.ts +6 -0
  326. package/out/utils/index.js +25 -1
  327. package/out/utils/index.js.map +1 -1
  328. package/out/utils/string.d.ts +1 -1
  329. package/out/utils/string.js +38 -9
  330. package/out/utils/string.js.map +1 -1
  331. package/package.json +2 -1
  332. package/src/automate/engine/index.js +97 -118
  333. package/src/automate/engine/operators.js +63 -0
  334. package/src/automate/engine/uniqueName.js +36 -0
  335. package/src/automate/engine/utils.js +49 -19
  336. package/src/common/BaseNode.ts +223 -87
  337. package/src/concepts/App__.ts +86 -46
  338. package/src/concepts/Argument__.ts +23 -3
  339. package/src/concepts/Assignee__.ts +437 -0
  340. package/src/concepts/Assignment__.ts +4 -1
  341. package/src/concepts/BinaryExpression__.ts +9 -7
  342. package/src/concepts/BindAttribute__.ts +69 -9
  343. package/src/concepts/BindDirective__.ts +22 -3
  344. package/src/concepts/BindEvent__.ts +67 -23
  345. package/src/concepts/BooleanLiteral__.ts +8 -0
  346. package/src/concepts/CallFunction__.ts +58 -25
  347. package/src/concepts/CallInterface__.ts +236 -26
  348. package/src/concepts/CallLogic__.ts +111 -52
  349. package/src/concepts/CallQueryComponent__.ts +36 -21
  350. package/src/concepts/Comment__.ts +6 -2
  351. package/src/concepts/CompletionProperty__.ts +5 -1
  352. package/src/concepts/ConfigGroup__.ts +3 -3
  353. package/src/concepts/ConfigProperty__.ts +3 -3
  354. package/src/concepts/Configuration__.ts +3 -3
  355. package/src/concepts/Constant__.ts +12 -0
  356. package/src/concepts/Destination__.ts +106 -18
  357. package/src/concepts/End__.ts +8 -1
  358. package/src/concepts/EntityProperty__.ts +69 -5
  359. package/src/concepts/Entity__.ts +33 -28
  360. package/src/concepts/Enum__.ts +16 -11
  361. package/src/concepts/Event__.ts +3 -3
  362. package/src/concepts/ForEachStatement__.ts +16 -21
  363. package/src/concepts/Function__.ts +13 -13
  364. package/src/concepts/Identifier__.ts +82 -32
  365. package/src/concepts/IfStatement__.ts +4 -4
  366. package/src/concepts/InterfaceParam__.ts +49 -27
  367. package/src/concepts/Interface__.ts +130 -16
  368. package/src/concepts/JSBlock__.ts +4 -0
  369. package/src/concepts/LogicItem__.ts +16 -1
  370. package/src/concepts/Logic__.ts +201 -39
  371. package/src/concepts/MemberExpression__.ts +58 -15
  372. package/src/concepts/Module__.ts +35 -24
  373. package/src/concepts/Namespace__.ts +49 -37
  374. package/src/concepts/NullLiteral__.ts +8 -1
  375. package/src/concepts/NumericLiteral__.ts +17 -6
  376. package/src/concepts/Param__.ts +54 -28
  377. package/src/concepts/ProcessComponent__.ts +6 -6
  378. package/src/concepts/ProcessElement__.ts +143 -44
  379. package/src/concepts/ProcessOutcome__.ts +1 -1
  380. package/src/concepts/Process__.ts +85 -98
  381. package/src/concepts/QueryAggregateExpression__.ts +1 -1
  382. package/src/concepts/QueryFromExpression__.ts +2 -2
  383. package/src/concepts/QueryJoinExpression__.ts +5 -5
  384. package/src/concepts/QueryLimitExpression__.ts +2 -2
  385. package/src/concepts/QuerySelectExpression__.ts +3 -3
  386. package/src/concepts/Return__.ts +60 -29
  387. package/src/concepts/Role__.ts +11 -4
  388. package/src/concepts/SqlQueryComponent__.ts +2 -2
  389. package/src/concepts/StringLiteral__.ts +20 -31
  390. package/src/concepts/StructureProperty__.ts +50 -33
  391. package/src/concepts/Structure__.ts +32 -10
  392. package/src/concepts/SwitchCase__.ts +4 -4
  393. package/src/concepts/SwitchStatement__.ts +2 -2
  394. package/src/concepts/TypeAnnotation__.ts +59 -16
  395. package/src/concepts/UnaryExpression__.ts +10 -8
  396. package/src/concepts/Unparsed__.ts +1 -1
  397. package/src/concepts/ValidationRule__.ts +44 -14
  398. package/src/concepts/Variable__.ts +67 -25
  399. package/src/concepts/ViewComponent__.ts +15 -15
  400. package/src/concepts/ViewElement__.ts +380 -264
  401. package/src/concepts/View__.ts +139 -94
  402. package/src/concepts/WhileStatement__.ts +4 -4
  403. package/src/concepts/basics/stdlib/index.ts +4 -2
  404. package/src/concepts/basics/stdlib/nasl.auth.ts +26 -0
  405. package/src/concepts/basics/stdlib/nasl.browser.ts +37 -0
  406. package/src/concepts/basics/stdlib/nasl.configuration.ts +21 -0
  407. package/src/concepts/basics/stdlib/nasl.ui.ts +20 -1
  408. package/src/concepts/basics/stdlib/nasl.util.ts +151 -13
  409. package/src/concepts/basics/stdlib/nasl.validation.ts +45 -11
  410. package/src/concepts/basics/types/coreTypeList.ts +11 -10
  411. package/src/concepts/index__.ts +1 -0
  412. package/src/config.ts +1 -2
  413. package/src/enums/KEYWORDS.ts +1204 -0
  414. package/src/{terms → enums}/LEVEL_NAME_MAP.ts +0 -0
  415. package/src/eventBus.ts +5 -0
  416. package/src/generator/genBundleFiles.ts +182 -30
  417. package/src/generator/genMetaData.ts +72 -21
  418. package/src/index.ts +2 -0
  419. package/src/manager/diagnostic.ts +1 -1
  420. package/src/server/createUiTs.ts +50 -8
  421. package/src/server/entity2LogicNamespace.ts +41 -25
  422. package/src/server/getExtensionModules.ts +2 -0
  423. package/src/server/getFunctions.ts +6 -0
  424. package/src/server/getLogics.ts +66 -19
  425. package/src/server/getMemberIdentifier.ts +275 -46
  426. package/src/server/getProcesses.ts +248 -4
  427. package/src/server/getScope.ts +62 -0
  428. package/src/server/index.ts +12 -1
  429. package/src/server/naslServer.ts +715 -398
  430. package/src/server/process2LogicNamespace.ts +30 -2
  431. package/src/server/translator.ts +423 -128
  432. package/src/service/config/index.js +1 -1
  433. package/src/service/creator/errHandles.js +5 -2
  434. package/src/service/creator/index.js +0 -6
  435. package/src/service/storage/api.js +14 -0
  436. package/src/service/storage/init.ts +217 -47
  437. package/src/service/storage/service.ts +6 -0
  438. package/src/service/storage/storagePoint.ts +16 -16
  439. package/src/templator/genCreateBlock.ts +6 -6
  440. package/src/templator/genCurdEditMultipleKeyBlock.ts +29 -30
  441. package/src/templator/genCurdMultipleKeyBlock.ts +11 -11
  442. package/src/templator/genEditTableBlock.ts +5 -5
  443. package/src/templator/genEnumSelectBlock.ts +2 -2
  444. package/src/templator/genGetBlock.ts +6 -8
  445. package/src/templator/genGridViewBlock.ts +59 -9
  446. package/src/templator/genQueryComponent.ts +39 -28
  447. package/src/templator/genTableBlock.ts +5 -9
  448. package/src/templator/genUpdateBlock.ts +9 -11
  449. package/src/templator/utils.ts +9 -6
  450. package/src/test/fixtures/env.ts +0 -2
  451. package/src/test/units/page/Element.spec.ts +3 -3
  452. package/src/test/units/temp/temp.spec.ts +1 -1
  453. package/src/utils/index.ts +24 -0
  454. package/src/utils/string.ts +39 -9
  455. package/out/concepts/basics/stdlib/nasl.validate.js +0 -527
  456. package/out/concepts/basics/stdlib/nasl.validate.js.map +0 -1
  457. package/out/data/Module.d.ts +0 -34
  458. package/out/data/Module.js +0 -53
  459. package/out/data/Module.js.map +0 -1
  460. package/src/automate/engine/index.d.ts +0 -3
@@ -36,10 +36,17 @@ import {
36
36
  CallQueryComponent,
37
37
  Role,
38
38
  Configuration,
39
+ CallInterface,
40
+ Return,
41
+ ProcessElement,
42
+ NullLiteral,
43
+ Namespace,
44
+ Theme,
45
+ Variable,
39
46
  } from '../concepts';
40
47
  import { lsp2tspNumber, SourceMap, SourceMapItem, embeddedTSEmitter } from '../translator';
41
48
  import axios from '../service/storage';
42
- import { transformType, translateDiagnosticMessage } from './translator';
49
+ import { translateDiagnosticMessage, naslNodeTranslateMessage, MinRange } from './translator';
43
50
  import { EventPayload, invokeCommand, registerCommand } from '../common';
44
51
  import { DiagnosticRecord, Diagnostic, default as diagnosticManager } from '../manager/diagnostic';
45
52
  import formatUiTs from './createUiTs';
@@ -48,6 +55,8 @@ import { primitiveTypeList } from '../concepts/basics/types/coreTypeList';
48
55
  const EmbeddedTSFileLineMap: { [name: string]: number } = {
49
56
  Entity: 3,
50
57
  };
58
+ // 要Check的文件
59
+ const filesToCheck: Set<string> = new Set();
51
60
 
52
61
  interface FileNode extends BaseNode {
53
62
  getEmbeddedFilePath(name?: string): string;
@@ -58,14 +67,11 @@ interface FileNode extends BaseNode {
58
67
  };
59
68
  }
60
69
 
61
- interface setNameNode extends BaseNode {
70
+ interface SetNameNode extends BaseNode {
62
71
  setName(name: string): any;
63
72
  [propname: string]: any;
64
73
  }
65
- interface treeNode {
66
- [propName: string]: QuoteNode[];
67
- }
68
- export { transformType, translateDiagnosticMessage };
74
+
69
75
  const worker = new Worker('/ts-worker.js');
70
76
  const messager = new Messager({
71
77
  protocol: 'ts-worker',
@@ -80,29 +86,17 @@ const messager = new Messager({
80
86
  },
81
87
  });
82
88
 
83
- interface MinRange {
84
- node: BaseNode;
85
- item: SourceMapItem;
86
- }
87
89
  interface reNameMinRange extends MinRange {
88
90
  newValue?: any;
89
91
  setTypeMethods?: string;
90
92
  }
91
93
  // 查找引用节点
92
94
  interface QuoteNode {
93
- name: any;
95
+ icon: any;
94
96
  node: BaseNode;
97
+ expanded: boolean;
95
98
  children?: QuoteNode[];
96
99
  }
97
- // 组装后的resMap, 一个页面节点下可能有多个queue
98
- interface ResMap {
99
- [propName: string]: {
100
- queue: QuoteNode[][];
101
- name: string;
102
- concept: string;
103
- node: BaseNode;
104
- };
105
- }
106
100
  const naslServer = {
107
101
  messager,
108
102
  worker,
@@ -117,85 +111,125 @@ const naslServer = {
117
111
  return this.messager.requestCommand('start');
118
112
  },
119
113
  async createUiTs(allComponent: any) {
120
- const { code, elementsLogic } = await formatUiTs(allComponent);
114
+ const { code, elementsLogic, naslStdlibMap } = await formatUiTs(allComponent);
121
115
  // 放入生產的uits文件
122
116
  await naslServer.addFile({
123
117
  file: 'nasl.ui.definition.ts',
124
118
  fileContent: code,
125
119
  });
120
+ Object.keys(naslStdlibMap).forEach(async (libFileName: string) => {
121
+ await naslServer.addFile({
122
+ file: '/' + libFileName,
123
+ fileContent: naslStdlibMap[libFileName],
124
+ });
125
+ });
126
126
  naslServer.elementsLogic = elementsLogic;
127
127
  // 全部文件加载完毕开始初始化
128
128
  await naslServer.getDiagnosticRecordsAndPushAll();
129
129
  },
130
130
  contentToFile(module: Module | App, results: Array<ReturnType<Structure['toEmbeddedTSFile']>>) {
131
131
  module.structures.forEach((structure) => {
132
- const result = structure.toEmbeddedTSFile();
133
- results.push(result);
134
- // sourceMap都存在目录级别内容下,在页面层级下去找
135
- structure.sourceMap = result.sourceMap;
136
- this.file2NodeMap.set(result.filePath, structure);
132
+ try {
133
+ const result = structure.toEmbeddedTSFile();
134
+ results.push(result);
135
+ // sourceMap都存在目录级别内容下,在页面层级下去找
136
+ structure.sourceMap = result.sourceMap;
137
+ this.file2NodeMap.set(result.filePath, structure);
138
+ } catch (err) {
139
+ console.log(err);
140
+ }
137
141
  });
138
142
  module.entities.forEach((entity) => {
139
- const result = entity.toEmbeddedTSFile();
140
- results.push(result);
141
- // sourceMap都存在目录级别内容下,在页面层级下去找
142
- entity.sourceMap = result.sourceMap;
143
- this.file2NodeMap.set(result.filePath, entity);
143
+ try {
144
+ const result = entity.toEmbeddedTSFile();
145
+ results.push(result);
146
+ // sourceMap都存在目录级别内容下,在页面层级下去找
147
+ entity.sourceMap = result.sourceMap;
148
+ this.file2NodeMap.set(result.filePath, entity);
149
+ } catch (err) {
150
+ console.log(err);
151
+ }
144
152
  });
145
153
  module.interfaces.forEach((_interface) => {
146
- const result = _interface.toEmbeddedTSFile();
147
- results.push(result);
148
- // sourceMap都存在目录级别内容下,在页面层级下去找
149
- _interface.sourceMap = result.sourceMap;
150
- this.file2NodeMap.set(result.filePath, _interface);
154
+ try {
155
+ const result = _interface.toEmbeddedTSFile();
156
+ results.push(result);
157
+ // sourceMap都存在目录级别内容下,在页面层级下去找
158
+ _interface.sourceMap = result.sourceMap;
159
+ this.file2NodeMap.set(result.filePath, _interface);
160
+ } catch (err) {
161
+ console.log(err);
162
+ }
151
163
  });
152
164
  module.enums.forEach((_enum) => {
153
- const result = _enum.toEmbeddedTSFile();
154
- results.push(result);
155
- // sourceMap都存在目录级别内容下,在页面层级下去找
156
- _enum.sourceMap = result.sourceMap;
157
- this.file2NodeMap.set(result.filePath, _enum);
165
+ try {
166
+ const result = _enum.toEmbeddedTSFile();
167
+ results.push(result);
168
+ // sourceMap都存在目录级别内容下,在页面层级下去找
169
+ _enum.sourceMap = result.sourceMap;
170
+ this.file2NodeMap.set(result.filePath, _enum);
171
+ } catch (err) {
172
+ console.log(err);
173
+ }
158
174
  });
159
175
  module.logics.forEach((logic) => {
160
- if (!(logic instanceof Logic))
161
- return;
162
- const result = logic.toEmbeddedTSFile();
163
- results.push(result);
164
- logic.sourceMap = result.sourceMap;
165
- this.file2NodeMap.set(result.filePath, logic);
176
+ try {
177
+ if (!(logic instanceof Logic))
178
+ return;
179
+ const result = logic.toEmbeddedTSFile();
180
+ results.push(result);
181
+ logic.sourceMap = result.sourceMap;
182
+ this.file2NodeMap.set(result.filePath, logic);
183
+ } catch (err) {
184
+ console.log(err);
185
+ }
166
186
  });
167
187
 
168
188
  // view的生成
169
189
  naslServer.view2TSFile(module.views, results);
170
190
 
171
191
  module.processes.forEach((process) => {
172
- const result = process.toEmbeddedTSFile();
173
- results.push(result);
174
- process.sourceMap = result.sourceMap;
175
- this.file2NodeMap.set(result.filePath, process);
192
+ try {
193
+ const result = process.toEmbeddedTSFile();
194
+ results.push(result);
195
+ process.sourceMap = result.sourceMap;
196
+ this.file2NodeMap.set(result.filePath, process);
197
+ } catch (err) {
198
+ console.log(err);
199
+ }
176
200
  });
177
201
 
178
202
  if (module instanceof App) {
179
203
  module.roles.forEach((role) => {
180
- const result = role.toEmbeddedTSFile();
181
- results.push(result);
182
- // sourceMap都存在目录级别内容下,在页面层级下去找
183
- role.sourceMap = result.sourceMap;
184
- this.file2NodeMap.set(result.filePath, role);
204
+ try {
205
+ const result = role.toEmbeddedTSFile();
206
+ results.push(result);
207
+ // sourceMap都存在目录级别内容下,在页面层级下去找
208
+ role.sourceMap = result.sourceMap;
209
+ this.file2NodeMap.set(result.filePath, role);
210
+ } catch (err) {
211
+ console.log(err);
212
+ }
185
213
  });
186
214
  }
187
215
  },
188
216
  view2TSFile(viewsChildren: View[], results: Array<ReturnType<Structure['toEmbeddedTSFile']>>) {
189
- // 子页面
190
- viewsChildren.forEach((view) => {
191
- const result = view.toEmbeddedTSFile();
192
- results.push(result);
193
- view.sourceMap = result.sourceMap;
194
- this.file2NodeMap.set(result.filePath, view);
195
- if (view.children.length) {
196
- naslServer.view2TSFile(view.children, results);
197
- }
198
- });
217
+ // 如果有子页面
218
+ if (viewsChildren && viewsChildren.length) {
219
+ viewsChildren.forEach((view) => {
220
+ try {
221
+ const result = view.toEmbeddedTSFile();
222
+ results.push(result);
223
+ view.sourceMap = result.sourceMap;
224
+ this.file2NodeMap.set(result.filePath, view);
225
+ if (view.children.length) {
226
+ naslServer.view2TSFile(view.children, results);
227
+ }
228
+ } catch (err) {
229
+ console.log(err);
230
+ }
231
+ });
232
+ }
199
233
  },
200
234
  async openApp(app: App) {
201
235
  const results: Array<ReturnType<Structure['toEmbeddedTSFile']>> = [];
@@ -225,19 +259,16 @@ const naslServer = {
225
259
  callback();
226
260
  });
227
261
  },
228
- async importModule(module: Module) {
229
- const results: Array<ReturnType<Structure['toEmbeddedTSFile']>> = [];
230
- try {
231
- naslServer.contentToFile(module, results);
232
- } catch (err) {
233
- console.log(err);
234
- }
235
- const files = results.map((result) => ({
236
- file: result.filePath,
237
- fileContent: result.code,
238
- }));
239
- await this.writeFiles(files);
240
- this._debugInFileStorage(module.parentNode as App, files);
262
+ async refreshApp(app: App) {
263
+ // 清除所有问题
264
+ diagnosticManager.clear();
265
+ await naslServer.deleteDirectoryFiles({ directoryName: '/embedded' });
266
+ // 清楚check count的数量
267
+ await this.messager.requestCommand('_clearTimeout');
268
+ // 重新加载app下内容
269
+ await naslServer.openApp(app);
270
+ // 重新check一遍所有内容
271
+ await naslServer.getDiagnosticRecordsAndPushAll();
241
272
  },
242
273
  /**
243
274
  * 初始化之前添加文件
@@ -252,14 +283,7 @@ const naslServer = {
252
283
  writeFiles(files: Array<tsProtocol.OpenRequestArgs>) {
253
284
  return this.messager.requestCommand('writeFiles', files);
254
285
  },
255
- /**
256
- * 新增或修改文件
257
- * @param {*} files
258
- * @returns
259
- */
260
- outputFiles(files: Array<tsProtocol.OpenRequestArgs>) {
261
- return this.messager.requestCommand('outputFiles', files);
262
- },
286
+
263
287
  /**
264
288
  * 新增、修改
265
289
  * 删除文件 文件用修改内容为空模拟,防止报错
@@ -268,7 +292,15 @@ const naslServer = {
268
292
  updateFiles(args: { outputFiles: Array<tsProtocol.OpenRequestArgs> }) {
269
293
  return this.messager.requestCommand('updateFiles', args);
270
294
  },
295
+
296
+ /**
297
+ * 清除一个目录下的所有文件
298
+ */
299
+ deleteDirectoryFiles(args: { directoryName: string }) {
300
+ return this.messager.requestCommand('deleteDirectoryFiles', args);
301
+ },
271
302
  _debugInFileStorage(node: BaseNode, openFiles: Array<tsProtocol.OpenRequestArgs>) {
303
+ /// #if process.env.NODE_ENV === 'development'
272
304
  let app = node;
273
305
  if (node.concept !== 'App') {
274
306
  app = (node as any).rootNode || (node as any).app;
@@ -276,7 +308,10 @@ const naslServer = {
276
308
  return Promise.all(openFiles.map(async (file) => {
277
309
  const res = await axios.post('/api/App/debugEmbedded?id=' + app.id, file);
278
310
  return res.data;
279
- }));
311
+ })).catch((e) => {
312
+ console.error(e);
313
+ });
314
+ /// #endif
280
315
  },
281
316
  open() {
282
317
  return this.messager.requestCommand('open');
@@ -317,7 +352,9 @@ const naslServer = {
317
352
  const types = reg.exec(displayString);
318
353
  // 取出提示的类型,组成是数组
319
354
  const typeList: string[] = types[1].split(' | ').map((item: string) => {
320
- if (item.includes(' ')) {
355
+ if (/\<([^()]+)\>/g.exec(item)) {
356
+ return item;
357
+ } else if (item.includes(' ')) {
321
358
  const strs = item.split(' ');
322
359
  const type = strs[strs.length - 1];
323
360
  return type;
@@ -332,8 +369,7 @@ const naslServer = {
332
369
  return typeList;
333
370
  },
334
371
  async getTypeQuickinfo(node: BaseNode) {
335
- console.log(node);
336
- if (node instanceof Identifier) {
372
+ if (node && node instanceof BaseNode) {
337
373
  const callFunction = node.parentNode.parentNode;
338
374
  /**
339
375
  * currentSource callFunction 的节点,要去到当前节点的位置
@@ -354,21 +390,44 @@ const naslServer = {
354
390
  const typeAnnotation = primitiveTypeList.find((typeAnnotation) => typeAnnotation.typeName === type);
355
391
  if (typeAnnotation) {
356
392
  res.push(typeAnnotation);
357
- } else if (type === 'unknown') {
393
+ } else if (type === 'unknown' || type === 'never') {
358
394
  return null;
359
395
  }
360
396
  });
361
397
  if (!res.length) {
362
- res = primitiveTypeList;
398
+ return [];
399
+ } else {
400
+ return [{ title: '基础类型', children: res }];
401
+ }
402
+ }
403
+ } else {
404
+ // 字符串 和 inter
405
+ return [{ title: '基础类型', children: [primitiveTypeList[4]] }];
406
+ }
407
+ },
408
+ async getDataSchemaType(node: BaseNode) {
409
+ if (!(node instanceof ViewElement))
410
+ return;
411
+ const { currentSource, fileNode } = naslServer.getCurrentSource(node);
412
+ const quickInfo = await naslServer._getTypeQuickinfo({
413
+ file: (fileNode as FileNode).getEmbeddedFilePath(),
414
+ line: lsp2tspNumber(currentSource.range.start.line),
415
+ offset: lsp2tspNumber(currentSource.range.start.character) + `__elements.`.length,
416
+ });
417
+ if (quickInfo.responseRequired) {
418
+ const displayString = quickInfo?.response?.displayString || '';
419
+ const flag = displayString.includes('<') && displayString.includes('>');
420
+ if (flag) {
421
+ let str = '';
422
+ const types = naslServer.getDisplayString2Type(displayString);
423
+ if (Array.isArray(types) && types.length) {
424
+ const type = types[0];
425
+ str = type === 'any' || type === 'unknown' || type === 'never' ? '' : type;
363
426
  }
364
- // 调整结构
365
- const dataTypeList: Array<{
366
- title: string;
367
- children: Array<TypeAnnotation>;
368
- }> = [{ title: '基础类型', children: res }];
369
- return dataTypeList;
427
+ return str;
370
428
  }
371
429
  }
430
+ return '';
372
431
  },
373
432
  _getTypeQuickinfo(args: any) {
374
433
  return this.messager.requestCommand('quickInfo', args) as unknown as { responseRequired: boolean; response: tsProtocol.QuickInfoResponseBody };
@@ -416,7 +475,7 @@ const naslServer = {
416
475
 
417
476
  // 语义诊断
418
477
  record.semanticDiagnostics = record.semanticDiagnostics
419
- .map((diag) => this._resolveDiagnostic(diag as unknown as tsProtocol.DiagnosticWithFileName, node.sourceMap))
478
+ .map((diag) => this._resolveDiagnostic(diag as unknown as tsProtocol.DiagnosticWithFileName, node as FileNode))
420
479
  .filter((diag) => !!diag);
421
480
 
422
481
  // 建议诊断
@@ -440,8 +499,8 @@ const naslServer = {
440
499
  });
441
500
  return records;
442
501
  },
443
- _resolveDiagnostic(diagnostic: tsProtocol.DiagnosticWithFileName, sourceMap: SourceMap): Diagnostic {
444
- const minRange = this._findMinRange(diagnostic, sourceMap);
502
+ _resolveDiagnostic(diagnostic: tsProtocol.DiagnosticWithFileName, fileNode: FileNode): Diagnostic {
503
+ const minRange = this._findMinRange(diagnostic, fileNode);
445
504
  const tsErrorDetail = {
446
505
  severity: diagnostic.category === 'error' ? 'error' : 'warning',
447
506
  message: translateDiagnosticMessage(diagnostic.text),
@@ -450,9 +509,8 @@ const naslServer = {
450
509
  };
451
510
 
452
511
  if (minRange) {
453
- // let message = this.translateDiagnosticMessage(diagnostic.text);
454
512
  // 节点的error要置为true
455
- return naslServer._diagnosticSpecialTreatment(minRange, tsErrorDetail);
513
+ return naslNodeTranslateMessage(minRange, tsErrorDetail);
456
514
  } else {
457
515
  // 没找到节点, 先把问题暴露出来
458
516
  return {
@@ -461,45 +519,10 @@ const naslServer = {
461
519
  };
462
520
  }
463
521
  },
464
- /**
465
- * 处理一些边界情况
466
- * @param minRange
467
- * @param tsErrorDetail 报错具体信息
468
- * @returns
469
- */
470
- _diagnosticSpecialTreatment(minRange: MinRange, tsErrorDetail: Diagnostic) {
471
- const text = tsErrorDetail.originalDiagnostic.text;
472
- // 有一些节点报错信息不向外暴露,缺失一些原生标签等等的展示
473
- if (minRange.node instanceof View || minRange.node instanceof ViewElement) {
474
- if (text.startsWith(`'nasl.ui' has no exported member named `)) {
475
- return null;
476
- } else if (text.startsWith(`Property '`) && text.includes(`does not exist on type 'typeof ui'.`)) {
477
- return null;
478
- } else if (text.startsWith(`Namespace 'nasl.ui' has no exported member `)) {
479
- return null;
480
- }
481
- }
482
- if (/Expected (.+?) arguments, but got (.+?)./.exec(text)) {
483
- // bindevent本身现在就不传参数
484
- if (minRange.node instanceof BindEvent) {
485
- return null;
486
- }
487
- // 因为缺少参数时候有可能有特殊情况,因为原本少的多了就会找到 callLogic上,
488
- // 但是只少一个的时候就会找到准确的Argument上 需要特殊处理, ui层就可以统一处理
489
- if (minRange.node instanceof Argument) {
490
- minRange.node = minRange.node.parentNode;
491
- }
492
- }
493
-
494
- minRange.node.tsErrorDetail = tsErrorDetail;
495
- return {
496
- id: minRange.node.id,
497
- node: minRange.node,
498
- ...tsErrorDetail,
499
- };
500
- },
501
- _findMinRange(diagnostic: tsProtocol.DiagnosticWithFileName | tsProtocol.ReferencesResponseItem, sourceMap: SourceMap) {
522
+ _findMinRange(diagnostic: tsProtocol.DiagnosticWithFileName | tsProtocol.ReferencesResponseItem, fileNode: FileNode) {
502
523
  let minRange: MinRange;
524
+ const sourceMap: SourceMap = fileNode.sourceMap;
525
+
503
526
  for (const [node, item] of sourceMap.entries()) {
504
527
  /**
505
528
  * 当前内容的开始行 <= 诊断开始的行 &&
@@ -528,51 +551,18 @@ const naslServer = {
528
551
  }
529
552
  }
530
553
  if (!minRange) {
554
+ if (fileNode instanceof View) {
555
+ return { node: fileNode, item: sourceMap.get(fileNode) };
556
+ }
531
557
  console.log(diagnostic, 'diagnostic');
532
558
  console.log(sourceMap, 'sourceMap');
533
559
  console.log(minRange, '需要特殊看下,为什么没找到内容-------------');
534
560
  }
535
561
  return minRange;
536
562
  },
537
- // 查找引用
538
- async findReferences(node: BaseNode) {
539
- console.log(node);
540
- const refsList = await naslServer._isHaveRef(node, true);
541
- console.log(refsList, 'refsList');
542
- // refsList = refsList.filter((item) =>
543
- // // 不是创建者
544
- // item.isDefinition !== true);
545
- let result = {};
546
- const resMap = {};
547
- try {
548
- refsList.forEach((record) => {
549
- const fileNode = this.file2NodeMap.get(record.file);
550
- if (!fileNode)
551
- return;
552
- const minRange = this._findMinRange(record, fileNode.sourceMap);
553
- // 过滤一把不需要改的信息
554
- if (minRange) {
555
- // 如果查找引用查到自己里面的引用不展示
556
- // 因为view生成的特殊性
557
- if (minRange.node === node || (minRange.node instanceof View && node instanceof View)) {
558
- return;
559
- }
560
- // 拼装树
561
- naslServer._getTreeMap(minRange, fileNode, resMap);
562
- }
563
- });
564
- console.log(resMap, 'resMap');
565
- result = naslServer.handleTreeMap(resMap);
566
- } catch (err) {
567
- console.log(err);
568
- }
569
- console.log(result);
570
- return result;
571
- },
572
- async _isHaveRef(node: BaseNode, isFind: boolean = false) {
563
+ async _isHaveRef(node: BaseNode) {
573
564
  const { currentSource, fileNode } = naslServer.getCurrentSource(node);
574
565
  let refsList: tsProtocol.ReferencesResponseItem[] = [];
575
-
576
566
  /**
577
567
  * 未完成创建的节点 ,或者异常情况 可能找不到节点
578
568
  */
@@ -583,15 +573,36 @@ const naslServer = {
583
573
  offset: lsp2tspNumber(currentSource.range.start.character),
584
574
  });
585
575
  refsList = [...newRefs.refs];
576
+ } else {
577
+ if (node instanceof Module) {
578
+ const lists = node.logics || node.structures || node.enums;
579
+ const moduleName = (fileNode as FileNode).getEmbeddedFilePath();
580
+ if (lists.length) {
581
+ const item = lists[0];
582
+ const { fileNode } = naslServer.getCurrentSource(item);
583
+ const newRefs = await naslServer.references({
584
+ file: (fileNode as FileNode).getEmbeddedFilePath(),
585
+ line: 1,
586
+ offset: 22, //固定的位置,module的位置信息
587
+ });
588
+ refsList = newRefs.refs.filter((item) => !item.file.startsWith(moduleName));
589
+ // 多塞一个 ,删除的时候就有值了, 上面过滤了之后可能是空的
590
+ refsList.unshift(newRefs.refs[0]);
591
+ }
592
+ }
586
593
  }
587
594
 
588
595
  // 如果是entity就需要在单独,查一边来修改名字
589
596
  if (node instanceof Entity) {
590
597
  // 过滤一把不需要改的信息
591
- refsList = refsList.filter((item) =>
598
+ refsList = refsList.filter((item) => (fileNode as FileNode).getEmbeddedFilePath() !== item.file || item.isDefinition === true);
592
599
  // 不再当前文件里
593
600
  // 或者在当前列表但是位置小于entity的结束位置
594
- (fileNode as FileNode).getEmbeddedFilePath() !== item.file);
601
+ }
602
+
603
+ if (node instanceof Return) {
604
+ // 过滤一下最后出去的值
605
+ refsList = refsList.filter((item) => !item.lineText.includes('return '));
595
606
  }
596
607
 
597
608
  // 如果是参数, 就需要把logic的引用 都查找出来就需要把他的父级的引用全部查找出来
@@ -606,8 +617,8 @@ const naslServer = {
606
617
  refsList = [...refsList, ...parentRefs.refs];
607
618
  }
608
619
 
609
- // 如果是参数, 就需要把logic的引用 都查找出来就需要把他的父级的引用全部查找出来
610
- if (node instanceof Param && node.parentNode instanceof View && isFind) {
620
+ // 如果是参数修改, 就需要把logic的引用 都查找出来就需要把他的父级的引用全部查找出来d
621
+ if (node instanceof Param && node.parentNode instanceof View) {
611
622
  const viewNode = node.parentNode;
612
623
  const { currentSource } = naslServer.getCurrentSource(viewNode);
613
624
  const code = currentSource.code;
@@ -622,46 +633,54 @@ const naslServer = {
622
633
  refsList = [...refsList, ...filterViewRefs];
623
634
  }
624
635
  /**
636
+ * 暂时不要了, 因为生成的结构发生了变化
625
637
  * view 因为不是嵌套的,所以不能用最前面的变量查找,所以要单独处理一下
626
638
  * 找到第一个 { 之前的变量 进行修改
627
639
  * 如果是VIew的查找,比较特殊,他查的是当前抛出的 {} 大括号前的
628
640
  * 最后一个,因为生成的规则不一样
629
641
  */
630
- if (node instanceof View) {
631
- const code = currentSource.code;
632
- const viewIndex = code.indexOf(' {');
633
- const viewRefs = await naslServer.references({
634
- file: (fileNode as FileNode).getEmbeddedFilePath(),
635
- line: lsp2tspNumber(currentSource.range.start.line),
636
- offset: lsp2tspNumber(currentSource.range.start.character + viewIndex),
637
- });
638
- refsList = [...viewRefs.refs];
639
- }
642
+ // if (node instanceof View) {
643
+ // const code = currentSource.code;
644
+ // const viewIndex = code.indexOf(' {');
645
+ // const viewRefs = await naslServer.references({
646
+ // file: (fileNode as FileNode).getEmbeddedFilePath(),
647
+ // line: lsp2tspNumber(currentSource.range.start.line),
648
+ // offset: lsp2tspNumber(currentSource.range.start.character + viewIndex),
649
+ // });
650
+ // refsList = [...viewRefs.refs];
651
+ // }
640
652
  /**
641
653
  * elements 需要查的是__elements.后面的那个内容,过滤两个为了生成内容的节点
642
654
  */
643
655
  if (node instanceof ViewElement) {
644
- const code = currentSource.code;
645
- const prefix = '__elements.';
646
- const prefixIndex = code.indexOf(prefix) !== -1 ? code.indexOf(prefix) : 0;
647
- const methodsNameIndex = prefixIndex + prefix.length;
648
- const methods = await naslServer.references({
649
- file: (fileNode as FileNode).getEmbeddedFilePath(),
650
- line: lsp2tspNumber(currentSource.range.start.line),
651
- offset: lsp2tspNumber(currentSource.range.start.character + methodsNameIndex),
652
- });
656
+ if (currentSource) {
657
+ const code = currentSource.code;
658
+ const prefix = '__elements.';
659
+ const prefixIndex = code.indexOf(prefix) !== -1 ? code.indexOf(prefix) : 0;
660
+ const methodsNameIndex = prefixIndex + prefix.length;
661
+ const methods = await naslServer.references({
662
+ file: (fileNode as FileNode).getEmbeddedFilePath(),
663
+ line: lsp2tspNumber(currentSource.range.start.line),
664
+ offset: lsp2tspNumber(currentSource.range.start.character + methodsNameIndex),
665
+ });
666
+ const methodRefs: tsProtocol.ReferencesResponseItem[] = [];
667
+ methods.refs.forEach((item) => {
668
+ // 定义里的格式,在删除的时候留下来占位
669
+ // 重命名的时候会过滤
653
670
 
654
- const methodRefs = methods.refs.filter((item) => {
655
- if (item.lineText.includes('__elements.') && item.lineText.includes('new nasl.ui.')) {
656
- return false;
657
- }
658
- if (item.lineText.includes(': <nasl.ui.')) {
659
- return false;
660
- }
661
- return true;
662
- });
663
- refsList = [...methodRefs];
671
+ // 这里只过滤 __elements.button = new nasl.ui.Button<any>这种格式
672
+ // if (item.lineText.includes('__elements.') && item.lineText.includes('new nasl.ui.'))
673
+ // return false;
674
+ // 处理声明组件名可能重复的问题, 查找引用不提示
675
+ const find = methodRefs.find((findItem) => item.lineText === findItem.lineText && item.lineText.includes(': nasl.ui.'));
676
+ if (!find) {
677
+ methodRefs.push(item);
678
+ }
679
+ });
680
+ refsList = [...methodRefs];
681
+ }
664
682
  }
683
+ console.log(refsList, 'refsList');
665
684
  return refsList;
666
685
  },
667
686
  /**
@@ -679,13 +698,17 @@ const naslServer = {
679
698
  const fileNode = this.file2NodeMap.get(record.file);
680
699
  if (!fileNode)
681
700
  return null;
682
- const minRange: reNameMinRange = this._findMinRange(record, fileNode.sourceMap);
701
+ const minRange: reNameMinRange = this._findMinRange(record, fileNode as FileNode);
683
702
  if (minRange) {
684
703
  // 如果节点是TypeAnnotation类型,
685
704
  // 很复杂,可能是多级嵌套结构
686
705
  // 不一定只修改typeName
687
706
  if (minRange.node instanceof TypeAnnotation) {
688
707
  // console.log(record);
708
+ // 如果是fake的逻辑,内部的重命名都不需要修改
709
+ // if ((minRange.node?.parentNode as any).logic && (minRange.node?.parentNode as any).logic?.fake) {
710
+ // return null;
711
+ // }
689
712
  minRange.setTypeMethods = 'setTypeName';
690
713
  }
691
714
  // 如果节点是logic修改引发calllogic修改
@@ -693,11 +716,11 @@ const naslServer = {
693
716
  minRange.setTypeMethods = 'setCalleeName';
694
717
  }
695
718
  if (minRange.node instanceof CallLogic && node instanceof ViewElement) {
696
- minRange.setTypeMethods = 'setCalleeName';
719
+ minRange.setTypeMethods = 'setCalleeNamespace';
697
720
  minRange.newValue = 'elements.' + newValue + '.logics';
698
721
  }
699
722
  // 如果节点是实体修改引发calllogic修改
700
- if (minRange.node instanceof CallLogic && (node instanceof Entity || node instanceof View)) {
723
+ if (minRange.node instanceof CallLogic && (node instanceof Entity || node instanceof View || node instanceof Process || node instanceof ProcessElement)) {
701
724
  // 匹配到的内容,当前这一行的内容;
702
725
  // 因为要用下面的点位信息
703
726
  /**
@@ -719,26 +742,29 @@ const naslServer = {
719
742
  const end = record.end.offset - index - 1;
720
743
  // 新的完整的value
721
744
  let newTsNameSpace = tsCalleeNamespace.substring(0, start) + newValue + tsCalleeNamespace.substring(end, tsCalleeNamespace.length);
722
- newTsNameSpace = newTsNameSpace.replace(/.$/g, '.');
745
+ newTsNameSpace = newTsNameSpace.replace(/.\$/g, '.');
723
746
  minRange.setTypeMethods = 'setCalleeNamespace';
724
747
  minRange.newValue = newTsNameSpace;
725
748
  }
726
749
  // 如果参数修改影响了 callLogic
727
750
  if (minRange.node instanceof CallLogic && node instanceof Param) {
751
+ return null;
728
752
  // 逻辑第几个位置发生修改,对应的calllogic对应位置的内容要进行修改
729
- const nodeArguments = minRange.node.arguments;
730
- const LogicNode = node.parentNode;
731
- const paramIndex = (LogicNode as Logic).params.findIndex((param) => param === node);
732
- console.log(node, nodeArguments);
733
- if (paramIndex !== -1) {
734
- minRange.setTypeMethods = 'setArgumentName';
735
- minRange.newValue = {
736
- argument: nodeArguments[paramIndex],
737
- newKeyword: newValue,
738
- };
739
- } else {
740
- return null;
741
- }
753
+ // minRange.setTypeMethods = 'setArgumentName';
754
+ // const nodeArguments = minRange.node.arguments;
755
+ // minRange.newValue = [...nodeArguments];
756
+ // const LogicNode = node.parentNode;
757
+ // const paramIndex = (LogicNode as Logic).params.findIndex((param) => param === node);
758
+ // console.log(node, nodeArguments);
759
+ // if (paramIndex !== -1) {
760
+ // minRange.setTypeMethods = 'setArgumentName';
761
+ // minRange.newValue = {
762
+ // argument: nodeArguments[paramIndex],
763
+ // newKeyword: newValue,
764
+ // };
765
+ // } else {
766
+ // return null;
767
+ // }
742
768
  }
743
769
  // 如果节点是Identifier表达式
744
770
  if (minRange.node instanceof Identifier) {
@@ -760,6 +786,11 @@ const naslServer = {
760
786
  minRange.newValue = newTextValue;
761
787
  }
762
788
  }
789
+ // 如果是枚举修改,枚举的值刚好在Identifier 中选了 就修改值
790
+ if (minRange.node instanceof Identifier && node instanceof Enum) {
791
+ minRange.newValue = newValue;
792
+ minRange.setTypeMethods = 'setName';
793
+ }
763
794
  // 如果修改逻辑,改到了Identifier表达式,只能说明是在属性里有使用了
764
795
  if (minRange.node instanceof Identifier && node instanceof Logic) {
765
796
  minRange.newValue = newValue;
@@ -767,19 +798,26 @@ const naslServer = {
767
798
  }
768
799
  // 如果节点是MemberExpression表达式
769
800
  if (minRange.node instanceof MemberExpression) {
770
- // 匹配到的内容,当前这一行的内容;
771
- // 因为要用下面的点位信息
772
- const a = record.lineText;
773
- // 之前的内容
774
- const oldValue = minRange.node.getValue();
775
- const index = a.indexOf(oldValue);
776
- const start = record.start.offset - index - 1;
777
- const end = record.end.offset - index - 1;
778
- const newTextValue = oldValue.substring(0, start) + newValue + oldValue.substring(end, oldValue.length);
779
- // MemberExpression可能改的是多层中的某一个
780
- // 倒序, 对比看是哪里发生了修改
781
- // 比较特殊就把新匹配到的值返回内部自己看要改那个地方的值
782
- minRange.newValue = newTextValue;
801
+ // 枚举key的特殊性,因为它不是原来的key+value形式的
802
+ // 是加了中括号啥的,所以直接赋值新值
803
+ if (node instanceof EnumItem) {
804
+ const newTextValue = node.parentNode.name + '.' + newValue;
805
+ minRange.newValue = newTextValue;
806
+ } else {
807
+ // 匹配到的内容,当前这一行的内容;
808
+ // 因为要用下面的点位信息
809
+ const a = record.lineText;
810
+ // 之前的内容
811
+ const oldValue = minRange.node.getValue();
812
+ const index = a.indexOf(oldValue);
813
+ const start = record.start.offset - index - 1;
814
+ const end = record.end.offset - index - 1;
815
+ const newTextValue = oldValue.substring(0, start) + newValue + oldValue.substring(end, oldValue.length);
816
+ // MemberExpression可能改的是多层中的某一个
817
+ // 倒序, 对比看是哪里发生了修改
818
+ // 比较特殊就把新匹配到的值返回内部自己看要改那个地方的值
819
+ minRange.newValue = newTextValue;
820
+ }
783
821
  }
784
822
  // 如果是修改实体,引发节点依赖实体发生改变的
785
823
  if (minRange.node instanceof EntityProperty && node instanceof Entity) {
@@ -837,7 +875,12 @@ const naslServer = {
837
875
  // 如果是view也需要加前缀
838
876
  // logic 和 views名称修改 可能会触发bindEvent修改
839
877
  if (minRange.node instanceof BindEvent) {
840
- /**
878
+ // 页面逻辑直接赋值就可以, 因为是相对路径
879
+ if ((node instanceof ViewElement)) {
880
+ minRange.setTypeMethods = 'setCalleeNamespace';
881
+ minRange.newValue = 'elements.' + newValue + '.logics';
882
+ } else {
883
+ /**
841
884
  * 如果namespce是 'app.views.Student.views.404.views.505.views.update'
842
885
  * 在ts中会是'app.views.Student.views.$404.views.$505.views.update'
843
886
  * 但是505 要改名为 666 ,要存的是666
@@ -846,25 +889,45 @@ const naslServer = {
846
889
  * 2.在匹配到的内容中取转后的namespace的位置
847
890
  * 3.然后把namespace中的 $替换成 ''
848
891
  */
849
- const tsCalleeNamespace = minRange.node.tsCalleeNamespace;
850
- const tsName = minRange.node.tsName;
851
- const oldValue = tsCalleeNamespace + '.' + tsName;
852
- // 先看下标位置
853
- const lineText = record.lineText;
854
- const index = lineText.indexOf(oldValue);
855
- // 在把开始结束位置的-开始位置,来知道是哪里要替换
856
- const start = record.start.offset - index - 1;
857
- const end = record.end.offset - index - 1;
858
- // 新的完整的value
859
- if (start > tsCalleeNamespace.length) {
860
- minRange.setTypeMethods = 'setCalleeName';
861
- minRange.newValue = newValue;
862
- } else {
892
+ const tsCalleeNamespace = minRange.node.tsCalleeNamespace;
893
+ const oldValue = tsCalleeNamespace;
894
+
895
+ // 先看下标位置
896
+ const lineText = record.lineText;
897
+ const index = lineText.indexOf(oldValue);
898
+
899
+ // 在把开始结束位置的-开始位置,来知道是哪里要替换
900
+ const start = record.start.offset - index - 1;
901
+ const end = record.end.offset - index - 1;
902
+
863
903
  // 新的完整的value
864
- let newTsNameSpace = tsCalleeNamespace.substring(0, start) + newValue + tsCalleeNamespace.substring(end, tsCalleeNamespace.length);
865
- minRange.setTypeMethods = 'setCalleeNamespace';
866
- newTsNameSpace = newTsNameSpace.replace(/\.\$/g, '.');
867
- minRange.newValue = newTsNameSpace;
904
+ if (start > tsCalleeNamespace.length) {
905
+ minRange.setTypeMethods = 'setCalleeName';
906
+ minRange.newValue = newValue;
907
+ } else {
908
+ // 新的完整的value
909
+ let newTsNameSpace = tsCalleeNamespace.substring(0, start) + newValue + tsCalleeNamespace.substring(end, tsCalleeNamespace.length);
910
+ minRange.setTypeMethods = 'setCalleeNamespace';
911
+ newTsNameSpace = newTsNameSpace.replace(/\.\$/g, '.');
912
+ minRange.newValue = newTsNameSpace;
913
+ }
914
+ }
915
+ }
916
+ if (minRange.node instanceof Destination && node instanceof Param) {
917
+ // 因为view是key value 绑定所以需要重新赋值
918
+ if (node.parentNode instanceof View) {
919
+ const nodeArguments = minRange.node.arguments;
920
+ const findArgument = nodeArguments.find((item) => node.name === item.keyword);
921
+ if (findArgument) {
922
+ minRange.setTypeMethods = 'setArgumentsKeyWord';
923
+ minRange.newValue = {
924
+ findArgument,
925
+ newKeyword: newValue,
926
+ };
927
+ }
928
+ } else {
929
+ // 如果是修改param查找到Destination就不操作
930
+ return null;
868
931
  }
869
932
  }
870
933
  if (minRange.node instanceof Interface && node instanceof Logic) {
@@ -880,13 +943,35 @@ const naslServer = {
880
943
  const newBindRoles = str.split(',');
881
944
  minRange.newValue = newBindRoles;
882
945
  }
946
+ // 修改枚举值找到了EntityProperty就说明给了默认值
947
+ if (minRange.node instanceof EntityProperty && node instanceof EnumItem) {
948
+ minRange.setTypeMethods = 'setDefaultValue';
949
+ }
950
+ if (minRange.node instanceof QueryFieldExpression && node instanceof Entity) {
951
+ minRange.setTypeMethods = 'setEntityAsName';
952
+ }
953
+
954
+ if ((minRange.node instanceof QueryFromExpression || minRange.node instanceof QueryJoinExpression) && node instanceof Entity) {
955
+ minRange.setTypeMethods = 'setEntityName';
956
+ }
957
+ if (minRange.node instanceof QueryFieldExpression && node instanceof EntityProperty) {
958
+ minRange.setTypeMethods = 'setPropertyName';
959
+ }
960
+
961
+ // 如果跳转链接或者页面变量同一个param和TypeAnnotation 有两个过滤掉一个
962
+ if ((minRange.node instanceof Param || minRange.node instanceof Variable || minRange.node instanceof Return) && (node instanceof Entity || node instanceof Enum || node instanceof Structure)) {
963
+ return null;
964
+ }
965
+ if (minRange.node instanceof Destination && (node instanceof Process || node instanceof ProcessElement)) {
966
+ return null;
967
+ }
883
968
  // 枚举修改枚举名,比较特殊
884
969
  if (minRange.node instanceof EnumItem && node instanceof Enum) {
885
970
  // 什么都不做,用来跳过修改
886
971
  return null;
887
972
  }
888
- // 如果是修改param查找到logic就不操作
889
- if (minRange.node instanceof Logic && node instanceof Param) {
973
+ // params修改 查找bindevent不需要修改
974
+ if (minRange.node instanceof BindEvent && node instanceof Param) {
890
975
  return null;
891
976
  }
892
977
  // 如果是子页面修改
@@ -894,8 +979,39 @@ const naslServer = {
894
979
  if (minRange.node instanceof View && node instanceof View && minRange.node !== node) {
895
980
  return null;
896
981
  }
982
+ /**
983
+ * 屏蔽组件生成内容块中的变量或者逻辑,出现在表格选择中。在bindAttr中还会有,所以过滤一把
984
+ */
985
+ if ((minRange.node instanceof Identifier || minRange.node instanceof MemberExpression) && node instanceof Param && minRange.node.parentNode instanceof BindAttribute) {
986
+ return null;
987
+ }
988
+ // 修改element引发view改名
989
+ if (node instanceof ViewElement && minRange.node instanceof View) {
990
+ return null;
991
+ }
992
+ // params修改 查找View不需要修改
897
993
  // 逻辑改名,触发了在定义里面的,element定义,的值,直接掠过
898
- if (minRange.node instanceof View && node instanceof Logic) {
994
+ if (minRange.node instanceof View && (node instanceof Logic || node instanceof Param)) {
995
+ /**
996
+ * 这里过滤一下,一些查找引用,重复的内容,直接屏蔽掉,防止操作重复
997
+ * 因为在生成的时候 ,可能弄了一些副作用的引用
998
+ */
999
+ // 本来是想在上面过滤一把的先放到这里匹配这两个的时候 就会找到
1000
+ // refsList = refsList.filter((item) => {
1001
+ // 屏蔽组件查找查到定义这里,也过滤一下
1002
+ // if (item.lineText.includes(': nasl.ui.'))
1003
+ // return false;
1004
+ // return true;
1005
+ // });
1006
+ return null;
1007
+ }
1008
+ /**
1009
+ * 理论上 logic setName只能自己触发,别的地方查到引用都不用重命名
1010
+ * 流程改名不触发Logic改名
1011
+ * 如果是修改param查找到logic就不操作
1012
+ * 除非想在内部修改别的内容所以暂时屏蔽掉
1013
+ */
1014
+ if (minRange.node instanceof Logic && node !== minRange.node) {
899
1015
  return null;
900
1016
  }
901
1017
  } else {
@@ -912,40 +1028,82 @@ const naslServer = {
912
1028
  },
913
1029
  _addParamsPrepare(node: BaseNode, refsList: any[]) {
914
1030
  const App = node.rootNode;
915
- const LogicNode = node.parentNode as Logic;
1031
+ const parantNode = node.parentNode as Logic | View;
916
1032
  // 收集修改
917
1033
  App.emit('collect:start', {
918
1034
  actionMsg: '增加逻辑参数',
919
1035
  });
920
1036
  node.create({
921
1037
  index: 0,
922
- parentNode: LogicNode,
1038
+ parentNode: parantNode,
923
1039
  parentKey: node.parentKey,
924
1040
  });
925
1041
  refsList.forEach((record) => {
926
1042
  const fileNode = this.file2NodeMap.get(record.file);
927
1043
  if (!fileNode)
928
1044
  return null;
929
- const minRange: MinRange = this._findMinRange(record, fileNode.sourceMap);
1045
+ const minRange: MinRange = this._findMinRange(record, fileNode as FileNode);
930
1046
  if (minRange) {
931
1047
  // 如果找到节点是callLogic就去更新
932
1048
  if (minRange.node instanceof CallLogic && node instanceof Param) {
933
- minRange.node.setCalleeArgName(LogicNode);
1049
+ minRange.node.setCalleeArgName((parantNode) as Logic);
1050
+ }
1051
+ // 如果节点参数增加页面也要更新
1052
+ if (minRange.node instanceof Destination && node instanceof Param) {
1053
+ minRange.node.setViewArgument((parantNode) as View);
934
1054
  }
935
1055
  }
936
1056
  });
937
1057
  // 结束修改 ,批量操作
938
1058
  App.emit('collect:end');
939
1059
  },
1060
+ // 查找引用
1061
+ async findReferences(node: BaseNode) {
1062
+ let refsList = await naslServer._isHaveRef(node);
1063
+ // 如果查找引用查到自己里面的引用不展示
1064
+ refsList = refsList.filter((item) => {
1065
+ // 自己引用自己的过滤掉
1066
+ // 删除的时候过滤一把组件删除提示
1067
+ // 展示组件自己屏蔽掉
1068
+ return !item.isDefinition && !(item.lineText.includes(' = new nasl.ui.'));
1069
+ });
1070
+ // 最后返回的结果
1071
+ let result = new Map();
1072
+ // 树的构造,key: 一个file的node, 值是 [[logic, params],[logic, returns]]
1073
+ const resMap = new Map<BaseNode, Array<Array<QuoteNode>>>();
1074
+ // 普通节点和要输出的节点做一个映射,为了引用地址一样
1075
+ const nodeMap = new Map<BaseNode, QuoteNode>();
1076
+ try {
1077
+ refsList.forEach((record) => {
1078
+ const fileNode = this.file2NodeMap.get(record.file);
1079
+ if (!fileNode)
1080
+ return;
1081
+ const minRange = this._findMinRange(record, fileNode as FileNode);
1082
+ // 过滤一把不需要改的信息
1083
+ if (minRange) {
1084
+ // 拼装树
1085
+ naslServer._getTreeMap(minRange, fileNode, resMap, nodeMap);
1086
+ }
1087
+ });
1088
+ console.log(resMap, 'resMap');
1089
+ if (resMap.size > 0) {
1090
+ result = naslServer.handleTreeMap(resMap);
1091
+ }
1092
+ } catch (err) {
1093
+ console.log(err);
1094
+ }
1095
+ console.log(result);
1096
+ return result;
1097
+ },
940
1098
  // 获取节点的上层渲染
941
- _getTreeMap(minRange: MinRange, fileNode: BaseNode, resMap: ResMap) {
1099
+ _getTreeMap(minRange: MinRange, fileNode: BaseNode, resMap: Map<BaseNode, Array<Array<QuoteNode>>>, nodeMap: Map<BaseNode, QuoteNode>) {
942
1100
  const minRangeNode = minRange.node;
943
1101
  let parantNode = minRangeNode;
944
1102
  // 顺序队列
945
1103
  const queue: any[] = [];
946
1104
  // 先插入自己,如果没有在往上找,
947
1105
  // 一直到file节点的父级
948
- while (parantNode !== fileNode.parentNode) {
1106
+ while (!(parantNode instanceof App)) {
949
1107
  // 找到上一级 在map对象中构造出他的子集
950
1108
  const currentNode = parantNode;
951
1109
  parantNode = parantNode.parentNode;
@@ -953,11 +1111,12 @@ const naslServer = {
953
1111
  // 因为部分节点没有name,先过滤掉
954
1112
  // if (currentNode.name) {
955
1113
  // }
956
-
957
1114
  // 排除一些不放入集合的节点
958
1115
  let isNeedPush = true;
959
1116
  // 如果不是ViewElement 或者 Assignment , 或者如果是的话, 排除l-root
960
- if (currentNode instanceof ViewElement && (currentNode as ViewElement).tag !== 'l-root')
1117
+ if (currentNode instanceof ViewElement && (currentNode as ViewElement).tag === 'l-root')
1118
+ isNeedPush = false;
1119
+ else if (currentNode instanceof Argument)
961
1120
  isNeedPush = false;
962
1121
  else if (currentNode instanceof Assignment)
963
1122
  isNeedPush = false;
@@ -967,13 +1126,11 @@ const naslServer = {
967
1126
  isNeedPush = false;
968
1127
  else if (currentNode instanceof QueryFromExpression)
969
1128
  isNeedPush = false;
970
- else if ((currentNode.concept === parantNode.concept) || (currentNode.name === parantNode.name))
971
- isNeedPush = false;
1129
+ // 需要放到数组中
972
1130
  if (isNeedPush) {
973
1131
  // 名称
974
- let name = currentNode.name || currentNode.concept;
975
1132
  // 赋值图标
976
- let icon = currentNode.concept && currentNode.concept.replace(/^./, (m) => m.toLowerCase());
1133
+ let icon = '';
977
1134
  if (currentNode instanceof ViewElement)
978
1135
  icon = 'element';
979
1136
  else if (currentNode instanceof BindAttribute)
@@ -982,55 +1139,34 @@ const naslServer = {
982
1139
  icon = 'logicNode';
983
1140
  else if (currentNode instanceof CallLogic) {
984
1141
  icon = 'interface';
985
- name = '调用逻辑';
986
1142
  }
987
- queue.unshift({ name, node: currentNode, expanded: true, icon });
1143
+
1144
+ // 相同节点使用一个引用
1145
+ if (nodeMap.get(currentNode)) {
1146
+ queue.unshift(nodeMap.get(currentNode));
1147
+ } else {
1148
+ const quoteNode: QuoteNode = { node: currentNode, expanded: true, icon };
1149
+ nodeMap.set(currentNode, quoteNode);
1150
+ queue.unshift(quoteNode);
1151
+ }
988
1152
  }
989
1153
  }
990
1154
 
991
- const key = fileNode.name;
992
1155
  // 一个logic 或者 view可能会有多个顺序队列
993
- if (resMap[key]) {
994
- // // 是否展示两个内容全等,但是两个queue的node可能不一样,但是只需要展示一个
995
- // let equalFlag = false;
996
- // const queues = resMap[key].queue;
997
- // queues.forEach((item) => {
998
- // if (item.length === queue.length) {
999
- // let equalIndex = 0;
1000
- // item.forEach((queueItem, index) => {
1001
- // if (queueItem.name === queue[index].name)
1002
- // equalIndex++;
1003
- // });
1004
- // console.log(equalIndex)
1005
- // if (equalIndex === queue.length)
1006
- // equalFlag = true;
1007
- // }
1008
- // });
1009
-
1010
- // // 如果有值就return
1011
- // if (equalFlag)
1012
- // return;
1013
- queue.length && resMap[key].queue.push(queue);
1156
+ if (resMap.get(fileNode)) {
1157
+ // 是否展示两个内容全等,但是两个queue的node可能不一样,但是只需要展示一个
1158
+ resMap.get(fileNode).push(queue);
1014
1159
  } else {
1015
- resMap[key] = {
1016
- queue: queue.length ? [queue] : [],
1017
- concept: fileNode.concept,
1018
- name: fileNode.name,
1019
- node: fileNode,
1020
- };
1160
+ resMap.set(fileNode, [queue]);
1021
1161
  }
1022
1162
  },
1023
- handleTreeMap(tree: ResMap) {
1024
- const treeNodeMap: treeNode = {};
1025
- for (const [sub, val] of Object.entries(tree)) {
1163
+ handleTreeMap(resMap: Map<BaseNode, Array<Array<QuoteNode>>>) {
1164
+ const treeNodeMap = new Map();
1165
+ resMap.forEach((value, fileNode) => {
1026
1166
  // 循环处理tree的queue
1027
- const treeObj = naslServer.handleTreeQueue(val.queue);
1028
- if (treeNodeMap[val.concept]) {
1029
- treeNodeMap[val.concept].push(treeObj);
1030
- } else {
1031
- treeNodeMap[val.concept] = [treeObj];
1032
- }
1033
- }
1167
+ const treeObj = naslServer.handleTreeQueue(value);
1168
+ treeNodeMap.set(fileNode, treeObj);
1169
+ });
1034
1170
  return treeNodeMap;
1035
1171
  },
1036
1172
  /**
@@ -1039,30 +1175,26 @@ const naslServer = {
1039
1175
  * @param arr 当前页面下的queue的二维数组,一个数组下有多条链路
1040
1176
  * @returns 最后要使用到的节点和对应的子集
1041
1177
  */
1042
- handleTreeQueue(arr: QuoteNode[][]) {
1043
- const map: { [propName: string]: QuoteNode[] } = {};
1044
- let root: null | QuoteNode = null;
1045
- if (!arr.length)
1178
+ handleTreeQueue(queueLists: Array<Array<QuoteNode>>) {
1179
+ const map = new Map<QuoteNode, Array<QuoteNode>>();
1180
+ let root: QuoteNode = null;
1181
+ if (!queueLists.length)
1046
1182
  return;
1047
- for (const sub of arr) {
1183
+ for (const queueList of queueLists) {
1048
1184
  let preNode = null;
1049
- for (const item of sub) {
1050
- const node = item;
1051
- const key = item.name;
1052
-
1053
- if (!map[key]) {
1054
- map[key] = [];
1185
+ for (const queueItem of queueList) {
1186
+ if (!map.get(queueItem)) {
1187
+ map.set(queueItem, []);
1055
1188
  }
1056
1189
  if (preNode) {
1057
- const preKey = preNode.name;
1058
- const find = map[preKey].find((item) => node.name === item.name);
1190
+ const find = map.get(preNode).find((item: QuoteNode) => item === queueItem);
1059
1191
  if (!find) {
1060
- map[preKey].push(node);
1192
+ map.get(preNode).push(queueItem);
1061
1193
  }
1062
1194
  } else {
1063
- root = node;
1195
+ root = queueItem;
1064
1196
  }
1065
- preNode = node;
1197
+ preNode = queueItem;
1066
1198
  }
1067
1199
  }
1068
1200
  const children = naslServer._recursionCreateResult(root, map);
@@ -1074,14 +1206,12 @@ const naslServer = {
1074
1206
  * @param map 当前所有节点的map对象
1075
1207
  * @returns 当前节点,最后输出所有节点
1076
1208
  */
1077
- _recursionCreateResult(root: QuoteNode, map: { [propName: string]: QuoteNode[] }) {
1078
- const node = root;
1079
- const rootKey = root.name;
1080
- const children = map[rootKey].map((item: QuoteNode) => naslServer._recursionCreateResult(item, map));
1209
+ _recursionCreateResult(root: QuoteNode, map: Map<QuoteNode, Array<QuoteNode>>) {
1210
+ const children = map.get(root).map((item: QuoteNode) => naslServer._recursionCreateResult(item, map));
1081
1211
  if (children && children.length) {
1082
- node.children = children;
1212
+ root.children = children;
1083
1213
  }
1084
- return node;
1214
+ return root;
1085
1215
  },
1086
1216
 
1087
1217
  /**
@@ -1089,12 +1219,13 @@ const naslServer = {
1089
1219
  * 当前this上下文 的Source 和 父级文件级别的节点
1090
1220
  */
1091
1221
  getCurrentSource(node: BaseNode) {
1222
+ if (node instanceof App || node instanceof Theme)
1223
+ return { fileNode: null };
1092
1224
  let sourceMap = node.sourceMap;
1093
1225
  let fileNode = node;
1094
1226
  // 如果没有sourceMap,就继续向上找 ,或者到module结束
1095
1227
  // 如果 节点找到 app 或者module 停止
1096
-
1097
- while (!sourceMap && fileNode && !(fileNode.parentNode instanceof App) && !(fileNode.parentNode instanceof Module)) {
1228
+ while (!sourceMap && fileNode && !(fileNode.parentNode instanceof App) && !(fileNode.parentNode instanceof Module) && !(fileNode instanceof View)) {
1098
1229
  fileNode = fileNode.parentNode;
1099
1230
  sourceMap = fileNode?.sourceMap;
1100
1231
  }
@@ -1117,7 +1248,6 @@ const naslServer = {
1117
1248
  // 获取element方法的可选值
1118
1249
  getFieldKeySelectCompletion(node: BaseNode, fieldKey?: string) {
1119
1250
  const { currentSource, fileNode } = naslServer.getCurrentSource(node);
1120
- console.log(currentSource);
1121
1251
  if (currentSource && fileNode) {
1122
1252
  return naslServer._getFieldKeySelectCompletion({
1123
1253
  file: (fileNode as FileNode).getEmbeddedFilePath(),
@@ -1165,11 +1295,49 @@ async function handleDelete(fileNode: BaseNode, targetNode: BaseNode, result: Re
1165
1295
  // 更新文件之后
1166
1296
  await naslServer.updateFiles({ outputFiles });
1167
1297
 
1168
- const filesToCheck: Set<string> = new Set();
1169
1298
  newRefs.refs.forEach((ref) => filesToCheck.add(ref.file));
1170
- console.log('filesToCheck', filesToCheck, filesToCheck.size);
1171
- await naslServer.getDiagnosticRecordsAndPushAll(Array.from(filesToCheck));
1172
1299
  }
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
+ };
1173
1341
  // 查找引用
1174
1342
  BaseNode.prototype.findUsage = function findUsage() {
1175
1343
  try {
@@ -1195,7 +1363,7 @@ BaseNode.prototype.changeName = async function changeName(newValue: string, upda
1195
1363
  */
1196
1364
  const res = naslServer._renamePrepare(this, refsList, newValue);
1197
1365
  if (res.length <= 1) {
1198
- (this as setNameNode).setName(newValue);
1366
+ (this as SetNameNode).setName(newValue);
1199
1367
  } else {
1200
1368
  const callback = (value: boolean) => {
1201
1369
  if (value) {
@@ -1205,7 +1373,7 @@ BaseNode.prototype.changeName = async function changeName(newValue: string, upda
1205
1373
  actionMsg: '重命名并更新引用',
1206
1374
  });
1207
1375
  res.forEach((item) => {
1208
- const itemNode = item.node as setNameNode;
1376
+ const itemNode = item.node as SetNameNode;
1209
1377
  if (item.newValue) {
1210
1378
  // 如果有指定的修改方法,就用那个,没有就修改名字
1211
1379
  item.setTypeMethods ? itemNode[item.setTypeMethods](item.newValue) : itemNode.setName?.(item.newValue);
@@ -1216,12 +1384,13 @@ BaseNode.prototype.changeName = async function changeName(newValue: string, upda
1216
1384
  // 结束修改 ,批量操作
1217
1385
  App.emit('collect:end');
1218
1386
  } else {
1219
- (this as setNameNode).setName(newValue);
1387
+ (this as SetNameNode).setName(newValue);
1220
1388
  }
1221
1389
  };
1222
1390
  const confirmParms = {
1223
1391
  actionType: 'rename',
1224
1392
  node: this,
1393
+ newValue,
1225
1394
  };
1226
1395
  /**
1227
1396
  * nasl和vue的通信,回退,要触发vue的watch。
@@ -1229,11 +1398,19 @@ BaseNode.prototype.changeName = async function changeName(newValue: string, upda
1229
1398
  * 先修改之
1230
1399
  */
1231
1400
  const closeCallBack = () => {
1232
- const oldValue = this.name;
1233
- this.name = oldValue + ' ';
1234
- setTimeout(() => {
1235
- this.name = oldValue;
1236
- }, 0);
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
+ }
1237
1414
  };
1238
1415
  updateAll ? callback(true) : invokeCommand('tsConfirm.open', confirmParms, callback, closeCallBack);
1239
1416
 
@@ -1253,15 +1430,39 @@ BaseNode.prototype.prepareDelete = async function prepareDelete() {
1253
1430
  * 查找这个节点是不是有依赖
1254
1431
  */
1255
1432
  const node = this;
1256
- const refsList = await naslServer._isHaveRef(node);
1257
- // console.log(refsList, 'refsList');
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的弹框展示
1258
1453
  const confirmParms = {
1259
1454
  actionType: 'delete',
1260
1455
  tipFlag: false,
1261
1456
  node,
1457
+ icon: 'warning',
1262
1458
  };
1263
1459
  let callback = null;
1264
1460
  if (refsList.length <= 1) {
1461
+ // 页面组件直接删除然后return
1462
+ if (node instanceof ViewElement) {
1463
+ this.delete();
1464
+ return;
1465
+ }
1265
1466
  callback = () => {
1266
1467
  // Structure 和 Interface是内部有delete方法
1267
1468
  if (node instanceof Structure || node instanceof Interface) {
@@ -1274,12 +1475,27 @@ BaseNode.prototype.prepareDelete = async function prepareDelete() {
1274
1475
  // 如果有依赖就有一个查找引用提示
1275
1476
  confirmParms.tipFlag = true;
1276
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
+ }
1277
1493
  callback = () => {
1278
1494
  // removeParam
1279
1495
  // 跟rename 还不太一样,部分修改依赖修改好的值,然后在下面的修改需要把自己传递进去
1280
1496
  if (node instanceof Param) {
1281
1497
  const App = this.rootNode;
1282
- const logicNode = this.parentNode;
1498
+ const parentNode = this.parentNode;
1283
1499
  // 收集修改
1284
1500
  App.emit('collect:start', {
1285
1501
  actionMsg: '删除参数',
@@ -1289,10 +1505,13 @@ BaseNode.prototype.prepareDelete = async function prepareDelete() {
1289
1505
  const fileNode = naslServer.file2NodeMap.get(record.file);
1290
1506
  if (!fileNode)
1291
1507
  return null;
1292
- const minRange: MinRange = naslServer._findMinRange(record, fileNode.sourceMap);
1508
+ const minRange: MinRange = naslServer._findMinRange(record, fileNode as FileNode);
1293
1509
  if (minRange) {
1294
1510
  if (minRange.node instanceof CallLogic) {
1295
- minRange.node.setCalleeArgName(logicNode as Logic);
1511
+ minRange.node.setCalleeArgName(parentNode as Logic);
1512
+ }
1513
+ if (minRange.node instanceof Destination) {
1514
+ minRange.node.setViewArgument(parentNode as View);
1296
1515
  }
1297
1516
  }
1298
1517
  });
@@ -1312,7 +1531,7 @@ BaseNode.prototype.prepareDelete = async function prepareDelete() {
1312
1531
  const fileNode = naslServer.file2NodeMap.get(record.file);
1313
1532
  if (!fileNode)
1314
1533
  return null;
1315
- const minRange: MinRange = naslServer._findMinRange(record, fileNode.sourceMap);
1534
+ const minRange: MinRange = naslServer._findMinRange(record, fileNode as FileNode);
1316
1535
  if (minRange) {
1317
1536
  if (minRange.node instanceof Interface) {
1318
1537
  minRange.node.delete();
@@ -1321,6 +1540,7 @@ BaseNode.prototype.prepareDelete = async function prepareDelete() {
1321
1540
  });
1322
1541
  // 结束修改 ,批量操作
1323
1542
  App.emit('collect:end');
1543
+ return;
1324
1544
  }
1325
1545
  // 删除权限节点
1326
1546
  if (node instanceof Role) {
@@ -1334,7 +1554,7 @@ BaseNode.prototype.prepareDelete = async function prepareDelete() {
1334
1554
  const fileNode = naslServer.file2NodeMap.get(record.file);
1335
1555
  if (!fileNode)
1336
1556
  return null;
1337
- const minRange: MinRange = naslServer._findMinRange(record, fileNode.sourceMap);
1557
+ const minRange: MinRange = naslServer._findMinRange(record, fileNode as FileNode);
1338
1558
  if (minRange) {
1339
1559
  if (minRange.node instanceof View || minRange.node instanceof ViewElement) {
1340
1560
  // oldName旧的节点存的值
@@ -1351,6 +1571,10 @@ BaseNode.prototype.prepareDelete = async function prepareDelete() {
1351
1571
  return;
1352
1572
  }
1353
1573
 
1574
+ // 删除页面或者流程,如果上一步没有return 就说明他是有别的引用的,会有引用弹框
1575
+ if (node instanceof View || node instanceof Process) {
1576
+ this.delete();
1577
+ }
1354
1578
  // 其余的都直接调用删除
1355
1579
  // Structure 和 Interface是内部有delete方法
1356
1580
  if (node instanceof Structure || node instanceof Interface) {
@@ -1400,19 +1624,22 @@ async function handleChange(fileNode: BaseNode, targetNode: BaseNode, result: Re
1400
1624
  line: EmbeddedTSFileLineMap[fileNode.concept] ?? 2,
1401
1625
  offset: 6,
1402
1626
  });
1403
- const filesToCheck: Set<string> = new Set();
1404
1627
 
1405
1628
  newRefs.refs.forEach((ref) => filesToCheck.add(ref.file));
1406
1629
  // 唤起建立连接弹框
1407
1630
  // 文件级别的建立连接采取提醒
1408
- if (fileNode === targetNode && action === 'create' && filesToCheck.size > 1) {
1409
- const confirmParms = {
1410
- actionType: 'createEstablishConnection',
1411
- node: fileNode,
1412
- };
1413
- invokeCommand('tsConfirm.open', confirmParms, () => {});
1631
+ if (action === 'create' && (targetNode as any).__init) {
1632
+ // 清除临时状态, 完成本次创建
1633
+ delete (targetNode as any).__init;
1634
+ if (fileNode === targetNode && filesToCheck.size > 1) {
1635
+ const confirmParms = {
1636
+ actionType: 'createEstablishConnection',
1637
+ node: fileNode,
1638
+ icon: 'success',
1639
+ };
1640
+ invokeCommand('tsConfirm.open', confirmParms, () => {});
1641
+ }
1414
1642
  }
1415
- await naslServer.getDiagnosticRecordsAndPushAll(Array.from(filesToCheck));
1416
1643
  }
1417
1644
 
1418
1645
  /**
@@ -1426,7 +1653,6 @@ async function handleChange(fileNode: BaseNode, targetNode: BaseNode, result: Re
1426
1653
  async function handleRename(fileNode: BaseNode, targetNode: BaseNode, result: ReturnType<Structure['toEmbeddedTSFile']>, oldFilePath?: string) {
1427
1654
  // rename 场景
1428
1655
  const outputFiles = [{ file: result.filePath, fileContent: result.code }];
1429
- const filesToCheck: Set<string> = new Set();
1430
1656
  // 如果是要修改顶级文件名
1431
1657
  // file节点和当前改得是同一节点
1432
1658
  if (fileNode === targetNode) {
@@ -1461,36 +1687,98 @@ async function handleRename(fileNode: BaseNode, targetNode: BaseNode, result: Re
1461
1687
 
1462
1688
  // 文件级别重命名,有依赖才唤起弹框
1463
1689
  // 唤起重命名,提示有连接弹框
1464
- if (newRefFileList.size > 1) {
1465
- const confirmParms = {
1466
- actionType: 'renameEstablishConnection',
1467
- node: fileNode,
1468
- };
1469
- invokeCommand('tsConfirm.open', confirmParms, () => {});
1470
- }
1690
+ // 重命名建立连接先不展示弹框了
1691
+
1692
+ // if (newRefFileList.size > 1) {
1693
+ // const confirmParms = {
1694
+ // actionType: 'renameEstablishConnection',
1695
+ // node: fileNode,
1696
+ // icon: 'success',
1697
+ // };
1698
+ // invokeCommand('tsConfirm.open', confirmParms, () => {});
1699
+ // }
1471
1700
  } else {
1472
1701
  // 查一下当前属性依赖的文件
1473
1702
  const { currentSource, fileNode } = naslServer.getCurrentSource(targetNode);
1474
- const oldRefs = await naslServer.references({
1475
- file: (fileNode as FileNode).getEmbeddedFilePath(),
1476
- line: lsp2tspNumber(currentSource.range.start.line),
1477
- offset: lsp2tspNumber(currentSource.range.start.character),
1478
- });
1479
- oldRefs.refs.forEach((ref) => filesToCheck.add(ref.file));
1480
- // 更新文件之后
1481
- await naslServer.updateFiles({ outputFiles });
1703
+ if (currentSource) {
1704
+ const oldRefs = await naslServer.references({
1705
+ file: (fileNode as FileNode).getEmbeddedFilePath(),
1706
+ line: lsp2tspNumber(currentSource.range.start.line),
1707
+ offset: lsp2tspNumber(currentSource.range.start.character),
1708
+ });
1709
+ oldRefs.refs.forEach((ref) => filesToCheck.add(ref.file));
1710
+ // 更新文件之后
1711
+ await naslServer.updateFiles({ outputFiles });
1482
1712
 
1483
- const newRefs2 = await naslServer.references({
1484
- file: (fileNode as FileNode).getEmbeddedFilePath(),
1485
- line: lsp2tspNumber(currentSource.range.start.line),
1486
- offset: lsp2tspNumber(currentSource.range.start.character),
1487
- });
1488
- newRefs2.refs.forEach((ref) => filesToCheck.add(ref.file));
1713
+ const newRefs2 = await naslServer.references({
1714
+ file: (fileNode as FileNode).getEmbeddedFilePath(),
1715
+ line: lsp2tspNumber(currentSource.range.start.line),
1716
+ offset: lsp2tspNumber(currentSource.range.start.character),
1717
+ });
1718
+ newRefs2.refs.forEach((ref) => filesToCheck.add(ref.file));
1719
+ }
1489
1720
  }
1721
+ }
1490
1722
 
1491
- console.log('filesToCheck', filesToCheck, filesToCheck.size);
1492
- await naslServer.getDiagnosticRecordsAndPushAll(Array.from(filesToCheck));
1493
- // outputFiles.map((file) => file.file));
1723
+ /**
1724
+ * 处理一些节点操作,子节点需要更新并且check的场景
1725
+ * 因为删除,新增父页面,或者重命名会一起
1726
+ * 删除或者新增view而且他有子集 就要执行同样的操作
1727
+ * @param action 当前操作类型
1728
+ * @param fileNode 文件节点
1729
+ * @param targetNode 操作节点 这里要两个相等才会走家去面对哦逻辑
1730
+ * @param oldpath 触发内容的oldpath
1731
+ */
1732
+ async function incidentalAction(action: string, fileNode: BaseNode, targetNode: BaseNode, oldpath?: string) {
1733
+ if ((action === 'create' || action === 'delete' || (action === 'update' && oldpath)) && fileNode === targetNode) {
1734
+ // 删除或者新增页面
1735
+ if (fileNode instanceof View && fileNode.children?.length) {
1736
+ const fileNodeChildren = fileNode.children;
1737
+ for (let i = 0; i < fileNodeChildren.length; i++) {
1738
+ const fileNodeItem = fileNodeChildren[i];
1739
+ const result = (fileNodeItem as FileNode).toEmbeddedTSFile();
1740
+ if (action === 'create') {
1741
+ await handleChange(fileNodeItem, fileNodeItem, result, action);
1742
+ await incidentalAction(action, fileNodeItem, fileNodeItem);
1743
+ } else if (action === 'delete') {
1744
+ await handleDelete(fileNodeItem, fileNodeItem, result);
1745
+ await incidentalAction(action, fileNodeItem, fileNodeItem);
1746
+ } else if (action === 'update' && oldpath) {
1747
+ const parentPath = oldpath.replace('.ts', '/');
1748
+ const currentOldPath = parentPath + fileNodeItem.name + '.ts';
1749
+ // 因为重命名这里只有当前修改父级的 旧名称, 所以他的子集也要根据旧名称去查依赖 更新内容
1750
+ await handleRename(fileNodeItem, fileNodeItem, result, currentOldPath);
1751
+ await incidentalAction(action, fileNodeItem, fileNodeItem, currentOldPath);
1752
+ }
1753
+ };
1754
+ }
1755
+ // 删除或新增模块
1756
+ // 需要把下面的哦内容全部都更新一遍
1757
+ if (fileNode instanceof Module) {
1758
+ const module: Module = (targetNode) as Module;
1759
+ const results: Array<ReturnType<Structure['toEmbeddedTSFile']>> = [];
1760
+ naslServer.contentToFile(module, results);
1761
+ for (let i = 0; i < results.length; i++) {
1762
+ const result = results[i];
1763
+ const node = naslServer.file2NodeMap.get(result.filePath);
1764
+ if (action === 'create') {
1765
+ await handleChange(node, node, result, action);
1766
+ } else {
1767
+ await handleDelete(node, node, result);
1768
+ }
1769
+ };
1770
+
1771
+ // 删除模块通知更新列表
1772
+ if (action === 'delete') {
1773
+ try {
1774
+ // 如果已经
1775
+ invokeCommand('module.delete', true);
1776
+ } catch (err) {
1777
+ console.log('module.delete', '组件销毁了,不用唤起了');
1778
+ }
1779
+ }
1780
+ }
1781
+ }
1494
1782
  }
1495
1783
 
1496
1784
  async function receiveHandleChange($event: EventPayload) {
@@ -1500,7 +1788,11 @@ async function receiveHandleChange($event: EventPayload) {
1500
1788
  // 当前操作的文件节点
1501
1789
  const { fileNode } = naslServer.getCurrentSource(targetNode);
1502
1790
  // 如果是导入模块就,就引入对应模块,先不处理module和Configuration,下面的内容会自动创建
1503
- if (fileNode instanceof Module || fileNode instanceof Configuration) {
1791
+ if (!fileNode || fileNode instanceof Module || fileNode instanceof Configuration) {
1792
+ // module单独处理
1793
+ if (fileNode instanceof Module) {
1794
+ await incidentalAction(action, fileNode, targetNode);
1795
+ }
1504
1796
  return;
1505
1797
  }
1506
1798
 
@@ -1520,25 +1812,50 @@ async function receiveHandleChange($event: EventPayload) {
1520
1812
 
1521
1813
  fileNode.sourceMap = result.sourceMap;
1522
1814
  if (action === 'update' || action === 'create') {
1523
- if ($event?.field !== 'name')
1815
+ if ($event?.field !== 'name') {
1524
1816
  await handleChange(fileNode, targetNode, result, action);
1525
- else {
1526
- await handleRename(fileNode, targetNode, result, (fileNode as FileNode).getEmbeddedFilePath($event.oldName));
1817
+ await incidentalAction(action, fileNode, targetNode);
1818
+ } else {
1819
+ const oldpath = (fileNode as FileNode).getEmbeddedFilePath($event.oldObject.name);
1820
+ await handleRename(fileNode, targetNode, result, oldpath);
1821
+ await incidentalAction(action, fileNode, targetNode, oldpath);
1527
1822
  }
1528
1823
  }
1529
1824
  // 删除
1530
1825
  if (action === 'delete') {
1826
+ await incidentalAction(action, fileNode, targetNode);
1531
1827
  await handleDelete(fileNode, targetNode, result);
1532
1828
  }
1829
+ return true;
1533
1830
  }
1534
1831
 
1535
1832
  // 监听所有改变操作
1536
1833
  embeddedTSEmitter.on('change', ($event: EventPayload) => {
1537
1834
  // 收集到一个行为集合
1538
1835
  const eventValue = $event.value;
1539
- eventValue.forEach((item: EventPayload) => {
1540
- receiveHandleChange(item.originEvent);
1836
+ const stackList: Array<EventPayload> = [];
1837
+ eventValue.forEach(async (item: EventPayload) => {
1838
+ stackList.push(item.originEvent);
1541
1839
  });
1840
+
1841
+ // 异步状态机,一个完成了在执行下一个
1842
+ function next() {
1843
+ const item = stackList.shift();
1844
+ receiveHandleChange(item).then(async() => {
1845
+ if (stackList.length) {
1846
+ next();
1847
+ } else {
1848
+ console.log('filesToCheck', filesToCheck, filesToCheck.size);
1849
+ await naslServer.getDiagnosticRecordsAndPushAll(Array.from(filesToCheck));
1850
+ filesToCheck.clear();
1851
+ }
1852
+ });
1853
+ }
1854
+
1855
+ // 如果有长度开始执行状态机
1856
+ if (stackList.length) {
1857
+ next();
1858
+ }
1542
1859
  });
1543
1860
 
1544
1861
  naslServer.messager.options.context = naslServer;