@lcap/nasl 3.3.0-beta.0 → 3.4.0-alpha.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.
Files changed (423) hide show
  1. package/out/common/BaseNode.js +2 -1
  2. package/out/common/BaseNode.js.map +1 -1
  3. package/out/concepts/Abort__.js +2 -1
  4. package/out/concepts/Abort__.js.map +1 -1
  5. package/out/concepts/Anchor__.d.ts +1 -0
  6. package/out/concepts/Anchor__.js +16 -0
  7. package/out/concepts/Anchor__.js.map +1 -1
  8. package/out/concepts/AnonymousFunction__.d.ts +1 -0
  9. package/out/concepts/AnonymousFunction__.js +28 -2
  10. package/out/concepts/AnonymousFunction__.js.map +1 -1
  11. package/out/concepts/App__.js +2 -1
  12. package/out/concepts/App__.js.map +1 -1
  13. package/out/concepts/Argument__.d.ts +1 -0
  14. package/out/concepts/Argument__.js +21 -0
  15. package/out/concepts/Argument__.js.map +1 -1
  16. package/out/concepts/Assignee__.js.map +1 -1
  17. package/out/concepts/AssignmentLine__.js +1 -1
  18. package/out/concepts/AssignmentLine__.js.map +1 -1
  19. package/out/concepts/Assignment__.d.ts +1 -0
  20. package/out/concepts/Assignment__.js +15 -1
  21. package/out/concepts/Assignment__.js.map +1 -1
  22. package/out/concepts/BackendVariable__.js +1 -1
  23. package/out/concepts/BackendVariable__.js.map +1 -1
  24. package/out/concepts/Backend__.js +1 -1
  25. package/out/concepts/Backend__.js.map +1 -1
  26. package/out/concepts/BatchAssignment__.d.ts +1 -0
  27. package/out/concepts/BatchAssignment__.js +18 -1
  28. package/out/concepts/BatchAssignment__.js.map +1 -1
  29. package/out/concepts/BinaryExpression__.d.ts +1 -0
  30. package/out/concepts/BinaryExpression__.js +53 -16
  31. package/out/concepts/BinaryExpression__.js.map +1 -1
  32. package/out/concepts/BindAttribute__.d.ts +1 -0
  33. package/out/concepts/BindAttribute__.js +67 -3
  34. package/out/concepts/BindAttribute__.js.map +1 -1
  35. package/out/concepts/BindDirective__.js +1 -1
  36. package/out/concepts/BindDirective__.js.map +1 -1
  37. package/out/concepts/BindEvent__.d.ts +1 -0
  38. package/out/concepts/BindEvent__.js +57 -0
  39. package/out/concepts/BindEvent__.js.map +1 -1
  40. package/out/concepts/BindStyle__.js +1 -1
  41. package/out/concepts/BindStyle__.js.map +1 -1
  42. package/out/concepts/BooleanLiteral__.d.ts +1 -0
  43. package/out/concepts/BooleanLiteral__.js +7 -1
  44. package/out/concepts/BooleanLiteral__.js.map +1 -1
  45. package/out/concepts/CallAuthInterface__.js +1 -1
  46. package/out/concepts/CallAuthInterface__.js.map +1 -1
  47. package/out/concepts/CallConnector__.js +1 -1
  48. package/out/concepts/CallConnector__.js.map +1 -1
  49. package/out/concepts/CallFunction__.d.ts +1 -0
  50. package/out/concepts/CallFunction__.js +45 -1
  51. package/out/concepts/CallFunction__.js.map +1 -1
  52. package/out/concepts/CallInterface__.d.ts +1 -0
  53. package/out/concepts/CallInterface__.js +44 -8
  54. package/out/concepts/CallInterface__.js.map +1 -1
  55. package/out/concepts/CallLogic__.d.ts +1 -0
  56. package/out/concepts/CallLogic__.js +101 -1
  57. package/out/concepts/CallLogic__.js.map +1 -1
  58. package/out/concepts/CallQueryComponent__.js +1 -1
  59. package/out/concepts/CallQueryComponent__.js.map +1 -1
  60. package/out/concepts/Comment__.d.ts +1 -0
  61. package/out/concepts/Comment__.js +7 -1
  62. package/out/concepts/Comment__.js.map +1 -1
  63. package/out/concepts/ConfigProperty__.js +1 -1
  64. package/out/concepts/ConfigProperty__.js.map +1 -1
  65. package/out/concepts/Constant__.js +1 -1
  66. package/out/concepts/Constant__.js.map +1 -1
  67. package/out/concepts/DataSource__.js +2 -2
  68. package/out/concepts/DataSource__.js.map +1 -1
  69. package/out/concepts/Destination__.d.ts +1 -0
  70. package/out/concepts/Destination__.js +52 -1
  71. package/out/concepts/Destination__.js.map +1 -1
  72. package/out/concepts/End__.js +1 -1
  73. package/out/concepts/End__.js.map +1 -1
  74. package/out/concepts/EntityIndex__.js +1 -1
  75. package/out/concepts/EntityIndex__.js.map +1 -1
  76. package/out/concepts/EntityProperty__.d.ts +1 -0
  77. package/out/concepts/EntityProperty__.js +17 -1
  78. package/out/concepts/EntityProperty__.js.map +1 -1
  79. package/out/concepts/Entity__.d.ts +1 -0
  80. package/out/concepts/Entity__.js +25 -1
  81. package/out/concepts/Entity__.js.map +1 -1
  82. package/out/concepts/EnumItem__.d.ts +1 -0
  83. package/out/concepts/EnumItem__.js +7 -1
  84. package/out/concepts/EnumItem__.js.map +1 -1
  85. package/out/concepts/Enum__.d.ts +1 -0
  86. package/out/concepts/Enum__.js +14 -1
  87. package/out/concepts/Enum__.js.map +1 -1
  88. package/out/concepts/ForEachStatement__.d.ts +1 -0
  89. package/out/concepts/ForEachStatement__.js +44 -1
  90. package/out/concepts/ForEachStatement__.js.map +1 -1
  91. package/out/concepts/Frontend__.js +1 -1
  92. package/out/concepts/Frontend__.js.map +1 -1
  93. package/out/concepts/Function__.d.ts +1 -0
  94. package/out/concepts/Function__.js +29 -1
  95. package/out/concepts/Function__.js.map +1 -1
  96. package/out/concepts/Identifier__.js +1 -1
  97. package/out/concepts/Identifier__.js.map +1 -1
  98. package/out/concepts/IfStatement__.d.ts +1 -0
  99. package/out/concepts/IfStatement__.js +30 -1
  100. package/out/concepts/IfStatement__.js.map +1 -1
  101. package/out/concepts/Interface__.d.ts +3 -1
  102. package/out/concepts/Interface__.js +19 -3
  103. package/out/concepts/Interface__.js.map +1 -1
  104. package/out/concepts/JSBlock__.d.ts +1 -0
  105. package/out/concepts/JSBlock__.js +7 -1
  106. package/out/concepts/JSBlock__.js.map +1 -1
  107. package/out/concepts/JavaLogic__.js +1 -1
  108. package/out/concepts/JavaLogic__.js.map +1 -1
  109. package/out/concepts/LogicItem__.d.ts +6 -0
  110. package/out/concepts/LogicItem__.js +10 -1
  111. package/out/concepts/LogicItem__.js.map +1 -1
  112. package/out/concepts/Logic__.d.ts +1 -0
  113. package/out/concepts/Logic__.js +133 -1
  114. package/out/concepts/Logic__.js.map +1 -1
  115. package/out/concepts/MatchCase__.d.ts +1 -0
  116. package/out/concepts/MatchCase__.js +88 -0
  117. package/out/concepts/MatchCase__.js.map +1 -1
  118. package/out/concepts/Match__.d.ts +1 -0
  119. package/out/concepts/Match__.js +44 -1
  120. package/out/concepts/Match__.js.map +1 -1
  121. package/out/concepts/MemberExpression__.d.ts +1 -0
  122. package/out/concepts/MemberExpression__.js +19 -1
  123. package/out/concepts/MemberExpression__.js.map +1 -1
  124. package/out/concepts/NewComposite__.d.ts +1 -0
  125. package/out/concepts/NewComposite__.js +91 -1
  126. package/out/concepts/NewComposite__.js.map +1 -1
  127. package/out/concepts/NewList__.d.ts +1 -0
  128. package/out/concepts/NewList__.js +17 -1
  129. package/out/concepts/NewList__.js.map +1 -1
  130. package/out/concepts/NewMap__.d.ts +1 -0
  131. package/out/concepts/NewMap__.js +11 -1
  132. package/out/concepts/NewMap__.js.map +1 -1
  133. package/out/concepts/New__.js +1 -1
  134. package/out/concepts/New__.js.map +1 -1
  135. package/out/concepts/NullLiteral__.js +1 -1
  136. package/out/concepts/NullLiteral__.js.map +1 -1
  137. package/out/concepts/NumericLiteral__.d.ts +1 -0
  138. package/out/concepts/NumericLiteral__.js +7 -1
  139. package/out/concepts/NumericLiteral__.js.map +1 -1
  140. package/out/concepts/OqlQueryComponent__.d.ts +1 -0
  141. package/out/concepts/OqlQueryComponent__.js +8 -1
  142. package/out/concepts/OqlQueryComponent__.js.map +1 -1
  143. package/out/concepts/Param__.d.ts +1 -0
  144. package/out/concepts/Param__.js +41 -0
  145. package/out/concepts/Param__.js.map +1 -1
  146. package/out/concepts/ProcessElement__.js +1 -1
  147. package/out/concepts/ProcessElement__.js.map +1 -1
  148. package/out/concepts/ProcessOutcome__.js +1 -1
  149. package/out/concepts/ProcessOutcome__.js.map +1 -1
  150. package/out/concepts/ProcessOutcomes__.js +1 -1
  151. package/out/concepts/ProcessOutcomes__.js.map +1 -1
  152. package/out/concepts/QueryAggregateExpression__.js +1 -1
  153. package/out/concepts/QueryAggregateExpression__.js.map +1 -1
  154. package/out/concepts/QueryFieldExpression__.js +1 -1
  155. package/out/concepts/QueryFieldExpression__.js.map +1 -1
  156. package/out/concepts/QueryFromExpression__.js +1 -1
  157. package/out/concepts/QueryFromExpression__.js.map +1 -1
  158. package/out/concepts/QueryJoinExpression__.js +1 -1
  159. package/out/concepts/QueryJoinExpression__.js.map +1 -1
  160. package/out/concepts/QueryLimitExpression__.js +1 -1
  161. package/out/concepts/QueryLimitExpression__.js.map +1 -1
  162. package/out/concepts/QueryOrderByExpression__.js +1 -1
  163. package/out/concepts/QueryOrderByExpression__.js.map +1 -1
  164. package/out/concepts/Return__.d.ts +1 -0
  165. package/out/concepts/Return__.js +20 -1
  166. package/out/concepts/Return__.js.map +1 -1
  167. package/out/concepts/Role__.js +1 -1
  168. package/out/concepts/Role__.js.map +1 -1
  169. package/out/concepts/SelectMembers__.js +1 -1
  170. package/out/concepts/SelectMembers__.js.map +1 -1
  171. package/out/concepts/SqlQueryComponent__.d.ts +1 -0
  172. package/out/concepts/SqlQueryComponent__.js +8 -1
  173. package/out/concepts/SqlQueryComponent__.js.map +1 -1
  174. package/out/concepts/Start__.js +1 -1
  175. package/out/concepts/Start__.js.map +1 -1
  176. package/out/concepts/StringInterpolation__.d.ts +1 -0
  177. package/out/concepts/StringInterpolation__.js +19 -1
  178. package/out/concepts/StringInterpolation__.js.map +1 -1
  179. package/out/concepts/StringLiteral__.d.ts +1 -0
  180. package/out/concepts/StringLiteral__.js +6 -0
  181. package/out/concepts/StringLiteral__.js.map +1 -1
  182. package/out/concepts/StructureProperty__.d.ts +5 -0
  183. package/out/concepts/StructureProperty__.js +19 -2
  184. package/out/concepts/StructureProperty__.js.map +1 -1
  185. package/out/concepts/Structure__.d.ts +5 -0
  186. package/out/concepts/Structure__.js +22 -2
  187. package/out/concepts/Structure__.js.map +1 -1
  188. package/out/concepts/SwitchCase__.d.ts +1 -0
  189. package/out/concepts/SwitchCase__.js +34 -0
  190. package/out/concepts/SwitchCase__.js.map +1 -1
  191. package/out/concepts/SwitchStatement__.d.ts +1 -0
  192. package/out/concepts/SwitchStatement__.js +19 -1
  193. package/out/concepts/SwitchStatement__.js.map +1 -1
  194. package/out/concepts/TriggerLauncher__.js +1 -1
  195. package/out/concepts/TriggerLauncher__.js.map +1 -1
  196. package/out/concepts/TypeAnnotation__.d.ts +1 -0
  197. package/out/concepts/TypeAnnotation__.js +47 -1
  198. package/out/concepts/TypeAnnotation__.js.map +1 -1
  199. package/out/concepts/TypeParam__.d.ts +1 -0
  200. package/out/concepts/TypeParam__.js +6 -0
  201. package/out/concepts/TypeParam__.js.map +1 -1
  202. package/out/concepts/UnaryExpression__.d.ts +1 -0
  203. package/out/concepts/UnaryExpression__.js +19 -1
  204. package/out/concepts/UnaryExpression__.js.map +1 -1
  205. package/out/concepts/Unparsed__.d.ts +1 -0
  206. package/out/concepts/Unparsed__.js +6 -0
  207. package/out/concepts/Unparsed__.js.map +1 -1
  208. package/out/concepts/ValidationRule__.js.map +1 -1
  209. package/out/concepts/Variable__.d.ts +1 -0
  210. package/out/concepts/Variable__.js +20 -1
  211. package/out/concepts/Variable__.js.map +1 -1
  212. package/out/concepts/ViewElement__.d.ts +2 -0
  213. package/out/concepts/ViewElement__.js +67 -0
  214. package/out/concepts/ViewElement__.js.map +1 -1
  215. package/out/concepts/View__.d.ts +1 -0
  216. package/out/concepts/View__.js +94 -2
  217. package/out/concepts/View__.js.map +1 -1
  218. package/out/concepts/WhileStatement__.d.ts +1 -0
  219. package/out/concepts/WhileStatement__.js +21 -1
  220. package/out/concepts/WhileStatement__.js.map +1 -1
  221. package/out/index.d.ts +1 -0
  222. package/out/index.js +1 -0
  223. package/out/index.js.map +1 -1
  224. package/out/natural/componentData.d.ts +31 -0
  225. package/out/natural/componentData.js +85 -0
  226. package/out/natural/componentData.js.map +1 -0
  227. package/out/natural/genNaturalTS.d.ts +3 -0
  228. package/out/natural/genNaturalTS.js +91 -0
  229. package/out/natural/genNaturalTS.js.map +1 -0
  230. package/out/natural/index.d.ts +2 -0
  231. package/out/natural/index.js +19 -0
  232. package/out/natural/index.js.map +1 -0
  233. package/out/natural/naslStdlibMap.d.ts +2 -0
  234. package/out/natural/naslStdlibMap.js +26 -0
  235. package/out/natural/naslStdlibMap.js.map +1 -0
  236. package/out/natural/transformTSCode.d.ts +7 -0
  237. package/out/natural/transformTSCode.js +878 -0
  238. package/out/natural/transformTSCode.js.map +1 -0
  239. package/out/server/naslServer.d.ts +3 -3
  240. package/out/server/naslServer.js +93 -108
  241. package/out/server/naslServer.js.map +1 -1
  242. package/out/service/storage/init.js +16 -0
  243. package/out/service/storage/init.js.map +1 -1
  244. package/out/utils/env.d.ts +2 -0
  245. package/out/utils/env.js +6 -0
  246. package/out/utils/env.js.map +1 -0
  247. package/out/utils/index.d.ts +1 -0
  248. package/out/utils/index.js +1 -0
  249. package/out/utils/index.js.map +1 -1
  250. package/out/utils/time-slicing.js +2 -1
  251. package/out/utils/time-slicing.js.map +1 -1
  252. package/package.json +11 -5
  253. package/sandbox-natural/stdlib/nasl.core.ts +36 -0
  254. package/sandbox-natural/stdlib/nasl.oql.ts +8 -0
  255. package/sandbox-natural/stdlib/nasl.ui.ts +63 -0
  256. package/sandbox-natural/stdlib/nasl.util.ts +119 -0
  257. package/sandbox-natural/tsconfig.json +12 -0
  258. package/src/common/BaseNode.ts +3 -1
  259. package/src/concepts/Abort__.ts +2 -2
  260. package/src/concepts/Anchor__.ts +16 -2
  261. package/src/concepts/AnonymousFunction__.ts +29 -4
  262. package/src/concepts/App__.ts +2 -1
  263. package/src/concepts/Argument__.ts +19 -1
  264. package/src/concepts/Assignee__.ts +1 -1
  265. package/src/concepts/AssignmentLine__.ts +2 -2
  266. package/src/concepts/Assignment__.ts +26 -11
  267. package/src/concepts/BackendVariable__.ts +2 -2
  268. package/src/concepts/Backend__.ts +1 -1
  269. package/src/concepts/BatchAssignment__.ts +20 -3
  270. package/src/concepts/BinaryExpression__.ts +54 -18
  271. package/src/concepts/BindAttribute__.ts +63 -4
  272. package/src/concepts/BindDirective__.ts +2 -2
  273. package/src/concepts/BindEvent__.ts +58 -0
  274. package/src/concepts/BindStyle__.ts +2 -2
  275. package/src/concepts/BooleanLiteral__.ts +7 -2
  276. package/src/concepts/CallAuthInterface__.ts +2 -2
  277. package/src/concepts/CallConnector__.ts +2 -2
  278. package/src/concepts/CallFunction__.ts +42 -2
  279. package/src/concepts/CallInterface__.ts +48 -10
  280. package/src/concepts/CallLogic__.ts +123 -3
  281. package/src/concepts/CallQueryComponent__.ts +2 -2
  282. package/src/concepts/Comment__.ts +9 -3
  283. package/src/concepts/ConfigProperty__.ts +1 -1
  284. package/src/concepts/Constant__.ts +2 -2
  285. package/src/concepts/DataSource__.ts +2 -2
  286. package/src/concepts/Destination__.ts +58 -2
  287. package/src/concepts/End__.ts +2 -2
  288. package/src/concepts/EntityIndex__.ts +2 -2
  289. package/src/concepts/EntityProperty__.ts +18 -2
  290. package/src/concepts/Entity__.ts +27 -1
  291. package/src/concepts/EnumItem__.ts +7 -2
  292. package/src/concepts/Enum__.ts +14 -1
  293. package/src/concepts/ForEachStatement__.ts +48 -4
  294. package/src/concepts/Frontend__.ts +1 -1
  295. package/src/concepts/Function__.ts +30 -2
  296. package/src/concepts/Identifier__.ts +2 -2
  297. package/src/concepts/IfStatement__.ts +39 -3
  298. package/src/concepts/Interface__.ts +20 -3
  299. package/src/concepts/JSBlock__.ts +7 -2
  300. package/src/concepts/JavaLogic__.ts +2 -2
  301. package/src/concepts/LogicItem__.ts +11 -2
  302. package/src/concepts/Logic__.ts +137 -1
  303. package/src/concepts/MatchCase__.ts +90 -2
  304. package/src/concepts/Match__.ts +47 -3
  305. package/src/concepts/MemberExpression__.ts +19 -2
  306. package/src/concepts/NewComposite__.ts +85 -2
  307. package/src/concepts/NewList__.ts +17 -2
  308. package/src/concepts/NewMap__.ts +11 -2
  309. package/src/concepts/New__.ts +2 -2
  310. package/src/concepts/NullLiteral__.ts +2 -2
  311. package/src/concepts/NumericLiteral__.ts +7 -2
  312. package/src/concepts/OqlQueryComponent__.ts +8 -2
  313. package/src/concepts/Param__.ts +40 -1
  314. package/src/concepts/ProcessElement__.ts +2 -2
  315. package/src/concepts/ProcessOutcome__.ts +2 -2
  316. package/src/concepts/ProcessOutcomes__.ts +2 -2
  317. package/src/concepts/QueryAggregateExpression__.ts +2 -2
  318. package/src/concepts/QueryFieldExpression__.ts +2 -2
  319. package/src/concepts/QueryFromExpression__.ts +2 -2
  320. package/src/concepts/QueryJoinExpression__.ts +2 -2
  321. package/src/concepts/QueryLimitExpression__.ts +2 -2
  322. package/src/concepts/QueryOrderByExpression__.ts +2 -2
  323. package/src/concepts/Return__.ts +20 -2
  324. package/src/concepts/Role__.ts +1 -1
  325. package/src/concepts/SelectMembers__.ts +2 -2
  326. package/src/concepts/SqlQueryComponent__.ts +8 -2
  327. package/src/concepts/Start__.ts +2 -2
  328. package/src/concepts/StringInterpolation__.ts +20 -3
  329. package/src/concepts/StringLiteral__.ts +6 -1
  330. package/src/concepts/StructureProperty__.ts +20 -3
  331. package/src/concepts/Structure__.ts +22 -2
  332. package/src/concepts/SwitchCase__.ts +35 -2
  333. package/src/concepts/SwitchStatement__.ts +20 -3
  334. package/src/concepts/TriggerLauncher__.ts +1 -1
  335. package/src/concepts/TypeAnnotation__.ts +47 -2
  336. package/src/concepts/TypeParam__.ts +8 -2
  337. package/src/concepts/UnaryExpression__.ts +22 -3
  338. package/src/concepts/Unparsed__.ts +5 -1
  339. package/src/concepts/ValidationRule__.ts +2 -2
  340. package/src/concepts/Variable__.ts +20 -2
  341. package/src/concepts/ViewElement__.ts +70 -2
  342. package/src/concepts/View__.ts +106 -8
  343. package/src/concepts/WhileStatement__.ts +25 -3
  344. package/src/index.ts +1 -0
  345. package/src/natural/componentData.ts +81 -0
  346. package/src/natural/genNaturalTS.ts +91 -0
  347. package/src/natural/index.ts +2 -0
  348. package/src/natural/naslStdlibMap.ts +24 -0
  349. package/src/natural/transformTSCode.ts +834 -0
  350. package/src/server/naslServer.ts +90 -87
  351. package/src/service/storage/init.ts +17 -0
  352. package/src/utils/env.ts +2 -0
  353. package/src/utils/index.ts +1 -0
  354. package/src/utils/time-slicing.ts +3 -1
  355. package/test/concepts/anonymous-function/__snapshots__/toEmbeddedTS.spec.ts.snap +8 -0
  356. package/test/concepts/anonymous-function/__snapshots__/toJS.spec.ts.snap +3 -0
  357. package/test/concepts/anonymous-function/__snapshots__/toVue.spec.ts.snap +6 -0
  358. package/test/concepts/anonymous-function/constant.ts +5 -0
  359. package/test/concepts/anonymous-function/fixtures/simple.json +85 -0
  360. package/test/concepts/anonymous-function/toEmbeddedTS.spec.ts +14 -0
  361. package/test/concepts/anonymous-function/toJS.spec.ts +14 -0
  362. package/test/concepts/anonymous-function/toVue.spec.ts +14 -0
  363. package/test/concepts/assignment/__snapshots__/toEmbeddedTS.spec.ts.snap +21 -0
  364. package/test/concepts/assignment/__snapshots__/toJS.spec.ts.snap +9 -0
  365. package/test/concepts/assignment/__snapshots__/toVue.spec.ts.snap +21 -0
  366. package/test/concepts/assignment/constant.ts +5 -0
  367. package/test/concepts/assignment/fixtures/both-space.json +4 -0
  368. package/test/concepts/assignment/fixtures/left-space.json +14 -0
  369. package/test/concepts/assignment/fixtures/right-space.json +8 -0
  370. package/test/concepts/assignment/fixtures/simple.json +12 -0
  371. package/test/concepts/assignment/toEmbeddedTS.spec.ts +14 -0
  372. package/test/concepts/assignment/toJS.spec.ts +14 -0
  373. package/test/concepts/assignment/toVue.spec.ts +14 -0
  374. package/test/concepts/batch-assignment/__snapshots__/toEmbeddedTS.spec.ts.snap +28 -0
  375. package/test/concepts/batch-assignment/__snapshots__/toJS.spec.ts.snap +13 -0
  376. package/test/concepts/batch-assignment/__snapshots__/toVue.spec.ts.snap +14 -0
  377. package/test/concepts/batch-assignment/constant.ts +5 -0
  378. package/test/concepts/batch-assignment/fixtures/muli-var-muli-value.json +144 -0
  379. package/test/concepts/batch-assignment/fixtures/simple-var-simple-value.json +36 -0
  380. package/test/concepts/batch-assignment/toEmbeddedTS.spec.ts +14 -0
  381. package/test/concepts/batch-assignment/toJS.spec.ts +14 -0
  382. package/test/concepts/batch-assignment/toVue.spec.ts +14 -0
  383. package/test/concepts/binary-expression/__snapshots__/toEmbeddedTS.spec.ts.snap +25 -0
  384. package/test/concepts/binary-expression/__snapshots__/toJS.spec.ts.snap +16 -0
  385. package/test/concepts/binary-expression/__snapshots__/toVue.spec.ts.snap +19 -0
  386. package/test/concepts/binary-expression/constant.ts +5 -0
  387. package/test/concepts/binary-expression/fixtures/constant-nested.json +36 -0
  388. package/test/concepts/binary-expression/fixtures/constant-simple.json +12 -0
  389. package/test/concepts/binary-expression/fixtures/variable-nested.json +69 -0
  390. package/test/concepts/binary-expression/toEmbeddedTS.spec.ts +14 -0
  391. package/test/concepts/binary-expression/toJS.spec.ts +14 -0
  392. package/test/concepts/binary-expression/toVue.spec.ts +14 -0
  393. package/test/concepts/boolean-literal/toEmbeddedTS.spec.ts +2 -2
  394. package/test/concepts/boolean-literal/toJS.spec.ts +2 -2
  395. package/test/concepts/boolean-literal/toVue.spec.ts +2 -2
  396. package/test/concepts/data-source/__snapshots__/toEmbeddedTS.spec.ts.snap +8 -0
  397. package/test/concepts/data-source/__snapshots__/toEmbeddedTSFile.spec.ts.snap +12 -0
  398. package/test/concepts/data-source/constant.ts +5 -0
  399. package/test/concepts/data-source/fixtures/normal.json +289 -0
  400. package/test/concepts/data-source/toEmbeddedTS.spec.ts +14 -0
  401. package/test/concepts/data-source/toEmbeddedTSFile.spec.ts +15 -0
  402. package/test/concepts/entity/__snapshots__/toEmbeddedTS.spec.ts.snap +74 -0
  403. package/test/concepts/entity/__snapshots__/toEmbeddedTSFile.spec.ts.snap +3 -0
  404. package/test/concepts/entity/constant.ts +5 -0
  405. package/test/concepts/entity/fixtures/normal.json +469 -0
  406. package/test/concepts/entity/toEmbeddedTS.spec.ts +14 -0
  407. package/test/concepts/entity/toEmbeddedTSFile.spec.ts +14 -0
  408. package/test/concepts/identifier/toEmbeddedTS.spec.ts +2 -2
  409. package/test/concepts/identifier/toJS.spec.ts +2 -2
  410. package/test/concepts/identifier/toVue.spec.ts +2 -2
  411. package/test/concepts/member-expression/toEmbeddedTS.spec.ts +2 -2
  412. package/test/concepts/member-expression/toJS.spec.ts +2 -2
  413. package/test/concepts/member-expression/toVue.spec.ts +2 -2
  414. package/test/concepts/null-literal/toEmbeddedTS.spec.ts +2 -2
  415. package/test/concepts/null-literal/toJS.spec.ts +2 -2
  416. package/test/concepts/null-literal/toVue.spec.ts +2 -2
  417. package/test/concepts/numeric-literal/toEmbeddedTS.spec.ts +2 -2
  418. package/test/concepts/numeric-literal/toJS.spec.ts +2 -2
  419. package/test/concepts/numeric-literal/toVue.spec.ts +2 -2
  420. package/test/concepts/string-literal/toEmbeddedTS.spec.ts +2 -2
  421. package/test/concepts/string-literal/toJS.spec.ts +2 -2
  422. package/test/concepts/string-literal/toVue.spec.ts +2 -2
  423. package/test/concepts/view-element/__snapshots__/toVue.spec.ts.snap +66 -62
@@ -0,0 +1,834 @@
1
+ /* eslint-disable global-require */
2
+ /* eslint-disable @typescript-eslint/no-use-before-define */
3
+ import * as babel from '@babel/core';
4
+ import * as babelTypes from '@babel/types';
5
+ import generate from '@babel/generator';
6
+ import * as naslTypes from '../concepts';
7
+ import { traverse } from '../utils';
8
+
9
+ const debug = false;
10
+
11
+ export function tryParseTS(tsCode: string) {
12
+ try {
13
+ const root = babel.parseSync(tsCode, {
14
+ filename: 'result.ts',
15
+ presets: [require('@babel/preset-typescript')],
16
+ }) as babelTypes.File;
17
+ // console.log((root as any).program.body[0].body.body.map((item) => item.trailingComments));
18
+ return root;
19
+ } catch (e) {
20
+ return null;
21
+ }
22
+ }
23
+
24
+ function flatMemberExpression(node: babelTypes.Node): Array<babelTypes.Node> {
25
+ if (node.type === 'MemberExpression')
26
+ return [...flatMemberExpression(node.object), node.property];
27
+ return [node];
28
+ }
29
+ function flatMatchPatternsExpression(node: any): Array<babelTypes.Node> {
30
+ if (node.concept === 'BinaryExpression') {
31
+ if (node.operator === '||') {
32
+ return [...flatMatchPatternsExpression(node.left), ...flatMatchPatternsExpression(node.right)];
33
+ }
34
+ if (node.operator === '==') {
35
+ return [node.right];
36
+ }
37
+ return [node];
38
+ }
39
+ return [node];
40
+ }
41
+
42
+ function flatIfStatement(node: any): Array<babelTypes.Node> {
43
+ if (node.alternate.type === 'IfStatement') {
44
+ return [...flatIfStatement(node.alternate), node];
45
+ }
46
+ return [node];
47
+ }
48
+
49
+ /**
50
+ * 这个函数是修复 AI 翻译出错的情况,与正常的 transform 做个区分
51
+ * @param node
52
+ * @returns
53
+ */
54
+ function fixLogicNode(node: babelTypes.Node): void {
55
+ if (node?.type === 'CallExpression') {
56
+ const calleeName = generate(node.callee as any).code;
57
+ if (calleeName === 'nasl.util.ForEach') {
58
+ const callee = flatMemberExpression(node.callee);
59
+ node.callee = callee[2] as babelTypes.Identifier;
60
+ }
61
+ }
62
+ }
63
+
64
+
65
+ export function transformTSCode(tsCode: string, contextLogicName: string, type?: string) {
66
+ const logic = new naslTypes.Logic();
67
+ logic.body = [];
68
+
69
+ function transformTypeAnnotation(node: babelTypes.TSType): naslTypes.TypeAnnotation {
70
+ if (node.type === 'TSTypeReference') {
71
+ const typeName = (node.typeName as babelTypes.Identifier).name;
72
+ const primitiveType = naslTypes.primitiveTypeList.find((ta) => ta.typeName === typeName);
73
+ if ((node as any)?.typeNamespace) {
74
+ return naslTypes.TypeAnnotation.createReference(typeName, {
75
+ typeNamespace: (node as any).typeNamespace,
76
+ });
77
+ }
78
+ if (typeName === 'Integer') {
79
+ return naslTypes.TypeAnnotation.createPrimitive('Long');
80
+ }
81
+ if (primitiveType) {
82
+ return naslTypes.TypeAnnotation.createPrimitive(typeName);
83
+ }
84
+ if (['List', 'Map', 'Current'].includes(typeName) && node.typeParameters) {
85
+ return naslTypes.TypeAnnotation.createGeneric(typeName, {
86
+ typeArguments: node.typeParameters.params.map(transformTypeAnnotation),
87
+ });
88
+ }
89
+ if (!node.typeParameters) {
90
+ return naslTypes.TypeAnnotation.createReference(typeName, {
91
+ typeNamespace: 'app.dataSources.defaultDS',
92
+ });
93
+ }
94
+ console.error(node);
95
+ if (debug) {
96
+ throw new Error(`Unhandled node ${node.type}`);
97
+ }
98
+ } else if (node.type === 'TSTypeLiteral') {
99
+ return naslTypes.TypeAnnotation.createTypeAnonymousStructure(node.members.map((member: babelTypes.TSPropertySignature) => new naslTypes.StructureProperty({
100
+ name: (member.key as babelTypes.Identifier).name,
101
+ typeAnnotation: transformTypeAnnotation(member.typeAnnotation.typeAnnotation),
102
+ })));
103
+ } else if (node.type === 'TSBooleanKeyword') {
104
+ return naslTypes.TypeAnnotation.createPrimitive('Boolean');
105
+ } else if (node.type === 'TSStringKeyword') {
106
+ return naslTypes.TypeAnnotation.createPrimitive('String');
107
+ } else if (node.type === 'TSNumberKeyword') {
108
+ return naslTypes.TypeAnnotation.createPrimitive('Double');
109
+ } else if (node.type === 'TSUnionType') {
110
+ const union = naslTypes.TypeAnnotation.createPrimitive('Union');
111
+ union.typeArguments = [];
112
+ node.types.forEach((curType) => {
113
+ union.typeArguments.push(transformTypeAnnotation(curType));
114
+ });
115
+ return union;
116
+ } else {
117
+ console.error(node);
118
+ if (debug) {
119
+ throw new Error(`Unhandled node ${node.type}`);
120
+ }
121
+ }
122
+ }
123
+ function transformParam(node: babelTypes.Identifier): naslTypes.Param {
124
+ const typeAnnotation = (node.typeAnnotation as babelTypes.TSTypeAnnotation)?.typeAnnotation;
125
+ return new naslTypes.Param({
126
+ name: node.name,
127
+ typeAnnotation: typeAnnotation ? transformTypeAnnotation(typeAnnotation) : null,
128
+ });
129
+ }
130
+ function pushElseIf(ifNode: babelTypes.IfStatement, switchStatement: naslTypes.SwitchStatement) {
131
+ switchStatement.cases.push(new naslTypes.SwitchCase({
132
+ test: transformLogicNode(ifNode.test),
133
+ consequent: !ifNode.consequent ? [] : (ifNode.consequent as babelTypes.BlockStatement).body.map((item) => transformLogicNode(item)).filter((item) => !!item),
134
+ }));
135
+ if (ifNode.alternate && ifNode.alternate.type === 'IfStatement') {
136
+ pushElseIf(ifNode.alternate, switchStatement);
137
+ } else {
138
+ switchStatement.cases.push(new naslTypes.SwitchCase({
139
+ test: undefined,
140
+ consequent: !ifNode?.alternate ? [] : (ifNode?.alternate as babelTypes.BlockStatement)?.body.map((item) => transformLogicNode(item)).filter((item) => !!item),
141
+ }));
142
+ }
143
+ }
144
+
145
+ function handleBinaryExpression(calleeName: String, argument: any) {
146
+ const map: Record<'plus' | 'minus' | 'multiply' | 'divide' | 'remainder', '+' | '-' | '*' | '/' | '%'> = {
147
+ plus: '+',
148
+ minus: '-',
149
+ multiply: '*',
150
+ divide: '/',
151
+ remainder: '%',
152
+ };
153
+ return new naslTypes.BinaryExpression({
154
+ operator: map?.[calleeName as keyof typeof map],
155
+ left: transformLogicNode(argument?.[0]),
156
+ right: transformLogicNode(argument?.[1]),
157
+ });
158
+ }
159
+
160
+ function handleNewExpression(calleeName: String, node: any) {
161
+ if (calleeName === 'NewList') {
162
+ return new naslTypes.NewList({
163
+ typeAnnotation: naslTypes.TypeAnnotation.createGeneric('List', {
164
+ typeArguments: node?.typeParameters?.params.map(transformTypeAnnotation),
165
+ }),
166
+ items: node?.arguments?.[0]?.elements?.map((arg: any) => transformLogicNode(arg)),
167
+ });
168
+ }
169
+ if (calleeName === 'NewMap') {
170
+ const keys: any = [];
171
+ const values: any = [];
172
+ node?.arguments?.[0]?.properties.forEach((arg: any) => {
173
+ keys.push(transformLogicNode(arg.key));
174
+ values.push(transformLogicNode(arg.value));
175
+ });
176
+ return new naslTypes.NewMap({
177
+ typeAnnotation: naslTypes.TypeAnnotation.createGeneric('Map', {
178
+ typeArguments: node?.typeParameters?.params.map(transformTypeAnnotation),
179
+ }),
180
+ keys,
181
+ values,
182
+ });
183
+ }
184
+ if (calleeName === 'NewEntity') {
185
+ const properties: any = [];
186
+ const rights: any = [];
187
+ node?.arguments?.[0]?.properties.forEach((arg: any) => {
188
+ properties.push(transformLogicNode(arg.key));
189
+ rights.push(new naslTypes.SelectMembers({
190
+ expression: transformLogicNode(arg.value)
191
+ }));
192
+ });
193
+ const typeName = node?.typeParameters?.params?.[0]?.typeName?.name;
194
+ return new naslTypes.NewComposite({
195
+ typeAnnotation: naslTypes.TypeAnnotation.createReference(typeName, {
196
+ typeNamespace: 'app.dataSources.defaultDS.entities',
197
+ typeName
198
+ }),
199
+ properties,
200
+ rights,
201
+ });
202
+ }
203
+ if (calleeName === 'NewAnonymityStructure') {
204
+ const properties: any = [];
205
+ const rights: any = [];
206
+ const structureProperties: any = [];
207
+ node?.arguments?.[0]?.properties?.forEach((arg: any) => {
208
+ properties.push(transformLogicNode(arg.key));
209
+ rights.push(new naslTypes.SelectMembers({
210
+ expression: transformLogicNode(arg.value)
211
+ }));
212
+ structureProperties.push(new naslTypes.StructureProperty({
213
+ name: arg?.key?.name,
214
+ typeAnnotation: null
215
+ }));
216
+ });
217
+ return new naslTypes.NewComposite({
218
+ typeAnnotation: naslTypes.TypeAnnotation.createTypeAnonymousStructure(structureProperties),
219
+ properties,
220
+ rights,
221
+ });
222
+ }
223
+ return node;
224
+ }
225
+
226
+ function transformLogicNode(node: babelTypes.Node, typeAnnotation?: naslTypes.TypeAnnotation): naslTypes.LogicItem {
227
+ fixLogicNode(node);
228
+ // console.log('lemon ~~~ node--1:', node);
229
+ if (node.type === 'VariableDeclaration') { // 拆成局部变量和赋值
230
+ const declList = node?.declarations || [];
231
+ declList?.forEach((decl) => {
232
+ const variableName = (decl.id as babelTypes.Identifier).name;
233
+ if (!logic.variables.find((variable) => variable.name === variableName)) {
234
+ const varTypeAnnotation = ((decl.id as babelTypes.Identifier).typeAnnotation as babelTypes.TSTypeAnnotation)?.typeAnnotation;
235
+ logic.variables.push(new naslTypes.Variable({
236
+ name: variableName,
237
+ typeAnnotation: varTypeAnnotation && transformTypeAnnotation(varTypeAnnotation),
238
+ }));
239
+ }
240
+ if (decl.init) {
241
+ if (decl.init.type !== 'ArrayExpression' && decl.init.type !== 'ObjectExpression') {
242
+ if (type === 'expression') {
243
+ return transformLogicNode(decl.init);
244
+ }
245
+ const item = new naslTypes.Assignment({
246
+ left: new naslTypes.Identifier({
247
+ name: variableName,
248
+ }),
249
+ right: transformLogicNode(decl.init),
250
+ });
251
+ item && logic.body.push(item);
252
+ }
253
+ }
254
+ });
255
+ } else if (node.type === 'CallExpression') {
256
+ const callee = flatMemberExpression(node.callee);
257
+ const calleeName = generate(node.callee as any).code;
258
+ // console.log('lemon ~~~ node--2', node, callee, calleeName);
259
+ if (/^\$refs\./.test(calleeName)) {
260
+ return new naslTypes.CallLogic({
261
+ calleeNamespace: `elements.${(callee[1] as babelTypes.Identifier).name}.logics`,
262
+ calleeName: (callee[2] as babelTypes.Identifier).name,
263
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
264
+ expression: transformLogicNode(arg),
265
+ })) as naslTypes.Argument[],
266
+ });
267
+ }
268
+ if (callee.length === 2 && callee[0].type === 'Identifier' && callee[0].name.endsWith('Entity')) {
269
+ const entityName = callee[0].name.replace(/Entity$/, '');
270
+ return new naslTypes.CallLogic({
271
+ calleeNamespace: `app.dataSources.defaultDS.entities.${entityName}.logics`,
272
+ calleeName: (callee[1] as babelTypes.Identifier).name,
273
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
274
+ expression: transformLogicNode(arg),
275
+ })) as naslTypes.Argument[],
276
+ });
277
+ }
278
+ if (calleeName === 'nasl.oql.query') {
279
+ return new naslTypes.OqlQueryComponent({
280
+ dataSource: 'app.dataSources.defaultDS',
281
+ code: generate(node.arguments[0] as any).code.trim().slice(1, -1),
282
+ });
283
+ }
284
+ if (calleeName === 'nasl.util.consoleLog' || calleeName === 'console.log') {
285
+ if (contextLogicName.includes('on_') || contextLogicName.includes('viewLogic_')) {
286
+ return new naslTypes.CallLogic({
287
+ calleeNamespace: 'nasl.util',
288
+ calleeName: 'consoleLog',
289
+ shortcut: true,
290
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
291
+ expression: transformLogicNode(arg),
292
+ })) as naslTypes.Argument[],
293
+ });
294
+ }
295
+ return new naslTypes.CallLogic({
296
+ calleeNamespace: 'nasl.logging',
297
+ calleeName: 'INFO',
298
+ shortcut: true,
299
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
300
+ expression: transformLogicNode(arg),
301
+ })) as naslTypes.Argument[],
302
+ });
303
+ }
304
+ if (calleeName === 'nasl.util.jsonSerialize' || calleeName === 'nasl.util.jsonDeserialize') {
305
+ const curCalleeName = (node.callee as any).property.name;
306
+ return new naslTypes.CallLogic({
307
+ calleeNamespace: 'nasl.util',
308
+ calleeName: curCalleeName,
309
+ shortcut: true,
310
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
311
+ expression: transformLogicNode(arg),
312
+ })) as naslTypes.Argument[],
313
+ typeArguments: node?.typeParameters?.params.map((curType: any) => transformTypeAnnotation({ ...curType })),
314
+ });
315
+ };
316
+ if (calleeName.startsWith('nasl.util.')) {
317
+ const curCalleeName = callee.length === 3 ? (callee[callee.length - 1] as babelTypes.Identifier).name : (callee[0] as any).callee.property.name;
318
+ const argument = callee.length === 3 ? node.arguments : (callee[0] as any).arguments as any;
319
+
320
+ if (['plus', 'minus', 'multiply', 'divide', 'remainder'].includes(curCalleeName)) {
321
+ return handleBinaryExpression(curCalleeName, argument);
322
+ };
323
+
324
+ if (['NewList', 'NewMap', 'NewEntity', 'NewAnonymityStructure'].includes(curCalleeName)) {
325
+ return handleNewExpression(curCalleeName, node);
326
+ }
327
+
328
+ let typeNamespace: string;
329
+ if (argument?.[argument.length - 1]?.type === 'ObjectExpression') {
330
+ typeNamespace = argument.splice(-1)[0].properties[0].value.value;
331
+ }
332
+ const nodeElement = new naslTypes.CallFunction({
333
+ calleeNamespace: 'nasl.util',
334
+ calleeName: curCalleeName,
335
+ arguments: argument.map((arg: any, index: number) => new naslTypes.Argument({
336
+ expression: transformLogicNode(arg),
337
+ keyword: `str${index + 1}`,
338
+ })) as naslTypes.Argument[],
339
+ typeArguments: node?.typeParameters?.params.map((curType: any) => transformTypeAnnotation({ ...curType, typeNamespace })),
340
+
341
+ });
342
+ // console.log('lemon ~ callFunction ~ 3:', nodeElement);
343
+ return nodeElement;
344
+ }
345
+ if (callee.length === 3 && calleeName.startsWith('nasl.ui.')) {
346
+ if ((callee[2] as babelTypes.Identifier).name === 'destination') {
347
+ const namespace = (node.arguments[0] as babelTypes.StringLiteral).value;
348
+ const nsArr = namespace.split('.').map((item) => item.replace(/_view$/, ''));
349
+ const viewName = nsArr.pop();
350
+
351
+ return new naslTypes.Destination({
352
+ viewNamespace: `app.frontends.pc.views${nsArr.map((item) => `.${item}.views`).join('')}`, // viewNamespace
353
+ viewName, // viewName
354
+ arguments: node.arguments.slice(1).map((arg) => new naslTypes.Argument({
355
+ expression: transformLogicNode(arg),
356
+ })) as naslTypes.Argument[],
357
+ });
358
+ }
359
+ return new naslTypes.CallLogic({
360
+ calleeNamespace: 'nasl.ui',
361
+ calleeName: (callee[2] as babelTypes.Identifier).name,
362
+ shortcut: true,
363
+ /**
364
+ * 这个函数是修复 AI 翻译出错的情况,与正常的 transform 做个区分
365
+ * @param node
366
+ * @returns
367
+ */
368
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
369
+ expression: transformLogicNode(arg),
370
+ })) as naslTypes.Argument[],
371
+ });
372
+ }
373
+ if (calleeName === 'ForEach') {
374
+ const newCallee = node.arguments;
375
+ const arrowFunction = node.arguments[3] as babelTypes.ArrowFunctionExpression;
376
+ const nodeElement = new naslTypes.ForEachStatement({
377
+ each: transformLogicNode(newCallee[0]),
378
+ start: transformLogicNode(newCallee[1]),
379
+ end: transformLogicNode(newCallee[2]),
380
+ item: transformParam(arrowFunction.params[0] as babelTypes.Identifier),
381
+ index: transformParam(arrowFunction.params[1] as babelTypes.Identifier),
382
+ body: (arrowFunction.body as babelTypes.BlockStatement).body.map((item) => transformLogicNode(item)).filter((item) => !!item),
383
+ });
384
+ return nodeElement;
385
+ }
386
+ if (callee.length === 2) {
387
+ const curCalleeName = (node.callee as any).property.name;
388
+ if (curCalleeName === 'forEach') {
389
+ const newCallee = (node.callee as any).object;
390
+ const arrowFunction = node.arguments[0] as babelTypes.ArrowFunctionExpression;
391
+ const nodeElement = new naslTypes.ForEachStatement({
392
+ each: transformLogicNode(newCallee.callee.object),
393
+ start: transformLogicNode(newCallee?.arguments?.[0]),
394
+ end: transformLogicNode(newCallee?.arguments?.[1]),
395
+ item: transformParam(arrowFunction.params[0] as babelTypes.Identifier),
396
+ index: transformParam(arrowFunction.params[1] as babelTypes.Identifier),
397
+ body: (arrowFunction.body as babelTypes.BlockStatement).body.map((item) => transformLogicNode(item)).filter((item) => !!item),
398
+ });
399
+ return nodeElement;
400
+ }
401
+ } else if (['plus', 'minus', 'multiply', 'divide', 'remainder'].includes(calleeName)) {
402
+ return handleBinaryExpression(calleeName, node?.arguments);
403
+ } else if (calleeName === 'alert') {
404
+ return new naslTypes.CallLogic({
405
+ calleeNamespace: 'nasl.ui',
406
+ calleeName: 'showMessage',
407
+ shortcut: true,
408
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
409
+ expression: transformLogicNode(arg),
410
+ })) as naslTypes.Argument[],
411
+ });
412
+ } else if (/^app.dataSources|app.logics|load/.test(calleeName)) {
413
+ return new naslTypes.CallLogic({
414
+ calleeNamespace: generate((node.callee as any).object).code,
415
+ calleeName: (callee[callee.length - 1] as babelTypes.Identifier).name,
416
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
417
+ expression: transformLogicNode(arg),
418
+ })) as naslTypes.Argument[],
419
+ });
420
+ } else if (callee.length === 1) {
421
+ if (calleeName.startsWith('viewLogic_')) {
422
+ return new naslTypes.CallLogic({
423
+ calleeNamespace: '',
424
+ calleeName: calleeName.slice('viewLogic_'.length),
425
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
426
+ expression: transformLogicNode(arg),
427
+ })) as naslTypes.Argument[],
428
+ });
429
+ }
430
+ return new naslTypes.CallLogic({
431
+ calleeNamespace: `app.logics`,
432
+ calleeName,
433
+ arguments: node.arguments.map((arg) => new naslTypes.Argument({
434
+ expression: transformLogicNode(arg),
435
+ })) as naslTypes.Argument[],
436
+ });
437
+ } else if (/interfaces/.test(calleeName)) {
438
+ return new naslTypes.CallInterface({
439
+ calleeNamespace: generate((node.callee as any).object).code,
440
+ calleeName: (callee[callee.length - 1] as babelTypes.Identifier).name,
441
+ arguments: node.arguments.map((arg: any) => new naslTypes.Argument({
442
+ keyword: arg.properties[0].key.name,
443
+ expression: transformLogicNode(arg.properties[0].value),
444
+ })) as naslTypes.Argument[],
445
+ });
446
+ }
447
+ // else if (/destination/.test(calleeName)) {
448
+ // const newCallee = flatMemberExpression((node.callee as any).object);
449
+ // return new naslTypes.Destination({
450
+ // viewNamespace: generate((node.callee as any).object.object).code,
451
+ // viewName: (newCallee[newCallee.length - 1] as babelTypes.Identifier).name,
452
+ // target: (node.arguments[0] as any).properties[1].value.value,
453
+ // anchor: new naslTypes.Anchor({
454
+ // expression: transformLogicNode((node.arguments[0] as any).properties[0].value),
455
+ // }),
456
+ // });
457
+ // }
458
+ else if (node.callee.type === 'ArrowFunctionExpression') {
459
+ // NOTE: 适用于 if else
460
+ const newCallee = (node.callee.body as any).body;
461
+ if (newCallee[newCallee.length - 1].argument?.callee?.name === '__MatchExpressionFuntion') {
462
+ const match = new naslTypes.Match({
463
+ expression: transformLogicNode(newCallee[0]),
464
+ isExpression: type === 'expression',
465
+ cases: flatIfStatement(newCallee[1].body.body[0]).map((_case: any) => new naslTypes.MatchCase({
466
+ patterns: !_case.test ? [] : flatMatchPatternsExpression(transformLogicNode(_case.test)) as any,
467
+ body: _case.consequent.body.filter((item: any) => item.type !== 'BreakStatement').map((item: any) => transformLogicNode(item)).filter((item: any) => !!item),
468
+ })),
469
+ });
470
+ if (!match.cases.length || match.cases[match.cases.length - 1].patterns.length) {
471
+ match.cases.push(new naslTypes.MatchCase({
472
+ patterns: [],
473
+ body: [],
474
+ }));
475
+ }
476
+ match.cases.forEach((case_: any) => {
477
+ if (case_.body.length && (case_.body[0].concept === 'BooleanLiteral' || case_.body[0].concept === 'StringLiteral')) {
478
+ case_.isMatchedTypeEnumable = true;
479
+ }
480
+ if (case_.patterns.length && case_.patterns[0].concept === 'MemberExpression') {
481
+ case_.isMatchedTypeEnumable = true;
482
+ case_.patterns[0] = new naslTypes.MemberExpression({
483
+ object: {
484
+ concept: 'Identifier',
485
+ name: case_.patterns[0].object.property.name,
486
+ folded: false,
487
+ namespace: 'app.enums'
488
+ } as any,
489
+ property: {
490
+ concept: 'Identifier',
491
+ name: case_.patterns[0].property.value,
492
+ folded: false,
493
+ } as any,
494
+ });
495
+ }
496
+ });
497
+ return match;
498
+ }
499
+ if (newCallee[newCallee.length - 1].argument?.callee?.name === '__SwitchExpressionFuntion') {
500
+ const switchStatement = transformLogicNode(newCallee[0].body.body[0]);
501
+ return switchStatement;
502
+ }
503
+ console.error(node);
504
+ if (debug) {
505
+ throw new Error(`Unhandled ArrowFunctionExpression node ${node.type}`);
506
+ }
507
+ } else {
508
+ console.error(node);
509
+ if (debug) {
510
+ throw new Error(`Unhandled node ${callee.map((item: babelTypes.Identifier) => item.name).join('.')} ${node.type}`);
511
+ }
512
+ }
513
+ } else if (node.type === 'IfStatement') {
514
+ if (node.alternate && node.alternate.type === 'IfStatement') {
515
+ const switchStatement = new naslTypes.SwitchStatement({
516
+ cases: [],
517
+ });
518
+ pushElseIf(node, switchStatement);
519
+ return switchStatement;
520
+ }
521
+ return new naslTypes.IfStatement({
522
+ test: transformLogicNode(node.test),
523
+ consequent: !node.consequent ? [] : (node.consequent as babelTypes.BlockStatement).body.map((item) => transformLogicNode(item)).filter((item) => !!item),
524
+ alternate: !node.alternate ? [] : (node.alternate as babelTypes.BlockStatement).body.map((item) => transformLogicNode(item)).filter((item) => !!item),
525
+ });
526
+ } else if (node.type === 'WhileStatement') {
527
+ return new naslTypes.WhileStatement({
528
+ test: transformLogicNode(node.test),
529
+ body: (node.body as babelTypes.BlockStatement).body.map((item) => transformLogicNode(item)).filter((item) => !!item),
530
+ });
531
+ } else if (node.type === 'SwitchStatement') {
532
+ const match = new naslTypes.Match({
533
+ expression: transformLogicNode(node.discriminant),
534
+ isExpression: type === 'expression',
535
+ cases: node.cases.map((_case) => new naslTypes.MatchCase({
536
+ patterns: !_case.test ? [] : [transformLogicNode(_case.test)],
537
+ body: _case.consequent.filter((item) => item.type !== 'BreakStatement').map((item) => transformLogicNode(item)).filter((item) => !!item),
538
+ })),
539
+ });
540
+ if (!match.cases.length || match.cases[match.cases.length - 1].patterns.length) {
541
+ match.cases.push(new naslTypes.MatchCase({
542
+ patterns: [],
543
+ body: [],
544
+ }));
545
+ }
546
+ match.cases.forEach((case_: any) => {
547
+ if (case_.body.length && (case_.body[0].concept === 'BooleanLiteral' || case_.body[0].concept === 'StringLiteral')) {
548
+ case_.isMatchedTypeEnumable = true;
549
+ }
550
+ if (case_.patterns.length && case_.patterns[0].concept === 'MemberExpression') {
551
+ case_.isMatchedTypeEnumable = true;
552
+ case_.patterns[0].object.namespace = 'app.enums';
553
+ }
554
+ });
555
+ return match;
556
+ } else if (node.type === 'MemberExpression') {
557
+ if (node.property.type === 'NumericLiteral') {
558
+ return new naslTypes.CallFunction({
559
+ calleeNamespace: 'nasl.util',
560
+ calleeName: 'Get',
561
+ arguments: [
562
+ new naslTypes.Argument({
563
+ expression: transformLogicNode(node.object),
564
+ }),
565
+ new naslTypes.Argument({
566
+ expression: transformLogicNode(node.property),
567
+ }),
568
+ ],
569
+ });
570
+ }
571
+ return new naslTypes.MemberExpression({
572
+ object: transformLogicNode(node.object),
573
+ property: transformLogicNode(node.property),
574
+ });
575
+ } else if (node.type === 'Identifier') {
576
+ return new naslTypes.Identifier({
577
+ name: node.name,
578
+ });
579
+ } else if (node.type === 'ExpressionStatement') {
580
+ return transformLogicNode(node.expression);
581
+ } else if (node.type === 'AssignmentExpression') {
582
+ if (node.operator === '+=' || node.operator === '-=') {
583
+ if (type === 'expression') {
584
+ return new naslTypes.BinaryExpression({
585
+ operator: node.operator[0] as '+' | '-',
586
+ left: transformLogicNode(node.left),
587
+ right: transformLogicNode(node.right),
588
+ });
589
+ }
590
+ return new naslTypes.Assignment({
591
+ left: transformLogicNode(node.left),
592
+ right: new naslTypes.BinaryExpression({
593
+ operator: node.operator[0] as '+' | '-',
594
+ left: transformLogicNode(node.left),
595
+ right: transformLogicNode(node.right),
596
+ }),
597
+ });
598
+ }
599
+ if (type === 'expression') {
600
+ return transformLogicNode(node.right);
601
+ }
602
+ return new naslTypes.Assignment({
603
+ left: transformLogicNode(node.left),
604
+ right: transformLogicNode(node.right),
605
+ });
606
+ } else if (node.type === 'NewExpression') {
607
+ const calleeName = generate(node.callee as any).code;
608
+ if (['Boolean', 'Integer', 'Double', 'Decimal', 'Long'].includes(calleeName)) {
609
+ return transformLogicNode(node.arguments[0], naslTypes.TypeAnnotation.createPrimitive(calleeName));
610
+ }
611
+ console.error(node);
612
+ if (debug) {
613
+ throw new Error(`Unhandled node ${node.type}`);
614
+ }
615
+ } else if (node.type === 'ArrowFunctionExpression') {
616
+ return new naslTypes.AnonymousFunction({
617
+ params: node.params.map((param: babelTypes.Identifier) => transformParam(param)),
618
+ body: transformLogicNode(node.body),
619
+ }) as any as naslTypes.LogicItem;
620
+ } else if (node.type === 'BooleanLiteral') {
621
+ return new naslTypes.BooleanLiteral({
622
+ value: String(node.value),
623
+ });
624
+ } else if (node.type === 'StringLiteral') {
625
+ return new naslTypes.StringLiteral({
626
+ value: node.value,
627
+ });
628
+ } else if (node.type === 'NumericLiteral') {
629
+ const literal = new naslTypes.NumericLiteral({
630
+ value: String(node.value),
631
+ typeAnnotation: typeAnnotation || naslTypes.TypeAnnotation.createPrimitive('Integer'),
632
+ });
633
+ literal.typeAnnotation.typeName = literal.changeType(String(node.value));
634
+ return literal;
635
+ } else if (node.type === 'NullLiteral') {
636
+ return new naslTypes.NullLiteral();
637
+ } else if (node.type === 'TemplateLiteral') {
638
+ const expressions = [...node.expressions as babelTypes.Expression[], ...node.quasis.map((element) => ({
639
+ type: 'StringLiteral',
640
+ value: element.value.raw,
641
+ start: element.start,
642
+ end: element.end,
643
+ })) as babelTypes.StringLiteral[]];
644
+ expressions.sort((a, b) => a.start - b.start);
645
+
646
+ return new naslTypes.StringInterpolation({
647
+ expressions: expressions.map((item) => transformLogicNode(item)),
648
+ });
649
+ } else if (node.type === 'BinaryExpression' || node.type === 'LogicalExpression') {
650
+ if (node.operator === '===')
651
+ node.operator = '==';
652
+ if (node.operator === '!==')
653
+ node.operator = '!=';
654
+ if (['+', '-', '*', '/', '%', '==', '!=', '>', '<', '>=', '<=', '&&', '||', 'startwith', 'endwith', 'like', 'in'].includes(node.operator)) {
655
+ return new naslTypes.BinaryExpression({
656
+ operator: node.operator as any,
657
+ left: transformLogicNode(node.left),
658
+ right: transformLogicNode(node.right),
659
+ });
660
+ }
661
+ console.error(node);
662
+ if (debug) {
663
+ throw new Error(`Unhandled node ${node.type}`);
664
+ }
665
+ } else if (node.type === 'UnaryExpression') {
666
+ if (['!'].includes(node.operator)) {
667
+ return new naslTypes.UnaryExpression({
668
+ operator: node.operator as any,
669
+ argument: transformLogicNode(node.argument),
670
+ });
671
+ }
672
+ if (['-'].includes(node.operator) && node.argument.type === 'NumericLiteral') {
673
+ return transformLogicNode({
674
+ type: 'NumericLiteral',
675
+ value: -node.argument.value,
676
+ } as babelTypes.NumericLiteral);
677
+ }
678
+ console.error(node);
679
+ if (debug) {
680
+ throw new Error(`Unhandled node ${node.type}`);
681
+ }
682
+ } else if (node.type === 'UpdateExpression') {
683
+ if (node.operator === '++' || node.operator === '--') {
684
+ return new naslTypes.Assignment({
685
+ left: transformLogicNode(node.argument),
686
+ right: new naslTypes.BinaryExpression({
687
+ operator: node.operator[0] as '+' | '-',
688
+ left: transformLogicNode(node.argument),
689
+ right: new naslTypes.NumericLiteral({
690
+ value: '1',
691
+ typeAnnotation: naslTypes.TypeAnnotation.createPrimitive('Integer'),
692
+ }),
693
+ }),
694
+ });
695
+ }
696
+ } else if (node.type === 'ReturnStatement') {
697
+ if (node.argument) {
698
+ if (type === 'expression') {
699
+ return transformLogicNode(node.argument);
700
+ }
701
+ if (!logic.returns.length) {
702
+ logic.returns.push(new naslTypes.Return({
703
+ name: 'result',
704
+ }));
705
+ }
706
+ return new naslTypes.Assignment({
707
+ left: new naslTypes.Identifier({
708
+ name: logic.returns[0].name,
709
+ }),
710
+ right: transformLogicNode(node.argument),
711
+ });
712
+ }
713
+ } else if (node.type === 'EmptyStatement') {
714
+ return node.leadingComments && new naslTypes.Comment({
715
+ value: String(node.leadingComments[0].value),
716
+ });
717
+ } else if (node.type === 'BlockStatement') {
718
+ return transformLogicNode(node?.body?.[0]);
719
+ } else {
720
+ console.error(node);
721
+ if (debug) {
722
+ throw new Error(`Unhandled node ${node.type}`);
723
+ }
724
+ }
725
+ }
726
+
727
+ const root = babel.parseSync(tsCode, {
728
+ filename: 'result.ts',
729
+ presets: [require('@babel/preset-typescript')],
730
+ }) as babelTypes.File;
731
+
732
+ let parameters: babelTypes.Identifier[] = [];
733
+ let statements: babelTypes.Statement[] = [];
734
+
735
+ let func: babelTypes.FunctionDeclaration;
736
+ if (root.program.body[0].type === 'ExportNamedDeclaration') {
737
+ func = root.program.body[0].declaration as babelTypes.FunctionDeclaration;
738
+ }
739
+ parameters = func.params as babelTypes.Identifier[];
740
+ statements = func.body.body;
741
+ // traverse<babelTypes.Node>((current) => {
742
+ // if (current.node.type === 'FunctionDeclaration' && (current.node.id.name === contextLogicName || type === 'expression')) {
743
+ // return true;
744
+ // }
745
+ // }, { node: root.program }, { mode: 'anyObject' });
746
+
747
+ const currentPositionComment = root.comments.find((comment) => comment.type === 'CommentLine' && comment.value === ' 当前位置');
748
+ if (currentPositionComment) {
749
+ statements = statements.filter((stat) => stat.start > currentPositionComment.start);
750
+ }
751
+
752
+ // traverse<babelTypes.Node>((current) => {
753
+ // if (!current.node.type)
754
+ // console.log(current.key, current.node);
755
+ // // console.log(current.node.type);
756
+ // }, { node: {
757
+ // type: 'BlockStatement',
758
+ // body: statements,
759
+ // } as babelTypes.BlockStatement }, {
760
+ // mode: 'anyObject',
761
+ // depthFirst: true,
762
+ // excludedKeySet: new Set(['loc']),
763
+ // });
764
+
765
+ parameters.forEach((node) => {
766
+ const param = transformParam(node);
767
+ param && logic.params.push(param);
768
+ });
769
+ statements.forEach((node) => {
770
+ const item = transformLogicNode(node);
771
+ item && logic.body.push(item);
772
+ });
773
+
774
+ // console.log(JSON.stringify(logic));
775
+ // try {
776
+ // console.log(logic.toNaturalTS());
777
+ // } catch (e) {
778
+ // console.error(e);
779
+ // }
780
+
781
+ return logic;
782
+ }
783
+
784
+ export function tryTransformTSCode(tsCode: string, contextLogicName: string, type?: string): naslTypes.Logic {
785
+ if (tsCode.includes('```')) {
786
+ const cap = tsCode.match(/```.*\n([\s\S]+?)```/);
787
+ if (cap)
788
+ tsCode = cap[1].trim();
789
+ }
790
+
791
+ return transformTSCode(tsCode, contextLogicName, type);
792
+ }
793
+
794
+ export function transformTSCodeEx(answer: any, activeLogic: any, context: any) {
795
+ let logicName = activeLogic.name;
796
+ const { app, nasl } = context;
797
+ if (activeLogic.parentNode instanceof nasl.BindEvent && activeLogic.parentNode.parentNode instanceof nasl.View) {
798
+ logicName = `viewLogic_${activeLogic.name}`;
799
+ } else if (activeLogic.parentNode instanceof nasl.BindEvent && activeLogic.parentNode.parentNode instanceof nasl.ViewElement) {
800
+ logicName = `on_${(activeLogic.parentNode).element.name}_${activeLogic.name}`;
801
+ } else {
802
+ logicName = activeLogic.name;
803
+ }
804
+
805
+ const logic = tryTransformTSCode(answer, logicName);
806
+ app.emit('collect:start', { actionMsg: '自然语言生成代码' });
807
+ logic.params.forEach((param: any) => {
808
+ if (!activeLogic.params.find((_: any) => _.name === param.name))
809
+ activeLogic.addParam(param.toJSON());
810
+ });
811
+ logic.variables.forEach((variable: any) => {
812
+ if (!activeLogic.variables.find((_: any) => _.name === variable.name))
813
+ activeLogic.addVariable(variable.toJSON());
814
+ });
815
+ if (logic.returns.length && !activeLogic.returns.length) {
816
+ activeLogic.addReturn(logic.returns[0].toJSON());
817
+ }
818
+ logic.body.forEach((item: any) => activeLogic.insertItemInBodyAt(item.toJSON(), activeLogic.body.length - 1));
819
+ app.emit('collect:end');
820
+ }
821
+
822
+ export function transformTSCodeToExpression(answer: any, context: any) {
823
+ let logic;
824
+ try {
825
+ logic = tryTransformTSCode(answer, '', 'expression');
826
+ } catch (error) {
827
+ throw new Error(error);
828
+ }
829
+ const { app } = context;
830
+ app.emit('collect:start', { actionMsg: '自然语言生成代码' });
831
+ const { body } = logic;
832
+ app.emit('collect:end');
833
+ return body;
834
+ }