@lcap/nasl 3.3.5-beta.1 → 3.3.6-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/.nyc_output/{b920244d-8d01-4e76-be5a-95132217c5a1.json → d58d92d8-c0d6-479b-9f82-1f4da8e73ff3.json} +1 -1
  2. package/.nyc_output/processinfo/d58d92d8-c0d6-479b-9f82-1f4da8e73ff3.json +1 -0
  3. package/.nyc_output/processinfo/index.json +1 -1
  4. package/coverage/index.html +100 -100
  5. package/coverage/src/automate/engine/index.html +1 -1
  6. package/coverage/src/automate/engine/utils.js.html +36 -36
  7. package/coverage/src/bak/index.html +15 -15
  8. package/coverage/src/bak/translator.js.html +78 -87
  9. package/coverage/src/breakpoint/generator/AfterStartNode.ts.html +1 -1
  10. package/coverage/src/breakpoint/generator/BeforeEndNode.ts.html +1 -1
  11. package/coverage/src/breakpoint/generator/BreakpointNode.ts.html +1 -1
  12. package/coverage/src/breakpoint/generator/CallbackNode.ts.html +1 -1
  13. package/coverage/src/breakpoint/generator/index.html +1 -1
  14. package/coverage/src/breakpoint/generator/index.ts.html +1 -1
  15. package/coverage/src/breakpoint/index.html +1 -1
  16. package/coverage/src/breakpoint/index.ts.html +1 -1
  17. package/coverage/src/breakpoint/shared/constants.ts.html +1 -1
  18. package/coverage/src/breakpoint/shared/index.html +1 -1
  19. package/coverage/src/breakpoint/shared/index.ts.html +1 -1
  20. package/coverage/src/breakpoint/shared/operations.ts.html +2 -2
  21. package/coverage/src/breakpoint/shared/socket.ts.html +1 -1
  22. package/coverage/src/breakpoint/shared/utils.ts.html +1 -1
  23. package/coverage/src/breakpoint/store/core.ts.html +3 -3
  24. package/coverage/src/breakpoint/store/dock.ts.html +1 -1
  25. package/coverage/src/breakpoint/store/index.html +1 -1
  26. package/coverage/src/breakpoint/store/index.ts.html +1 -1
  27. package/coverage/src/common/BaseNode.ts.html +237 -444
  28. package/coverage/src/common/Command.ts.html +1 -1
  29. package/coverage/src/common/EventEmitter.ts.html +7 -10
  30. package/coverage/src/common/Messager.ts.html +1 -1
  31. package/coverage/src/common/asyncFuncMap.ts.html +1 -1
  32. package/coverage/src/common/index.html +19 -19
  33. package/coverage/src/common/index.ts.html +1 -1
  34. package/coverage/src/concepts/Abort__.ts.html +6 -9
  35. package/coverage/src/concepts/Anchor__.ts.html +22 -43
  36. package/coverage/src/concepts/AnonymousFunction__.ts.html +146 -209
  37. package/coverage/src/concepts/App__.ts.html +124 -523
  38. package/coverage/src/concepts/Argument__.ts.html +109 -52
  39. package/coverage/src/concepts/Assignee__.ts.html +18 -99
  40. package/coverage/src/concepts/AssignmentLine__.ts.html +14 -35
  41. package/coverage/src/concepts/Assignment__.ts.html +58 -109
  42. package/coverage/src/concepts/Attribute__.ts.html +15 -201
  43. package/coverage/src/concepts/AuthInterface__.ts.html +6 -9
  44. package/coverage/src/concepts/AuthLogicForCallInterface__.ts.html +11 -38
  45. package/coverage/src/concepts/AuthLogic__.ts.html +6 -18
  46. package/coverage/src/concepts/BackendVariable__.ts.html +81 -288
  47. package/coverage/src/concepts/Backend__.ts.html +16 -43
  48. package/coverage/src/concepts/BatchAssignment__.ts.html +154 -229
  49. package/coverage/src/concepts/BinaryExpression__.ts.html +125 -152
  50. package/coverage/src/concepts/BindAttribute__.ts.html +44 -140
  51. package/coverage/src/concepts/BindDirective__.ts.html +17 -98
  52. package/coverage/src/concepts/BindEvent__.ts.html +25 -106
  53. package/coverage/src/concepts/BindStyle__.ts.html +12 -45
  54. package/coverage/src/concepts/BooleanLiteral__.ts.html +17 -20
  55. package/coverage/src/concepts/CallAuthInterface__.ts.html +12 -39
  56. package/coverage/src/concepts/CallConnector__.ts.html +6 -9
  57. package/coverage/src/concepts/CallFunction__.ts.html +41 -83
  58. package/coverage/src/concepts/CallInterface__.ts.html +38 -95
  59. package/coverage/src/concepts/CallLogic__.ts.html +306 -192
  60. package/coverage/src/concepts/CallQueryComponent__.ts.html +23 -134
  61. package/coverage/src/concepts/Comment__.ts.html +8 -11
  62. package/coverage/src/concepts/CompletionProperty__.ts.html +11 -32
  63. package/coverage/src/concepts/ConfigGroup__.ts.html +16 -43
  64. package/coverage/src/concepts/ConfigPropertyValue__.ts.html +19 -22
  65. package/coverage/src/concepts/ConfigProperty__.ts.html +25 -52
  66. package/coverage/src/concepts/Configuration__.ts.html +17 -44
  67. package/coverage/src/concepts/Connection__.ts.html +12 -39
  68. package/coverage/src/concepts/ConnectorTrigger__.ts.html +6 -9
  69. package/coverage/src/concepts/Connector__.ts.html +29 -164
  70. package/coverage/src/concepts/Constant__.ts.html +33 -243
  71. package/coverage/src/concepts/DataSource__.ts.html +53 -80
  72. package/coverage/src/concepts/DatabaseTypeAnnotation__.ts.html +6 -9
  73. package/coverage/src/concepts/Destination__.ts.html +15 -45
  74. package/coverage/src/concepts/End__.ts.html +6 -9
  75. package/coverage/src/concepts/EntityIndex__.ts.html +7 -19
  76. package/coverage/src/concepts/EntityProperty__.ts.html +75 -273
  77. package/coverage/src/concepts/Entity__.ts.html +68 -188
  78. package/coverage/src/concepts/EnumItem__.ts.html +6 -9
  79. package/coverage/src/concepts/Enum__.ts.html +11 -38
  80. package/coverage/src/concepts/Event__.ts.html +11 -38
  81. package/coverage/src/concepts/ExternalDestination__.ts.html +12 -39
  82. package/coverage/src/concepts/ForEachStatement__.ts.html +27 -93
  83. package/coverage/src/concepts/FrontendLibrary__.ts.html +15 -66
  84. package/coverage/src/concepts/FrontendVariable__.ts.html +1 -1
  85. package/coverage/src/concepts/Frontend__.ts.html +28 -145
  86. package/coverage/src/concepts/Function__.ts.html +60 -180
  87. package/coverage/src/concepts/Identifier__.ts.html +38 -41
  88. package/coverage/src/concepts/IfStatement__.ts.html +48 -90
  89. package/coverage/src/concepts/Integration__.ts.html +15 -60
  90. package/coverage/src/concepts/InterfaceParam__.ts.html +31 -202
  91. package/coverage/src/concepts/Interface__.ts.html +25 -94
  92. package/coverage/src/concepts/JSBlock__.ts.html +6 -9
  93. package/coverage/src/concepts/JavaLogic__.ts.html +6 -9
  94. package/coverage/src/concepts/LogicItem__.ts.html +17 -20
  95. package/coverage/src/concepts/Logic__.ts.html +144 -468
  96. package/coverage/src/concepts/MatchCase__.ts.html +41 -86
  97. package/coverage/src/concepts/Match__.ts.html +29 -68
  98. package/coverage/src/concepts/MemberExpression__.ts.html +94 -112
  99. package/coverage/src/concepts/MicroApp__.ts.html +6 -9
  100. package/coverage/src/concepts/Module__.ts.html +20 -185
  101. package/coverage/src/concepts/MsgTriggerEvent__.ts.html +11 -38
  102. package/coverage/src/concepts/MsgTriggerLauncher__.ts.html +11 -38
  103. package/coverage/src/concepts/Namespace__.ts.html +70 -349
  104. package/coverage/src/concepts/NewComposite__.ts.html +93 -129
  105. package/coverage/src/concepts/NewList__.ts.html +26 -110
  106. package/coverage/src/concepts/NewMap__.ts.html +22 -166
  107. package/coverage/src/concepts/New__.ts.html +1 -1
  108. package/coverage/src/concepts/NullLiteral__.ts.html +6 -9
  109. package/coverage/src/concepts/NumericLiteral__.ts.html +24 -45
  110. package/coverage/src/concepts/OqlQueryComponent__.ts.html +14 -110
  111. package/coverage/src/concepts/OverriddenLogic__.ts.html +32 -185
  112. package/coverage/src/concepts/Param__.ts.html +119 -191
  113. package/coverage/src/concepts/Point__.ts.html +6 -9
  114. package/coverage/src/concepts/ProcessComponent__.ts.html +15 -66
  115. package/coverage/src/concepts/ProcessElement__.ts.html +40 -343
  116. package/coverage/src/concepts/ProcessOutcome__.ts.html +6 -9
  117. package/coverage/src/concepts/ProcessOutcomes__.ts.html +7 -19
  118. package/coverage/src/concepts/Process__.ts.html +30 -333
  119. package/coverage/src/concepts/QueryAggregateExpression__.ts.html +11 -32
  120. package/coverage/src/concepts/QueryFieldExpression__.ts.html +6 -9
  121. package/coverage/src/concepts/QueryFromExpression__.ts.html +11 -38
  122. package/coverage/src/concepts/QueryGroupByExpression__.ts.html +11 -32
  123. package/coverage/src/concepts/QueryJoinExpression__.ts.html +12 -51
  124. package/coverage/src/concepts/QueryLimitExpression__.ts.html +12 -39
  125. package/coverage/src/concepts/QueryOrderByExpression__.ts.html +12 -39
  126. package/coverage/src/concepts/QuerySelectExpression__.ts.html +11 -38
  127. package/coverage/src/concepts/Rect__.ts.html +6 -9
  128. package/coverage/src/concepts/Return__.ts.html +92 -251
  129. package/coverage/src/concepts/Role__.ts.html +6 -9
  130. package/coverage/src/concepts/SelectMembers__.ts.html +18 -51
  131. package/coverage/src/concepts/Slot__.ts.html +11 -32
  132. package/coverage/src/concepts/SqlQueryComponent__.ts.html +11 -32
  133. package/coverage/src/concepts/Start__.ts.html +6 -9
  134. package/coverage/src/concepts/StringInterpolation__.ts.html +17 -44
  135. package/coverage/src/concepts/StringLiteral__.ts.html +26 -29
  136. package/coverage/src/concepts/StructureProperty__.ts.html +31 -199
  137. package/coverage/src/concepts/Structure__.ts.html +17 -107
  138. package/coverage/src/concepts/SwitchCase__.ts.html +16 -46
  139. package/coverage/src/concepts/SwitchStatement__.ts.html +24 -51
  140. package/coverage/src/concepts/Theme__.ts.html +6 -9
  141. package/coverage/src/concepts/Transactional__.ts.html +6 -9
  142. package/coverage/src/concepts/TriggerEvent__.ts.html +11 -38
  143. package/coverage/src/concepts/TriggerLauncher__.ts.html +6 -9
  144. package/coverage/src/concepts/TypeAnnotation__.ts.html +95 -209
  145. package/coverage/src/concepts/TypeParam__.ts.html +7 -10
  146. package/coverage/src/concepts/UnaryExpression__.ts.html +14 -47
  147. package/coverage/src/concepts/Unparsed__.ts.html +8 -11
  148. package/coverage/src/concepts/UseComponent__.ts.html +6 -9
  149. package/coverage/src/concepts/ValidationRule__.ts.html +17 -53
  150. package/coverage/src/concepts/Variable__.ts.html +74 -290
  151. package/coverage/src/concepts/ViewBlock__.ts.html +6 -9
  152. package/coverage/src/concepts/ViewComponent__.ts.html +30 -177
  153. package/coverage/src/concepts/ViewElement__.ts.html +131 -320
  154. package/coverage/src/concepts/View__.ts.html +68 -467
  155. package/coverage/src/concepts/WhileStatement__.ts.html +51 -93
  156. package/coverage/src/concepts/basics/stdlib/index.html +8 -8
  157. package/coverage/src/concepts/basics/stdlib/index.ts.html +1 -1
  158. package/coverage/src/concepts/basics/stdlib/nasl.auth.ts.html +1 -1
  159. package/coverage/src/concepts/basics/stdlib/nasl.browser.ts.html +1 -1
  160. package/coverage/src/concepts/basics/stdlib/nasl.collection.ts.html +1 -1
  161. package/coverage/src/concepts/basics/stdlib/nasl.configuration.ts.html +1 -1
  162. package/coverage/src/concepts/basics/stdlib/nasl.core.ts.html +1 -1
  163. package/coverage/src/concepts/basics/stdlib/nasl.event.ts.html +1 -1
  164. package/coverage/src/concepts/basics/stdlib/nasl.http.ts.html +1 -1
  165. package/coverage/src/concepts/basics/stdlib/nasl.interface.ts.html +1 -1
  166. package/coverage/src/concepts/basics/stdlib/nasl.io.ts.html +1 -1
  167. package/coverage/src/concepts/basics/stdlib/nasl.logging.ts.html +1 -1
  168. package/coverage/src/concepts/basics/stdlib/nasl.process.ts.html +1 -1
  169. package/coverage/src/concepts/basics/stdlib/nasl.ui.ts.html +1 -1
  170. package/coverage/src/concepts/basics/stdlib/nasl.util.ts.html +17 -128
  171. package/coverage/src/concepts/basics/stdlib/nasl.validation.ts.html +1 -1
  172. package/coverage/src/concepts/basics/stdlib/reference2TypeAnnotationList.ts.html +1 -1
  173. package/coverage/src/concepts/basics/stdlib/timeZone.ts.html +1 -1
  174. package/coverage/src/concepts/basics/types/coreTypeList.ts.html +1 -1
  175. package/coverage/src/concepts/basics/types/index.html +1 -1
  176. package/coverage/src/concepts/basics/types/index.ts.html +1 -1
  177. package/coverage/src/concepts/index.html +863 -878
  178. package/coverage/src/concepts/index.ts.html +1 -1
  179. package/coverage/src/concepts/index__.ts.html +4 -7
  180. package/coverage/src/config.ts.html +1 -1
  181. package/coverage/src/decorators/index.html +14 -14
  182. package/coverage/src/decorators/index.ts.html +36 -45
  183. package/coverage/src/decorators/promise.ts.html +1 -1
  184. package/coverage/src/eventBus.ts.html +1 -1
  185. package/coverage/src/generator/compileComponent.ts.html +1 -1
  186. package/coverage/src/generator/genBundleFiles.ts.html +1 -1
  187. package/coverage/src/generator/genHash.ts.html +1 -1
  188. package/coverage/src/generator/genMetaData.ts.html +9 -51
  189. package/coverage/src/generator/genReleaseBody.ts.html +2 -2
  190. package/coverage/src/generator/icestark.ts.html +1 -1
  191. package/coverage/src/generator/index.html +15 -15
  192. package/coverage/src/generator/index.ts.html +1 -1
  193. package/coverage/src/generator/microApp.ts.html +1 -1
  194. package/coverage/src/generator/permission.ts.html +1 -1
  195. package/coverage/src/generator/qiankun.ts.html +1 -1
  196. package/coverage/src/generator/styleReplacer.ts.html +1 -1
  197. package/coverage/src/index.html +7 -7
  198. package/coverage/src/index.ts.html +7 -10
  199. package/coverage/src/manager/diagnostic.ts.html +1 -1
  200. package/coverage/src/manager/index.html +1 -1
  201. package/coverage/src/manager/stepRecorder.ts.html +1 -1
  202. package/coverage/src/natural/genNaturalTS.ts.html +1 -1
  203. package/coverage/src/natural/index.html +15 -15
  204. package/coverage/src/natural/index.ts.html +1 -1
  205. package/coverage/src/natural/naslStdlibMap.ts.html +1 -1
  206. package/coverage/src/natural/transformTSCode.ts.html +18 -78
  207. package/coverage/src/sentry/index.html +1 -1
  208. package/coverage/src/sentry/index.ts.html +23 -23
  209. package/coverage/src/server/createUiTs.ts.html +6 -15
  210. package/coverage/src/server/entity2LogicNamespace.ts.html +9 -9
  211. package/coverage/src/server/event.js.html +1 -1
  212. package/coverage/src/server/extendBaseNode.ts.html +1 -1
  213. package/coverage/src/server/formatTsUtils.ts.html +10 -10
  214. package/coverage/src/server/getConnector.ts.html +1 -1
  215. package/coverage/src/server/getExtensionModules.ts.html +1 -1
  216. package/coverage/src/server/getFunctions.ts.html +1 -1
  217. package/coverage/src/server/getInterfaces.ts.html +1 -1
  218. package/coverage/src/server/getLogging.ts.html +1 -1
  219. package/coverage/src/server/getLogics.ts.html +1 -1
  220. package/coverage/src/server/getMemberIdentifier.ts.html +13 -58
  221. package/coverage/src/server/getProcessComponents.ts.html +1 -1
  222. package/coverage/src/server/getProcesses.ts.html +1 -1
  223. package/coverage/src/server/getValidates.ts.html +1 -1
  224. package/coverage/src/server/index.html +23 -23
  225. package/coverage/src/server/index.ts.html +1 -1
  226. package/coverage/src/server/naslServer.ts.html +179 -134
  227. package/coverage/src/server/naslStdlibMap.ts.html +1 -1
  228. package/coverage/src/server/process2LogicNamespace.ts.html +1 -1
  229. package/coverage/src/server/translator.ts.html +1 -1
  230. package/coverage/src/service/creator/add.configs.js.html +8 -26
  231. package/coverage/src/service/creator/errHandles.js.html +37 -19
  232. package/coverage/src/service/creator/index.html +22 -22
  233. package/coverage/src/service/creator/index.js.html +1 -1
  234. package/coverage/src/service/datasource/api.js.html +1 -1
  235. package/coverage/src/service/datasource/index.html +1 -1
  236. package/coverage/src/service/datasource/index.js.html +1 -1
  237. package/coverage/src/service/logic/api.js.html +1 -1
  238. package/coverage/src/service/logic/index.html +1 -1
  239. package/coverage/src/service/logic/index.js.html +1 -1
  240. package/coverage/src/service/storage/api.js.html +1 -1
  241. package/coverage/src/service/storage/index.html +19 -19
  242. package/coverage/src/service/storage/index.ts.html +1 -1
  243. package/coverage/src/service/storage/init.ts.html +618 -1578
  244. package/coverage/src/service/storage/jsoner.ts.html +3 -3
  245. package/coverage/src/service/storage/map.ts.html +3 -3
  246. package/coverage/src/service/storage/service.ts.html +1 -1
  247. package/coverage/src/service/storage/storagePoint.ts.html +1 -1
  248. package/coverage/src/templator/genCallComponentLogic.ts.html +1 -1
  249. package/coverage/src/templator/genCreateBlock.ts.html +1 -1
  250. package/coverage/src/templator/genCurdEditMultipleKeyBlock.ts.html +1 -1
  251. package/coverage/src/templator/genCurdMultipleKeyBlock.ts.html +1 -1
  252. package/coverage/src/templator/genEditTableBlock.ts.html +4 -70
  253. package/coverage/src/templator/genEnumSelectBlock.ts.html +1 -1
  254. package/coverage/src/templator/genGetBlock.ts.html +1 -1
  255. package/coverage/src/templator/genGridViewBlock.ts.html +1 -1
  256. package/coverage/src/templator/genListViewBlock.ts.html +1 -1
  257. package/coverage/src/templator/genQueryComponent.ts.html +1 -1
  258. package/coverage/src/templator/genSelectBlock.ts.html +1 -1
  259. package/coverage/src/templator/genTableBlock.ts.html +3 -66
  260. package/coverage/src/templator/genUpdateBlock.ts.html +1 -1
  261. package/coverage/src/templator/index.html +1 -1
  262. package/coverage/src/templator/index.ts.html +1 -1
  263. package/coverage/src/templator/utils.ts.html +1 -1
  264. package/coverage/src/translator/constant.ts.html +1 -1
  265. package/coverage/src/translator/index.html +1 -1
  266. package/coverage/src/translator/index.ts.html +1 -1
  267. package/coverage/src/translator/utils.ts.html +37 -37
  268. package/coverage/src/utils/cookie.ts.html +1 -1
  269. package/coverage/src/utils/env.ts.html +1 -1
  270. package/coverage/src/utils/index.html +19 -19
  271. package/coverage/src/utils/index.ts.html +22 -61
  272. package/coverage/src/utils/logger.ts.html +1 -1
  273. package/coverage/src/utils/sortTsString.ts.html +1 -1
  274. package/coverage/src/utils/string.ts.html +1 -1
  275. package/coverage/src/utils/time-slicing.ts.html +1 -1
  276. package/coverage/src/utils/traverse.ts.html +1 -1
  277. package/coverage/src/utils/window.ts.html +1 -1
  278. package/out/bak/translator.js.map +1 -1
  279. package/out/concepts/Argument__.js +7 -2
  280. package/out/concepts/Argument__.js.map +1 -1
  281. package/out/concepts/Assignment__.js +20 -3
  282. package/out/concepts/Assignment__.js.map +1 -1
  283. package/out/concepts/BackendVariable__.js +24 -2
  284. package/out/concepts/BackendVariable__.js.map +1 -1
  285. package/out/concepts/BinaryExpression__.js +40 -13
  286. package/out/concepts/BinaryExpression__.js.map +1 -1
  287. package/out/concepts/CallLogic__.js +7 -12
  288. package/out/concepts/CallLogic__.js.map +1 -1
  289. package/out/concepts/CountersignPolicy__.d.ts +26 -0
  290. package/out/concepts/CountersignPolicy__.js +73 -0
  291. package/out/concepts/CountersignPolicy__.js.map +1 -0
  292. package/out/concepts/ForEachStatement__.js +12 -26
  293. package/out/concepts/ForEachStatement__.js.map +1 -1
  294. package/out/concepts/Identifier__.js +3 -0
  295. package/out/concepts/Identifier__.js.map +1 -1
  296. package/out/concepts/JSBlock__.js +56 -0
  297. package/out/concepts/JSBlock__.js.map +1 -1
  298. package/out/concepts/LogicItem__.js +2 -1
  299. package/out/concepts/LogicItem__.js.map +1 -1
  300. package/out/concepts/Logic__.js +2 -0
  301. package/out/concepts/Logic__.js.map +1 -1
  302. package/out/concepts/MultiApprovalPolicy__.d.ts +24 -0
  303. package/out/concepts/MultiApprovalPolicy__.js +65 -0
  304. package/out/concepts/MultiApprovalPolicy__.js.map +1 -0
  305. package/out/concepts/NewComposite__.js +18 -10
  306. package/out/concepts/NewComposite__.js.map +1 -1
  307. package/out/concepts/NumericLiteral__.js +1 -1
  308. package/out/concepts/NumericLiteral__.js.map +1 -1
  309. package/out/concepts/Param__.js +24 -2
  310. package/out/concepts/Param__.js.map +1 -1
  311. package/out/concepts/ProcessElement__.d.ts +16 -0
  312. package/out/concepts/ProcessElement__.js +56 -1
  313. package/out/concepts/ProcessElement__.js.map +1 -1
  314. package/out/concepts/Return__.js +24 -2
  315. package/out/concepts/Return__.js.map +1 -1
  316. package/out/concepts/SequentialPolicy__.d.ts +18 -0
  317. package/out/concepts/SequentialPolicy__.js +54 -0
  318. package/out/concepts/SequentialPolicy__.js.map +1 -0
  319. package/out/concepts/Variable__.js +24 -2
  320. package/out/concepts/Variable__.js.map +1 -1
  321. package/out/concepts/ViewElement__.js.map +1 -1
  322. package/out/concepts/index__.d.ts +3 -0
  323. package/out/concepts/index__.js +3 -0
  324. package/out/concepts/index__.js.map +1 -1
  325. package/out/concepts/types__.d.ts +4 -1
  326. package/out/generator/genReleaseBody.js +2 -2
  327. package/out/generator/genReleaseBody.js.map +1 -1
  328. package/out/server/extendBaseNode.js +32 -1
  329. package/out/server/extendBaseNode.js.map +1 -1
  330. package/out/server/getLogics.d.ts +1 -0
  331. package/out/server/getLogics.js +6 -2
  332. package/out/server/getLogics.js.map +1 -1
  333. package/out/server/getProcesses.js +66 -6
  334. package/out/server/getProcesses.js.map +1 -1
  335. package/out/server/index.js +1 -0
  336. package/out/server/index.js.map +1 -1
  337. package/out/server/naslServer.js +2 -2
  338. package/out/server/naslServer.js.map +1 -1
  339. package/out/server/translator.js +3 -0
  340. package/out/server/translator.js.map +1 -1
  341. package/out/service/creator/errHandles.js +6 -3
  342. package/out/service/creator/errHandles.js.map +1 -1
  343. package/out/service/storage/init.js +2 -2
  344. package/out/service/storage/init.js.map +1 -1
  345. package/out/templator/genCreateBlock.js +9 -5
  346. package/out/templator/genCreateBlock.js.map +1 -1
  347. package/out/templator/genCurdEditMultipleKeyBlock.js +18 -12
  348. package/out/templator/genCurdEditMultipleKeyBlock.js.map +1 -1
  349. package/out/templator/genCurdMultipleKeyBlock.js +10 -8
  350. package/out/templator/genCurdMultipleKeyBlock.js.map +1 -1
  351. package/out/templator/genEditTableBlock.js +3 -2
  352. package/out/templator/genEditTableBlock.js.map +1 -1
  353. package/out/templator/genUpdateBlock.js +12 -9
  354. package/out/templator/genUpdateBlock.js.map +1 -1
  355. package/out/templator/utils.js.map +1 -1
  356. package/package.json +2 -2
  357. package/sandbox/stdlib/nasl.core.ts +2 -0
  358. package/sandbox/stdlib/nasl.util.ts +3 -3
  359. package/src/bak/translator.js +0 -1
  360. package/src/concepts/Argument__.ts +7 -2
  361. package/src/concepts/Assignment__.ts +31 -13
  362. package/src/concepts/BackendVariable__.ts +22 -3
  363. package/src/concepts/BinaryExpression__.ts +39 -13
  364. package/src/concepts/CallLogic__.ts +13 -23
  365. package/src/concepts/CountersignPolicy__.ts +77 -0
  366. package/src/concepts/ForEachStatement__.ts +17 -26
  367. package/src/concepts/Identifier__.ts +4 -1
  368. package/src/concepts/JSBlock__.ts +58 -0
  369. package/src/concepts/LogicItem__.ts +2 -2
  370. package/src/concepts/Logic__.ts +1 -0
  371. package/src/concepts/MultiApprovalPolicy__.ts +69 -0
  372. package/src/concepts/NewComposite__.ts +18 -9
  373. package/src/concepts/NumericLiteral__.ts +1 -1
  374. package/src/concepts/Param__.ts +24 -2
  375. package/src/concepts/ProcessElement__.ts +70 -1
  376. package/src/concepts/Return__.ts +23 -3
  377. package/src/concepts/SequentialPolicy__.ts +58 -0
  378. package/src/concepts/Variable__.ts +23 -3
  379. package/src/concepts/ViewElement__.ts +6 -4
  380. package/src/concepts/index__.ts +3 -0
  381. package/src/concepts/types__.ts +6 -0
  382. package/src/generator/genReleaseBody.ts +40 -40
  383. package/src/server/extendBaseNode.ts +30 -2
  384. package/src/server/getLogics.ts +4 -0
  385. package/src/server/getProcesses.ts +66 -6
  386. package/src/server/index.ts +2 -1
  387. package/src/server/naslServer.ts +2 -2
  388. package/src/server/translator.ts +3 -0
  389. package/src/service/creator/errHandles.js +7 -4
  390. package/src/service/storage/init.ts +2 -2
  391. package/src/templator/genCreateBlock.ts +9 -5
  392. package/src/templator/genCurdEditMultipleKeyBlock.ts +19 -13
  393. package/src/templator/genCurdMultipleKeyBlock.ts +14 -11
  394. package/src/templator/genEditTableBlock.ts +4 -2
  395. package/src/templator/genUpdateBlock.ts +15 -12
  396. package/src/templator/utils.ts +8 -7
  397. package/test/concepts/anonymous-function/__snapshots__/toJS.spec.ts.snap +1 -1
  398. package/test/concepts/assignment/__snapshots__/toJS.spec.ts.snap +1 -1
  399. package/test/concepts/batch-assignment/__snapshots__/toJS.spec.ts.snap +2 -2
  400. package/test/concepts/binary-expression/__snapshots__/toJS.spec.ts.snap +3 -2
  401. package/test/concepts/call-interface/__snapshots__/toJS.spec.ts.snap +2 -2
  402. package/test/concepts/call-logic/__snapshots__/toJS.spec.ts.snap +3 -3
  403. package/test/concepts/match/__snapshots__/toJS.spec.ts.snap +1 -1
  404. package/test/concepts/numeric-literal/__snapshots__/toJS.spec.ts.snap +1 -1
  405. package/test/concepts/validation-rule/__snapshots__/toJS.spec.ts.snap +3 -3
  406. package/.nyc_output/processinfo/b920244d-8d01-4e76-be5a-95132217c5a1.json +0 -1
  407. package/coverage/src/concepts/DefaultValue__.ts.html +0 -946
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">5.38% </span>
26
+ <span class="strong">6.39% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>35/650</span>
28
+ <span class='fraction'>30/469</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0.52% </span>
33
+ <span class="strong">0.66% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>2/382</span>
35
+ <span class='fraction'>2/300</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">1.03% </span>
40
+ <span class="strong">1.49% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>1/97</span>
42
+ <span class='fraction'>1/67</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">5.56% </span>
47
+ <span class="strong">6.69% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>35/629</span>
49
+ <span class='fraction'>30/448</span>
50
50
  </div>
51
51
 
52
52
 
@@ -955,570 +955,26 @@
955
955
  <a name='L890'></a><a href='#L890'>890</a>
956
956
  <a name='L891'></a><a href='#L891'>891</a>
957
957
  <a name='L892'></a><a href='#L892'>892</a>
958
- <a name='L893'></a><a href='#L893'>893</a>
959
- <a name='L894'></a><a href='#L894'>894</a>
960
- <a name='L895'></a><a href='#L895'>895</a>
961
- <a name='L896'></a><a href='#L896'>896</a>
962
- <a name='L897'></a><a href='#L897'>897</a>
963
- <a name='L898'></a><a href='#L898'>898</a>
964
- <a name='L899'></a><a href='#L899'>899</a>
965
- <a name='L900'></a><a href='#L900'>900</a>
966
- <a name='L901'></a><a href='#L901'>901</a>
967
- <a name='L902'></a><a href='#L902'>902</a>
968
- <a name='L903'></a><a href='#L903'>903</a>
969
- <a name='L904'></a><a href='#L904'>904</a>
970
- <a name='L905'></a><a href='#L905'>905</a>
971
- <a name='L906'></a><a href='#L906'>906</a>
972
- <a name='L907'></a><a href='#L907'>907</a>
973
- <a name='L908'></a><a href='#L908'>908</a>
974
- <a name='L909'></a><a href='#L909'>909</a>
975
- <a name='L910'></a><a href='#L910'>910</a>
976
- <a name='L911'></a><a href='#L911'>911</a>
977
- <a name='L912'></a><a href='#L912'>912</a>
978
- <a name='L913'></a><a href='#L913'>913</a>
979
- <a name='L914'></a><a href='#L914'>914</a>
980
- <a name='L915'></a><a href='#L915'>915</a>
981
- <a name='L916'></a><a href='#L916'>916</a>
982
- <a name='L917'></a><a href='#L917'>917</a>
983
- <a name='L918'></a><a href='#L918'>918</a>
984
- <a name='L919'></a><a href='#L919'>919</a>
985
- <a name='L920'></a><a href='#L920'>920</a>
986
- <a name='L921'></a><a href='#L921'>921</a>
987
- <a name='L922'></a><a href='#L922'>922</a>
988
- <a name='L923'></a><a href='#L923'>923</a>
989
- <a name='L924'></a><a href='#L924'>924</a>
990
- <a name='L925'></a><a href='#L925'>925</a>
991
- <a name='L926'></a><a href='#L926'>926</a>
992
- <a name='L927'></a><a href='#L927'>927</a>
993
- <a name='L928'></a><a href='#L928'>928</a>
994
- <a name='L929'></a><a href='#L929'>929</a>
995
- <a name='L930'></a><a href='#L930'>930</a>
996
- <a name='L931'></a><a href='#L931'>931</a>
997
- <a name='L932'></a><a href='#L932'>932</a>
998
- <a name='L933'></a><a href='#L933'>933</a>
999
- <a name='L934'></a><a href='#L934'>934</a>
1000
- <a name='L935'></a><a href='#L935'>935</a>
1001
- <a name='L936'></a><a href='#L936'>936</a>
1002
- <a name='L937'></a><a href='#L937'>937</a>
1003
- <a name='L938'></a><a href='#L938'>938</a>
1004
- <a name='L939'></a><a href='#L939'>939</a>
1005
- <a name='L940'></a><a href='#L940'>940</a>
1006
- <a name='L941'></a><a href='#L941'>941</a>
1007
- <a name='L942'></a><a href='#L942'>942</a>
1008
- <a name='L943'></a><a href='#L943'>943</a>
1009
- <a name='L944'></a><a href='#L944'>944</a>
1010
- <a name='L945'></a><a href='#L945'>945</a>
1011
- <a name='L946'></a><a href='#L946'>946</a>
1012
- <a name='L947'></a><a href='#L947'>947</a>
1013
- <a name='L948'></a><a href='#L948'>948</a>
1014
- <a name='L949'></a><a href='#L949'>949</a>
1015
- <a name='L950'></a><a href='#L950'>950</a>
1016
- <a name='L951'></a><a href='#L951'>951</a>
1017
- <a name='L952'></a><a href='#L952'>952</a>
1018
- <a name='L953'></a><a href='#L953'>953</a>
1019
- <a name='L954'></a><a href='#L954'>954</a>
1020
- <a name='L955'></a><a href='#L955'>955</a>
1021
- <a name='L956'></a><a href='#L956'>956</a>
1022
- <a name='L957'></a><a href='#L957'>957</a>
1023
- <a name='L958'></a><a href='#L958'>958</a>
1024
- <a name='L959'></a><a href='#L959'>959</a>
1025
- <a name='L960'></a><a href='#L960'>960</a>
1026
- <a name='L961'></a><a href='#L961'>961</a>
1027
- <a name='L962'></a><a href='#L962'>962</a>
1028
- <a name='L963'></a><a href='#L963'>963</a>
1029
- <a name='L964'></a><a href='#L964'>964</a>
1030
- <a name='L965'></a><a href='#L965'>965</a>
1031
- <a name='L966'></a><a href='#L966'>966</a>
1032
- <a name='L967'></a><a href='#L967'>967</a>
1033
- <a name='L968'></a><a href='#L968'>968</a>
1034
- <a name='L969'></a><a href='#L969'>969</a>
1035
- <a name='L970'></a><a href='#L970'>970</a>
1036
- <a name='L971'></a><a href='#L971'>971</a>
1037
- <a name='L972'></a><a href='#L972'>972</a>
1038
- <a name='L973'></a><a href='#L973'>973</a>
1039
- <a name='L974'></a><a href='#L974'>974</a>
1040
- <a name='L975'></a><a href='#L975'>975</a>
1041
- <a name='L976'></a><a href='#L976'>976</a>
1042
- <a name='L977'></a><a href='#L977'>977</a>
1043
- <a name='L978'></a><a href='#L978'>978</a>
1044
- <a name='L979'></a><a href='#L979'>979</a>
1045
- <a name='L980'></a><a href='#L980'>980</a>
1046
- <a name='L981'></a><a href='#L981'>981</a>
1047
- <a name='L982'></a><a href='#L982'>982</a>
1048
- <a name='L983'></a><a href='#L983'>983</a>
1049
- <a name='L984'></a><a href='#L984'>984</a>
1050
- <a name='L985'></a><a href='#L985'>985</a>
1051
- <a name='L986'></a><a href='#L986'>986</a>
1052
- <a name='L987'></a><a href='#L987'>987</a>
1053
- <a name='L988'></a><a href='#L988'>988</a>
1054
- <a name='L989'></a><a href='#L989'>989</a>
1055
- <a name='L990'></a><a href='#L990'>990</a>
1056
- <a name='L991'></a><a href='#L991'>991</a>
1057
- <a name='L992'></a><a href='#L992'>992</a>
1058
- <a name='L993'></a><a href='#L993'>993</a>
1059
- <a name='L994'></a><a href='#L994'>994</a>
1060
- <a name='L995'></a><a href='#L995'>995</a>
1061
- <a name='L996'></a><a href='#L996'>996</a>
1062
- <a name='L997'></a><a href='#L997'>997</a>
1063
- <a name='L998'></a><a href='#L998'>998</a>
1064
- <a name='L999'></a><a href='#L999'>999</a>
1065
- <a name='L1000'></a><a href='#L1000'>1000</a>
1066
- <a name='L1001'></a><a href='#L1001'>1001</a>
1067
- <a name='L1002'></a><a href='#L1002'>1002</a>
1068
- <a name='L1003'></a><a href='#L1003'>1003</a>
1069
- <a name='L1004'></a><a href='#L1004'>1004</a>
1070
- <a name='L1005'></a><a href='#L1005'>1005</a>
1071
- <a name='L1006'></a><a href='#L1006'>1006</a>
1072
- <a name='L1007'></a><a href='#L1007'>1007</a>
1073
- <a name='L1008'></a><a href='#L1008'>1008</a>
1074
- <a name='L1009'></a><a href='#L1009'>1009</a>
1075
- <a name='L1010'></a><a href='#L1010'>1010</a>
1076
- <a name='L1011'></a><a href='#L1011'>1011</a>
1077
- <a name='L1012'></a><a href='#L1012'>1012</a>
1078
- <a name='L1013'></a><a href='#L1013'>1013</a>
1079
- <a name='L1014'></a><a href='#L1014'>1014</a>
1080
- <a name='L1015'></a><a href='#L1015'>1015</a>
1081
- <a name='L1016'></a><a href='#L1016'>1016</a>
1082
- <a name='L1017'></a><a href='#L1017'>1017</a>
1083
- <a name='L1018'></a><a href='#L1018'>1018</a>
1084
- <a name='L1019'></a><a href='#L1019'>1019</a>
1085
- <a name='L1020'></a><a href='#L1020'>1020</a>
1086
- <a name='L1021'></a><a href='#L1021'>1021</a>
1087
- <a name='L1022'></a><a href='#L1022'>1022</a>
1088
- <a name='L1023'></a><a href='#L1023'>1023</a>
1089
- <a name='L1024'></a><a href='#L1024'>1024</a>
1090
- <a name='L1025'></a><a href='#L1025'>1025</a>
1091
- <a name='L1026'></a><a href='#L1026'>1026</a>
1092
- <a name='L1027'></a><a href='#L1027'>1027</a>
1093
- <a name='L1028'></a><a href='#L1028'>1028</a>
1094
- <a name='L1029'></a><a href='#L1029'>1029</a>
1095
- <a name='L1030'></a><a href='#L1030'>1030</a>
1096
- <a name='L1031'></a><a href='#L1031'>1031</a>
1097
- <a name='L1032'></a><a href='#L1032'>1032</a>
1098
- <a name='L1033'></a><a href='#L1033'>1033</a>
1099
- <a name='L1034'></a><a href='#L1034'>1034</a>
1100
- <a name='L1035'></a><a href='#L1035'>1035</a>
1101
- <a name='L1036'></a><a href='#L1036'>1036</a>
1102
- <a name='L1037'></a><a href='#L1037'>1037</a>
1103
- <a name='L1038'></a><a href='#L1038'>1038</a>
1104
- <a name='L1039'></a><a href='#L1039'>1039</a>
1105
- <a name='L1040'></a><a href='#L1040'>1040</a>
1106
- <a name='L1041'></a><a href='#L1041'>1041</a>
1107
- <a name='L1042'></a><a href='#L1042'>1042</a>
1108
- <a name='L1043'></a><a href='#L1043'>1043</a>
1109
- <a name='L1044'></a><a href='#L1044'>1044</a>
1110
- <a name='L1045'></a><a href='#L1045'>1045</a>
1111
- <a name='L1046'></a><a href='#L1046'>1046</a>
1112
- <a name='L1047'></a><a href='#L1047'>1047</a>
1113
- <a name='L1048'></a><a href='#L1048'>1048</a>
1114
- <a name='L1049'></a><a href='#L1049'>1049</a>
1115
- <a name='L1050'></a><a href='#L1050'>1050</a>
1116
- <a name='L1051'></a><a href='#L1051'>1051</a>
1117
- <a name='L1052'></a><a href='#L1052'>1052</a>
1118
- <a name='L1053'></a><a href='#L1053'>1053</a>
1119
- <a name='L1054'></a><a href='#L1054'>1054</a>
1120
- <a name='L1055'></a><a href='#L1055'>1055</a>
1121
- <a name='L1056'></a><a href='#L1056'>1056</a>
1122
- <a name='L1057'></a><a href='#L1057'>1057</a>
1123
- <a name='L1058'></a><a href='#L1058'>1058</a>
1124
- <a name='L1059'></a><a href='#L1059'>1059</a>
1125
- <a name='L1060'></a><a href='#L1060'>1060</a>
1126
- <a name='L1061'></a><a href='#L1061'>1061</a>
1127
- <a name='L1062'></a><a href='#L1062'>1062</a>
1128
- <a name='L1063'></a><a href='#L1063'>1063</a>
1129
- <a name='L1064'></a><a href='#L1064'>1064</a>
1130
- <a name='L1065'></a><a href='#L1065'>1065</a>
1131
- <a name='L1066'></a><a href='#L1066'>1066</a>
1132
- <a name='L1067'></a><a href='#L1067'>1067</a>
1133
- <a name='L1068'></a><a href='#L1068'>1068</a>
1134
- <a name='L1069'></a><a href='#L1069'>1069</a>
1135
- <a name='L1070'></a><a href='#L1070'>1070</a>
1136
- <a name='L1071'></a><a href='#L1071'>1071</a>
1137
- <a name='L1072'></a><a href='#L1072'>1072</a>
1138
- <a name='L1073'></a><a href='#L1073'>1073</a>
1139
- <a name='L1074'></a><a href='#L1074'>1074</a>
1140
- <a name='L1075'></a><a href='#L1075'>1075</a>
1141
- <a name='L1076'></a><a href='#L1076'>1076</a>
1142
- <a name='L1077'></a><a href='#L1077'>1077</a>
1143
- <a name='L1078'></a><a href='#L1078'>1078</a>
1144
- <a name='L1079'></a><a href='#L1079'>1079</a>
1145
- <a name='L1080'></a><a href='#L1080'>1080</a>
1146
- <a name='L1081'></a><a href='#L1081'>1081</a>
1147
- <a name='L1082'></a><a href='#L1082'>1082</a>
1148
- <a name='L1083'></a><a href='#L1083'>1083</a>
1149
- <a name='L1084'></a><a href='#L1084'>1084</a>
1150
- <a name='L1085'></a><a href='#L1085'>1085</a>
1151
- <a name='L1086'></a><a href='#L1086'>1086</a>
1152
- <a name='L1087'></a><a href='#L1087'>1087</a>
1153
- <a name='L1088'></a><a href='#L1088'>1088</a>
1154
- <a name='L1089'></a><a href='#L1089'>1089</a>
1155
- <a name='L1090'></a><a href='#L1090'>1090</a>
1156
- <a name='L1091'></a><a href='#L1091'>1091</a>
1157
- <a name='L1092'></a><a href='#L1092'>1092</a>
1158
- <a name='L1093'></a><a href='#L1093'>1093</a>
1159
- <a name='L1094'></a><a href='#L1094'>1094</a>
1160
- <a name='L1095'></a><a href='#L1095'>1095</a>
1161
- <a name='L1096'></a><a href='#L1096'>1096</a>
1162
- <a name='L1097'></a><a href='#L1097'>1097</a>
1163
- <a name='L1098'></a><a href='#L1098'>1098</a>
1164
- <a name='L1099'></a><a href='#L1099'>1099</a>
1165
- <a name='L1100'></a><a href='#L1100'>1100</a>
1166
- <a name='L1101'></a><a href='#L1101'>1101</a>
1167
- <a name='L1102'></a><a href='#L1102'>1102</a>
1168
- <a name='L1103'></a><a href='#L1103'>1103</a>
1169
- <a name='L1104'></a><a href='#L1104'>1104</a>
1170
- <a name='L1105'></a><a href='#L1105'>1105</a>
1171
- <a name='L1106'></a><a href='#L1106'>1106</a>
1172
- <a name='L1107'></a><a href='#L1107'>1107</a>
1173
- <a name='L1108'></a><a href='#L1108'>1108</a>
1174
- <a name='L1109'></a><a href='#L1109'>1109</a>
1175
- <a name='L1110'></a><a href='#L1110'>1110</a>
1176
- <a name='L1111'></a><a href='#L1111'>1111</a>
1177
- <a name='L1112'></a><a href='#L1112'>1112</a>
1178
- <a name='L1113'></a><a href='#L1113'>1113</a>
1179
- <a name='L1114'></a><a href='#L1114'>1114</a>
1180
- <a name='L1115'></a><a href='#L1115'>1115</a>
1181
- <a name='L1116'></a><a href='#L1116'>1116</a>
1182
- <a name='L1117'></a><a href='#L1117'>1117</a>
1183
- <a name='L1118'></a><a href='#L1118'>1118</a>
1184
- <a name='L1119'></a><a href='#L1119'>1119</a>
1185
- <a name='L1120'></a><a href='#L1120'>1120</a>
1186
- <a name='L1121'></a><a href='#L1121'>1121</a>
1187
- <a name='L1122'></a><a href='#L1122'>1122</a>
1188
- <a name='L1123'></a><a href='#L1123'>1123</a>
1189
- <a name='L1124'></a><a href='#L1124'>1124</a>
1190
- <a name='L1125'></a><a href='#L1125'>1125</a>
1191
- <a name='L1126'></a><a href='#L1126'>1126</a>
1192
- <a name='L1127'></a><a href='#L1127'>1127</a>
1193
- <a name='L1128'></a><a href='#L1128'>1128</a>
1194
- <a name='L1129'></a><a href='#L1129'>1129</a>
1195
- <a name='L1130'></a><a href='#L1130'>1130</a>
1196
- <a name='L1131'></a><a href='#L1131'>1131</a>
1197
- <a name='L1132'></a><a href='#L1132'>1132</a>
1198
- <a name='L1133'></a><a href='#L1133'>1133</a>
1199
- <a name='L1134'></a><a href='#L1134'>1134</a>
1200
- <a name='L1135'></a><a href='#L1135'>1135</a>
1201
- <a name='L1136'></a><a href='#L1136'>1136</a>
1202
- <a name='L1137'></a><a href='#L1137'>1137</a>
1203
- <a name='L1138'></a><a href='#L1138'>1138</a>
1204
- <a name='L1139'></a><a href='#L1139'>1139</a>
1205
- <a name='L1140'></a><a href='#L1140'>1140</a>
1206
- <a name='L1141'></a><a href='#L1141'>1141</a>
1207
- <a name='L1142'></a><a href='#L1142'>1142</a>
1208
- <a name='L1143'></a><a href='#L1143'>1143</a>
1209
- <a name='L1144'></a><a href='#L1144'>1144</a>
1210
- <a name='L1145'></a><a href='#L1145'>1145</a>
1211
- <a name='L1146'></a><a href='#L1146'>1146</a>
1212
- <a name='L1147'></a><a href='#L1147'>1147</a>
1213
- <a name='L1148'></a><a href='#L1148'>1148</a>
1214
- <a name='L1149'></a><a href='#L1149'>1149</a>
1215
- <a name='L1150'></a><a href='#L1150'>1150</a>
1216
- <a name='L1151'></a><a href='#L1151'>1151</a>
1217
- <a name='L1152'></a><a href='#L1152'>1152</a>
1218
- <a name='L1153'></a><a href='#L1153'>1153</a>
1219
- <a name='L1154'></a><a href='#L1154'>1154</a>
1220
- <a name='L1155'></a><a href='#L1155'>1155</a>
1221
- <a name='L1156'></a><a href='#L1156'>1156</a>
1222
- <a name='L1157'></a><a href='#L1157'>1157</a>
1223
- <a name='L1158'></a><a href='#L1158'>1158</a>
1224
- <a name='L1159'></a><a href='#L1159'>1159</a>
1225
- <a name='L1160'></a><a href='#L1160'>1160</a>
1226
- <a name='L1161'></a><a href='#L1161'>1161</a>
1227
- <a name='L1162'></a><a href='#L1162'>1162</a>
1228
- <a name='L1163'></a><a href='#L1163'>1163</a>
1229
- <a name='L1164'></a><a href='#L1164'>1164</a>
1230
- <a name='L1165'></a><a href='#L1165'>1165</a>
1231
- <a name='L1166'></a><a href='#L1166'>1166</a>
1232
- <a name='L1167'></a><a href='#L1167'>1167</a>
1233
- <a name='L1168'></a><a href='#L1168'>1168</a>
1234
- <a name='L1169'></a><a href='#L1169'>1169</a>
1235
- <a name='L1170'></a><a href='#L1170'>1170</a>
1236
- <a name='L1171'></a><a href='#L1171'>1171</a>
1237
- <a name='L1172'></a><a href='#L1172'>1172</a>
1238
- <a name='L1173'></a><a href='#L1173'>1173</a>
1239
- <a name='L1174'></a><a href='#L1174'>1174</a>
1240
- <a name='L1175'></a><a href='#L1175'>1175</a>
1241
- <a name='L1176'></a><a href='#L1176'>1176</a>
1242
- <a name='L1177'></a><a href='#L1177'>1177</a>
1243
- <a name='L1178'></a><a href='#L1178'>1178</a>
1244
- <a name='L1179'></a><a href='#L1179'>1179</a>
1245
- <a name='L1180'></a><a href='#L1180'>1180</a>
1246
- <a name='L1181'></a><a href='#L1181'>1181</a>
1247
- <a name='L1182'></a><a href='#L1182'>1182</a>
1248
- <a name='L1183'></a><a href='#L1183'>1183</a>
1249
- <a name='L1184'></a><a href='#L1184'>1184</a>
1250
- <a name='L1185'></a><a href='#L1185'>1185</a>
1251
- <a name='L1186'></a><a href='#L1186'>1186</a>
1252
- <a name='L1187'></a><a href='#L1187'>1187</a>
1253
- <a name='L1188'></a><a href='#L1188'>1188</a>
1254
- <a name='L1189'></a><a href='#L1189'>1189</a>
1255
- <a name='L1190'></a><a href='#L1190'>1190</a>
1256
- <a name='L1191'></a><a href='#L1191'>1191</a>
1257
- <a name='L1192'></a><a href='#L1192'>1192</a>
1258
- <a name='L1193'></a><a href='#L1193'>1193</a>
1259
- <a name='L1194'></a><a href='#L1194'>1194</a>
1260
- <a name='L1195'></a><a href='#L1195'>1195</a>
1261
- <a name='L1196'></a><a href='#L1196'>1196</a>
1262
- <a name='L1197'></a><a href='#L1197'>1197</a>
1263
- <a name='L1198'></a><a href='#L1198'>1198</a>
1264
- <a name='L1199'></a><a href='#L1199'>1199</a>
1265
- <a name='L1200'></a><a href='#L1200'>1200</a>
1266
- <a name='L1201'></a><a href='#L1201'>1201</a>
1267
- <a name='L1202'></a><a href='#L1202'>1202</a>
1268
- <a name='L1203'></a><a href='#L1203'>1203</a>
1269
- <a name='L1204'></a><a href='#L1204'>1204</a>
1270
- <a name='L1205'></a><a href='#L1205'>1205</a>
1271
- <a name='L1206'></a><a href='#L1206'>1206</a>
1272
- <a name='L1207'></a><a href='#L1207'>1207</a>
1273
- <a name='L1208'></a><a href='#L1208'>1208</a>
1274
- <a name='L1209'></a><a href='#L1209'>1209</a>
1275
- <a name='L1210'></a><a href='#L1210'>1210</a>
1276
- <a name='L1211'></a><a href='#L1211'>1211</a>
1277
- <a name='L1212'></a><a href='#L1212'>1212</a>
1278
- <a name='L1213'></a><a href='#L1213'>1213</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
958
+ <a name='L893'></a><a href='#L893'>893</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
1279
959
  <span class="cline-any cline-yes">1x</span>
1280
960
  <span class="cline-any cline-yes">1x</span>
1281
961
  <span class="cline-any cline-yes">1x</span>
1282
962
  <span class="cline-any cline-yes">1x</span>
1283
963
  <span class="cline-any cline-yes">1x</span>
1284
964
  <span class="cline-any cline-yes">1x</span>
1285
- <span class="cline-any cline-yes">1x</span>
1286
- <span class="cline-any cline-yes">1x</span>
1287
- <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-yes">1x</span>
1289
- <span class="cline-any cline-neutral">&nbsp;</span>
1290
965
  <span class="cline-any cline-neutral">&nbsp;</span>
1291
- <span class="cline-any cline-neutral">&nbsp;</span>
1292
- <span class="cline-any cline-yes">1x</span>
1293
- <span class="cline-any cline-yes">1x</span>
1294
966
  <span class="cline-any cline-yes">1x</span>
1295
967
  <span class="cline-any cline-yes">1x</span>
1296
968
  <span class="cline-any cline-neutral">&nbsp;</span>
1297
969
  <span class="cline-any cline-neutral">&nbsp;</span>
1298
- <span class="cline-any cline-yes">1x</span>
1299
970
  <span class="cline-any cline-neutral">&nbsp;</span>
1300
971
  <span class="cline-any cline-yes">1x</span>
1301
- <span class="cline-any cline-neutral">&nbsp;</span>
1302
- <span class="cline-any cline-neutral">&nbsp;</span>
1303
972
  <span class="cline-any cline-yes">1x</span>
1304
- <span class="cline-any cline-no">&nbsp;</span>
1305
- <span class="cline-any cline-neutral">&nbsp;</span>
1306
- <span class="cline-any cline-no">&nbsp;</span>
1307
- <span class="cline-any cline-no">&nbsp;</span>
1308
- <span class="cline-any cline-no">&nbsp;</span>
1309
- <span class="cline-any cline-no">&nbsp;</span>
1310
- <span class="cline-any cline-no">&nbsp;</span>
1311
- <span class="cline-any cline-neutral">&nbsp;</span>
1312
- <span class="cline-any cline-neutral">&nbsp;</span>
1313
- <span class="cline-any cline-no">&nbsp;</span>
1314
- <span class="cline-any cline-no">&nbsp;</span>
1315
- <span class="cline-any cline-no">&nbsp;</span>
1316
- <span class="cline-any cline-no">&nbsp;</span>
1317
- <span class="cline-any cline-no">&nbsp;</span>
1318
- <span class="cline-any cline-no">&nbsp;</span>
1319
- <span class="cline-any cline-no">&nbsp;</span>
1320
- <span class="cline-any cline-no">&nbsp;</span>
1321
- <span class="cline-any cline-no">&nbsp;</span>
1322
- <span class="cline-any cline-neutral">&nbsp;</span>
1323
- <span class="cline-any cline-no">&nbsp;</span>
1324
- <span class="cline-any cline-neutral">&nbsp;</span>
1325
- <span class="cline-any cline-no">&nbsp;</span>
1326
- <span class="cline-any cline-no">&nbsp;</span>
1327
- <span class="cline-any cline-no">&nbsp;</span>
1328
- <span class="cline-any cline-neutral">&nbsp;</span>
1329
- <span class="cline-any cline-neutral">&nbsp;</span>
1330
- <span class="cline-any cline-neutral">&nbsp;</span>
1331
- <span class="cline-any cline-no">&nbsp;</span>
1332
- <span class="cline-any cline-no">&nbsp;</span>
1333
- <span class="cline-any cline-neutral">&nbsp;</span>
1334
- <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-neutral">&nbsp;</span>
1336
- <span class="cline-any cline-neutral">&nbsp;</span>
1337
- <span class="cline-any cline-neutral">&nbsp;</span>
1338
- <span class="cline-any cline-no">&nbsp;</span>
1339
- <span class="cline-any cline-no">&nbsp;</span>
1340
- <span class="cline-any cline-neutral">&nbsp;</span>
1341
- <span class="cline-any cline-no">&nbsp;</span>
1342
- <span class="cline-any cline-no">&nbsp;</span>
1343
- <span class="cline-any cline-no">&nbsp;</span>
1344
- <span class="cline-any cline-no">&nbsp;</span>
1345
- <span class="cline-any cline-no">&nbsp;</span>
1346
- <span class="cline-any cline-neutral">&nbsp;</span>
1347
- <span class="cline-any cline-neutral">&nbsp;</span>
1348
- <span class="cline-any cline-no">&nbsp;</span>
1349
- <span class="cline-any cline-no">&nbsp;</span>
1350
- <span class="cline-any cline-no">&nbsp;</span>
1351
- <span class="cline-any cline-no">&nbsp;</span>
1352
- <span class="cline-any cline-no">&nbsp;</span>
1353
- <span class="cline-any cline-neutral">&nbsp;</span>
1354
- <span class="cline-any cline-no">&nbsp;</span>
1355
- <span class="cline-any cline-no">&nbsp;</span>
1356
- <span class="cline-any cline-no">&nbsp;</span>
1357
- <span class="cline-any cline-no">&nbsp;</span>
1358
- <span class="cline-any cline-neutral">&nbsp;</span>
1359
- <span class="cline-any cline-no">&nbsp;</span>
1360
- <span class="cline-any cline-no">&nbsp;</span>
1361
- <span class="cline-any cline-no">&nbsp;</span>
1362
- <span class="cline-any cline-no">&nbsp;</span>
1363
- <span class="cline-any cline-no">&nbsp;</span>
1364
- <span class="cline-any cline-no">&nbsp;</span>
1365
- <span class="cline-any cline-neutral">&nbsp;</span>
1366
- <span class="cline-any cline-no">&nbsp;</span>
1367
- <span class="cline-any cline-neutral">&nbsp;</span>
1368
- <span class="cline-any cline-neutral">&nbsp;</span>
1369
- <span class="cline-any cline-neutral">&nbsp;</span>
1370
- <span class="cline-any cline-no">&nbsp;</span>
1371
- <span class="cline-any cline-no">&nbsp;</span>
1372
- <span class="cline-any cline-neutral">&nbsp;</span>
1373
- <span class="cline-any cline-neutral">&nbsp;</span>
1374
- <span class="cline-any cline-neutral">&nbsp;</span>
1375
- <span class="cline-any cline-no">&nbsp;</span>
1376
- <span class="cline-any cline-no">&nbsp;</span>
1377
- <span class="cline-any cline-neutral">&nbsp;</span>
1378
- <span class="cline-any cline-neutral">&nbsp;</span>
1379
- <span class="cline-any cline-neutral">&nbsp;</span>
1380
- <span class="cline-any cline-neutral">&nbsp;</span>
1381
- <span class="cline-any cline-neutral">&nbsp;</span>
1382
973
  <span class="cline-any cline-yes">1x</span>
1383
- <span class="cline-any cline-no">&nbsp;</span>
1384
- <span class="cline-any cline-no">&nbsp;</span>
1385
- <span class="cline-any cline-no">&nbsp;</span>
1386
- <span class="cline-any cline-no">&nbsp;</span>
1387
- <span class="cline-any cline-no">&nbsp;</span>
1388
- <span class="cline-any cline-no">&nbsp;</span>
1389
- <span class="cline-any cline-no">&nbsp;</span>
1390
- <span class="cline-any cline-no">&nbsp;</span>
1391
- <span class="cline-any cline-no">&nbsp;</span>
1392
- <span class="cline-any cline-no">&nbsp;</span>
1393
- <span class="cline-any cline-no">&nbsp;</span>
1394
- <span class="cline-any cline-neutral">&nbsp;</span>
1395
- <span class="cline-any cline-no">&nbsp;</span>
1396
- <span class="cline-any cline-no">&nbsp;</span>
1397
- <span class="cline-any cline-no">&nbsp;</span>
1398
- <span class="cline-any cline-no">&nbsp;</span>
1399
- <span class="cline-any cline-no">&nbsp;</span>
1400
- <span class="cline-any cline-no">&nbsp;</span>
1401
- <span class="cline-any cline-no">&nbsp;</span>
1402
- <span class="cline-any cline-no">&nbsp;</span>
1403
- <span class="cline-any cline-neutral">&nbsp;</span>
1404
- <span class="cline-any cline-no">&nbsp;</span>
1405
- <span class="cline-any cline-neutral">&nbsp;</span>
1406
- <span class="cline-any cline-no">&nbsp;</span>
1407
- <span class="cline-any cline-no">&nbsp;</span>
1408
- <span class="cline-any cline-neutral">&nbsp;</span>
1409
- <span class="cline-any cline-neutral">&nbsp;</span>
1410
- <span class="cline-any cline-neutral">&nbsp;</span>
1411
- <span class="cline-any cline-no">&nbsp;</span>
1412
- <span class="cline-any cline-no">&nbsp;</span>
1413
- <span class="cline-any cline-neutral">&nbsp;</span>
1414
- <span class="cline-any cline-neutral">&nbsp;</span>
1415
- <span class="cline-any cline-neutral">&nbsp;</span>
1416
- <span class="cline-any cline-no">&nbsp;</span>
1417
- <span class="cline-any cline-no">&nbsp;</span>
1418
- <span class="cline-any cline-neutral">&nbsp;</span>
1419
- <span class="cline-any cline-neutral">&nbsp;</span>
1420
- <span class="cline-any cline-neutral">&nbsp;</span>
1421
- <span class="cline-any cline-neutral">&nbsp;</span>
1422
- <span class="cline-any cline-neutral">&nbsp;</span>
1423
- <span class="cline-any cline-neutral">&nbsp;</span>
1424
- <span class="cline-any cline-no">&nbsp;</span>
1425
- <span class="cline-any cline-no">&nbsp;</span>
1426
- <span class="cline-any cline-no">&nbsp;</span>
1427
- <span class="cline-any cline-no">&nbsp;</span>
1428
- <span class="cline-any cline-no">&nbsp;</span>
1429
- <span class="cline-any cline-no">&nbsp;</span>
1430
- <span class="cline-any cline-neutral">&nbsp;</span>
1431
- <span class="cline-any cline-no">&nbsp;</span>
1432
- <span class="cline-any cline-neutral">&nbsp;</span>
1433
- <span class="cline-any cline-neutral">&nbsp;</span>
1434
- <span class="cline-any cline-no">&nbsp;</span>
1435
- <span class="cline-any cline-no">&nbsp;</span>
1436
- <span class="cline-any cline-no">&nbsp;</span>
1437
- <span class="cline-any cline-no">&nbsp;</span>
1438
- <span class="cline-any cline-no">&nbsp;</span>
1439
- <span class="cline-any cline-no">&nbsp;</span>
1440
- <span class="cline-any cline-neutral">&nbsp;</span>
1441
- <span class="cline-any cline-no">&nbsp;</span>
1442
- <span class="cline-any cline-neutral">&nbsp;</span>
1443
- <span class="cline-any cline-neutral">&nbsp;</span>
1444
- <span class="cline-any cline-no">&nbsp;</span>
1445
- <span class="cline-any cline-no">&nbsp;</span>
1446
- <span class="cline-any cline-neutral">&nbsp;</span>
1447
- <span class="cline-any cline-neutral">&nbsp;</span>
1448
- <span class="cline-any cline-neutral">&nbsp;</span>
1449
- <span class="cline-any cline-neutral">&nbsp;</span>
1450
- <span class="cline-any cline-neutral">&nbsp;</span>
1451
- <span class="cline-any cline-neutral">&nbsp;</span>
1452
974
  <span class="cline-any cline-yes">1x</span>
1453
- <span class="cline-any cline-no">&nbsp;</span>
1454
- <span class="cline-any cline-no">&nbsp;</span>
1455
- <span class="cline-any cline-no">&nbsp;</span>
1456
- <span class="cline-any cline-no">&nbsp;</span>
1457
- <span class="cline-any cline-neutral">&nbsp;</span>
1458
- <span class="cline-any cline-no">&nbsp;</span>
1459
- <span class="cline-any cline-no">&nbsp;</span>
1460
- <span class="cline-any cline-no">&nbsp;</span>
1461
- <span class="cline-any cline-no">&nbsp;</span>
1462
- <span class="cline-any cline-no">&nbsp;</span>
1463
- <span class="cline-any cline-neutral">&nbsp;</span>
1464
- <span class="cline-any cline-no">&nbsp;</span>
1465
- <span class="cline-any cline-no">&nbsp;</span>
1466
- <span class="cline-any cline-no">&nbsp;</span>
1467
- <span class="cline-any cline-neutral">&nbsp;</span>
1468
- <span class="cline-any cline-no">&nbsp;</span>
1469
- <span class="cline-any cline-neutral">&nbsp;</span>
1470
- <span class="cline-any cline-no">&nbsp;</span>
1471
- <span class="cline-any cline-no">&nbsp;</span>
1472
- <span class="cline-any cline-no">&nbsp;</span>
1473
- <span class="cline-any cline-neutral">&nbsp;</span>
1474
- <span class="cline-any cline-neutral">&nbsp;</span>
1475
- <span class="cline-any cline-no">&nbsp;</span>
1476
- <span class="cline-any cline-no">&nbsp;</span>
1477
- <span class="cline-any cline-neutral">&nbsp;</span>
1478
- <span class="cline-any cline-no">&nbsp;</span>
1479
- <span class="cline-any cline-no">&nbsp;</span>
1480
- <span class="cline-any cline-no">&nbsp;</span>
1481
- <span class="cline-any cline-neutral">&nbsp;</span>
1482
- <span class="cline-any cline-neutral">&nbsp;</span>
1483
- <span class="cline-any cline-no">&nbsp;</span>
1484
- <span class="cline-any cline-no">&nbsp;</span>
1485
- <span class="cline-any cline-no">&nbsp;</span>
1486
- <span class="cline-any cline-no">&nbsp;</span>
1487
- <span class="cline-any cline-no">&nbsp;</span>
1488
- <span class="cline-any cline-no">&nbsp;</span>
1489
- <span class="cline-any cline-no">&nbsp;</span>
1490
- <span class="cline-any cline-no">&nbsp;</span>
1491
- <span class="cline-any cline-no">&nbsp;</span>
1492
- <span class="cline-any cline-no">&nbsp;</span>
1493
- <span class="cline-any cline-neutral">&nbsp;</span>
1494
- <span class="cline-any cline-no">&nbsp;</span>
1495
- <span class="cline-any cline-no">&nbsp;</span>
1496
- <span class="cline-any cline-no">&nbsp;</span>
1497
- <span class="cline-any cline-no">&nbsp;</span>
1498
- <span class="cline-any cline-neutral">&nbsp;</span>
1499
- <span class="cline-any cline-neutral">&nbsp;</span>
1500
- <span class="cline-any cline-no">&nbsp;</span>
1501
- <span class="cline-any cline-neutral">&nbsp;</span>
1502
- <span class="cline-any cline-no">&nbsp;</span>
1503
- <span class="cline-any cline-neutral">&nbsp;</span>
1504
- <span class="cline-any cline-no">&nbsp;</span>
1505
- <span class="cline-any cline-no">&nbsp;</span>
1506
975
  <span class="cline-any cline-neutral">&nbsp;</span>
1507
- <span class="cline-any cline-no">&nbsp;</span>
1508
- <span class="cline-any cline-neutral">&nbsp;</span>
1509
- <span class="cline-any cline-no">&nbsp;</span>
1510
- <span class="cline-any cline-neutral">&nbsp;</span>
1511
- <span class="cline-any cline-no">&nbsp;</span>
1512
- <span class="cline-any cline-no">&nbsp;</span>
1513
- <span class="cline-any cline-neutral">&nbsp;</span>
1514
- <span class="cline-any cline-no">&nbsp;</span>
1515
- <span class="cline-any cline-neutral">&nbsp;</span>
1516
- <span class="cline-any cline-neutral">&nbsp;</span>
1517
- <span class="cline-any cline-neutral">&nbsp;</span>
1518
- <span class="cline-any cline-no">&nbsp;</span>
1519
- <span class="cline-any cline-no">&nbsp;</span>
1520
- <span class="cline-any cline-no">&nbsp;</span>
1521
976
  <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-yes">1x</span>
1522
978
  <span class="cline-any cline-neutral">&nbsp;</span>
1523
979
  <span class="cline-any cline-neutral">&nbsp;</span>
1524
980
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1652,12 +1108,6 @@
1652
1108
  <span class="cline-any cline-no">&nbsp;</span>
1653
1109
  <span class="cline-any cline-no">&nbsp;</span>
1654
1110
  <span class="cline-any cline-no">&nbsp;</span>
1655
- <span class="cline-any cline-neutral">&nbsp;</span>
1656
- <span class="cline-any cline-no">&nbsp;</span>
1657
- <span class="cline-any cline-no">&nbsp;</span>
1658
- <span class="cline-any cline-no">&nbsp;</span>
1659
- <span class="cline-any cline-no">&nbsp;</span>
1660
- <span class="cline-any cline-no">&nbsp;</span>
1661
1111
  <span class="cline-any cline-no">&nbsp;</span>
1662
1112
  <span class="cline-any cline-no">&nbsp;</span>
1663
1113
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1836,13 +1286,11 @@
1836
1286
  <span class="cline-any cline-no">&nbsp;</span>
1837
1287
  <span class="cline-any cline-neutral">&nbsp;</span>
1838
1288
  <span class="cline-any cline-neutral">&nbsp;</span>
1839
- <span class="cline-any cline-no">&nbsp;</span>
1840
- <span class="cline-any cline-no">&nbsp;</span>
1841
- <span class="cline-any cline-no">&nbsp;</span>
1842
1289
  <span class="cline-any cline-neutral">&nbsp;</span>
1843
1290
  <span class="cline-any cline-no">&nbsp;</span>
1844
1291
  <span class="cline-any cline-no">&nbsp;</span>
1845
1292
  <span class="cline-any cline-no">&nbsp;</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1846
1294
  <span class="cline-any cline-neutral">&nbsp;</span>
1847
1295
  <span class="cline-any cline-neutral">&nbsp;</span>
1848
1296
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1878,32 +1326,11 @@
1878
1326
  <span class="cline-any cline-neutral">&nbsp;</span>
1879
1327
  <span class="cline-any cline-neutral">&nbsp;</span>
1880
1328
  <span class="cline-any cline-no">&nbsp;</span>
1881
- <span class="cline-any cline-no">&nbsp;</span>
1882
- <span class="cline-any cline-neutral">&nbsp;</span>
1883
1329
  <span class="cline-any cline-neutral">&nbsp;</span>
1884
1330
  <span class="cline-any cline-neutral">&nbsp;</span>
1885
1331
  <span class="cline-any cline-neutral">&nbsp;</span>
1886
1332
  <span class="cline-any cline-no">&nbsp;</span>
1887
1333
  <span class="cline-any cline-neutral">&nbsp;</span>
1888
- <span class="cline-any cline-neutral">&nbsp;</span>
1889
- <span class="cline-any cline-neutral">&nbsp;</span>
1890
- <span class="cline-any cline-neutral">&nbsp;</span>
1891
- <span class="cline-any cline-neutral">&nbsp;</span>
1892
- <span class="cline-any cline-no">&nbsp;</span>
1893
- <span class="cline-any cline-no">&nbsp;</span>
1894
- <span class="cline-any cline-neutral">&nbsp;</span>
1895
- <span class="cline-any cline-neutral">&nbsp;</span>
1896
- <span class="cline-any cline-neutral">&nbsp;</span>
1897
- <span class="cline-any cline-neutral">&nbsp;</span>
1898
- <span class="cline-any cline-neutral">&nbsp;</span>
1899
- <span class="cline-any cline-neutral">&nbsp;</span>
1900
- <span class="cline-any cline-neutral">&nbsp;</span>
1901
- <span class="cline-any cline-neutral">&nbsp;</span>
1902
- <span class="cline-any cline-neutral">&nbsp;</span>
1903
- <span class="cline-any cline-neutral">&nbsp;</span>
1904
- <span class="cline-any cline-no">&nbsp;</span>
1905
- <span class="cline-any cline-neutral">&nbsp;</span>
1906
- <span class="cline-any cline-no">&nbsp;</span>
1907
1334
  <span class="cline-any cline-no">&nbsp;</span>
1908
1335
  <span class="cline-any cline-no">&nbsp;</span>
1909
1336
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1938,7 +1365,6 @@
1938
1365
  <span class="cline-any cline-neutral">&nbsp;</span>
1939
1366
  <span class="cline-any cline-neutral">&nbsp;</span>
1940
1367
  <span class="cline-any cline-neutral">&nbsp;</span>
1941
- <span class="cline-any cline-neutral">&nbsp;</span>
1942
1368
  <span class="cline-any cline-yes">1x</span>
1943
1369
  <span class="cline-any cline-yes">1x</span>
1944
1370
  <span class="cline-any cline-yes">1x</span>
@@ -1985,7 +1411,6 @@
1985
1411
  <span class="cline-any cline-no">&nbsp;</span>
1986
1412
  <span class="cline-any cline-no">&nbsp;</span>
1987
1413
  <span class="cline-any cline-no">&nbsp;</span>
1988
- <span class="cline-any cline-no">&nbsp;</span>
1989
1414
  <span class="cline-any cline-neutral">&nbsp;</span>
1990
1415
  <span class="cline-any cline-no">&nbsp;</span>
1991
1416
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1993,101 +1418,57 @@
1993
1418
  <span class="cline-any cline-no">&nbsp;</span>
1994
1419
  <span class="cline-any cline-no">&nbsp;</span>
1995
1420
  <span class="cline-any cline-no">&nbsp;</span>
1996
- <span class="cline-any cline-no">&nbsp;</span>
1997
- <span class="cline-any cline-neutral">&nbsp;</span>
1998
- <span class="cline-any cline-neutral">&nbsp;</span>
1999
- <span class="cline-any cline-no">&nbsp;</span>
2000
- <span class="cline-any cline-no">&nbsp;</span>
2001
- <span class="cline-any cline-no">&nbsp;</span>
2002
- <span class="cline-any cline-neutral">&nbsp;</span>
2003
- <span class="cline-any cline-neutral">&nbsp;</span>
2004
- <span class="cline-any cline-no">&nbsp;</span>
2005
- <span class="cline-any cline-no">&nbsp;</span>
2006
- <span class="cline-any cline-neutral">&nbsp;</span>
2007
- <span class="cline-any cline-neutral">&nbsp;</span>
2008
- <span class="cline-any cline-neutral">&nbsp;</span>
2009
- <span class="cline-any cline-neutral">&nbsp;</span>
2010
1421
  <span class="cline-any cline-neutral">&nbsp;</span>
2011
- <span class="cline-any cline-no">&nbsp;</span>
2012
- <span class="cline-any cline-no">&nbsp;</span>
2013
- <span class="cline-any cline-no">&nbsp;</span>
2014
1422
  <span class="cline-any cline-neutral">&nbsp;</span>
2015
1423
  <span class="cline-any cline-no">&nbsp;</span>
2016
- <span class="cline-any cline-neutral">&nbsp;</span>
2017
1424
  <span class="cline-any cline-no">&nbsp;</span>
2018
1425
  <span class="cline-any cline-no">&nbsp;</span>
2019
1426
  <span class="cline-any cline-neutral">&nbsp;</span>
2020
- <span class="cline-any cline-no">&nbsp;</span>
2021
1427
  <span class="cline-any cline-neutral">&nbsp;</span>
2022
1428
  <span class="cline-any cline-no">&nbsp;</span>
2023
- <span class="cline-any cline-neutral">&nbsp;</span>
2024
- <span class="cline-any cline-neutral">&nbsp;</span>
2025
1429
  <span class="cline-any cline-no">&nbsp;</span>
2026
1430
  <span class="cline-any cline-neutral">&nbsp;</span>
2027
- <span class="cline-any cline-no">&nbsp;</span>
2028
1431
  <span class="cline-any cline-neutral">&nbsp;</span>
2029
1432
  <span class="cline-any cline-neutral">&nbsp;</span>
2030
1433
  <span class="cline-any cline-neutral">&nbsp;</span>
2031
- <span class="cline-any cline-no">&nbsp;</span>
2032
- <span class="cline-any cline-no">&nbsp;</span>
2033
1434
  <span class="cline-any cline-neutral">&nbsp;</span>
2034
1435
  <span class="cline-any cline-no">&nbsp;</span>
2035
1436
  <span class="cline-any cline-no">&nbsp;</span>
2036
1437
  <span class="cline-any cline-no">&nbsp;</span>
2037
- <span class="cline-any cline-no">&nbsp;</span>
2038
- <span class="cline-any cline-neutral">&nbsp;</span>
2039
- <span class="cline-any cline-neutral">&nbsp;</span>
2040
1438
  <span class="cline-any cline-neutral">&nbsp;</span>
2041
1439
  <span class="cline-any cline-no">&nbsp;</span>
2042
1440
  <span class="cline-any cline-neutral">&nbsp;</span>
2043
- <span class="cline-any cline-neutral">&nbsp;</span>
2044
1441
  <span class="cline-any cline-no">&nbsp;</span>
2045
- <span class="cline-any cline-neutral">&nbsp;</span>
2046
- <span class="cline-any cline-neutral">&nbsp;</span>
2047
1442
  <span class="cline-any cline-no">&nbsp;</span>
2048
1443
  <span class="cline-any cline-neutral">&nbsp;</span>
2049
- <span class="cline-any cline-neutral">&nbsp;</span>
2050
- <span class="cline-any cline-neutral">&nbsp;</span>
2051
- <span class="cline-any cline-neutral">&nbsp;</span>
2052
- <span class="cline-any cline-neutral">&nbsp;</span>
2053
- <span class="cline-any cline-neutral">&nbsp;</span>
2054
- <span class="cline-any cline-neutral">&nbsp;</span>
2055
1444
  <span class="cline-any cline-no">&nbsp;</span>
2056
1445
  <span class="cline-any cline-neutral">&nbsp;</span>
2057
1446
  <span class="cline-any cline-no">&nbsp;</span>
2058
- <span class="cline-any cline-no">&nbsp;</span>
2059
- <span class="cline-any cline-neutral">&nbsp;</span>
2060
- <span class="cline-any cline-neutral">&nbsp;</span>
2061
1447
  <span class="cline-any cline-neutral">&nbsp;</span>
2062
- <span class="cline-any cline-no">&nbsp;</span>
2063
1448
  <span class="cline-any cline-neutral">&nbsp;</span>
2064
1449
  <span class="cline-any cline-no">&nbsp;</span>
2065
- <span class="cline-any cline-no">&nbsp;</span>
2066
- <span class="cline-any cline-no">&nbsp;</span>
2067
1450
  <span class="cline-any cline-neutral">&nbsp;</span>
2068
1451
  <span class="cline-any cline-no">&nbsp;</span>
2069
- <span class="cline-any cline-no">&nbsp;</span>
2070
- <span class="cline-any cline-no">&nbsp;</span>
2071
- <span class="cline-any cline-neutral">&nbsp;</span>
2072
- <span class="cline-any cline-neutral">&nbsp;</span>
2073
- <span class="cline-any cline-neutral">&nbsp;</span>
2074
- <span class="cline-any cline-neutral">&nbsp;</span>
2075
- <span class="cline-any cline-yes">1x</span>
2076
- <span class="cline-any cline-neutral">&nbsp;</span>
2077
- <span class="cline-any cline-no">&nbsp;</span>
2078
- <span class="cline-any cline-neutral">&nbsp;</span>
2079
- <span class="cline-any cline-neutral">&nbsp;</span>
2080
1452
  <span class="cline-any cline-neutral">&nbsp;</span>
2081
1453
  <span class="cline-any cline-neutral">&nbsp;</span>
2082
1454
  <span class="cline-any cline-neutral">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-no">&nbsp;</span>
2083
1457
  <span class="cline-any cline-neutral">&nbsp;</span>
1458
+ <span class="cline-any cline-no">&nbsp;</span>
1459
+ <span class="cline-any cline-no">&nbsp;</span>
1460
+ <span class="cline-any cline-no">&nbsp;</span>
1461
+ <span class="cline-any cline-no">&nbsp;</span>
2084
1462
  <span class="cline-any cline-neutral">&nbsp;</span>
2085
1463
  <span class="cline-any cline-neutral">&nbsp;</span>
2086
1464
  <span class="cline-any cline-neutral">&nbsp;</span>
1465
+ <span class="cline-any cline-no">&nbsp;</span>
2087
1466
  <span class="cline-any cline-neutral">&nbsp;</span>
2088
1467
  <span class="cline-any cline-neutral">&nbsp;</span>
1468
+ <span class="cline-any cline-no">&nbsp;</span>
2089
1469
  <span class="cline-any cline-neutral">&nbsp;</span>
2090
1470
  <span class="cline-any cline-neutral">&nbsp;</span>
1471
+ <span class="cline-any cline-no">&nbsp;</span>
2091
1472
  <span class="cline-any cline-neutral">&nbsp;</span>
2092
1473
  <span class="cline-any cline-neutral">&nbsp;</span>
2093
1474
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2096,29 +1477,27 @@
2096
1477
  <span class="cline-any cline-neutral">&nbsp;</span>
2097
1478
  <span class="cline-any cline-neutral">&nbsp;</span>
2098
1479
  <span class="cline-any cline-no">&nbsp;</span>
2099
- <span class="cline-any cline-no">&nbsp;</span>
2100
- <span class="cline-any cline-no">&nbsp;</span>
2101
- <span class="cline-any cline-no">&nbsp;</span>
2102
1480
  <span class="cline-any cline-neutral">&nbsp;</span>
2103
1481
  <span class="cline-any cline-no">&nbsp;</span>
2104
1482
  <span class="cline-any cline-no">&nbsp;</span>
2105
- <span class="cline-any cline-no">&nbsp;</span>
2106
- <span class="cline-any cline-no">&nbsp;</span>
2107
1483
  <span class="cline-any cline-neutral">&nbsp;</span>
2108
- <span class="cline-any cline-no">&nbsp;</span>
1484
+ <span class="cline-any cline-neutral">&nbsp;</span>
1485
+ <span class="cline-any cline-neutral">&nbsp;</span>
2109
1486
  <span class="cline-any cline-no">&nbsp;</span>
2110
1487
  <span class="cline-any cline-neutral">&nbsp;</span>
2111
1488
  <span class="cline-any cline-no">&nbsp;</span>
2112
1489
  <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-no">&nbsp;</span>
2113
1491
  <span class="cline-any cline-neutral">&nbsp;</span>
2114
1492
  <span class="cline-any cline-no">&nbsp;</span>
2115
1493
  <span class="cline-any cline-no">&nbsp;</span>
2116
- <span class="cline-any cline-neutral">&nbsp;</span>
2117
1494
  <span class="cline-any cline-no">&nbsp;</span>
2118
1495
  <span class="cline-any cline-neutral">&nbsp;</span>
2119
1496
  <span class="cline-any cline-neutral">&nbsp;</span>
2120
1497
  <span class="cline-any cline-neutral">&nbsp;</span>
2121
1498
  <span class="cline-any cline-neutral">&nbsp;</span>
1499
+ <span class="cline-any cline-yes">1x</span>
1500
+ <span class="cline-any cline-neutral">&nbsp;</span>
2122
1501
  <span class="cline-any cline-no">&nbsp;</span>
2123
1502
  <span class="cline-any cline-neutral">&nbsp;</span>
2124
1503
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2134,18 +1513,9 @@
2134
1513
  <span class="cline-any cline-no">&nbsp;</span>
2135
1514
  <span class="cline-any cline-neutral">&nbsp;</span>
2136
1515
  <span class="cline-any cline-neutral">&nbsp;</span>
2137
- <span class="cline-any cline-neutral">&nbsp;</span>
2138
- <span class="cline-any cline-neutral">&nbsp;</span>
2139
- <span class="cline-any cline-no">&nbsp;</span>
2140
1516
  <span class="cline-any cline-no">&nbsp;</span>
2141
1517
  <span class="cline-any cline-no">&nbsp;</span>
2142
1518
  <span class="cline-any cline-no">&nbsp;</span>
2143
- <span class="cline-any cline-no">&nbsp;</span>
2144
- <span class="cline-any cline-no">&nbsp;</span>
2145
- <span class="cline-any cline-neutral">&nbsp;</span>
2146
- <span class="cline-any cline-neutral">&nbsp;</span>
2147
- <span class="cline-any cline-neutral">&nbsp;</span>
2148
- <span class="cline-any cline-no">&nbsp;</span>
2149
1519
  <span class="cline-any cline-neutral">&nbsp;</span>
2150
1520
  <span class="cline-any cline-neutral">&nbsp;</span>
2151
1521
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2156,14 +1526,6 @@
2156
1526
  <span class="cline-any cline-neutral">&nbsp;</span>
2157
1527
  <span class="cline-any cline-neutral">&nbsp;</span>
2158
1528
  <span class="cline-any cline-no">&nbsp;</span>
2159
- <span class="cline-any cline-no">&nbsp;</span>
2160
- <span class="cline-any cline-neutral">&nbsp;</span>
2161
- <span class="cline-any cline-no">&nbsp;</span>
2162
- <span class="cline-any cline-no">&nbsp;</span>
2163
- <span class="cline-any cline-neutral">&nbsp;</span>
2164
- <span class="cline-any cline-neutral">&nbsp;</span>
2165
- <span class="cline-any cline-neutral">&nbsp;</span>
2166
- <span class="cline-any cline-neutral">&nbsp;</span>
2167
1529
  <span class="cline-any cline-neutral">&nbsp;</span>
2168
1530
  <span class="cline-any cline-no">&nbsp;</span>
2169
1531
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2329,10 +1691,6 @@
2329
1691
  <span class="cline-any cline-neutral">&nbsp;</span>
2330
1692
  <span class="cline-any cline-neutral">&nbsp;</span>
2331
1693
  <span class="cline-any cline-yes">1x</span>
2332
- <span class="cline-any cline-no">&nbsp;</span>
2333
- <span class="cline-any cline-neutral">&nbsp;</span>
2334
- <span class="cline-any cline-no">&nbsp;</span>
2335
- <span class="cline-any cline-neutral">&nbsp;</span>
2336
1694
  <span class="cline-any cline-neutral">&nbsp;</span>
2337
1695
  <span class="cline-any cline-no">&nbsp;</span>
2338
1696
  <span class="cline-any cline-no">&nbsp;</span>
@@ -2487,503 +1845,277 @@
2487
1845
  <span class="cline-any cline-no">&nbsp;</span>
2488
1846
  <span class="cline-any cline-no">&nbsp;</span>
2489
1847
  <span class="cline-any cline-neutral">&nbsp;</span>
2490
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { cloneDeep } from 'lodash';
2491
- import { App, LogicItem, Logic, Module, View, ViewElement, Argument, SelectMembers, SyntaxNode, BindDirective, CallLogic, BindAttribute } from '../../concepts';
1848
+ <span class="cline-any cline-neutral">&nbsp;</span>
1849
+ <span class="cline-any cline-neutral">&nbsp;</span>
1850
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { App, LogicItem, Logic, Module, View, ViewElement, Argument, SelectMembers, SynatxNode, BindDirective, CallLogic } from '../../concepts';
2492
1851
  import { addBreakpointNodesFromApp } from '../../breakpoint';
2493
1852
  import { getConceptConstructor } from '../../decorators';
2494
1853
  import { config } from '../../config';
2495
1854
  import storageService from './service';
2496
1855
  import { v4 as uuidv4 } from 'uuid';
2497
1856
  import stepRecorder from '../../manager/stepRecorder';
2498
- import * as jsoner from './jsoner';
2499
1857
  /// #if !process.env.NODE_ENV || process.env.BUILD_TARGET === 'node'
2500
1858
  import * as fs from 'fs-extra';
1859
+ import * as jsoner from './jsoner';
2501
1860
  import type { NaslServer } from 'src/server/naslServer';
2502
1861
  /// #endif
2503
1862
  &nbsp;
1863
+ &nbsp;
1864
+ &nbsp;
2504
1865
  export const batchQuery = storageService.batchQuery;
2505
1866
  export const batchAction = storageService.batchAction;
2506
1867
  export const batchInstruct = storageService.batchInstruct;
2507
1868
  export const breakpoint = storageService.breakpoint;
2508
1869
  &nbsp;
2509
1870
  let tabTimestamp: string;
2510
- export const databaseTypes = storageService.databaseTypes;
2511
- &nbsp;
2512
- export const operationRecordInfoMap: Map&lt;string, any&gt; = new Map();
2513
- &nbsp;
2514
- // 操作栈记录
2515
- export function <span class="fstat-no" title="function not covered" >doOperationRecord(</span>operation: Operation) {
2516
- const request = <span class="cstat-no" title="statement not covered" >indexedDB.open('naslData', 1);</span>
2517
- &nbsp;
2518
- <span class="cstat-no" title="statement not covered" > request.onupgradeneeded = <span class="fstat-no" title="function not covered" >(e</span>vent: any) =&gt; {</span>
2519
- const db = <span class="cstat-no" title="statement not covered" >event.target.result;</span>
2520
- const objectStore = <span class="cstat-no" title="statement not covered" >db.createObjectStore('operationRecord', { autoIncrement: true });</span>
2521
- <span class="cstat-no" title="statement not covered" > objectStore.createIndex('appId', 'appId');</span>
2522
- <span class="cstat-no" title="statement not covered" > objectStore.createIndex('timestamp', 'timestamp');</span>
2523
- };
2524
- &nbsp;
2525
- <span class="cstat-no" title="statement not covered" > request.onsuccess = <span class="fstat-no" title="function not covered" >(e</span>vent: any) =&gt; {</span>
2526
- const db = <span class="cstat-no" title="statement not covered" >event.target.result;</span>
2527
- const transaction = <span class="cstat-no" title="statement not covered" >db.transaction('operationRecord', 'readwrite');</span>
2528
- const objectStore = <span class="cstat-no" title="statement not covered" >transaction.objectStore('operationRecord');</span>
2529
- <span class="cstat-no" title="statement not covered" > operation.appId = operationRecordInfoMap.get('appId');</span>
2530
- <span class="cstat-no" title="statement not covered" > operation.branchId = operationRecordInfoMap.get('branchId');</span>
2531
- <span class="cstat-no" title="statement not covered" > operation.accountId = operationRecordInfoMap.get('accountId');</span>
2532
- <span class="cstat-no" title="statement not covered" > operation.userId = operationRecordInfoMap.get('userId');</span>
2533
- <span class="cstat-no" title="statement not covered" > operation.phone = operationRecordInfoMap.get('phone');</span>
2534
- // 将时间戳添加到记录中
2535
- <span class="cstat-no" title="statement not covered" > operation.timestamp = Date.now();</span>
2536
- // 这份数据不存在向上的引用,因此用cloneDeep没有关系
2537
- <span class="cstat-no" title="statement not covered" > objectStore.put(cloneDeep(operation));</span>
2538
- <span class="cstat-no" title="statement not covered" > transaction.oncomplete = <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2539
- <span class="cstat-no" title="statement not covered" > db.close();</span>
2540
- };
2541
- };
2542
- &nbsp;
2543
- <span class="cstat-no" title="statement not covered" > request.onerror = <span class="fstat-no" title="function not covered" >function(e</span>vent) {</span>
2544
- <span class="cstat-no" title="statement not covered" > console.log('Failed to open database');</span>
2545
- };
2546
- }
2547
- &nbsp;
2548
- // 删除失效数据
2549
- async function <span class="fstat-no" title="function not covered" >deleteExpiredRecords(</span>) {
2550
- <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
2551
- const request = <span class="cstat-no" title="statement not covered" >indexedDB.open('naslData', 1);</span>
2552
- &nbsp;
2553
- <span class="cstat-no" title="statement not covered" > request.onupgradeneeded = <span class="fstat-no" title="function not covered" >(e</span>vent: any) =&gt; {</span>
2554
- const db = <span class="cstat-no" title="statement not covered" >event.target.result;</span>
2555
- const objectStore = <span class="cstat-no" title="statement not covered" >db.createObjectStore('operationRecord', { autoIncrement: true });</span>
2556
- <span class="cstat-no" title="statement not covered" > objectStore.createIndex('appId', 'appId');</span>
2557
- <span class="cstat-no" title="statement not covered" > objectStore.createIndex('timestamp', 'timestamp');</span>
2558
- };
2559
- &nbsp;
2560
- <span class="cstat-no" title="statement not covered" > request.onsuccess = <span class="fstat-no" title="function not covered" >(e</span>vent: any) =&gt; {</span>
2561
- const db = <span class="cstat-no" title="statement not covered" >event.target.result;</span>
2562
- const transaction = <span class="cstat-no" title="statement not covered" >db.transaction('operationRecord', 'readwrite');</span>
2563
- const objectStore = <span class="cstat-no" title="statement not covered" >transaction.objectStore('operationRecord');</span>
2564
- const index = <span class="cstat-no" title="statement not covered" >objectStore.index('timestamp');</span>
2565
- // 设置有效期,默认7天
2566
- const localStorageExpiresAt = <span class="cstat-no" title="statement not covered" >window.localStorage.getItem('expiresAt');</span>
2567
- const expiresAt = <span class="cstat-no" title="statement not covered" >Date.now() - (localStorageExpiresAt ? +localStorageExpiresAt : 7 * 24 * 60 * 60 * 1000);</span>
2568
- const range = <span class="cstat-no" title="statement not covered" >IDBKeyRange.upperBound(expiresAt);</span>
2569
- const expiredRecordsRequest = <span class="cstat-no" title="statement not covered" >index.openCursor(range);</span>
2570
- &nbsp;
2571
- <span class="cstat-no" title="statement not covered" > expiredRecordsRequest.onsuccess = <span class="fstat-no" title="function not covered" >(e</span>vent: any) =&gt; {</span>
2572
- const cursor = <span class="cstat-no" title="statement not covered" >event.target.result;</span>
2573
- <span class="cstat-no" title="statement not covered" > if (cursor) {</span>
2574
- <span class="cstat-no" title="statement not covered" > console.log(cursor);</span>
2575
- <span class="cstat-no" title="statement not covered" > objectStore.delete(cursor.primaryKey);</span>
2576
- <span class="cstat-no" title="statement not covered" > cursor.continue();</span>
2577
- } else {
2578
- <span class="cstat-no" title="statement not covered" > resolve(void 0);</span>
2579
- }
2580
- };
2581
- &nbsp;
2582
- <span class="cstat-no" title="statement not covered" > transaction.oncomplete = <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2583
- <span class="cstat-no" title="statement not covered" > db.close();</span>
2584
- };
2585
- };
2586
- &nbsp;
2587
- <span class="cstat-no" title="statement not covered" > request.onerror = <span class="fstat-no" title="function not covered" >(e</span>vent) =&gt; {</span>
2588
- <span class="cstat-no" title="statement not covered" > reject('Failed to open database');</span>
2589
- };
2590
- });
2591
- }
2592
- &nbsp;
2593
- // 操作栈查询
2594
- export function <span class="fstat-no" title="function not covered" >operationRecordQuery(</span>app: any) {
2595
- <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
2596
- const appId = <span class="cstat-no" title="statement not covered" >app?.id;</span>
2597
- const branchId = <span class="cstat-no" title="statement not covered" >app?.__branchId;</span>
2598
- const request = <span class="cstat-no" title="statement not covered" >indexedDB.open('naslData', 1);</span>
2599
- <span class="cstat-no" title="statement not covered" > request.onsuccess = <span class="fstat-no" title="function not covered" >(e</span>vent: any) =&gt; {</span>
2600
- const db = <span class="cstat-no" title="statement not covered" >event.target.result;</span>
2601
- const transaction = <span class="cstat-no" title="statement not covered" >db.transaction('operationRecord', 'readonly');</span>
2602
- const objectStore = <span class="cstat-no" title="statement not covered" >transaction.objectStore('operationRecord');</span>
2603
- const index = <span class="cstat-no" title="statement not covered" >objectStore.index('appId');</span> // 查询 'appId' 索引
2604
- const range = <span class="cstat-no" title="statement not covered" >IDBKeyRange.only(appId);</span>
2605
- const result: any[] = <span class="cstat-no" title="statement not covered" >[];</span>
2606
- &nbsp;
2607
- const request = <span class="cstat-no" title="statement not covered" >index.openCursor(range);</span>
2608
- <span class="cstat-no" title="statement not covered" > request.onsuccess = <span class="fstat-no" title="function not covered" >(e</span>vent: any) =&gt; {</span>
2609
- const cursor = <span class="cstat-no" title="statement not covered" >event.target.result;</span>
2610
- <span class="cstat-no" title="statement not covered" > if (cursor) {</span>
2611
- const record = <span class="cstat-no" title="statement not covered" >cursor.value;</span>
2612
- const branchId = <span class="cstat-no" title="statement not covered" >operationRecordInfoMap.get('branchId');</span>
2613
- <span class="cstat-no" title="statement not covered" > if (record.branchId === branchId) {</span>
2614
- <span class="cstat-no" title="statement not covered" > result.push(record);</span>
2615
- }
2616
- <span class="cstat-no" title="statement not covered" > cursor.continue();</span>
2617
- } else {
2618
- <span class="cstat-no" title="statement not covered" > console.log('操作记录栈:', result);</span>
2619
- <span class="cstat-no" title="statement not covered" > resolve(result);</span>
2620
- }
2621
- };
2622
- &nbsp;
2623
- <span class="cstat-no" title="statement not covered" > transaction.oncomplete = <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2624
- <span class="cstat-no" title="statement not covered" > db.close();</span>
2625
- };
2626
- };
2627
- &nbsp;
2628
- <span class="cstat-no" title="statement not covered" > request.onerror = <span class="fstat-no" title="function not covered" >(e</span>vent) =&gt; {</span>
2629
- <span class="cstat-no" title="statement not covered" > reject('Failed to open database');</span>
2630
- };
2631
- });
2632
- }
2633
- &nbsp;
2634
- // 获取父对象
2635
- function <span class="fstat-no" title="function not covered" >getParentInfo(</span>appJson: any, path: string) {
2636
- const pathArr: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
2637
- <span class="cstat-no" title="statement not covered" > (path?.split('.') || []).forEach(<span class="fstat-no" title="function not covered" >(p</span>athItem: string) =&gt; {</span>
2638
- const arrayPropertyKey = <span class="cstat-no" title="statement not covered" >pathItem.split('[')[0];</span>
2639
- const matchArr = <span class="cstat-no" title="statement not covered" >pathItem.match(/\[(.+?)\]/);</span>
2640
- <span class="cstat-no" title="statement not covered" > if (matchArr) {</span>
2641
- <span class="cstat-no" title="statement not covered" > pathArr.push(arrayPropertyKey, matchArr[0]);</span>
2642
- } else {
2643
- <span class="cstat-no" title="statement not covered" > pathArr.push(pathItem);</span>
2644
- }
2645
- });
2646
- <span class="cstat-no" title="statement not covered" > pathArr.pop();</span>
2647
- let parentPath = <span class="cstat-no" title="statement not covered" >'';</span>
2648
- <span class="cstat-no" title="statement not covered" > pathArr.forEach(<span class="fstat-no" title="function not covered" >(p</span>athItem: string, index: number) =&gt; {</span>
2649
- const matchArr = <span class="cstat-no" title="statement not covered" >pathItem.match(/\[(.+?)\]/);</span>
2650
- <span class="cstat-no" title="statement not covered" > if (matchArr || index === 0) {</span>
2651
- <span class="cstat-no" title="statement not covered" > parentPath += pathItem;</span>
2652
- } else {
2653
- <span class="cstat-no" title="statement not covered" > parentPath += `.${pathItem}`</span>
2654
- }
2655
- });
2656
- const parentNode = <span class="cstat-no" title="statement not covered" >jsoner.queryNodeByPath(appJson, parentPath);</span>
2657
- <span class="cstat-no" title="statement not covered" > return {</span>
2658
- parentPath,
2659
- parentNode,
2660
- };
2661
- }
2662
- &nbsp;
2663
- // 操作记录回放
2664
- export async function <span class="fstat-no" title="function not covered" >operationRecordPlayback(</span>app: any, action: 'undo' | 'redo') {
2665
- const operationRecord: any = <span class="cstat-no" title="statement not covered" >await operationRecordQuery(app);</span>
2666
- let operationRecordIndex = <span class="cstat-no" title="statement not covered" >operationRecordInfoMap.get('operationRecordIndex');</span>
2667
- <span class="cstat-no" title="statement not covered" > if ([null, undefined].includes(operationRecordIndex)) {</span>
2668
- <span class="cstat-no" title="statement not covered" > operationRecordIndex = operationRecord?.length;</span>
2669
- }
2670
- const appJson = <span class="cstat-no" title="statement not covered" >app.toJSON();</span>
2671
- <span class="cstat-no" title="statement not covered" > if (action === 'undo') {</span>
2672
- <span class="cstat-no" title="statement not covered" > if (operationRecordIndex &gt; 0) {</span>
2673
- const currentRecordItem = <span class="cstat-no" title="statement not covered" >operationRecord?.[operationRecordIndex];</span>
2674
- const { type, action: recordItemAction } = <span class="cstat-no" title="statement not covered" >currentRecordItem || {};</span>
2675
- // 多人协作
2676
- <span class="cstat-no" title="statement not covered" > if (type === 'cooperation' &amp;&amp; recordItemAction === 'confirmPull') {</span>
2677
- <span class="cstat-no" title="statement not covered" > console.log(`当前所处栈位置:${operationRecordIndex},已经进行了多人协作“合并”操作,无法继续对操作栈进行回放!`);</span>
2678
- <span class="cstat-no" title="statement not covered" > return;</span>
2679
- }
2680
- <span class="cstat-no" title="statement not covered" > operationRecordIndex--;</span>
2681
- } else {
2682
- <span class="cstat-no" title="statement not covered" > console.log(`当前所处栈位置:${operationRecordIndex},无法继续回放`);</span>
2683
- <span class="cstat-no" title="statement not covered" > console.log('当前appJSON:', appJson);</span>
2684
- <span class="cstat-no" title="statement not covered" > return;</span>
2685
- }
2686
- } else {
2687
- <span class="cstat-no" title="statement not covered" > if (operationRecordIndex &lt; operationRecord?.length) {</span>
2688
- <span class="cstat-no" title="statement not covered" > operationRecordIndex++;</span>
2689
- } else {
2690
- <span class="cstat-no" title="statement not covered" > console.log(`当前所处栈位置:${operationRecordIndex},无法继续前进`);</span>
2691
- <span class="cstat-no" title="statement not covered" > console.log('当前appJSON:', appJson);</span>
2692
- <span class="cstat-no" title="statement not covered" > return;</span>
2693
- }
2694
- }
2695
- <span class="cstat-no" title="statement not covered" > operationRecordInfoMap.set('operationRecordIndex', operationRecordIndex);</span>
2696
- const currentIndex = <span class="cstat-no" title="statement not covered" >operationRecordIndex;</span>
2697
- <span class="cstat-no" title="statement not covered" > ([...operationRecord].splice(currentIndex, operationRecord?.length) || []).reverse()?.forEach(<span class="fstat-no" title="function not covered" >(r</span>ecordItem: any) =&gt; {</span>
2698
- const { actionItem } = <span class="cstat-no" title="statement not covered" >recordItem || {};</span>
2699
- const { list } = <span class="cstat-no" title="statement not covered" >actionItem || {};</span>
2700
- <span class="cstat-no" title="statement not covered" > [...(list || [])].reverse().forEach(<span class="fstat-no" title="function not covered" >(a</span>ctionItem: any) =&gt; {</span>
2701
- const { path, action, oldObject, parentKey, index: oldIndex } = <span class="cstat-no" title="statement not covered" >actionItem || {};</span>
2702
- const { parentNode } = <span class="cstat-no" title="statement not covered" >getParentInfo(appJson, path);</span>
2703
- const node = <span class="cstat-no" title="statement not covered" >jsoner.queryNodeByPath(appJson, path);</span>
2704
- <span class="cstat-no" title="statement not covered" > switch (action) {</span>
2705
- case 'create':
2706
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(parentNode)) {</span>
2707
- const index = <span class="cstat-no" title="statement not covered" >parentNode.indexOf(node);</span>
2708
- <span class="cstat-no" title="statement not covered" > if (index !== -1) {</span>
2709
- <span class="cstat-no" title="statement not covered" > parentNode.splice(index, 1);</span>
2710
- }
2711
- } else {
2712
- <span class="cstat-no" title="statement not covered" > parentNode[parentKey] = null;</span>
2713
- }
2714
- <span class="cstat-no" title="statement not covered" > break;</span>
2715
- case 'delete':
2716
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(parentNode) &amp;&amp; oldIndex !== -1) {</span>
2717
- <span class="cstat-no" title="statement not covered" > parentNode.splice(oldIndex, 0, oldObject);</span>
2718
- } else {
2719
- <span class="cstat-no" title="statement not covered" > parentNode[parentKey] = oldObject;</span>
2720
- }
2721
- <span class="cstat-no" title="statement not covered" > break;</span>
2722
- case 'update':
2723
- <span class="cstat-no" title="statement not covered" > for (const key in oldObject) {</span>
2724
- (<span class="cstat-no" title="statement not covered" >node as any)[key] = oldObject[key] ?? null;</span>
2725
- }
2726
- <span class="cstat-no" title="statement not covered" > break;</span>
2727
- }
2728
- });
2729
- });
2730
- <span class="cstat-no" title="statement not covered" > console.log('当前所处栈位置:', currentIndex);</span>
2731
- <span class="cstat-no" title="statement not covered" > console.log('当前appJSON:', appJson);</span>
2732
- <span class="cstat-no" title="statement not covered" > return appJson;</span>
2733
- }
2734
- &nbsp;
2735
- function <span class="fstat-no" title="function not covered" >getLogic(</span>key: string, app: any, diffLogicList: string[]) {
2736
- <span class="cstat-no" title="statement not covered" > if (!diffLogicList.includes(key)) {</span>
2737
- <span class="cstat-no" title="statement not covered" > diffLogicList.push(key);</span>
2738
- <span class="cstat-no" title="statement not covered" > if (key.startsWith('app')) {</span>
2739
- const index = <span class="cstat-no" title="statement not covered" >key.lastIndexOf('.');</span>
2740
- const name = <span class="cstat-no" title="statement not covered" >key.slice(index + 1);</span>
2741
- const logic = <span class="cstat-no" title="statement not covered" >app.logics.find(<span class="fstat-no" title="function not covered" >(i</span>tem: any) =&gt; <span class="cstat-no" title="statement not covered" >item.name === name)</span>;</span>
2742
- <span class="cstat-no" title="statement not covered" > if (logic &amp;&amp; logic.body &amp;&amp; logic.body.length &gt; 2) {</span>
2743
- <span class="cstat-no" title="statement not covered" > logic.body.map(<span class="fstat-no" title="function not covered" >(i</span>tem: any) =&gt; <span class="cstat-no" title="statement not covered" >getStatement(item, app, diffLogicList))</span>;</span>
2744
- }
2745
- } else <span class="cstat-no" title="statement not covered" >if (key.startsWith('extensions')) {</span>
2746
- const _pathArr = <span class="cstat-no" title="statement not covered" >key.split('.');</span>
1871
+ export co<span class="fstat-no" title="function not covered" >nst datab</span>aseTypes = storageService.databaseTypes;
1872
+ <span class="cstat-no" title="statement not covered" ></span>
1873
+ func<span class="cstat-no" title="statement not covered" >tion getLogic(key: string</span>, app: any, diffLogicList: string[]) {
1874
+ if<span class="cstat-no" title="statement not covered" > (!diffLogicList.includes(key)) {</span>
1875
+ diffLogicList.pu<span class="cstat-no" title="statement not covered" >sh(key);</span>
1876
+ if (key.startsW<span class="cstat-no" title="statement not covered" >ith('app')) {</span>
1877
+ const index = <span class="cstat-no" title="statement not covered" >key.lastIndexOf(<span class="fstat-no" title="function not covered" >'.</span>');<span class="cstat-no" title="statement not covered" ></span></span>
1878
+ <span class="cstat-no" title="statement not covered" > const name = key.slice(index + 1);</span>
1879
+ co<span class="cstat-no" title="statement not covered" >nst logic = app<span class="fstat-no" title="function not covered" >.l</span>ogics.find((i<span class="cstat-no" title="statement not covered" >tem: any) =&gt; item.name === name);</span></span>
1880
+ if (logic &amp;&amp; logic.body &amp;&amp; logic.body.length &gt; 2) {
1881
+ log<span class="cstat-no" title="statement not covered" >ic.body.map((item: any) =&gt; getStatement(item, app, diffLogicList));</span>
1882
+ }<span class="cstat-no" title="statement not covered" ></span>
1883
+ } else if (key.s<span class="cstat-no" title="statement not covered" >tartsWith('e</span>xtensions')) {
1884
+ const _pathArr<span class="cstat-no" title="statement not covered" > = key.split</span>('.');
2747
1885
  const _name = <span class="cstat-no" title="statement not covered" >_pathArr[1];</span>
2748
- const _path = <span class="cstat-no" title="statement not covered" >_pathArr[3];</span>
2749
- const _list = <span class="cstat-no" title="statement not covered" >app.dependencies;</span>
2750
- const _module = <span class="cstat-no" title="statement not covered" >_list.find(<span class="fstat-no" title="function not covered" >(i</span>t: Module) =&gt; {</span>
2751
- const name = <span class="cstat-no" title="statement not covered" >it.name.replaceAll('-', '_');</span>
2752
- <span class="cstat-no" title="statement not covered" > return name === _name;</span>
2753
- });
2754
- const logic = <span class="cstat-no" title="statement not covered" >_module?.logics?.find(<span class="fstat-no" title="function not covered" >(i</span>tem: Logic) =&gt; <span class="cstat-no" title="statement not covered" >item.name === _path)</span>;</span>
2755
- <span class="cstat-no" title="statement not covered" > if (logic &amp;&amp; logic.body &amp;&amp; logic.body.length &gt; 2) {</span>
2756
- <span class="cstat-no" title="statement not covered" > logic.body.map(<span class="fstat-no" title="function not covered" >(i</span>tem: any) =&gt; <span class="cstat-no" title="statement not covered" >getStatement(item, app, diffLogicList))</span>;</span>
1886
+ const _path = _p<span class="cstat-no" title="statement not covered" >athArr[3];<span class="fstat-no" title="function not covered" ></span></span>
1887
+ const _list = a<span class="cstat-no" title="statement not covered" >pp.dependencies;</span>
1888
+ co<span class="cstat-no" title="statement not covered" >nst _module = _list.fin</span>d((it: Module) =&gt; {
1889
+ const name = it.name.replaceAll('-', '_');
1890
+ return name <span class="cstat-no" title="statement not covered" >=== _name;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
1891
+ <span class="cstat-no" title="statement not covered" > });</span>
1892
+ co<span class="cstat-no" title="statement not covered" >nst logic = _mo<span class="fstat-no" title="function not covered" >du</span>le?.logics?.f<span class="cstat-no" title="statement not covered" >ind((item: Logic) =&gt; item.name === _pat</span>h)</span>;
1893
+ if (logic &amp;&amp; logic.body &amp;&amp; logic.body.length &gt; 2) {
1894
+ logic.body.map((item: any) =&gt; getStatement(item, app, diffLogicList));
2757
1895
  }
2758
1896
  }
2759
1897
  }
2760
- }
2761
- /* 获取LogicITEM */
2762
- function <span class="fstat-no" title="function not covered" >getStatement(</span>state: any, app: any, diffLogicList: string[]) {
2763
- let logicItems = <span class="cstat-no" title="statement not covered" >[];</span>
2764
- <span class="cstat-no" title="statement not covered" > switch (state.concept) {</span>
2765
- case 'Assignment':
2766
- <span class="cstat-no" title="statement not covered" > logicItems = [state.left, state.right];</span>
2767
- <span class="cstat-no" title="statement not covered" > break;</span>
2768
- case 'IfStatement':
2769
- <span class="cstat-no" title="statement not covered" > logicItems = [...state.consequent, ...state.alternate];</span>
2770
- <span class="cstat-no" title="statement not covered" > break;</span>
2771
- case 'ForEachStatement':
2772
- <span class="cstat-no" title="statement not covered" > logicItems = [...state.body, state.each, state.start, state.end];</span>
2773
- <span class="cstat-no" title="statement not covered" > break;</span>
2774
- case 'Match':
2775
- <span class="cstat-no" title="statement not covered" > logicItems = [state.expression, ...state.cases.map(getStatement).flat(1)];</span>
2776
- <span class="cstat-no" title="statement not covered" > break;</span>
2777
- case 'MatchCase':
2778
- <span class="cstat-no" title="statement not covered" > logicItems = [...state.patterns, ...state.body];</span>
2779
- <span class="cstat-no" title="statement not covered" > break;</span>
2780
- case 'SwitchStatement':
2781
- <span class="cstat-no" title="statement not covered" > logicItems = state.cases.map(getStatement).flat(1);</span>
1898
+ }<span class="fstat-no" title="function not covered" ></span>
1899
+ /* 获取LogicITEM */<span class="cstat-no" title="statement not covered" ></span>
1900
+ fu<span class="cstat-no" title="statement not covered" >nction getStatement(state: any, app: any, diffLogicList: string[]) {</span>
1901
+ let logicItems = [];
1902
+ swit<span class="cstat-no" title="statement not covered" >ch (state.concept) {</span>
1903
+ ca<span class="cstat-no" title="statement not covered" >se 'Ass</span>ignment':
1904
+ logicItems = [state.left, state.right];
2782
1905
  <span class="cstat-no" title="statement not covered" > break;</span>
2783
- case 'SwitchCase':
2784
- <span class="cstat-no" title="statement not covered" > logicItems = [state.test, ...state.consequent];</span>
1906
+ ca<span class="cstat-no" title="statement not covered" >se 'IfS</span>tatement':
1907
+ logicItems = [...state.consequent, ...state.alternate];
2785
1908
  <span class="cstat-no" title="statement not covered" > break;</span>
2786
- case 'WhileStatement':
2787
- <span class="cstat-no" title="statement not covered" > logicItems = [state.test, ...state.body];</span>
1909
+ ca<span class="cstat-no" title="statement not covered" >se 'For</span>EachStatement':
1910
+ logicItems = [...state.body, state.each, state.start, state.end];
2788
1911
  <span class="cstat-no" title="statement not covered" > break;</span>
2789
- case 'CallLogic':
2790
- <span class="cstat-no" title="statement not covered" > logicItems = state.arguments?.map(<span class="fstat-no" title="function not covered" >(i</span>tem: Argument) =&gt; <span class="cstat-no" title="statement not covered" >item.expression)</span>;</span>
2791
- <span class="cstat-no" title="statement not covered" > getLogic(state.calleewholeKey, app, diffLogicList);</span>
1912
+ ca<span class="cstat-no" title="statement not covered" >se 'Mat</span>ch':
1913
+ logicItems = [state.expression, ...state.cases.map(getStatement).flat(1)];
2792
1914
  <span class="cstat-no" title="statement not covered" > break;</span>
2793
- case 'CallFunction':
2794
- <span class="cstat-no" title="statement not covered" > logicItems = state.arguments?.map(<span class="fstat-no" title="function not covered" >(i</span>tem: Argument) =&gt; <span class="cstat-no" title="statement not covered" >item.expression)</span>;</span>
1915
+ ca<span class="cstat-no" title="statement not covered" >se 'Mat</span>chCase':
1916
+ logicItems = [...state.patterns, ...state.body];
2795
1917
  <span class="cstat-no" title="statement not covered" > break;</span>
2796
- case 'CallInterface':
2797
- <span class="cstat-no" title="statement not covered" > logicItems = state.arguments?.map(<span class="fstat-no" title="function not covered" >(i</span>tem: Argument) =&gt; <span class="cstat-no" title="statement not covered" >item.expression)</span>;</span>
1918
+ ca<span class="cstat-no" title="statement not covered" >se 'Swi</span>tchStatement':
1919
+ logicItems = state.cases.map(getStatement).flat(1);
2798
1920
  <span class="cstat-no" title="statement not covered" > break;</span>
2799
- case 'ExternalDestination':
2800
- <span class="cstat-no" title="statement not covered" > logicItems = [state.anchor, state.link];</span>
1921
+ ca<span class="cstat-no" title="statement not covered" >se 'Swi</span>tchCase':
1922
+ logicItems = [state.test, ...state.consequent];
2801
1923
  <span class="cstat-no" title="statement not covered" > break;</span>
2802
- case 'BatchAssignment':
2803
- <span class="cstat-no" title="statement not covered" > logicItems = [state.left?.expression, ...state.left?.members, ...state.rights.map(<span class="fstat-no" title="function not covered" >(i</span>tem: SelectMembers) =&gt; <span class="cstat-no" title="statement not covered" >[item?.expression, ...item?.members])</span>.flat(1)];</span>
1924
+ ca<span class="cstat-no" title="statement not covered" >se 'Whi</span>leStatement':
1925
+ logicItems = [state.test, ...state.body];
1926
+ <span class="cstat-no" title="statement not covered" > break;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
1927
+ ca<span class="cstat-no" title="statement not covered" >se 'CallLogic':</span>
1928
+ <span class="cstat-no" title="statement not covered" > logicIt</span>ems = state.arguments?.map((item: Argument) =&gt; item.expression);
1929
+ getLogic(state.calleewholeKey, app, diffLogicList);
1930
+ <span class="cstat-no" title="statement not covered" > break;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
1931
+ ca<span class="cstat-no" title="statement not covered" >se 'Cal</span>lFunction':
1932
+ logicItems = state.arguments?.map((item: Argument) =&gt; item.expression);
1933
+ <span class="cstat-no" title="statement not covered" > break;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
1934
+ ca<span class="cstat-no" title="statement not covered" >se 'Cal</span>lInterface':
1935
+ logicItems = state.arguments?.map((item: Argument) =&gt; item.expression);
2804
1936
  <span class="cstat-no" title="statement not covered" > break;</span>
2805
- case 'MemberExpression':
2806
- <span class="cstat-no" title="statement not covered" > logicItems = [state.object, state.property];</span>
1937
+ ca<span class="cstat-no" title="statement not covered" >se 'Ext</span>ernalDestination':
1938
+ logicItems = [state.anchor, state.link];
1939
+ <span class="cstat-no" title="statement not covered" > break;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
1940
+ ca<span class="cstat-no" title="statement not covered" >se 'Bat</span>chAssignment':
1941
+ logicItems = [state.left?.expression, ...state.left?.members, ...state.rights.map((item: SelectMembers) =&gt; [item?.expression, ...item?.members]).flat(1)];
2807
1942
  <span class="cstat-no" title="statement not covered" > break;</span>
2808
- case 'StringInterpolation':
2809
- <span class="cstat-no" title="statement not covered" > logicItems = [...state.expressions];</span>
1943
+ ca<span class="cstat-no" title="statement not covered" >se 'Mem</span>berExpression':
1944
+ logicItems = [state.object, state.property];
2810
1945
  <span class="cstat-no" title="statement not covered" > break;</span>
2811
- case 'NewComposite':
2812
- <span class="cstat-no" title="statement not covered" > logicItems = [...state.rights.map(<span class="fstat-no" title="function not covered" >(i</span>tem: SelectMembers) =&gt; <span class="cstat-no" title="statement not covered" >item.expression)</span>];</span>
1946
+ ca<span class="cstat-no" title="statement not covered" >se 'Str</span>ingInterpolation':
1947
+ logicItems = [...state.expressions];
1948
+ <span class="cstat-no" title="statement not covered" > break;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
1949
+ ca<span class="cstat-no" title="statement not covered" >se 'New</span>Composite':
1950
+ logicItems = [...state.rights.map((item: SelectMembers) =&gt; item.expression)];
2813
1951
  <span class="cstat-no" title="statement not covered" > break;</span>
2814
- case 'NewList':
2815
- <span class="cstat-no" title="statement not covered" > logicItems = [...state.items];</span>
1952
+ ca<span class="cstat-no" title="statement not covered" >se 'New</span>List':
1953
+ logicItems = [...state.items];
2816
1954
  <span class="cstat-no" title="statement not covered" > break;</span>
2817
1955
  default:
2818
- <span class="cstat-no" title="statement not covered" > break;</span>
2819
- }
1956
+ break;
1957
+ <span class="cstat-no" title="statement not covered" > }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2820
1958
  &nbsp;
2821
- <span class="cstat-no" title="statement not covered" > return logicItems.filter(<span class="fstat-no" title="function not covered" >(i</span>tem: LogicItem) =&gt; <span class="cstat-no" title="statement not covered" >!!item)</span>;</span>
1959
+ return logicItems.filter((item: LogicItem) =&gt; !!item);
2822
1960
  }
2823
- &nbsp;
2824
- /* 小程序影响的服务端发布 */
2825
- function <span class="fstat-no" title="function not covered" >getMiniAppChange(</span>target: any, obj: any, action: string) {
2826
- <span class="cstat-no" title="statement not covered" > if (!target.app.miniEnable) {</span>
2827
- <span class="cstat-no" title="statement not covered" > return false;</span>
2828
- }
2829
- /* 分端以后需要改 */
2830
- const len = <span class="cstat-no" title="statement not covered" >target.nodePath?.split('.').length;</span>
2831
- <span class="cstat-no" title="statement not covered" > if (len &gt; 2) {</span>
1961
+ <span class="fstat-no" title="function not covered" ></span>
1962
+ /*<span class="cstat-no" title="statement not covered" > 小程序影响的服务端发布 */</span>
1963
+ func<span class="cstat-no" title="statement not covered" >tion getMiniAp</span>pChange(target: any, obj: any, action: string) {
1964
+ if (!target.app.miniEnable) {
1965
+ return false;
1966
+ }<span class="cstat-no" title="statement not covered" ></span>
1967
+ <span class="cstat-no" title="statement not covered" > /* 分端以后需要改 */</span>
1968
+ co<span class="cstat-no" title="statement not covered" >nst len = targ</span>et.nodePath?.split('.').length;
1969
+ if (len &gt; 2) {
2832
1970
  <span class="cstat-no" title="statement not covered" > return false;</span>
2833
- }
2834
- <span class="cstat-no" title="statement not covered" > if (action === 'delete') {</span>
1971
+ }<span class="cstat-no" title="statement not covered" ></span>
1972
+ if (action === 'delete') {
2835
1973
  <span class="cstat-no" title="statement not covered" > return true;</span>
2836
- } else {
2837
- <span class="cstat-no" title="statement not covered" > if ('name' in obj || 'title' in obj) {</span>
2838
- <span class="cstat-no" title="statement not covered" > return true;</span>
1974
+ } el<span class="cstat-no" title="statement not covered" >se {</span>
1975
+ if ('name' in obj || 'title' in obj) {
1976
+ return true;
2839
1977
  }
2840
1978
  }
2841
1979
  }
2842
1980
  &nbsp;
2843
1981
  let aiExecuted = 0;
2844
- let sessionPath = '';
2845
- // AI 生成内容是否被采纳
2846
- const handleAIPoint = <span class="fstat-no" title="function not covered" >(a</span>pp: any, actionItem: any) =&gt; {
2847
- const { actionMsg, action } = <span class="cstat-no" title="statement not covered" >actionItem || {};</span>
2848
- <span class="cstat-no" title="statement not covered" > if (aiExecuted &gt; 0) {</span>
2849
- <span class="cstat-no" title="statement not covered" > app.emit('logic:accepted', { ...actionItem, sessionPath });</span>
1982
+ let sessionPath = '';<span class="fstat-no" title="function not covered" ></span>
1983
+ // AI 生成内容是否被采纳<span class="cstat-no" title="statement not covered" ></span>
1984
+ co<span class="cstat-no" title="statement not covered" >nst handleAIPoint = (app: any, actionItem: any) =&gt; {</span>
1985
+ co<span class="cstat-no" title="statement not covered" >nst { actionMsg, action } = actionItem || {};</span>
1986
+ if<span class="cstat-no" title="statement not covered" > (aiExecuted &gt; 0)</span> {
1987
+ app.emit('logic:accepted', { ...actionItem, sessionPath });
2850
1988
  <span class="cstat-no" title="statement not covered" > aiExecuted -= 1;</span>
2851
- }
2852
- <span class="cstat-no" title="statement not covered" > if (actionMsg.includes('自然语言生成代码') &amp;&amp; !action) {</span>
1989
+ }<span class="cstat-no" title="statement not covered" ></span>
1990
+ if (actionMsg.includes('自然语言生成代码') &amp;&amp; !action) {
2853
1991
  <span class="cstat-no" title="statement not covered" > aiExecuted += 1;</span>
2854
1992
  // eslint-disable-next-line prefer-destructuring
2855
- <span class="cstat-no" title="statement not covered" > sessionPath = actionMsg.match(/:(.*)/)[1];</span>
1993
+ sessionPath = actionMsg.match(/:(.*)/)[1];
2856
1994
  }
2857
1995
  }
2858
1996
  &nbsp;
2859
1997
  /**
2860
- * 执行更新
2861
- */
2862
- async function <span class="fstat-no" title="function not covered" >doAction(</span>app: any, actionItem: any) {
2863
- const isOperationRecord = <span class="cstat-no" title="statement not covered" >operationRecordInfoMap.get('isOperationRecord');</span>
2864
- <span class="cstat-no" title="statement not covered" > if (isOperationRecord) {</span>
2865
- <span class="cstat-no" title="statement not covered" > console.log('正在进行操作栈回放操作,如需行任何Nasl操作请刷新页面');</span>
2866
- <span class="cstat-no" title="statement not covered" > return;</span>
2867
- }
2868
- let hasFrontEnd = <span class="cstat-no" title="statement not covered" >false;</span>
2869
- let hasBackEnd = <span class="cstat-no" title="statement not covered" >false;</span>
2870
- const actionList: any[] = <span class="cstat-no" title="statement not covered" >[];</span>
2871
- const allRiskList: any[] = <span class="cstat-no" title="statement not covered" >[];</span>
2872
- const { list, actionMsg, action } = <span class="cstat-no" title="statement not covered" >actionItem || {};</span>
2873
- <span class="cstat-no" title="statement not covered" > handleAIPoint(app, actionItem);</span>
2874
- const itemloop = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(_</span>i: LogicItem, app: any, diffArr: string[]) =&gt; {</span>
2875
- const _l = <span class="cstat-no" title="statement not covered" >getStatement(_i, app, diffArr);</span>
2876
- <span class="cstat-no" title="statement not covered" > if (_l.length) {</span>
2877
- <span class="cstat-no" title="statement not covered" > _l.map(<span class="fstat-no" title="function not covered" >(_</span>ii: LogicItem) =&gt; <span class="cstat-no" title="statement not covered" >itemloop(_ii, app, diffArr))</span>;</span>
2878
- }
2879
- };
2880
- const loopEle = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(v</span>iew: View | ViewElement, checkAuth: boolean) =&gt; {</span>
2881
- <span class="cstat-no" title="statement not covered" > if (view instanceof View) {</span>
2882
- <span class="cstat-no" title="statement not covered" > view?.elements?.forEach(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; <span class="cstat-no" title="statement not covered" >loopEle(item, checkAuth))</span>;</span>
2883
- }
2884
- <span class="cstat-no" title="statement not covered" > view?.children?.forEach(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; <span class="cstat-no" title="statement not covered" >loopEle(item, checkAuth))</span>;</span>
2885
- <span class="cstat-no" title="statement not covered" > if (view instanceof ViewElement) {</span>
2886
- <span class="cstat-no" title="statement not covered" > if (view.bindEvents.length) {</span>
2887
- const diffArr: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
2888
- <span class="cstat-no" title="statement not covered" > view.bindEvents.forEach(<span class="fstat-no" title="function not covered" >(b</span>indEvent) =&gt; {</span>
2889
- <span class="cstat-no" title="statement not covered" > bindEvent.logics.forEach(<span class="fstat-no" title="function not covered" >(l</span>ogic) =&gt; {</span>
2890
- <span class="cstat-no" title="statement not covered" > logic.body.forEach(<span class="fstat-no" title="function not covered" >(l</span>ogicItem) =&gt; <span class="cstat-no" title="statement not covered" >itemloop(logicItem, app, diffArr))</span>;</span>
2891
- });
2892
- });
2893
- const result = <span class="cstat-no" title="statement not covered" >diffArr.filter(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; <span class="cstat-no" title="statement not covered" >item.startsWith('app') || item.startsWith('extensions'))</span>;</span>
2894
- <span class="cstat-no" title="statement not covered" > if (result.length) {</span>
2895
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
2896
- }
2897
- }
2898
- <span class="cstat-no" title="statement not covered" > if (view.tag === 'u-uploader' || view.tag === 'van-uploader') {</span>
2899
- const bute = <span class="cstat-no" title="statement not covered" >view?.bindAttrs.find(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; <span class="cstat-no" title="statement not covered" >item.name === 'url')</span>;</span>
2900
- const needUpdateBackEnd = <span class="cstat-no" title="statement not covered" >bute?.value?.endsWith('/import') || bute?.value?.includes('/upload/');</span>
2901
- <span class="cstat-no" title="statement not covered" > if (checkAuth) {</span>
2902
- <span class="cstat-no" title="statement not covered" > if (needUpdateBackEnd &amp;&amp; !view.view.parentAuth) {</span>
2903
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
2904
- }
2905
- } else {
2906
- <span class="cstat-no" title="statement not covered" > if (needUpdateBackEnd) {</span>
2907
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
1998
+ * 执行更新<span class="fstat-no" title="function not covered" ></span>
1999
+ */<span class="cstat-no" title="statement not covered" ></span>
2000
+ async function doAc<span class="cstat-no" title="statement not covered" >tion(a</span>pp: any, actionItem: any) {
2001
+ let hasFrontEnd = false;<span class="cstat-no" title="statement not covered" ></span>
2002
+ let hasBackEnd = false;<span class="cstat-no" title="statement not covered" ></span>
2003
+ <span class="cstat-no" title="statement not covered" > const actionList: any[] = [];</span>
2004
+ const { list, act<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >io</span>nMsg, action } = actionItem || {};</span>
2005
+ handleAIPoint<span class="cstat-no" title="statement not covered" >(app, actionItem);</span>
2006
+ co<span class="cstat-no" title="statement not covered" >nst itemloop = (_i: LogicItem, app: any, diffArr: string[]) =&gt; {</span>
2007
+ co<span class="cstat-no" title="statement not covered" >nst _l <span class="fstat-no" title="function not covered" >= </span>getStatement(_i, a<span class="cstat-no" title="statement not covered" >pp, diffArr);</span></span>
2008
+ if (_l.length) {
2009
+ _l.map((_ii: LogicItem) =&gt; itemloop(_ii, app, diffArr));
2010
+ }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2011
+ };<span class="cstat-no" title="statement not covered" ></span>
2012
+ cons<span class="cstat-no" title="statement not covered" >t loopEle = (view: View <span class="fstat-no" title="function not covered" >| </span>ViewElem<span class="cstat-no" title="statement not covered" >ent, checkAuth: boolean) </span>=&gt;</span> {
2013
+ if (view instanceof View) {
2014
+ <span class="cstat-no" title="statement not covered" > view?.elements?.forEac<span class="fstat-no" title="function not covered" >h(</span>(item) =<span class="cstat-no" title="statement not covered" >&gt; loopEle(item, checkAuth</span>))</span>;
2015
+ <span class="cstat-no" title="statement not covered" > }</span>
2016
+ vi<span class="cstat-no" title="statement not covered" >ew?.children?.forEach((item) =&gt; loopEle(item, checkAuth));</span>
2017
+ if (view instanceof ViewElemen<span class="cstat-no" title="statement not covered" >t) </span>{
2018
+ if<span class="cstat-no" title="statement not covered" > (view.bindEvents.length<span class="fstat-no" title="function not covered" >) </span>{</span>
2019
+ co<span class="cstat-no" title="statement not covered" >nst diffArr: string[] = [<span class="fstat-no" title="function not covered" >];</span></span>
2020
+ view<span class="cstat-no" title="statement not covered" >.bindEvents.forEach<span class="fstat-no" title="function not covered" >((</span>bindEvent) =&gt;<span class="cstat-no" title="statement not covered" > {</span></span>
2021
+ bindEvent.logics.forEach((logic) =&gt; {
2022
+ logic.body.forEach((logicItem) =&gt; itemloop(logicItem, app, diffArr));
2023
+ });<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2024
+ <span class="cstat-no" title="statement not covered" > });</span>
2025
+ co<span class="cstat-no" title="statement not covered" >nst result = diffAr</span>r.filter((item) =&gt; item.startsWith('app') || item.startsWith('extensions'));
2026
+ if (result.length) {
2027
+ hasBackEnd = true;
2028
+ <span class="cstat-no" title="statement not covered" > }</span>
2029
+ }<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2030
+ if (view.tag === 'u-uploader<span class="cstat-no" title="statement not covered" >' || view.tag === 'van-uploader') {</span>
2031
+ <span class="cstat-no" title="statement not covered" > const bute = view?.bindAttrs.find((item) =&gt; item.name === 'url');</span>
2032
+ co<span class="cstat-no" title="statement not covered" >nst needUpdateBackEnd = bute?.value?.endsWith('/import') || bute?.value?.includes('/upload/');</span>
2033
+ if (<span class="cstat-no" title="statement not covered" >checkAuth) {</span>
2034
+ if (needUpdateBackEnd &amp;&amp; !view.view.parentAuth) {
2035
+ hasBackEnd = true;
2036
+ <span class="cstat-no" title="statement not covered" > }</span>
2037
+ } el<span class="cstat-no" title="statement not covered" >se {</span>
2038
+ if (needUpdateBackEnd) {
2039
+ hasBackEnd = true;
2908
2040
  }
2909
2041
  }
2910
2042
  }
2911
2043
  }
2912
- };
2913
- &nbsp;
2914
- const loopEleAuth = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(v</span>iewElement: ViewElement) =&gt; {</span>
2915
- <span class="cstat-no" title="statement not covered" > viewElement?.children?.forEach(<span class="fstat-no" title="function not covered" >(i</span>tem: ViewElement) =&gt; {</span>
2916
- const bindDirective = <span class="cstat-no" title="statement not covered" >item?.bindDirectives?.find(</span>
2917
- <span class="fstat-no" title="function not covered" > (i</span>tem: BindDirective) =&gt; <span class="cstat-no" title="statement not covered" >item.name === 'auth'</span>
2918
- )
2919
- <span class="cstat-no" title="statement not covered" > if (bindDirective) {</span>
2044
+ };<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2045
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2046
+ const loopEleAuth = (viewE<span class="cstat-no" title="statement not covered" >lement: ViewElement) =&gt; {</span>
2047
+ view<span class="fstat-no" title="function not covered" >El</span>ement?.children?.forEac<span class="cstat-no" title="statement not covered" >h((item: ViewElement)</span> =&gt; {
2048
+ const bindDirective = item?.bindDirectives?.find(
2049
+ <span class="cstat-no" title="statement not covered" > (item: BindDirective) =&gt; item.name === 'auth'</span>
2050
+ )<span class="cstat-no" title="statement not covered" ></span>
2051
+ if (bindDirective) {
2920
2052
  <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
2921
2053
  }
2922
- <span class="cstat-no" title="statement not covered" > loopEleAuth(item)</span>
2923
- })
2924
- }
2925
- <span class="cstat-no" title="statement not covered" > try {</span>
2926
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(list)) {</span>
2927
- <span class="cstat-no" title="statement not covered" > list.forEach(<span class="fstat-no" title="function not covered" >(e</span>vent) =&gt; {</span>
2928
- const emitTarget = <span class="cstat-no" title="statement not covered" >event?.originEvent?.target as SyntaxNode;</span>
2929
- const _path: string = <span class="cstat-no" title="statement not covered" >event.originEvent.path;</span>
2930
- const _root = <span class="cstat-no" title="statement not covered" >_path.split('.')?.[1] || '';</span>
2931
- <span class="cstat-no" title="statement not covered" > if (['backend', 'overriddenLogics', 'dataSources', 'processes', 'roles', 'logics', 'enums', 'structures', 'interfaces', 'interfaceDependencies', 'configuration', 'dependencies', 'authLogics', 'authLogicsForCallInterface', 'triggerLaunchers', 'connections'].some(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; <span class="cstat-no" title="statement not covered" >_root.startsWith(item))</span>) {</span>
2054
+ loopEleAuth(item)
2055
+ <span class="cstat-no" title="statement not covered" > })</span>
2056
+ }<span class="cstat-no" title="statement not covered" ></span>
2057
+ try <span class="cstat-no" title="statement not covered" >{<span class="fstat-no" title="function not covered" ></span></span>
2058
+ if (Array.isArray(list)<span class="cstat-no" title="statement not covered" >) {</span>
2059
+ list.forEach((event) =&gt; <span class="cstat-no" title="statement not covered" >{</span>
2060
+ const emitTarg<span class="cstat-no" title="statement not covered" >et = event?.originEvent?.tar</span>get as SynatxNode;
2061
+ <span class="cstat-no" title="statement not covered" > const _path: string = event.originEvent.path;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2062
+ co<span class="cstat-no" title="statement not covered" >nst _root = _path.s</span>plit('.')?.[1] || '';
2063
+ if (['backend', 'overriddenLogics', 'dataSources', 'processes', 'roles', 'logics', 'enums', 'structures', 'interfaces', 'interfaceDependencies', 'configuration', 'dependencies', 'authLogics', 'authLogicsForCallInterface', 'triggerLaunchers', 'connections'].some((item) =&gt; _root.startsWith(item))) {
2932
2064
  <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
2933
- }
2934
- <span class="cstat-no" title="statement not covered" > if (emitTarget) {</span>
2935
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'App') {</span>
2936
- <span class="cstat-no" title="statement not covered" > if (event?.object?.preferenceMap || event?.originEvent?.object?.preferenceMap) {</span>
2937
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
2938
- <span class="cstat-no" title="statement not covered" > hasFrontEnd = true</span>
2939
- }
2940
- }
2941
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'ValidationRule') {</span>
2942
- <span class="cstat-no" title="statement not covered" > if (</span>
2065
+ }<span class="cstat-no" title="statement not covered" ></span>
2066
+ if (<span class="cstat-no" title="statement not covered" >emitTarget) {</span>
2067
+ if (<span class="cstat-no" title="statement not covered" >emitTarget.concept === 'App') {</span>
2068
+ if<span class="cstat-no" title="statement not covered" > (event?.object?.preferenceMap || event?.originEvent?.object?.preferenceMap) {</span>
2069
+ hasBackEnd = true
2070
+ hasFrontEnd = true
2071
+ <span class="cstat-no" title="statement not covered" > }</span>
2072
+ }<span class="cstat-no" title="statement not covered" ></span>
2073
+ if (emitTarget.concept === 'ValidationRule') {
2074
+ if (
2943
2075
  event?.object?.enableServerValidation ||
2944
- event?.originEvent?.object?.enableServerValidation
2945
- ) {
2946
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
2947
- <span class="cstat-no" title="statement not covered" > hasFrontEnd = true</span>
2948
- }
2949
- }
2950
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'Logic') {</span>
2951
- const diffArr: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
2952
- <span class="cstat-no" title="statement not covered" > if ((emitTarget as Logic).body.length &gt; 2) {</span>
2953
- (<span class="cstat-no" title="statement not covered" >emitTarget as Logic).body.forEach(<span class="fstat-no" title="function not covered" >(i</span>t: LogicItem) =&gt; {</span>
2954
- <span class="cstat-no" title="statement not covered" > itemloop(it, app, diffArr);</span>
2955
- });
2956
- }
2957
- const result = <span class="cstat-no" title="statement not covered" >diffArr.filter(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; <span class="cstat-no" title="statement not covered" >item.startsWith('app') || item.startsWith('extensions'))</span>;</span>
2958
- <span class="cstat-no" title="statement not covered" > if (result.length) {</span>
2959
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
2960
- }
2961
- }
2962
- <span class="cstat-no" title="statement not covered" > if ('view' in emitTarget &amp;&amp; emitTarget.view) {</span>
2076
+ <span class="cstat-no" title="statement not covered" > event?.originEvent?.object?.enableServerValidation</span>
2077
+ ) <span class="cstat-no" title="statement not covered" >{</span>
2078
+ hasBackEnd = true
2079
+ hasFrontEnd = true
2080
+ <span class="cstat-no" title="statement not covered" > }</span>
2081
+ }<span class="cstat-no" title="statement not covered" ></span>
2082
+ if<span class="cstat-no" title="statement not covered" > (emitTarget.concept === 'Logic') {</span>
2083
+ co<span class="cstat-no" title="statement not covered" >nst diffArr: string[] = <span class="fstat-no" title="function not covered" >[]</span>;</span>
2084
+ if (<span class="cstat-no" title="statement not covered" >emitTarget.body.length &gt; 2) </span>{
2085
+ emitTarget.body.forEach((it: LogicItem) =&gt; {
2086
+ itemloop(it, app, diffArr);
2087
+ });<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2088
+ <span class="cstat-no" title="statement not covered" > }</span>
2089
+ co<span class="cstat-no" title="statement not covered" >nst result = diffAr</span>r.filter((item) =&gt; item.startsWith('app') || item.startsWith('extensions'));
2090
+ if (result.length) {
2091
+ hasBackEnd = true;
2092
+ <span class="cstat-no" title="statement not covered" > }</span>
2093
+ }<span class="cstat-no" title="statement not covered" ></span>
2094
+ if ('view' in emitTarget &amp;&amp; emitTarget.view) {
2963
2095
  <span class="cstat-no" title="statement not covered" > hasFrontEnd = true</span>
2964
- }
2965
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'BindDirective') {</span>
2096
+ }<span class="cstat-no" title="statement not covered" ></span>
2097
+ if<span class="cstat-no" title="statement not covered" > (emitTarget.concept === 'BindDirective') {</span>
2966
2098
  const isDelete = <span class="cstat-no" title="statement not covered" >event?.originEvent?.action === 'delete'</span>
2967
- <span class="cstat-no" title="statement not covered" > if (isDelete) {</span>
2968
- const isAuto = <span class="cstat-no" title="statement not covered" >~event?.originEvent?.path?.indexOf('name=auth')</span>
2969
- <span class="cstat-no" title="statement not covered" > if (isAuto) {</span>
2970
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
2971
- }
2972
- }
2973
- <span class="cstat-no" title="statement not covered" > if (event?.originEvent?.object?.name === 'auth') {</span>
2974
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
2975
- }
2976
- }
2977
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'View') {</span>
2978
- <span class="cstat-no" title="statement not covered" > if (getMiniAppChange(emitTarget, event?.originEvent?.object, event?.originEvent?.action)) {</span>
2979
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
2980
- }
2981
- const isDelete = <span class="cstat-no" title="statement not covered" >event?.originEvent?.action === 'delete';</span>
2982
- const isAuthView = (<span class="cstat-no" title="statement not covered" >emitTarget as View).auth &amp;&amp; event?.originEvent?.object?.name;</span>
2983
- const isUpdateAuth = <span class="cstat-no" title="statement not covered" >event?.originEvent?.action === 'update' &amp;&amp; event?.originEvent?.object &amp;&amp; event?.originEvent?.object?.auth</span>
2984
- const isUpdateBindRoles = <span class="cstat-no" title="statement not covered" >event?.originEvent?.action === 'update' &amp;&amp; event?.originEvent?.object &amp;&amp; event?.originEvent?.object?.bindRoles;</span>
2985
- <span class="cstat-no" title="statement not covered" > if (isDelete || isUpdateAuth || isUpdateBindRoles || isAuthView) {</span>
2986
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
2099
+ if<span class="cstat-no" title="statement not covered" > (isDelete) {</span>
2100
+ co<span class="cstat-no" title="statement not covered" >nst isAuto = ~event?.originEvent?.path?.indexOf('name=auth')</span>
2101
+ if (isAuto) {
2102
+ hasBackEnd = true
2103
+ <span class="cstat-no" title="statement not covered" > }</span>
2104
+ }<span class="cstat-no" title="statement not covered" ></span>
2105
+ if (event?.originEvent?.object?.name === 'auth') {
2106
+ hasBackEnd = true
2107
+ <span class="cstat-no" title="statement not covered" > }</span>
2108
+ <span class="cstat-no" title="statement not covered" > }</span>
2109
+ if (<span class="cstat-no" title="statement not covered" >emitTarget.concept </span>=== 'View') {
2110
+ if (getMiniAppChange(emitTarget, event?.originEvent?.object, event?.originEvent?.action)) {
2111
+ hasBackEnd = tr<span class="cstat-no" title="statement not covered" >ue;</span>
2112
+ }<span class="cstat-no" title="statement not covered" ></span>
2113
+ const isDelete = even<span class="cstat-no" title="statement not covered" >t?.originEvent?.action === 'delete';</span>
2114
+ const isAuthView = emitTar<span class="cstat-no" title="statement not covered" >get.auth &amp;&amp; event?.originEvent?.object?.name;</span>
2115
+ <span class="cstat-no" title="statement not covered" > const isUpdateAuth = event?.originEvent?.action === 'update' &amp;&amp; event?.originEvent?.object &amp;&amp; event?.originEvent?.object?.auth</span>
2116
+ co<span class="cstat-no" title="statement not covered" >nst isUpdateBindRol</span>es = event?.originEvent?.action === 'update' &amp;&amp; event?.originEvent?.object &amp;&amp; event?.originEvent?.object?.bindRoles;
2117
+ if (isDelete || isUpdateAuth || isUpdateBindRoles || isAuthView) {
2118
+ hasBackEnd = true;
2987
2119
  // const app = emitTarget.app;
2988
2120
  // const diffArr: string[] = [];
2989
2121
  // emitTarget.logics.forEach((logic: Logic) =&gt; {
@@ -2998,78 +2130,76 @@ async function <span class="fstat-no" title="function not covered" >doAction(</s
2998
2130
  // hasBackEnd = true;
2999
2131
  // }
3000
2132
  // emitTarget.children.forEach((item: View | ViewElement) =&gt; loopEle(item, isDelete));
3001
- // emitTarget.elements.forEach((item: View | ViewElement) =&gt; loopEle(item, isDelete));
2133
+ <span class="cstat-no" title="statement not covered" > // emitTarget.elem</span>ents.forEach((item: View | ViewElement) =&gt; loopEle(item, isDelete));
3002
2134
  }
3003
2135
  <span class="cstat-no" title="statement not covered" > hasFrontEnd = true;</span>
3004
- }
3005
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'ViewElement') {</span>
3006
- <span class="cstat-no" title="statement not covered" > if (event?.originEvent?.object?.name) {</span>
3007
- const bindDirective = (<span class="cstat-no" title="statement not covered" >emitTarget as ViewElement).bindDirectives.find(</span>
3008
- <span class="fstat-no" title="function not covered" > (i</span>tem: BindDirective) =&gt; <span class="cstat-no" title="statement not covered" >item.name === 'auth'</span>
3009
- )
3010
- <span class="cstat-no" title="statement not covered" > if (bindDirective) {</span>
3011
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
3012
- }
3013
- }
3014
- <span class="cstat-no" title="statement not covered" > if (event?.originEvent?.action === 'delete') {</span>
3015
- const bindDirective = (<span class="cstat-no" title="statement not covered" >emitTarget as ViewElement)?.bindDirectives?.find(</span>
3016
- <span class="fstat-no" title="function not covered" > (i</span>tem: BindDirective) =&gt; <span class="cstat-no" title="statement not covered" >item.name === 'auth'</span>
3017
- )
3018
- <span class="cstat-no" title="statement not covered" > if (bindDirective) {</span>
3019
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
3020
- }
3021
- <span class="cstat-no" title="statement not covered" > loopEleAuth((emitTarget as ViewElement))</span>
3022
- }
3023
- <span class="cstat-no" title="statement not covered" > if (event?.originEvent?.action !== 'create') {</span>
3024
- <span class="cstat-no" title="statement not covered" > if (event?.originEvent?.object &amp;&amp; event?.originEvent?.object?.bindRoles) {</span>
2136
+ }<span class="cstat-no" title="statement not covered" ></span>
2137
+ if (emitTarget.concept ===<span class="cstat-no" title="statement not covered" > 'ViewElement') {</span>
2138
+ if (<span class="fstat-no" title="function not covered" >ev</span>ent?.originEvent?.objec<span class="cstat-no" title="statement not covered" >t?.name) {</span>
2139
+ const bindDirective = emitTarget.bindDirectives.find(
2140
+ <span class="cstat-no" title="statement not covered" > (item: BindDirective) =&gt; item.name === 'auth'</span>
2141
+ )<span class="cstat-no" title="statement not covered" ></span>
2142
+ if (bindDirective) {
2143
+ hasBackEnd = true;
2144
+ }<span class="cstat-no" title="statement not covered" ></span>
2145
+ }<span class="cstat-no" title="statement not covered" ></span>
2146
+ if (<span class="fstat-no" title="function not covered" >ev</span>ent?.originEvent?.actio<span class="cstat-no" title="statement not covered" >n === 'delete') {</span>
2147
+ const bindDirective = emitTarget?.bindDirectives?.find(
2148
+ <span class="cstat-no" title="statement not covered" > (item: BindDirective) =&gt; item.name === 'auth'</span>
2149
+ )<span class="cstat-no" title="statement not covered" ></span>
2150
+ if (bindDirective) {
3025
2151
  <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
3026
2152
  }
2153
+ <span class="cstat-no" title="statement not covered" > loopEleAuth(emitTarget)</span>
2154
+ }<span class="cstat-no" title="statement not covered" ></span>
2155
+ if (<span class="cstat-no" title="statement not covered" >event?.originEvent?.action !== 'create') {</span>
2156
+ if (event?.originEvent?.object &amp;&amp; event?.originEvent?.object?.bindRoles) {
2157
+ hasBackEnd = true
2158
+ <span class="cstat-no" title="statement not covered" > }</span>
3027
2159
  }
3028
- <span class="cstat-no" title="statement not covered" > loopEle((emitTarget as ViewElement), true)</span>
3029
- }
3030
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'BindAttribute' &amp;&amp; emitTarget.name === 'url') {</span>
3031
- const needUpdateBackEnd =
3032
- (<span class="cstat-no" title="statement not covered" >emitTarget as BindAttribute)?.value?.endsWith('/import') || (emitTarget as BindAttribute)?.value?.includes('/upload/')</span>
3033
- <span class="cstat-no" title="statement not covered" > if (!(emitTarget as BindAttribute).view.parentAuth &amp;&amp; needUpdateBackEnd) {</span>
3034
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true</span>
3035
- }
2160
+ <span class="cstat-no" title="statement not covered" > loopEle(emitTarget, true)</span>
3036
2161
  }
3037
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'CallLogic') {</span>
3038
- const arrlist: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
3039
- <span class="cstat-no" title="statement not covered" > getLogic((emitTarget as CallLogic).calleeKey, (emitTarget as CallLogic).app, arrlist);</span>
3040
- const result = <span class="cstat-no" title="statement not covered" >arrlist.filter(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; <span class="cstat-no" title="statement not covered" >item.startsWith('app') || item.startsWith('extensions'))</span>;</span>
3041
- // console.log(result, 'CallLogic');
3042
- <span class="cstat-no" title="statement not covered" > if (result.length) {</span>
3043
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
2162
+ if (<span class="cstat-no" title="statement not covered" >emitTarget.concept === 'BindAttribute' &amp;&amp; emitTarget.name === 'url') {</span>
2163
+ <span class="cstat-no" title="statement not covered" > const needUpdateBackEnd =</span>
2164
+ <span class="cstat-no" title="statement not covered" > emitTarget?.value?.endsWith('/import') || emitTarget?.value?.includes('/upload/')</span>
2165
+ if (!emitTarget.view.parentAuth &amp;&amp; needUpdateBackEnd) {
2166
+ hasBackEnd = true
2167
+ <span class="cstat-no" title="statement not covered" > }</span>
2168
+ }<span class="cstat-no" title="statement not covered" ></span>
2169
+ if<span class="cstat-no" title="statement not covered" > (emitTarget.concept === 'CallLogic') {</span>
2170
+ const arrlist: <span class="cstat-no" title="statement not covered" >string[] = [];<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2171
+ getLogic((emitTarget as CallLogic).calleeKey, emitTarget.app, arrlist);
2172
+ <span class="cstat-no" title="statement not covered" > const result = arrlist.filter((item) =&gt; item.startsWith('app') || item.startsWith('extensions'));</span>
2173
+ //<span class="cstat-no" title="statement not covered" > console.log(result</span>, 'CallLogic');
2174
+ if (result.length) {
2175
+ hasBackEnd = true;
3044
2176
  }
2177
+ <span class="cstat-no" title="statement not covered" > }</span>
2178
+ //<span class="cstat-no" title="statement not covered" > 更新端时需要出发后端更新</span>
2179
+ if (emitTarget.concept === 'Frontend') {
2180
+ hasBackEnd = true;
3045
2181
  }
3046
- // 更新端时需要出发后端更新
3047
- <span class="cstat-no" title="statement not covered" > if (emitTarget.concept === 'Frontend') {</span>
3048
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
3049
- }
3050
- }
3051
- <span class="cstat-no" title="statement not covered" > event.eventList.forEach(<span class="fstat-no" title="function not covered" >({</span> action, riskList, path, object: objItem }: { action: string; riskList: string; path: string; object: any }) =&gt; {</span>
3052
- <span class="cstat-no" title="statement not covered" > if (riskList) {</span>
3053
- <span class="cstat-no" title="statement not covered" > allRiskList.push(...(riskList || []));</span>
3054
- }
3055
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(objItem)) {</span>
3056
- <span class="cstat-no" title="statement not covered" > if (action === 'update') {</span>
3057
- <span class="cstat-no" title="statement not covered" > actionList.push({</span>
2182
+ }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2183
+ <span class="cstat-no" title="statement not covered" ></span>
2184
+ even<span class="cstat-no" title="statement not covered" >t.eventList.forEach(({ action, path, object: objItem }: { action: string; path: string; object: any }) =&gt; {</span>
2185
+ if (<span class="cstat-no" title="statement not covered" >Array.isArray(objItem)) {</span>
2186
+ if (action === 'update') {
2187
+ actionList.push({
3058
2188
  action,
3059
2189
  path,
3060
2190
  node: objItem[0],
3061
- });
3062
- } else {
3063
- <span class="cstat-no" title="statement not covered" > objItem.forEach(<span class="fstat-no" title="function not covered" >(i</span>tem, index) =&gt; {</span>
3064
- <span class="cstat-no" title="statement not covered" > actionList.push({</span>
2191
+ <span class="cstat-no" title="statement not covered" > });<span class="fstat-no" title="function not covered" ></span></span>
2192
+ } el<span class="cstat-no" title="statement not covered" >se {</span>
2193
+ objItem.forEach((item, index) =&gt; {
2194
+ actionList.push({
3065
2195
  action,
3066
2196
  path,
3067
2197
  node: item,
3068
2198
  });
3069
2199
  });
3070
- }
2200
+ <span class="cstat-no" title="statement not covered" > }</span>
3071
2201
  } else {
3072
- <span class="cstat-no" title="statement not covered" > actionList.push({</span>
2202
+ actionList.push({
3073
2203
  action,
3074
2204
  path,
3075
2205
  object: objItem,
@@ -3077,67 +2207,46 @@ async function <span class="fstat-no" title="function not covered" >doAction(</s
3077
2207
  }
3078
2208
  });
3079
2209
  });
3080
- }
3081
- } catch (error) {
3082
- <span class="cstat-no" title="statement not covered" > console.log(error);</span>
3083
- <span class="cstat-no" title="statement not covered" > taskQueue.refreshNasl(app, {</span>
2210
+ <span class="cstat-no" title="statement not covered" > }</span>
2211
+ } <span class="cstat-no" title="statement not covered" >catch (error) {</span>
2212
+ console.log(error);
2213
+ taskQueue.refreshNasl(app, {
3084
2214
  errorInfo: {
3085
2215
  message: error?.message,
3086
2216
  stack: error?.stack,
3087
- },
2217
+ <span class="cstat-no" title="statement not covered" > },</span>
3088
2218
  });
3089
- <span class="cstat-no" title="statement not covered" > return;</span>
3090
- }
2219
+ return;
2220
+ }<span class="cstat-no" title="statement not covered" ></span>
3091
2221
  &nbsp;
3092
- const uuid = <span class="cstat-no" title="statement not covered" >uuidv4().replace(/-/g, '');</span>
3093
- const instructList = <span class="cstat-no" title="statement not covered" >[{</span>
3094
- uuid,
3095
- actions: actionList,
3096
- riskList: allRiskList
2222
+ const instructList = [{
2223
+ uuid: uuidv4().replace(/-/g, ''),
2224
+ <span class="cstat-no" title="statement not covered" > actions: actionList,</span>
3097
2225
  }];
3098
- const operation: Operation = <span class="cstat-no" title="statement not covered" >{</span>
3099
- type: 'doAction',
3100
- uuid,
3101
- actionItem: {
3102
- actionMsg,
3103
- list: list.map(<span class="fstat-no" title="function not covered" >(i</span>tem: any) =&gt; {
3104
- const { path, action, object, oldObject, parentKey, index } = <span class="cstat-no" title="statement not covered" >item?.originEvent || {};</span>
3105
- <span class="cstat-no" title="statement not covered" > return {</span>
3106
- path,
3107
- action,
3108
- parentKey,
3109
- index,
3110
- object: object?.toJSON?.() || object,
3111
- oldObject: oldObject?.toJSON?.() || oldObject,
3112
- }
3113
- }),
3114
- },
3115
- };
3116
- <span class="cstat-no" title="statement not covered" > saveNasl({ app, hasFrontEnd, hasBackEnd, instructList, operationList: [operation] });</span>
3117
- // 进行nasl操作后需要将Index重置
3118
- <span class="cstat-no" title="statement not covered" > operationRecordInfoMap.set('operationRecordIndex', null);</span>
3119
- <span class="cstat-no" title="statement not covered" > if (!app._historying) {</span>
3120
- <span class="cstat-no" title="statement not covered" > if (app._historyIndex !== app._historyList.length) {</span>
2226
+ <span class="cstat-no" title="statement not covered" > saveNasl({ app, hasFrontEnd, hasBackEnd, instructList });</span>
2227
+ <span class="cstat-no" title="statement not covered" ></span>
2228
+ if (<span class="cstat-no" title="statement not covered" >!app._historying) {</span>
2229
+ if (app._historyIndex !== app._historyList.length) {
3121
2230
  <span class="cstat-no" title="statement not covered" > app._historyList = app._historyList.splice(0, app._historyIndex);</span>
3122
2231
  }
3123
- <span class="cstat-no" title="statement not covered" > app._historyList.push({</span>
2232
+ app._historyList.<span class="fstat-no" title="function not covered" >pu</span>sh({<span class="cstat-no" title="statement not covered" ></span>
3124
2233
  actionMsg,
3125
- list: list.map(<span class="fstat-no" title="function not covered" >(i</span>tem: any) =&gt; <span class="cstat-no" title="statement not covered" >item?.originEvent)</span>,
2234
+ <span class="cstat-no" title="statement not covered" > list: list.map((item: any) =&gt; item.originEv</span>ent),
3126
2235
  });
3127
- <span class="cstat-no" title="statement not covered" > app._historyIndex = app._historyList.length;</span>
2236
+ app._historyIndex <span class="cstat-no" title="statement not covered" >= app._historyList.length;</span>
3128
2237
  } else {
3129
- const actionMap = <span class="cstat-no" title="statement not covered" >{</span>
2238
+ const actionMap = {
3130
2239
  undo: '已撤销操作:',
3131
- redo: '已重做操作:',
3132
- };
3133
- let msg = <span class="cstat-no" title="statement not covered" >actionMap[action as 'undo' | 'redo'];</span>
3134
- <span class="cstat-no" title="statement not covered" > msg += actionMsg;</span>
3135
- <span class="cstat-no" title="statement not covered" > if (process.env.BUILD_TARGET !== 'node') {</span>
3136
- <span class="cstat-no" title="statement not covered" > require('element-plus').ElMessage.info(msg);</span>
2240
+ redo: '已<span class="cstat-no" title="statement not covered" >重做操作:',</span>
2241
+ <span class="cstat-no" title="statement not covered" > };</span>
2242
+ <span class="cstat-no" title="statement not covered" > let msg = actionMap[action as 'undo' | 'redo'];</span>
2243
+ ms<span class="cstat-no" title="statement not covered" >g += actionMsg;</span>
2244
+ if (process.env.BUILD_TARGET !== 'node') {
2245
+ <span class="cstat-no" title="statement not covered" > require('element-plus')</span>.ElMessage.info(msg);
3137
2246
  }
3138
2247
  <span class="cstat-no" title="statement not covered" > app._historying = false;</span>
3139
2248
  }
3140
- <span class="cstat-no" title="statement not covered" > stepRecorder.initialized &amp;&amp; stepRecorder.record(actionMsg, actionItem, actionList);</span>
2249
+ stepRecorder.initialized &amp;&amp; stepRecorder.record(actionMsg, actionItem, actionList);
3141
2250
  }
3142
2251
  &nbsp;
3143
2252
  type Instruct = {
@@ -3149,7 +2258,6 @@ type TaskOption = {
3149
2258
  hasFrontEnd: boolean,
3150
2259
  hasBackEnd: boolean,
3151
2260
  instructList: Instruct[],
3152
- operationList: Operation[],
3153
2261
  };
3154
2262
  enum TaskQueueStatus {
3155
2263
  ExceedMaxTaskCount,
@@ -3167,197 +2275,141 @@ class TaskQueue {
3167
2275
  lastQueue: TaskOption[] = []
3168
2276
  running: Boolean = false
3169
2277
  maxTaskCount: number = 10
3170
- status?: TaskQueueStatus = undefined
3171
- &nbsp;
3172
- <span class="fstat-no" title="function not covered" > addTask(</span>task: TaskOption) {
2278
+ <span class="fstat-no" title="function not covered" > status?:</span> TaskQueueStatus = undefined
2279
+ <span class="cstat-no" title="statement not covered" ></span>
2280
+ addTask(task: TaskOption) {
3173
2281
  <span class="cstat-no" title="statement not covered" > this.queue.push(task);</span>
3174
- &nbsp;
3175
- <span class="cstat-no" title="statement not covered" > if (this.queue.length &gt;= this.maxTaskCount) {</span>
3176
- <span class="cstat-no" title="statement not covered" > this.status = TaskQueueStatus.ExceedMaxTaskCount;</span>
3177
- <span class="cstat-no" title="statement not covered" > task.app.emit('ExceedMaxTaskCount');</span>
3178
- }
3179
- &nbsp;
3180
- <span class="cstat-no" title="statement not covered" > this.run();</span>
3181
- }
3182
- &nbsp;
3183
- <span class="fstat-no" title="function not covered" > clear(</span>) {
2282
+ <span class="cstat-no" title="statement not covered" ></span>
2283
+ if<span class="cstat-no" title="statement not covered" > (this.queue.length &gt;= this.maxTaskCo</span>unt) {
2284
+ this.status = TaskQueueStatus.ExceedMaxTaskCount;
2285
+ task.app.emit('ExceedMaxTaskCount');
2286
+ <span class="cstat-no" title="statement not covered" > }</span>
2287
+ &nbsp;
2288
+ this.run();
2289
+ <span class="fstat-no" title="function not covered" > }</span>
2290
+ <span class="cstat-no" title="statement not covered" ></span>
2291
+ cl<span class="cstat-no" title="statement not covered" >ear() {</span>
3184
2292
  <span class="cstat-no" title="statement not covered" > this.queue = [];</span>
3185
2293
  <span class="cstat-no" title="statement not covered" > this.lastQueue = [];</span>
3186
- <span class="cstat-no" title="statement not covered" > this.status = undefined;</span>
3187
- <span class="cstat-no" title="statement not covered" > this.running = false;</span>
3188
- }
3189
- &nbsp;
3190
- <span class="fstat-no" title="function not covered" > async </span>run(queue = <span class="branch-0 cbranch-no" title="branch not covered" >this.queue)</span> {
2294
+ this.status = undefined;
2295
+ this.running = false;
2296
+ <span class="fstat-no" title="function not covered" > }<span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
2297
+ <span class="cstat-no" title="statement not covered" ></span>
2298
+ asyn<span class="cstat-no" title="statement not covered" >c run(qu</span>eue = this.queue) {
3191
2299
  <span class="cstat-no" title="statement not covered" > if (this.running)</span>
3192
2300
  <span class="cstat-no" title="statement not covered" > return;</span>
3193
- <span class="cstat-no" title="statement not covered" > if (queue.length === 0)</span>
3194
- <span class="cstat-no" title="statement not covered" > return;</span>
3195
- &nbsp;
3196
- const app = <span class="cstat-no" title="statement not covered" >queue[0].app;</span>
3197
- let hasFrontEnd = <span class="cstat-no" title="statement not covered" >false;</span>
3198
- let hasBackEnd = <span class="cstat-no" title="statement not covered" >false;</span>
3199
- let instructList: Instruct[] = <span class="cstat-no" title="statement not covered" >[];</span>
3200
- let operationList: Operation[] = <span class="cstat-no" title="statement not covered" >[];</span>
3201
- &nbsp;
3202
- <span class="cstat-no" title="statement not covered" > for (const task of queue) {</span>
2301
+ if (queue.length === 0)
2302
+ return;<span class="cstat-no" title="statement not covered" ></span>
2303
+ <span class="cstat-no" title="statement not covered" ></span>
2304
+ const app = queue<span class="cstat-no" title="statement not covered" >[0].ap</span>p;
2305
+ let hasFrontEnd = false;<span class="cstat-no" title="statement not covered" ></span>
2306
+ let hasBackEnd = false;
2307
+ <span class="cstat-no" title="statement not covered" > let instructList: Instruct[] = [];</span>
2308
+ <span class="cstat-no" title="statement not covered" ></span>
2309
+ for <span class="cstat-no" title="statement not covered" >(const task of queue</span>) {
3203
2310
  <span class="cstat-no" title="statement not covered" > if (task.hasFrontEnd)</span>
3204
2311
  <span class="cstat-no" title="statement not covered" > hasFrontEnd = true;</span>
3205
2312
  <span class="cstat-no" title="statement not covered" > if (task.hasBackEnd)</span>
3206
- <span class="cstat-no" title="statement not covered" > hasBackEnd = true;</span>
3207
- <span class="cstat-no" title="statement not covered" > instructList = instructList.concat(task.instructList);</span>
3208
- <span class="cstat-no" title="statement not covered" > operationList = operationList.concat(task.operationList);</span>
3209
- }
3210
- &nbsp;
3211
- <span class="cstat-no" title="statement not covered" > if (queue === this.queue) {</span>
3212
- <span class="cstat-no" title="statement not covered" > this.lastQueue = [...queue];</span>
3213
- <span class="cstat-no" title="statement not covered" > this.queue = [];</span>
3214
- }
3215
- &nbsp;
3216
- <span class="cstat-no" title="statement not covered" > this.running = true;</span>
3217
- const error = <span class="cstat-no" title="statement not covered" >await _saveNasl({</span>
3218
- app, hasFrontEnd, hasBackEnd, instructList, operationList
2313
+ hasBackEnd = true;
2314
+ instructList = instructList.concat(task.instructList);
2315
+ <span class="cstat-no" title="statement not covered" > }</span>
2316
+ <span class="cstat-no" title="statement not covered" ></span>
2317
+ if<span class="cstat-no" title="statement not covered" > (queue === this.</span>queue) {
2318
+ this.lastQueue = [...queue];
2319
+ this.queue = [];
2320
+ <span class="cstat-no" title="statement not covered" > }</span>
2321
+ <span class="cstat-no" title="statement not covered" ></span>
2322
+ this.running = true;
2323
+ const error = await _saveNasl({
2324
+ app, hasFrontEnd, hasBackEnd, instructList,
3219
2325
  });
3220
2326
  &nbsp;
3221
- // code: 401650, 检测到当前应用拉取操作已被强制结束, 用户确认后再刷新
3222
- // code: 500502 msg: "该应用已在新tab 页打开,请刷新!" 不重试或刷新
3223
- <span class="cstat-no" title="statement not covered" > if (!error)</span>
3224
- <span class="cstat-no" title="statement not covered" > this.recover(app);</span>
3225
- else <span class="cstat-no" title="statement not covered" >if (![401650, 500502].includes(error.code)) {</span>
2327
+ <span class="cstat-no" title="statement not covered" > // code: 401650, 检测到当前应用拉取操作已被强制结束, 用户确认后再刷新</span>
2328
+ //<span class="cstat-no" title="statement not covered" > code: 500502 msg:</span> "该应用已在新tab 页打开,请刷新!" 不重试或刷新
2329
+ if (!<span class="cstat-no" title="statement not covered" >error)</span>
2330
+ this.recover(app);
2331
+ el<span class="cstat-no" title="statement not covered" >se if (![401650, 500502].includes(error.code)) {</span>
3226
2332
  // 连接失败,或超时,或后端持久化异常
3227
- <span class="cstat-no" title="statement not covered" > if ((error.message === 'Network Error' || error.message?.includes('timeout') || error.code === 500500)</span>
3228
- &amp;&amp; this.status !== TaskQueueStatus.Retrying) {
3229
- <span class="cstat-no" title="statement not covered" > this.running = false;</span>
2333
+ if<span class="cstat-no" title="statement not covered" > ((error.message === '</span>Network Error' || error.message?.includes('timeout') || error.code === 500500)
2334
+ <span class="cstat-no" title="statement not covered" > &amp;&amp; this.status</span> !== TaskQueueStatus.Retrying) {
2335
+ this.running = false;
3230
2336
  <span class="cstat-no" title="statement not covered" > this.retry();</span>
3231
2337
  } else
3232
- <span class="cstat-no" title="statement not covered" > this.refreshNasl(app);</span>
3233
- &nbsp;
3234
- <span class="cstat-no" title="statement not covered" > return;</span>
3235
- }
3236
- &nbsp;
3237
- <span class="cstat-no" title="statement not covered" > this.running = false;</span>
3238
- &nbsp;
3239
- <span class="cstat-no" title="statement not covered" > this.run();</span>
3240
- }
3241
- &nbsp;
3242
- <span class="fstat-no" title="function not covered" > retry(</span>) {
3243
- <span class="cstat-no" title="statement not covered" > if (this.lastQueue.length === 0)</span>
3244
- <span class="cstat-no" title="statement not covered" > return;</span>
3245
- &nbsp;
3246
- const app = <span class="cstat-no" title="statement not covered" >this.lastQueue[0].app;</span>
3247
- <span class="cstat-no" title="statement not covered" > this.status = TaskQueueStatus.Retrying;</span>
3248
- <span class="cstat-no" title="statement not covered" > app.emit('Retrying');</span>
3249
- <span class="cstat-no" title="statement not covered" > this.run(this.lastQueue);</span>
3250
- }
3251
- &nbsp;
3252
- <span class="fstat-no" title="function not covered" > async </span>refreshNasl(app: App, options: RefreshNaslOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{ errorInfo: {} })</span> {
3253
- const failedQueue = <span class="cstat-no" title="statement not covered" >this.lastQueue.map(<span class="fstat-no" title="function not covered" >({</span> hasFrontEnd, hasBackEnd, instructList }) =&gt; (<span class="cstat-no" title="statement not covered" >{</span></span>
3254
- hasFrontEnd, hasBackEnd, instructList,
2338
+ <span class="cstat-no" title="statement not covered" > this.r</span>efreshNasl(app);
2339
+ &nbsp;
2340
+ return;
2341
+ <span class="cstat-no" title="statement not covered" > }</span>
2342
+ &nbsp;
2343
+ <span class="cstat-no" title="statement not covered" > this.running</span> = false;
2344
+ &nbsp;
2345
+ this.run();
2346
+ <span class="fstat-no" title="function not covered" > }</span>
2347
+ <span class="cstat-no" title="statement not covered" ></span>
2348
+ retr<span class="cstat-no" title="statement not covered" >y() {</span>
2349
+ if (this.lastQueue.length === 0)
2350
+ return;<span class="cstat-no" title="statement not covered" ></span>
2351
+ <span class="cstat-no" title="statement not covered" ></span>
2352
+ <span class="cstat-no" title="statement not covered" > const app = this.lastQ</span>ueue[0].app;
2353
+ <span class="cstat-no" title="statement not covered" > this.status = TaskQueueSta</span>tus.Retrying;
2354
+ app.emit('Retrying');
2355
+ this.run(this.lastQueue);
2356
+ <span class="fstat-no" title="function not covered" > }<span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
2357
+ <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2358
+ async refreshNasl(app: App, options: RefreshNaslOptions = { errorInfo: {} }) {
2359
+ const failedQueue = this.lastQueue.map(({ hasFrontEnd, hasBackEnd, instructList }) =&gt; ({
2360
+ hasFrontEnd,<span class="cstat-no" title="statement not covered" > hasBackEnd, in<span class="fstat-no" title="function not covered" >st</span>ructList,<span class="cstat-no" title="statement not covered" ></span></span>
3255
2361
  }));
3256
- const queue = <span class="cstat-no" title="statement not covered" >this.queue.map(<span class="fstat-no" title="function not covered" >({</span> hasFrontEnd, hasBackEnd, instructList }) =&gt; (<span class="cstat-no" title="statement not covered" >{</span></span>
3257
- hasFrontEnd, hasBackEnd, instructList,
2362
+ const queue = this.queue.map(({ hasFrontEnd, hasBackEnd, instructList }) =&gt; ({
2363
+ <span class="cstat-no" title="statement not covered" > hasFrontEnd, hasBackEnd, instructList,</span>
3258
2364
  }));
3259
- <span class="cstat-no" title="statement not covered" > await storageService.saveFrontendNasl({</span>
2365
+ await storageService.saveFrontendNasl({
3260
2366
  body: {
3261
2367
  nasl: app?.toJSON(),
3262
2368
  failedQueue,
3263
2369
  queue,
3264
- errorInfo: options.errorInfo,
3265
- },
3266
- }).catch(<span class="fstat-no" title="function not covered" >(e</span>rr: any) =&gt; {
3267
- <span class="cstat-no" title="statement not covered" > console.log('备份 nasl 失败:', err);</span>
3268
- });
3269
- <span class="cstat-no" title="statement not covered" > this.clear();</span>
3270
- <span class="cstat-no" title="statement not covered" > app.emit('refresh');</span>
3271
- }
3272
- &nbsp;
3273
- <span class="fstat-no" title="function not covered" > recover(</span>app: App) {
3274
- <span class="cstat-no" title="statement not covered" > switch (this.status) {</span>
3275
- case TaskQueueStatus.ExceedMaxTaskCount:
3276
- <span class="cstat-no" title="statement not covered" > app.emit('BelowMaxTaskCount');</span>
3277
- <span class="cstat-no" title="statement not covered" > this.status = undefined;</span>
3278
- <span class="cstat-no" title="statement not covered" > break;</span>
3279
- case TaskQueueStatus.Retrying:
3280
- <span class="cstat-no" title="statement not covered" > app.emit('SuccessRetry');</span>
3281
- <span class="cstat-no" title="statement not covered" > this.status = undefined;</span>
2370
+ error<span class="fstat-no" title="function not covered" >In</span>fo: options.errorInfo,
2371
+ <span class="cstat-no" title="statement not covered" > },</span>
2372
+ }).catch((err: any) =&gt; {
2373
+ <span class="cstat-no" title="statement not covered" > console.log(</span>'备份 nasl 失败:', err);
2374
+ <span class="cstat-no" title="statement not covered" > });</span>
2375
+ this.clear();
2376
+ app.emit('refresh');
2377
+ <span class="fstat-no" title="function not covered" > }</span>
2378
+ <span class="cstat-no" title="statement not covered" ></span>
2379
+ recover(app: App) {
2380
+ swit<span class="cstat-no" title="statement not covered" >ch (this.status) {</span>
2381
+ ca<span class="cstat-no" title="statement not covered" >se TaskQueueStatus.Exceed</span>MaxTaskCount:
2382
+ <span class="cstat-no" title="statement not covered" > app.emi</span>t('BelowMaxTaskCount');
2383
+ this.status = undefined;
3282
2384
  <span class="cstat-no" title="statement not covered" > break;</span>
2385
+ ca<span class="cstat-no" title="statement not covered" >se TaskQueueStatus.Retryi</span>ng:
2386
+ <span class="cstat-no" title="statement not covered" > app.emi</span>t('SuccessRetry');
2387
+ this.status = undefined;
2388
+ break;
3283
2389
  }
3284
2390
  }
3285
2391
  }
3286
- &nbsp;
3287
- export const taskQueue = new TaskQueue();
3288
- async function <span class="fstat-no" title="function not covered" >saveNasl(</span>options: TaskOption) {
3289
- <span class="cstat-no" title="statement not covered" > taskQueue.addTask(options);</span>
3290
- }
3291
- &nbsp;
3292
- class Operation {
3293
- appId?: string;
3294
- branchId?: string;
3295
- accountId?: string;
3296
- userId?: string;
3297
- phone?: string;
3298
- actionItem: any;
3299
- res?: any;
3300
- err?: any;
3301
- parentKey?: string;
3302
- timestamp?: any;
3303
- type?: string;
3304
- uuid?: string;
3305
- action?: string;
3306
- }
3307
- &nbsp;
3308
- // 确保操作非高危
3309
- function <span class="fstat-no" title="function not covered" >ensureSafe(</span>instructList: any[]) {
3310
- const riskList: any[] = <span class="cstat-no" title="statement not covered" >[]</span>
3311
- <span class="cstat-no" title="statement not covered" > instructList?.forEach(<span class="fstat-no" title="function not covered" >(i</span>nstruct) =&gt; {</span>
3312
- <span class="cstat-no" title="statement not covered" > if (instruct?.riskList) {</span>
3313
- <span class="cstat-no" title="statement not covered" > riskList.push(...(instruct.riskList || []));</span>
3314
- }
3315
- <span class="cstat-no" title="statement not covered" > instruct?.actions?.forEach(<span class="fstat-no" title="function not covered" >(a</span>ctionItem: any) =&gt; {</span>
3316
- const { path, action, object } = <span class="cstat-no" title="statement not covered" >actionItem || {};</span>
3317
- <span class="cstat-no" title="statement not covered" > if (path === 'app') {</span>
3318
- <span class="cstat-no" title="statement not covered" > switch(action) {</span>
3319
- case 'create':
3320
- <span class="cstat-no" title="statement not covered" > riskList.push('重复创建App');</span>
3321
- <span class="cstat-no" title="statement not covered" > break;</span>
3322
- case 'delete':
3323
- <span class="cstat-no" title="statement not covered" > riskList.push('删除App');</span>
3324
- <span class="cstat-no" title="statement not covered" > break;</span>
3325
- case 'update':
3326
- <span class="cstat-no" title="statement not covered" > if (object?.hasOwnProperty('id')) {</span>
3327
- <span class="cstat-no" title="statement not covered" > riskList.push('修改AppId');</span>
3328
- }
3329
- <span class="cstat-no" title="statement not covered" > break;</span>
3330
- }
3331
- }
3332
- });
3333
- });
3334
- <span class="cstat-no" title="statement not covered" > return riskList;</span>
3335
- }
3336
- &nbsp;
3337
- async function <span class="fstat-no" title="function not covered" >_saveNasl(</span>options: TaskOption) {
3338
- const { app, hasFrontEnd, hasBackEnd, instructList, operationList } = <span class="cstat-no" title="statement not covered" >options;</span>
2392
+ <span class="fstat-no" title="function not covered" ></span>
2393
+ ex<span class="cstat-no" title="statement not covered" >port const taskQueue = new T</span>askQueue();
2394
+ async function saveNasl(options: TaskOption) {
2395
+ taskQueue.addTask(options);
2396
+ }<span class="fstat-no" title="function not covered" ></span>
2397
+ <span class="cstat-no" title="statement not covered" ></span>
2398
+ as<span class="cstat-no" title="statement not covered" >ync function _saveNa</span>sl(options: TaskOption) {
2399
+ const { app, hasFrontE<span class="cstat-no" title="statement not covered" >nd,</span> hasBackEnd, instructList } = options;
3339
2400
  <span class="cstat-no" title="statement not covered" > app.emit('saving');</span>
3340
- let ChangedNASLType = <span class="cstat-no" title="statement not covered" >'';</span>
3341
- <span class="cstat-no" title="statement not covered" > if (hasFrontEnd &amp;&amp; hasBackEnd) {</span>
2401
+ le<span class="cstat-no" title="statement not covered" >t ChangedNASLType = '';</span>
2402
+ if (has<span class="cstat-no" title="statement not covered" >FrontEnd &amp;&amp; hasBackEnd) {</span>
3342
2403
  <span class="cstat-no" title="statement not covered" > ChangedNASLType = 'both';</span>
3343
2404
  } else <span class="cstat-no" title="statement not covered" >if (hasFrontEnd) {</span>
3344
2405
  <span class="cstat-no" title="statement not covered" > ChangedNASLType = 'web';</span>
3345
- } else <span class="cstat-no" title="statement not covered" >if (hasBackEnd) {</span>
3346
- <span class="cstat-no" title="statement not covered" > ChangedNASLType = 'backend';</span>
3347
- }
3348
- let res: any;
3349
- let err: any;
3350
- &nbsp;
3351
- <span class="cstat-no" title="statement not covered" > if (config.storage.protocol === 'http') {</span>
3352
- <span class="cstat-no" title="statement not covered" > try {</span>
3353
- const riskList = <span class="cstat-no" title="statement not covered" >ensureSafe(instructList);</span>
3354
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(riskList) &amp;&amp; riskList.length) {</span>
3355
- <span class="cstat-no" title="statement not covered" > throw Error(`存在以下高危操作:\n${riskList.map(<span class="fstat-no" title="function not covered" >(r</span>isk, index) =&gt; {</span>
3356
- <span class="cstat-no" title="statement not covered" > return `${index + 1}.${risk};`;</span>
3357
- }).join('\n')}\n请及时排查原因`);
3358
- }
3359
- // 接口请求
3360
- <span class="cstat-no" title="statement not covered" > res = await storageService.batchInstruct({</span>
2406
+ } else if (hasBackEnd) {
2407
+ ChangedNASLType = 'backend';
2408
+ <span class="cstat-no" title="statement not covered" > }</span>
2409
+ le<span class="cstat-no" title="statement not covered" >t err;</span>
2410
+ if (<span class="cstat-no" title="statement not covered" >config.storage.protocol === 'http') {</span>
2411
+ try {
2412
+ await storageService.batchInstruct({
3361
2413
  body: instructList,
3362
2414
  headers: {
3363
2415
  appId: app.id,
@@ -3365,35 +2417,27 @@ async function <span class="fstat-no" title="function not covered" >_saveNasl(</
3365
2417
  tabTimestamp,
3366
2418
  // 其他封装在 storageService 里了
3367
2419
  },
3368
- });
2420
+ <span class="cstat-no" title="statement not covered" > });</span>
3369
2421
  } catch (error) {
3370
- <span class="cstat-no" title="statement not covered" > err = error;</span>
3371
- <span class="cstat-no" title="statement not covered" > console.error(err);</span>
2422
+ err<span class="cstat-no" title="statement not covered" > = error;</span>
3372
2423
  }
3373
- <span class="cstat-no" title="statement not covered" > operationList.forEach(<span class="fstat-no" title="function not covered" >(o</span>peration) =&gt; {</span>
3374
- <span class="cstat-no" title="statement not covered" > doOperationRecord({</span>
3375
- ...operation,
3376
- res,
3377
- err,
3378
- });
3379
- });
3380
- } else <span class="cstat-no" title="statement not covered" >if (config.storage.protocol === 'mock') {</span>
3381
- // Do nothing
2424
+ } else if (config.storage.protocol === 'mock') {
2425
+ // Do nothing<span class="cstat-no" title="statement not covered" ></span>
3382
2426
  } else {
3383
- const json = <span class="cstat-no" title="statement not covered" >await fs.readJSON(config.storage.basePath);</span>
3384
- &nbsp;
3385
- let actionList: any[] = <span class="cstat-no" title="statement not covered" >[];</span>
3386
- <span class="cstat-no" title="statement not covered" > for (const { actions } of instructList) {</span>
3387
- <span class="cstat-no" title="statement not covered" > actionList = actionList.concat(actions);</span>
3388
- }
3389
- &nbsp;
3390
- <span class="cstat-no" title="statement not covered" > jsoner.batchAction(json, actionList);</span>
3391
- <span class="cstat-no" title="statement not covered" > await fs.writeJSON(config.storage.basePath, json, {</span>
2427
+ const json = await fs.re<span class="cstat-no" title="statement not covered" >adJ</span>SON(config.storage.basePath);
2428
+ <span class="cstat-no" title="statement not covered" ></span>
2429
+ le<span class="cstat-no" title="statement not covered" >t actionList: any[] = [];</span>
2430
+ for (const { actions } of instructList) {
2431
+ actionList = actionList.concat(actions);
2432
+ <span class="cstat-no" title="statement not covered" > }</span>
2433
+ <span class="cstat-no" title="statement not covered" ></span>
2434
+ jsoner.batchAction(json, actionList);
2435
+ await fs.writeJSON(config.storage.basePath, json, {
3392
2436
  spaces: 4,
3393
- });
3394
- }
3395
- <span class="cstat-no" title="statement not covered" > app.emit('saved', err);</span>
3396
- <span class="cstat-no" title="statement not covered" > return err;</span>
2437
+ <span class="cstat-no" title="statement not covered" > });</span>
2438
+ <span class="cstat-no" title="statement not covered" > }</span>
2439
+ app.emit('saved', err);
2440
+ return err;
3397
2441
  }
3398
2442
  &nbsp;
3399
2443
  export interface ProxyApp extends App {
@@ -3407,123 +2451,123 @@ export interface ProxyApp extends App {
3407
2451
  _actionMsg: string;
3408
2452
  _action: string;
3409
2453
  naslServer: NaslServer;
3410
- }
3411
- &nbsp;
3412
- export function <span class="fstat-no" title="function not covered" >handleApp(</span>app: ProxyApp) {
3413
- <span class="cstat-no" title="statement not covered" > app._isCollectingCount = 0;</span>
3414
- <span class="cstat-no" title="statement not covered" > app._collectingList = [];</span>
2454
+ }<span class="fstat-no" title="function not covered" ></span>
2455
+ <span class="cstat-no" title="statement not covered" ></span>
2456
+ ex<span class="cstat-no" title="statement not covered" >port function handleApp(ap</span>p: ProxyApp) {
2457
+ <span class="cstat-no" title="statement not covered" > app._isCollectingCount </span>= 0;
2458
+ <span class="cstat-no" title="statement not covered" > app._collectingList = [</span>];
3415
2459
  <span class="cstat-no" title="statement not covered" > app._historyList = [];</span>
3416
- <span class="cstat-no" title="statement not covered" > app._historyIndex = 0;</span>
3417
- <span class="cstat-no" title="statement not covered" > app._historying = false;</span>
3418
- <span class="cstat-no" title="statement not covered" > app._timer = null;</span>
3419
- &nbsp;
3420
- <span class="cstat-no" title="statement not covered" > app.on('undo', <span class="fstat-no" title="function not covered" >function (this: ProxyApp) {</span></span>
3421
- const proxyApp = <span class="cstat-no" title="statement not covered" >this;</span>
3422
- <span class="cstat-no" title="statement not covered" > proxyApp._historying = true;</span>
3423
- });
3424
- &nbsp;
3425
- <span class="cstat-no" title="statement not covered" > app.on('redo', <span class="fstat-no" title="function not covered" >function (this: ProxyApp) {</span></span>
3426
- const proxyApp = <span class="cstat-no" title="statement not covered" >this;</span>
3427
- <span class="cstat-no" title="statement not covered" > proxyApp._historying = true;</span>
2460
+ <span class="cstat-no" title="statement not covered" > app._historyIndex =</span> 0;
2461
+ app._historying = false;
2462
+ <span class="cstat-no" title="statement not covered" > app._timer = nu<span class="fstat-no" title="function not covered" >ll;</span></span>
2463
+ <span class="cstat-no" title="statement not covered" ></span>
2464
+ ap<span class="cstat-no" title="statement not covered" >p.on('undo', function (this: </span>ProxyApp) {
2465
+ const proxyApp = this;
2466
+ proxyApp._historying = true;
2467
+ <span class="cstat-no" title="statement not covered" > });<span class="fstat-no" title="function not covered" ></span></span>
2468
+ <span class="cstat-no" title="statement not covered" ></span>
2469
+ ap<span class="cstat-no" title="statement not covered" >p.on('redo', function (this: </span>ProxyApp) {
2470
+ const proxyApp = this;
2471
+ proxyApp._historying = true;
3428
2472
  });
3429
2473
  &nbsp;
3430
2474
  /**
3431
- * 开启收集
3432
- */
3433
- <span class="cstat-no" title="statement not covered" > app.on('collect:start', <span class="fstat-no" title="function not covered" >function (this: ProxyApp, e</span>vent: any) {</span>
3434
- const proxyApp = <span class="cstat-no" title="statement not covered" >this;</span>
3435
- <span class="cstat-no" title="statement not covered" > if (proxyApp._timer) {</span>
2475
+ <span class="cstat-no" title="statement not covered" > * 开启收集<span class="fstat-no" title="function not covered" ></span></span>
2476
+ */<span class="cstat-no" title="statement not covered" ></span>
2477
+ ap<span class="cstat-no" title="statement not covered" >p.on('collect:start', function (this: ProxyApp, event: any) {</span>
2478
+ co<span class="cstat-no" title="statement not covered" >nst proxyApp = this;</span>
2479
+ if (proxyApp._timer) {
3436
2480
  <span class="cstat-no" title="statement not covered" > clearTimeout(proxyApp._timer);</span>
3437
- }
3438
- <span class="cstat-no" title="statement not covered" > if (!proxyApp._noTimer) {</span>
2481
+ }<span class="cstat-no" title="statement not covered" ></span>
2482
+ if (!proxyApp._noTimer) {
3439
2483
  <span class="cstat-no" title="statement not covered" > proxyApp._noTimer = event.noTimer;</span>
3440
- }
3441
- <span class="cstat-no" title="statement not covered" > if (!proxyApp._noTimer) {</span>
3442
- <span class="cstat-no" title="statement not covered" > proxyApp._timer = setTimeout(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
3443
- <span class="cstat-no" title="statement not covered" > console.error('收集超时,请及时排查原因', event);</span>
3444
- <span class="cstat-no" title="statement not covered" > taskQueue.refreshNasl(proxyApp, {</span>
2484
+ }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2485
+ if (<span class="cstat-no" title="statement not covered" >!proxyApp._noTimer) {</span>
2486
+ pr<span class="cstat-no" title="statement not covered" >oxyApp._timer = setTimeout(() =&gt; {</span>
2487
+ console.error('收集超时,请及时排查原因', event);
2488
+ taskQueue.refreshNasl(proxyApp, {
3445
2489
  errorInfo: {
3446
2490
  message: '收集超时,请及时排查原因',
3447
2491
  },
3448
2492
  });
3449
- }, 2500);
3450
- }
3451
- <span class="cstat-no" title="statement not covered" > if (!proxyApp._isCollectingCount) {</span>
3452
- <span class="cstat-no" title="statement not covered" > proxyApp._actionMsg = event?.actionMsg;</span>
3453
- <span class="cstat-no" title="statement not covered" > proxyApp._action = event?.action;</span>
2493
+ <span class="cstat-no" title="statement not covered" > }, 2500);</span>
2494
+ }<span class="cstat-no" title="statement not covered" ></span>
2495
+ if<span class="cstat-no" title="statement not covered" > (!proxyApp._isCollectingCount) {</span>
2496
+ proxyApp._actionMsg = event?.actionMsg;
2497
+ <span class="cstat-no" title="statement not covered" > proxyApp._action = event?.act</span>ion;
3454
2498
  }
3455
- <span class="cstat-no" title="statement not covered" > proxyApp._isCollectingCount++;</span>
2499
+ proxyApp._isCollectingCount++;
3456
2500
  });
3457
2501
  &nbsp;
3458
2502
  /**
3459
- * 结束收集
3460
- */
3461
- <span class="cstat-no" title="statement not covered" > app.on('collect:end', <span class="fstat-no" title="function not covered" >async </span>function (this: ProxyApp) {</span>
3462
- const proxyApp = <span class="cstat-no" title="statement not covered" >this;</span>
3463
- <span class="cstat-no" title="statement not covered" > proxyApp._isCollectingCount--;</span>
3464
- <span class="cstat-no" title="statement not covered" > if (proxyApp._isCollectingCount === 0) {</span>
3465
- <span class="cstat-no" title="statement not covered" > if (proxyApp._timer) {</span>
3466
- <span class="cstat-no" title="statement not covered" > clearTimeout(proxyApp._timer);</span>
3467
- }
3468
- // 结束收集时,立即将全局收集变量状态重置,防止下次收集数据混乱
3469
- const collectingList = <span class="cstat-no" title="statement not covered" >proxyApp._collectingList;</span>
3470
- const actionMsg = <span class="cstat-no" title="statement not covered" >proxyApp._actionMsg;</span>
3471
- const action = <span class="cstat-no" title="statement not covered" >proxyApp._action;</span>
3472
- <span class="cstat-no" title="statement not covered" > proxyApp._collectingList = [];</span>
2503
+ <span class="cstat-no" title="statement not covered" > * 结束收集<span class="fstat-no" title="function not covered" ></span></span>
2504
+ */<span class="cstat-no" title="statement not covered" ></span>
2505
+ ap<span class="cstat-no" title="statement not covered" >p.on('collect:end', async funct</span>ion (this: ProxyApp) {
2506
+ <span class="cstat-no" title="statement not covered" > const proxyApp = this;</span>
2507
+ pr<span class="cstat-no" title="statement not covered" >oxyApp._isCollectingCount--;</span>
2508
+ if (<span class="cstat-no" title="statement not covered" >proxyApp._isCollectingCount ===</span> 0) {
2509
+ if (proxyApp._timer) {
2510
+ clearTimeout(proxyApp._timer);
2511
+ }<span class="cstat-no" title="statement not covered" ></span>
2512
+ // 结束收集时,立即将全局收集变量<span class="cstat-no" title="statement not covered" >状态重置,防止下次收集数据混乱</span>
2513
+ const collectin<span class="cstat-no" title="statement not covered" >gList = proxyApp.</span>_collectingList;
2514
+ <span class="cstat-no" title="statement not covered" > const actionMsg = proxyApp._act</span>ionMsg;
2515
+ <span class="cstat-no" title="statement not covered" > const action = proxyApp._a</span>ction;
2516
+ <span class="cstat-no" title="statement not covered" > proxyApp._collectingLis</span>t = [];
3473
2517
  <span class="cstat-no" title="statement not covered" > proxyApp._actionMsg = '';</span>
3474
2518
  <span class="cstat-no" title="statement not covered" > proxyApp._action = '';</span>
3475
- <span class="cstat-no" title="statement not covered" > proxyApp._noTimer = undefined;</span>
3476
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(collectingList) &amp;&amp; collectingList.length) {</span>
3477
- <span class="cstat-no" title="statement not covered" > mountDatabaseTypes(proxyApp);</span>
3478
- <span class="cstat-no" title="statement not covered" > proxyApp.naslServer?.embeddedTSEmitter?.emit('change', {</span>
3479
- value: collectingList,
2519
+ pr<span class="cstat-no" title="statement not covered" >oxyApp._noTimer = undefined;</span>
2520
+ if<span class="cstat-no" title="statement not covered" > (Array.isArray(collectingList) &amp;&amp; collectingList.length) {</span>
2521
+ mountDatabaseTypes(proxyApp);
2522
+ proxyApp.naslServer?.embeddedTSEmitter?.emit('change', {
2523
+ <span class="cstat-no" title="statement not covered" > value: collectingList,</span>
3480
2524
  });
3481
- <span class="cstat-no" title="statement not covered" > await doAction(proxyApp, {</span>
2525
+ await doAction(proxyApp, {
3482
2526
  list: collectingList,
3483
2527
  actionMsg,
3484
2528
  action,
3485
- });
3486
- }
3487
- } else <span class="cstat-no" title="statement not covered" >if (proxyApp._isCollectingCount &lt; 0) {</span>
3488
- <span class="cstat-no" title="statement not covered" > proxyApp._isCollectingCount = 0;</span>
3489
- <span class="cstat-no" title="statement not covered" > throw Error('关闭收集有问题,请排查');</span>
2529
+ });<span class="cstat-no" title="statement not covered" ></span>
2530
+ <span class="cstat-no" title="statement not covered" > }</span>
2531
+ } <span class="cstat-no" title="statement not covered" >else if (proxyApp._isCollect</span>ingCount &lt; 0) {
2532
+ proxyApp._isCollectingCount = 0;
2533
+ throw Error('关闭收集有问题,请排查');
3490
2534
  }
3491
2535
  });
3492
2536
  &nbsp;
3493
2537
  /**
3494
- * 有变更
3495
- */
3496
- <span class="cstat-no" title="statement not covered" > app.on('storage', <span class="fstat-no" title="function not covered" >function (this: ProxyApp, e</span>vent: any) {</span>
3497
- const proxyApp = <span class="cstat-no" title="statement not covered" >this;</span>
3498
- // 是否正在收集
3499
- <span class="cstat-no" title="statement not covered" > if (proxyApp._isCollectingCount === 0) {</span>
3500
- <span class="cstat-no" title="statement not covered" > proxyApp.naslServer?.embeddedTSEmitter?.emit('change', {</span>
3501
- value: [event],
3502
- });
3503
- let actionMsg = <span class="cstat-no" title="statement not covered" >'';</span>
3504
- const { action, target } = <span class="cstat-no" title="statement not covered" >event.originEvent || {};</span>
3505
- const { concept, name } = <span class="cstat-no" title="statement not covered" >target || {};</span>
3506
- <span class="cstat-no" title="statement not covered" > switch (action) {</span>
3507
- case 'create':
3508
- <span class="cstat-no" title="statement not covered" > actionMsg = '添加';</span>
2538
+ <span class="cstat-no" title="statement not covered" > * 有变更<span class="fstat-no" title="function not covered" ></span></span>
2539
+ */<span class="cstat-no" title="statement not covered" ></span>
2540
+ app.on('storage', function (this: ProxyApp, event: any) {
2541
+ <span class="cstat-no" title="statement not covered" > const proxyApp = this;</span>
2542
+ //<span class="cstat-no" title="statement not covered" > 是否正在收集</span>
2543
+ if (proxyApp._isCollectingCount === 0) {
2544
+ proxyApp.naslServer?.embeddedTSEmitter?.emit('change', {
2545
+ value: [event]<span class="cstat-no" title="statement not covered" >,</span>
2546
+ });<span class="cstat-no" title="statement not covered" ></span>
2547
+ let actionMsg = '';<span class="cstat-no" title="statement not covered" ></span>
2548
+ <span class="cstat-no" title="statement not covered" > const { action, target } = event.originEvent || {};</span>
2549
+ const { concept, name } = target || {};
2550
+ swit<span class="cstat-no" title="statement not covered" >ch (action) {</span>
2551
+ ca<span class="cstat-no" title="statement not covered" >se 'cre</span>ate':
2552
+ actionMsg = '添加';
3509
2553
  <span class="cstat-no" title="statement not covered" > break;</span>
3510
- case 'delete':
3511
- <span class="cstat-no" title="statement not covered" > actionMsg = '删除';</span>
2554
+ ca<span class="cstat-no" title="statement not covered" >se 'del</span>ete':
2555
+ actionMsg = '删除';
3512
2556
  <span class="cstat-no" title="statement not covered" > break;</span>
3513
- case 'update':
3514
- <span class="cstat-no" title="statement not covered" > actionMsg = '修改';</span>
2557
+ ca<span class="cstat-no" title="statement not covered" >se 'upd</span>ate':
2558
+ actionMsg = '修改';
3515
2559
  <span class="cstat-no" title="statement not covered" > break;</span>
3516
- }
3517
- <span class="cstat-no" title="statement not covered" > actionMsg += getConceptConstructor(concept).nodeTitle;</span>
3518
- <span class="cstat-no" title="statement not covered" > if (name) {</span>
2560
+ <span class="cstat-no" title="statement not covered" > }</span>
2561
+ ac<span class="cstat-no" title="statement not covered" >tionMsg += getConceptConst</span>ructor(concept).nodeTitle;
2562
+ if (name) {
3519
2563
  <span class="cstat-no" title="statement not covered" > actionMsg += `“${name}”`;</span>
3520
2564
  }
3521
- <span class="cstat-no" title="statement not covered" > doAction(proxyApp, {</span>
2565
+ doAction(proxyApp, {
3522
2566
  list: [event],
3523
2567
  actionMsg,
3524
- });
2568
+ <span class="cstat-no" title="statement not covered" > });</span>
3525
2569
  } else {
3526
- <span class="cstat-no" title="statement not covered" > proxyApp._collectingList.push(event);</span>
2570
+ proxyApp._collectingList.push(event);
3527
2571
  }
3528
2572
  });
3529
2573
  }
@@ -3538,17 +2582,13 @@ type BreakpointItem =
3538
2582
  /**
3539
2583
  * 加载 app
3540
2584
  * @param appId 如果是从文件读,就不需要传
3541
- * @returns app 对象
2585
+ * @returns app 对象<span class="fstat-no" title="function not covered" ></span>
3542
2586
  */
3543
- export async function <span class="fstat-no" title="function not covered" >loadApp(</span>appId?: string) {
3544
- <span class="cstat-no" title="statement not covered" > try {</span>
3545
- // 删除失效数据
3546
- <span class="cstat-no" title="statement not covered" > deleteExpiredRecords();</span>
3547
- } catch(err) { }
3548
- let app: App;
3549
- <span class="cstat-no" title="statement not covered" > if (config.storage.protocol === 'http') {</span>
3550
- <span class="cstat-no" title="statement not covered" > console.time('batchQuery');</span>
3551
- const promises = <span class="cstat-no" title="statement not covered" >[</span>
2587
+ ex<span class="cstat-no" title="statement not covered" >port async function loadApp(appId?: string) {</span>
2588
+ le<span class="cstat-no" title="statement not covered" >t app: App;</span>
2589
+ if (config.storage.<span class="cstat-no" title="statement not covered" >protocol === 'http') {</span>
2590
+ console.time('batchQuery');
2591
+ const promises = [
3552
2592
  storageService.batchQuery({
3553
2593
  body: [
3554
2594
  {
@@ -3568,37 +2608,37 @@ export async function <span class="fstat-no" title="function not covered" >loadA
3568
2608
  storageService.breakpoint({
3569
2609
  body: { appId }
3570
2610
  })
3571
- ]
3572
- &nbsp;
3573
- const [batchQueryRes, breakpointRes] = <span class="cstat-no" title="statement not covered" >await Promise.all(promises)</span>
2611
+ ]<span class="cstat-no" title="statement not covered" ></span>
3574
2612
  &nbsp;
2613
+ const [batchQueryRes, breakpointRes] = await Promise.all(promises)
2614
+ <span class="cstat-no" title="statement not covered" ></span>
3575
2615
  // 请求
3576
2616
  <span class="cstat-no" title="statement not covered" > console.timeEnd('batchQuery');</span>
3577
- &nbsp;
3578
- <span class="cstat-no" title="statement not covered" > tabTimestamp = batchQueryRes?.headers?.tabtimestamp;</span>
3579
- const data = <span class="cstat-no" title="statement not covered" >batchQueryRes?.data?.result;</span>
3580
- &nbsp;
3581
- <span class="cstat-no" title="statement not covered" > console.time('new App');</span>
3582
- <span class="cstat-no" title="statement not covered" > app = new App(Object.assign(data?.[0], { id: appId }));</span>
3583
- &nbsp;
3584
- <span class="cstat-no" title="statement not covered" > breakpointRes?.forEach(<span class="fstat-no" title="function not covered" >(i</span>tem: BreakpointItem = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> =&gt; {</span>
3585
- const { path, breakpointStatus } = <span class="cstat-no" title="statement not covered" >item</span>
3586
- &nbsp;
3587
- <span class="cstat-no" title="statement not covered" > if (breakpointStatus) {</span>
3588
- const node = <span class="cstat-no" title="statement not covered" >app.findNodeByPath(path)</span>
3589
- &nbsp;
3590
- <span class="cstat-no" title="statement not covered" > if (node) {</span>
3591
- <span class="cstat-no" title="statement not covered" > node.breakpoint = breakpointStatus</span>
2617
+ <span class="cstat-no" title="statement not covered" ></span>
2618
+ tabTimestamp = batchQueryRes?.headers?.tabtimestamp;
2619
+ <span class="cstat-no" title="statement not covered" > const data = batchQueryRe</span>s?.data?.result;
2620
+ <span class="cstat-no" title="statement not covered" ></span>
2621
+ console.time('new App');
2622
+ <span class="cstat-no" title="statement not covered" > app = new App(Object.as<span class="fstat-no" title="function not covered" >si</span>gn(data?.[0], { id: ap<span class="branch-0 cbranch-no" title="branch not covered" >pId</span> }));</span>
2623
+ <span class="cstat-no" title="statement not covered" ></span>
2624
+ breakpointRes?.forEach((item: BreakpointItem = {}) =&gt; {
2625
+ <span class="cstat-no" title="statement not covered" > const { path, breakpointStatus } = item</span>
2626
+ <span class="cstat-no" title="statement not covered" ></span>
2627
+ if (breakpointStatus) {
2628
+ <span class="cstat-no" title="statement not covered" > const node = app.findNodeByPath(path)</span>
2629
+ <span class="cstat-no" title="statement not covered" ></span>
2630
+ if (node) {
2631
+ node.breakpoint = breakpointStatus
3592
2632
  }
3593
- }
3594
- })
3595
- <span class="cstat-no" title="statement not covered" > console.timeEnd('new App');</span>
3596
- <span class="cstat-no" title="statement not covered" > if (!app.id) {</span>
2633
+ <span class="cstat-no" title="statement not covered" > }</span>
2634
+ <span class="cstat-no" title="statement not covered" > })</span>
2635
+ co<span class="cstat-no" title="statement not covered" >nsole.timeEnd('n</span>ew App');
2636
+ if (!app.id) {
3597
2637
  <span class="cstat-no" title="statement not covered" > app.id = appId;</span>
3598
- }
2638
+ }<span class="cstat-no" title="statement not covered" ></span>
3599
2639
  <span class="cstat-no" title="statement not covered" > addBreakpointNodesFromApp(app)</span>
3600
- } else <span class="cstat-no" title="statement not covered" >if (config.storage.protocol === 'mock') {</span>
3601
- <span class="cstat-no" title="statement not covered" > app = new App({</span>
2640
+ } else if (config.storage.protocol === 'mock') {
2641
+ app = new App({
3602
2642
  id: appId,
3603
2643
  concept: 'App',
3604
2644
  name: 'devapp',
@@ -3616,88 +2656,88 @@ export async function <span class="fstat-no" title="function not covered" >loadA
3616
2656
  dependencies: [],
3617
2657
  interfaceDependencies: [],
3618
2658
  frontends: [],
3619
- });
3620
- } else {
3621
- const json = <span class="cstat-no" title="statement not covered" >await fs.readJSON(config.storage.basePath);</span>
3622
- <span class="cstat-no" title="statement not covered" > app = new App(appId ? Object.assign(json, { id: appId }) : json);</span>
3623
- }
3624
- // config.scope = app.scope;
3625
- <span class="cstat-no" title="statement not covered" > handleApp(app as ProxyApp);</span>
3626
- (<span class="cstat-no" title="statement not covered" >app as any)._isCollectingCount = 0;</span>
3627
- <span class="cstat-no" title="statement not covered" > mountDatabaseTypes(app);</span>
3628
- <span class="cstat-no" title="statement not covered" > return app as App;</span>
2659
+ });<span class="cstat-no" title="statement not covered" ></span>
2660
+ } <span class="cstat-no" title="statement not covered" >else {</span>
2661
+ const json = await fs.readJSON(config.storage.basePath);
2662
+ app = new App(appId ? Object.assign(json, { id: appId }) : json);
2663
+ <span class="cstat-no" title="statement not covered" > }</span>
2664
+ /<span class="cstat-no" title="statement not covered" >/ config.scope = app.scope;</span>
2665
+ <span class="cstat-no" title="statement not covered" > handleApp(app as ProxyApp</span>);
2666
+ <span class="cstat-no" title="statement not covered" > (app as any)._isCol</span>lectingCount = 0;
2667
+ mountDatabaseTypes(app);
2668
+ return app as App;
3629
2669
  }
3630
- &nbsp;
3631
- // 在app上挂载所有的数据库类型
3632
- export async function <span class="fstat-no" title="function not covered" >mountDatabaseTypes(</span>app: App) {
3633
- <span class="cstat-no" title="statement not covered" > if (!app.__databaseTypeMap) {</span>
3634
- <span class="cstat-no" title="statement not covered" > app.__databaseTypeMap = {};</span>
3635
- }
3636
- const dataSources = <span class="cstat-no" title="statement not covered" >app?.dataSources;</span>
3637
- const dbTypeSet = <span class="cstat-no" title="statement not covered" >new Set();</span>
3638
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(dataSources)) {</span>
3639
- <span class="cstat-no" title="statement not covered" > dataSources.forEach(<span class="fstat-no" title="function not covered" >(d</span>ataSource) =&gt; {</span>
3640
- const dataSourceSqlType = <span class="cstat-no" title="statement not covered" >JSON.parse(dataSource.dataSourceConfig?.devProperty?.value || '{}')?.type;</span>
3641
- <span class="cstat-no" title="statement not covered" > if (dataSourceSqlType &amp;&amp; !app.__databaseTypeMap[dataSourceSqlType]) {</span>
3642
- <span class="cstat-no" title="statement not covered" > dbTypeSet.add(dataSourceSqlType);</span>
2670
+ <span class="fstat-no" title="function not covered" ></span>
2671
+ //<span class="cstat-no" title="statement not covered" > 在app上挂载所有的数据库类型</span>
2672
+ expo<span class="cstat-no" title="statement not covered" >rt async function mountDatab</span>aseTypes(app: App) {
2673
+ if (!app.__databaseTypeMap) {
2674
+ app.__databaseType<span class="cstat-no" title="statement not covered" >Map = {};</span>
2675
+ }<span class="cstat-no" title="statement not covered" ></span>
2676
+ <span class="cstat-no" title="statement not covered" > const dataSources = app?.dataSources;</span>
2677
+ co<span class="cstat-no" title="statement not covered" >nst dbTypeSet = new <span class="fstat-no" title="function not covered" >Se</span>t();</span>
2678
+ if (Array.isArray(dataSources)<span class="cstat-no" title="statement not covered" >) {</span>
2679
+ da<span class="cstat-no" title="statement not covered" >taSources.forEach((dataSource) =&gt; {</span>
2680
+ co<span class="cstat-no" title="statement not covered" >nst dataSourceSqlType = JSON.parse</span>(dataSource.dataSourceConfig?.devProperty?.value || '{}')?.type;
2681
+ if (dataSourceSqlType &amp;&amp; !app.__databaseTypeMap[dataSourceSqlType]) {
2682
+ dbTypeSet.add(dataSourceSqlType);
3643
2683
  }
3644
- });
3645
- }
3646
- const dbTypes = <span class="cstat-no" title="statement not covered" >[...dbTypeSet];</span>
3647
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(dbTypes) &amp;&amp; dbTypes.length) {</span>
3648
- const res: any = <span class="cstat-no" title="statement not covered" >await databaseTypes({</span>
2684
+ });<span class="cstat-no" title="statement not covered" ></span>
2685
+ <span class="cstat-no" title="statement not covered" > }</span>
2686
+ const dbTypes = [..<span class="cstat-no" title="statement not covered" >.dbTypeSet];</span>
2687
+ if (Array.isArray(dbTypes) &amp;&amp; dbTypes.length) {
2688
+ const res: any = await databaseTypes({
3649
2689
  query: {
3650
2690
  dbTypes: dbTypes.join(','),
3651
- },
3652
- });
3653
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(res)) {</span>
3654
- <span class="cstat-no" title="statement not covered" > res.forEach(<span class="fstat-no" title="function not covered" >(d</span>atabaseType: any) =&gt; {</span>
3655
- const { dbType, columnTypes } = <span class="cstat-no" title="statement not covered" >databaseType || {};</span>
3656
- const columnTypeMap: any = <span class="cstat-no" title="statement not covered" >{};</span>
3657
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(columnTypes)) {</span>
3658
- <span class="cstat-no" title="statement not covered" > columnTypes.forEach(<span class="fstat-no" title="function not covered" >(c</span>olumnType) =&gt; {</span>
3659
- const { naslType, dataBaseTypes } = <span class="cstat-no" title="statement not covered" >columnType;</span>
3660
- const dataBaseTypeMap: any = <span class="cstat-no" title="statement not covered" >{};</span>
3661
- let defaultDataBaseType;
3662
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(dataBaseTypes)) {</span>
3663
- <span class="cstat-no" title="statement not covered" > dataBaseTypes.forEach(<span class="fstat-no" title="function not covered" >(d</span>ataBaseType) =&gt; {</span>
3664
- const { type } = <span class="cstat-no" title="statement not covered" >dataBaseType || {};</span>
3665
- <span class="cstat-no" title="statement not covered" > if (type) {</span>
2691
+ <span class="cstat-no" title="statement not covered" > },</span>
2692
+ })<span class="cstat-no" title="statement not covered" >;<span class="fstat-no" title="function not covered" ></span></span>
2693
+ if (Array.isArray(res)) {<span class="cstat-no" title="statement not covered" ></span>
2694
+ res.forEach((databaseType: an<span class="cstat-no" title="statement not covered" >y) </span>=&gt; {
2695
+ <span class="cstat-no" title="statement not covered" > const { dbType, columnTypes } = databaseType || {};</span>
2696
+ co<span class="cstat-no" title="statement not covered" >nst columnTypeMap: a<span class="fstat-no" title="function not covered" >ny</span> = {};</span>
2697
+ if (Array.isArray(columnTypes)) {<span class="cstat-no" title="statement not covered" ></span>
2698
+ columnTypes.forEach((columnType<span class="cstat-no" title="statement not covered" >) =</span>&gt; {
2699
+ const { naslType, dataBaseTypes } = columnType;
2700
+ <span class="cstat-no" title="statement not covered" > const dataBaseTypeMap: any = {};</span>
2701
+ le<span class="cstat-no" title="statement not covered" >t defaultDataBaseType;<span class="fstat-no" title="function not covered" ></span></span>
2702
+ if (Array.isArray(dat<span class="cstat-no" title="statement not covered" >aBaseTypes)) {</span>
2703
+ da<span class="cstat-no" title="statement not covered" >taBaseTypes.forEach((dataBaseType) =&gt; {</span>
2704
+ co<span class="cstat-no" title="statement not covered" >nst { type } = dataBaseType || {};</span>
2705
+ if (type) {<span class="cstat-no" title="statement not covered" ></span>
3666
2706
  <span class="cstat-no" title="statement not covered" > dataBaseTypeMap[type] = dataBaseType;</span>
3667
- const { defaultType } = <span class="cstat-no" title="statement not covered" >dataBaseType;</span>
3668
- <span class="cstat-no" title="statement not covered" > if (defaultType) {</span>
3669
- <span class="cstat-no" title="statement not covered" > defaultDataBaseType = dataBaseType;</span>
2707
+ co<span class="cstat-no" title="statement not covered" >nst { defaultType } = dataBaseType;</span>
2708
+ if (defaultType) {
2709
+ defaultDataBaseType = dataBaseType;
3670
2710
  }
3671
2711
  }
3672
- });
2712
+ <span class="cstat-no" title="statement not covered" > });</span>
3673
2713
  }
3674
- <span class="cstat-no" title="statement not covered" > columnTypeMap[naslType] = {</span>
2714
+ columnTypeMap[naslType] = {
3675
2715
  dataBaseTypes,
3676
2716
  dataBaseTypeMap,
3677
2717
  defaultDataBaseType,
3678
2718
  };
3679
- });
2719
+ <span class="cstat-no" title="statement not covered" > });</span>
3680
2720
  }
3681
- <span class="cstat-no" title="statement not covered" > app.__databaseTypeMap[dbType] = columnTypeMap;</span>
2721
+ app.__databaseTypeMap[dbType] = columnTypeMap;
3682
2722
  });
3683
- }
3684
- }
3685
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(dataSources)) {</span>
3686
- <span class="cstat-no" title="statement not covered" > dataSources.forEach(<span class="fstat-no" title="function not covered" >(d</span>ataSource) =&gt; {</span>
3687
- <span class="cstat-no" title="statement not covered" > dataSource.__hasDatabaseConfig = !!(app.__databaseTypeMap?.[dataSource.dataSourceSqlType]);</span>
2723
+ <span class="cstat-no" title="statement not covered" > }</span>
2724
+ }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2725
+ if (<span class="cstat-no" title="statement not covered" >Array.isArray(dataSources)) {</span>
2726
+ dataSources.forEach((dataSource) =&gt; {
2727
+ dataSource.__hasDatabaseConfig = !!(app.__databaseTypeMap?.[dataSource.dataSourceSqlType]);
3688
2728
  });
3689
2729
  }
3690
2730
  }
3691
2731
  &nbsp;
3692
2732
  /**
3693
2733
  * 加载 app
3694
- * @returns app 对象
3695
- */
3696
- export function <span class="fstat-no" title="function not covered" >loadAppSync(</span>) {
3697
- const json = <span class="cstat-no" title="statement not covered" >fs.readJSONSync(config.storage.basePath);</span>
3698
- const app = <span class="cstat-no" title="statement not covered" >new App(json);</span>
3699
- <span class="cstat-no" title="statement not covered" > handleApp(app as ProxyApp);</span>
3700
- <span class="cstat-no" title="statement not covered" > return app;</span>
2734
+ * @returns app <span class="fstat-no" title="function not covered" >对象</span>
2735
+ */<span class="cstat-no" title="statement not covered" ></span>
2736
+ export functio<span class="cstat-no" title="statement not covered" >n loadAppSync(</span>) {
2737
+ <span class="cstat-no" title="statement not covered" > const json = fs.readJSONSync</span>(config.storage.basePath);
2738
+ <span class="cstat-no" title="statement not covered" > const app = </span>new App(json);
2739
+ handleApp(app as ProxyApp);
2740
+ return app;
3701
2741
  }
3702
2742
  &nbsp;</pre></td></tr></table></pre>
3703
2743
 
@@ -3706,7 +2746,7 @@ export function <span class="fstat-no" title="function not covered" >loadAppSync
3706
2746
  <div class='footer quiet pad2 space-top1 center small'>
3707
2747
  Code coverage generated by
3708
2748
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3709
- at 2023-10-27T11:50:55.546Z
2749
+ at 2023-10-18T11:36:07.885Z
3710
2750
  </div>
3711
2751
  <script src="../../../prettify.js"></script>
3712
2752
  <script>