@budibase/server 1.0.105-alpha.3 → 1.0.105-alpha.32

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 (310) hide show
  1. package/builder/assets/index.0572486a.js +1296 -0
  2. package/builder/assets/{index.ea3718aa.css → index.f602f4de.css} +2 -2
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +711 -1678
  5. package/coverage/coverage-final.json +30 -45
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +8 -3
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +9 -4
  8. package/coverage/lcov-report/api/controllers/auth.js.html +8 -3
  9. package/coverage/lcov-report/api/controllers/automation.js.html +8 -3
  10. package/coverage/lcov-report/api/controllers/backup.js.html +8 -3
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -3
  12. package/coverage/lcov-report/api/controllers/component.js.html +8 -3
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +11 -6
  14. package/coverage/lcov-report/api/controllers/dev.js.html +8 -3
  15. package/coverage/lcov-report/api/controllers/index.html +16 -26
  16. package/coverage/lcov-report/api/controllers/integration.js.html +8 -3
  17. package/coverage/lcov-report/api/controllers/layout.js.html +8 -3
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +8 -3
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +8 -3
  20. package/coverage/lcov-report/api/controllers/permission.js.html +8 -3
  21. package/coverage/lcov-report/api/controllers/query/index.html +16 -26
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +8 -3
  23. package/coverage/lcov-report/api/controllers/role.js.html +10 -5
  24. package/coverage/lcov-report/api/controllers/routing.js.html +9 -4
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +8 -3
  26. package/coverage/lcov-report/api/controllers/row/index.html +25 -35
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +32 -24
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +21 -16
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -19
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +33 -19
  31. package/coverage/lcov-report/api/controllers/screen.js.html +9 -4
  32. package/coverage/lcov-report/api/controllers/script.js.html +8 -3
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +55 -50
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +8 -3
  35. package/coverage/lcov-report/api/controllers/table/index.html +19 -44
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +20 -15
  37. package/coverage/lcov-report/api/controllers/templates.js.html +8 -3
  38. package/coverage/lcov-report/api/controllers/user.js.html +8 -3
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +8 -3
  40. package/coverage/lcov-report/api/controllers/view/index.html +8 -3
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +10 -5
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +8 -3
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +8 -3
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +10 -5
  45. package/coverage/lcov-report/api/index.html +18 -13
  46. package/coverage/lcov-report/api/index.js.html +28 -8
  47. package/coverage/lcov-report/api/routes/analytics.js.html +8 -3
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -3
  49. package/coverage/lcov-report/api/routes/auth.js.html +8 -3
  50. package/coverage/lcov-report/api/routes/automation.js.html +8 -3
  51. package/coverage/lcov-report/api/routes/backup.js.html +8 -3
  52. package/coverage/lcov-report/api/routes/cloud.js.html +8 -3
  53. package/coverage/lcov-report/api/routes/component.js.html +8 -3
  54. package/coverage/lcov-report/api/routes/datasource.js.html +8 -3
  55. package/coverage/lcov-report/api/routes/deploy.js.html +8 -3
  56. package/coverage/lcov-report/api/routes/dev.js.html +9 -4
  57. package/coverage/lcov-report/api/routes/index.html +13 -68
  58. package/coverage/lcov-report/api/routes/integration.js.html +8 -3
  59. package/coverage/lcov-report/api/routes/layout.js.html +8 -3
  60. package/coverage/lcov-report/api/routes/metadata.js.html +8 -3
  61. package/coverage/lcov-report/api/routes/migrations.js.html +8 -3
  62. package/coverage/lcov-report/api/routes/permission.js.html +8 -3
  63. package/coverage/lcov-report/api/routes/query.js.html +8 -3
  64. package/coverage/lcov-report/api/routes/role.js.html +8 -3
  65. package/coverage/lcov-report/api/routes/routing.js.html +8 -3
  66. package/coverage/lcov-report/api/routes/screen.js.html +8 -3
  67. package/coverage/lcov-report/api/routes/script.js.html +8 -3
  68. package/coverage/lcov-report/api/routes/table.js.html +8 -3
  69. package/coverage/lcov-report/api/routes/templates.js.html +8 -3
  70. package/coverage/lcov-report/api/routes/user.js.html +8 -3
  71. package/coverage/lcov-report/api/routes/utils/index.html +8 -3
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +8 -3
  73. package/coverage/lcov-report/api/routes/view.js.html +8 -3
  74. package/coverage/lcov-report/api/routes/webhook.js.html +8 -3
  75. package/coverage/lcov-report/automations/actions.js.html +21 -7
  76. package/coverage/lcov-report/automations/automationUtils.js.html +64 -23
  77. package/coverage/lcov-report/automations/bullboard.js.html +8 -3
  78. package/coverage/lcov-report/automations/index.html +27 -37
  79. package/coverage/lcov-report/automations/index.js.html +8 -3
  80. package/coverage/lcov-report/automations/steps/bash.js.html +8 -3
  81. package/coverage/lcov-report/automations/steps/delay.js.html +8 -3
  82. package/coverage/lcov-report/automations/steps/discord.js.html +8 -3
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +8 -3
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +8 -3
  85. package/coverage/lcov-report/automations/steps/filter.js.html +8 -3
  86. package/coverage/lcov-report/automations/steps/index.html +31 -41
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +8 -3
  88. package/coverage/lcov-report/{api/routes/static.js.html → automations/steps/loop.js.html} +70 -80
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +9 -4
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +9 -4
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +8 -3
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +8 -3
  93. package/coverage/lcov-report/automations/steps/slack.js.html +8 -3
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +8 -3
  95. package/coverage/lcov-report/automations/steps/utils.js.html +14 -9
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +8 -3
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +8 -3
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +8 -3
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +8 -3
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -3
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +8 -3
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +8 -3
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +8 -3
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +8 -3
  105. package/coverage/lcov-report/automations/triggers.js.html +16 -11
  106. package/coverage/lcov-report/block-navigation.js +8 -0
  107. package/coverage/lcov-report/constants/index.html +12 -7
  108. package/coverage/lcov-report/constants/index.js.html +54 -31
  109. package/coverage/lcov-report/constants/layouts.js.html +8 -3
  110. package/coverage/lcov-report/constants/screens.js.html +8 -3
  111. package/coverage/lcov-report/db/client.js.html +26 -21
  112. package/coverage/lcov-report/db/inMemoryView.js.html +8 -3
  113. package/coverage/lcov-report/db/index.html +8 -3
  114. package/coverage/lcov-report/db/index.js.html +10 -5
  115. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +20 -15
  116. package/coverage/lcov-report/db/linkedRows/index.html +8 -3
  117. package/coverage/lcov-report/db/linkedRows/index.js.html +22 -17
  118. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +12 -7
  119. package/coverage/lcov-report/db/newid.js.html +11 -6
  120. package/coverage/lcov-report/db/utils.js.html +83 -78
  121. package/coverage/lcov-report/events/AutomationEmitter.js.html +14 -9
  122. package/coverage/lcov-report/events/index.html +8 -3
  123. package/coverage/lcov-report/events/index.js.html +9 -4
  124. package/coverage/lcov-report/events/utils.js.html +18 -13
  125. package/coverage/lcov-report/index.html +124 -119
  126. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +8 -3
  127. package/coverage/lcov-report/integrations/tests/index.html +8 -3
  128. package/coverage/lcov-report/middleware/appInfo.js.html +8 -3
  129. package/coverage/lcov-report/middleware/builder.js.html +8 -3
  130. package/coverage/lcov-report/middleware/currentapp.js.html +65 -15
  131. package/coverage/lcov-report/middleware/index.html +25 -50
  132. package/coverage/lcov-report/middleware/joi-validator.js.html +9 -4
  133. package/coverage/lcov-report/middleware/publicApi.js.html +8 -3
  134. package/coverage/lcov-report/middleware/resourceId.js.html +8 -3
  135. package/coverage/lcov-report/middleware/selfhost.js.html +9 -4
  136. package/coverage/lcov-report/middleware/utils.js.html +8 -3
  137. package/coverage/lcov-report/sorter.js +26 -0
  138. package/coverage/lcov-report/threads/automation.js.html +581 -90
  139. package/coverage/lcov-report/threads/index.html +27 -37
  140. package/coverage/lcov-report/threads/query.js.html +10 -5
  141. package/coverage/lcov-report/threads/utils.js.html +11 -6
  142. package/coverage/lcov-report/utilities/bcrypt.js.html +8 -3
  143. package/coverage/lcov-report/utilities/budibaseDir.js.html +8 -3
  144. package/coverage/lcov-report/utilities/centralPath.js.html +8 -3
  145. package/coverage/lcov-report/utilities/csvParser.js.html +10 -5
  146. package/coverage/lcov-report/utilities/global.js.html +9 -4
  147. package/coverage/lcov-report/utilities/index.html +8 -3
  148. package/coverage/lcov-report/utilities/index.js.html +11 -6
  149. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +32 -9
  150. package/coverage/lcov-report/utilities/queue/index.html +12 -7
  151. package/coverage/lcov-report/utilities/routing/index.html +8 -3
  152. package/coverage/lcov-report/utilities/routing/index.js.html +8 -3
  153. package/coverage/lcov-report/utilities/rowProcessor/index.html +8 -3
  154. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +46 -41
  155. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +18 -13
  156. package/coverage/lcov-report/utilities/scriptRunner.js.html +8 -3
  157. package/coverage/lcov-report/utilities/security.js.html +9 -4
  158. package/coverage/lcov-report/utilities/statusCodes.js.html +8 -3
  159. package/coverage/lcov-report/utilities/usageQuota/index.html +24 -34
  160. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +45 -40
  161. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +8 -3
  162. package/coverage/lcov-report/utilities/users.js.html +8 -3
  163. package/coverage/lcov-report/utilities/workerRequests.js.html +9 -4
  164. package/coverage/lcov.info +1141 -2837
  165. package/dist/api/controllers/application.js +138 -70
  166. package/dist/api/controllers/deploy/index.js +64 -35
  167. package/dist/api/controllers/public/applications.js +29 -9
  168. package/dist/api/controllers/public/queries.js +27 -7
  169. package/dist/api/controllers/public/rows.js +32 -12
  170. package/dist/api/controllers/public/tables.js +2 -2
  171. package/dist/api/controllers/public/users.js +8 -8
  172. package/dist/api/controllers/public/utils.js +1 -1
  173. package/dist/api/controllers/query/import/index.js +3 -3
  174. package/dist/api/controllers/query/index.js +57 -44
  175. package/dist/api/controllers/row/ExternalRequest.js +27 -27
  176. package/dist/api/controllers/row/index.js +83 -60
  177. package/dist/api/controllers/row/internal.js +2 -1
  178. package/dist/api/controllers/row/utils.js +2 -1
  179. package/dist/api/controllers/static/templates/BudibaseApp.svelte +3 -0
  180. package/dist/api/controllers/table/bulkFormula.js +2 -1
  181. package/dist/api/controllers/table/internal.js +40 -34
  182. package/dist/api/controllers/table/utils.js +271 -229
  183. package/dist/api/index.js +5 -0
  184. package/dist/api/routes/application.js +39 -13
  185. package/dist/api/routes/index.js +61 -56
  186. package/dist/api/routes/public/index.js +6 -9
  187. package/dist/api/routes/public/queries.js +1 -1
  188. package/dist/api/routes/public/rows.js +1 -1
  189. package/dist/api/routes/public/tables.js +3 -3
  190. package/dist/api/routes/public/users.js +1 -1
  191. package/dist/api/routes/row.js +43 -17
  192. package/dist/api/routes/static.js +40 -13
  193. package/dist/api/routes/tests/utilities/TestFunctions.js +62 -26
  194. package/dist/app.js +11 -4
  195. package/dist/automations/actions.js +3 -0
  196. package/dist/automations/automationUtils.js +10 -0
  197. package/dist/automations/steps/createRow.js +12 -12
  198. package/dist/automations/steps/deleteRow.js +13 -16
  199. package/dist/automations/steps/loop.js +51 -0
  200. package/dist/automations/tests/utilities/index.js +0 -2
  201. package/dist/automations/utils.js +187 -132
  202. package/dist/constants/index.js +5 -0
  203. package/dist/environment.js +1 -2
  204. package/dist/integrations/base/sql.js +2 -2
  205. package/dist/integrations/base/sqlTable.js +2 -2
  206. package/dist/integrations/googlesheets.js +1 -1
  207. package/dist/integrations/microsoftSqlServer.js +8 -8
  208. package/dist/integrations/mysql.js +9 -9
  209. package/dist/integrations/oracle.js +7 -7
  210. package/dist/integrations/postgres.js +7 -7
  211. package/dist/integrations/rest.js +1 -1
  212. package/dist/middleware/authorized.js +51 -51
  213. package/dist/middleware/currentapp.js +15 -1
  214. package/dist/migrations/functions/appUrls.js +1 -1
  215. package/dist/migrations/functions/developerQuota.js +49 -0
  216. package/dist/migrations/functions/publishedAppsQuota.js +47 -0
  217. package/dist/migrations/functions/quotas1.js +6 -2
  218. package/dist/migrations/functions/usageQuotas/index.js +0 -4
  219. package/dist/migrations/functions/usageQuotas/syncApps.js +4 -7
  220. package/dist/migrations/functions/usageQuotas/syncDevelopers.js +24 -0
  221. package/dist/migrations/functions/usageQuotas/syncPublishedApps.js +26 -0
  222. package/dist/migrations/functions/usageQuotas/syncRows.js +5 -8
  223. package/dist/migrations/index.js +17 -1
  224. package/dist/package.json +11 -8
  225. package/dist/threads/automation.js +149 -27
  226. package/dist/threads/index.js +35 -8
  227. package/dist/tsconfig.build.tsbuildinfo +1 -0
  228. package/dist/utilities/queue/inMemoryQueue.js +6 -1
  229. package/nodemon.json +1 -1
  230. package/package.json +12 -9
  231. package/scripts/dev/manage.js +2 -0
  232. package/src/api/controllers/{application.js → application.ts} +103 -44
  233. package/src/api/controllers/deploy/{index.js → index.ts} +45 -28
  234. package/src/api/controllers/public/applications.ts +2 -2
  235. package/src/api/controllers/public/queries.ts +1 -1
  236. package/src/api/controllers/public/rows.ts +1 -1
  237. package/src/api/controllers/query/{index.js → index.ts} +51 -48
  238. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  239. package/src/api/controllers/row/{index.js → index.ts} +24 -17
  240. package/src/api/controllers/row/internal.js +2 -1
  241. package/src/api/controllers/row/utils.js +4 -1
  242. package/src/api/controllers/static/templates/BudibaseApp.svelte +3 -0
  243. package/src/api/controllers/table/bulkFormula.js +1 -1
  244. package/src/api/controllers/table/{internal.js → internal.ts} +27 -24
  245. package/src/api/controllers/table/{utils.js → utils.ts} +86 -69
  246. package/src/api/index.js +5 -0
  247. package/src/api/routes/{application.js → application.ts} +8 -14
  248. package/src/api/routes/index.ts +60 -0
  249. package/src/api/routes/public/index.ts +1 -4
  250. package/src/api/routes/{row.js → row.ts} +7 -15
  251. package/src/api/routes/{static.js → static.ts} +11 -11
  252. package/src/api/routes/tests/utilities/{TestFunctions.js → TestFunctions.ts} +42 -25
  253. package/src/app.ts +1 -2
  254. package/src/automations/actions.js +3 -0
  255. package/src/automations/automationUtils.js +12 -0
  256. package/src/automations/steps/{createRow.js → createRow.ts} +9 -15
  257. package/src/automations/steps/{deleteRow.js → deleteRow.ts} +10 -16
  258. package/src/automations/steps/loop.js +50 -0
  259. package/src/automations/tests/automation.spec.js +0 -1
  260. package/src/automations/tests/{createRow.spec.js → createRow.spec.ts} +4 -15
  261. package/src/automations/tests/{deleteRow.spec.js → deleteRow.spec.ts} +3 -5
  262. package/src/automations/tests/utilities/index.js +0 -2
  263. package/src/automations/{utils.js → utils.ts} +39 -27
  264. package/src/constants/index.js +6 -0
  265. package/src/environment.js +1 -2
  266. package/src/middleware/{authorized.js → authorized.ts} +20 -14
  267. package/src/middleware/currentapp.js +16 -1
  268. package/src/migrations/functions/developerQuota.ts +15 -0
  269. package/src/migrations/functions/publishedAppsQuota.ts +13 -0
  270. package/src/migrations/functions/tests/quotas1.spec.js +0 -2
  271. package/src/migrations/functions/usageQuotas/index.ts +0 -5
  272. package/src/migrations/functions/usageQuotas/syncApps.ts +3 -6
  273. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +19 -0
  274. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +21 -0
  275. package/src/migrations/functions/usageQuotas/syncRows.ts +3 -6
  276. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +32 -0
  277. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +38 -0
  278. package/src/migrations/index.ts +13 -1
  279. package/src/module.d.ts +4 -0
  280. package/src/threads/automation.js +196 -34
  281. package/src/threads/{index.js → index.ts} +14 -12
  282. package/src/utilities/queue/inMemoryQueue.js +7 -1
  283. package/tsconfig.build.json +10 -0
  284. package/tsconfig.json +2 -2
  285. package/builder/assets/index.5778ea01.js +0 -1291
  286. package/coverage/lcov-report/api/controllers/application.js.html +0 -1430
  287. package/coverage/lcov-report/api/controllers/query/index.js.html +0 -713
  288. package/coverage/lcov-report/api/controllers/row/index.js.html +0 -524
  289. package/coverage/lcov-report/api/controllers/table/internal.js.html +0 -548
  290. package/coverage/lcov-report/api/controllers/table/utils.js.html +0 -1331
  291. package/coverage/lcov-report/api/routes/application.js.html +0 -179
  292. package/coverage/lcov-report/api/routes/index.js.html +0 -266
  293. package/coverage/lcov-report/api/routes/row.js.html +0 -908
  294. package/coverage/lcov-report/automations/steps/createRow.js.html +0 -380
  295. package/coverage/lcov-report/automations/steps/deleteRow.js.html +0 -347
  296. package/coverage/lcov-report/automations/utils.js.html +0 -662
  297. package/coverage/lcov-report/middleware/authorized.js.html +0 -458
  298. package/coverage/lcov-report/middleware/usageQuota.js.html +0 -572
  299. package/coverage/lcov-report/threads/index.js.html +0 -278
  300. package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -359
  301. package/dist/middleware/usageQuota.js +0 -154
  302. package/dist/tsconfig.tsbuildinfo +0 -1
  303. package/dist/utilities/usageQuota/index.js +0 -86
  304. package/src/api/routes/index.js +0 -62
  305. package/src/middleware/tests/usageQuota.spec.js +0 -134
  306. package/src/middleware/usageQuota.js +0 -164
  307. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +0 -37
  308. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +0 -43
  309. package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
  310. package/src/utilities/usageQuota/index.js +0 -93
@@ -1,662 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for automations/utils.js</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../prettify.css" />
9
- <link rel="stylesheet" href="../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">automations</a> utils.js</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">79.74% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>63/79</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">81.57% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>31/38</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">90% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>9/10</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">79.74% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>63/79</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- </div>
58
- <div class='status-line medium'></div>
59
- <pre><table class="coverage">
60
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
- <a name='L2'></a><a href='#L2'>2</a>
62
- <a name='L3'></a><a href='#L3'>3</a>
63
- <a name='L4'></a><a href='#L4'>4</a>
64
- <a name='L5'></a><a href='#L5'>5</a>
65
- <a name='L6'></a><a href='#L6'>6</a>
66
- <a name='L7'></a><a href='#L7'>7</a>
67
- <a name='L8'></a><a href='#L8'>8</a>
68
- <a name='L9'></a><a href='#L9'>9</a>
69
- <a name='L10'></a><a href='#L10'>10</a>
70
- <a name='L11'></a><a href='#L11'>11</a>
71
- <a name='L12'></a><a href='#L12'>12</a>
72
- <a name='L13'></a><a href='#L13'>13</a>
73
- <a name='L14'></a><a href='#L14'>14</a>
74
- <a name='L15'></a><a href='#L15'>15</a>
75
- <a name='L16'></a><a href='#L16'>16</a>
76
- <a name='L17'></a><a href='#L17'>17</a>
77
- <a name='L18'></a><a href='#L18'>18</a>
78
- <a name='L19'></a><a href='#L19'>19</a>
79
- <a name='L20'></a><a href='#L20'>20</a>
80
- <a name='L21'></a><a href='#L21'>21</a>
81
- <a name='L22'></a><a href='#L22'>22</a>
82
- <a name='L23'></a><a href='#L23'>23</a>
83
- <a name='L24'></a><a href='#L24'>24</a>
84
- <a name='L25'></a><a href='#L25'>25</a>
85
- <a name='L26'></a><a href='#L26'>26</a>
86
- <a name='L27'></a><a href='#L27'>27</a>
87
- <a name='L28'></a><a href='#L28'>28</a>
88
- <a name='L29'></a><a href='#L29'>29</a>
89
- <a name='L30'></a><a href='#L30'>30</a>
90
- <a name='L31'></a><a href='#L31'>31</a>
91
- <a name='L32'></a><a href='#L32'>32</a>
92
- <a name='L33'></a><a href='#L33'>33</a>
93
- <a name='L34'></a><a href='#L34'>34</a>
94
- <a name='L35'></a><a href='#L35'>35</a>
95
- <a name='L36'></a><a href='#L36'>36</a>
96
- <a name='L37'></a><a href='#L37'>37</a>
97
- <a name='L38'></a><a href='#L38'>38</a>
98
- <a name='L39'></a><a href='#L39'>39</a>
99
- <a name='L40'></a><a href='#L40'>40</a>
100
- <a name='L41'></a><a href='#L41'>41</a>
101
- <a name='L42'></a><a href='#L42'>42</a>
102
- <a name='L43'></a><a href='#L43'>43</a>
103
- <a name='L44'></a><a href='#L44'>44</a>
104
- <a name='L45'></a><a href='#L45'>45</a>
105
- <a name='L46'></a><a href='#L46'>46</a>
106
- <a name='L47'></a><a href='#L47'>47</a>
107
- <a name='L48'></a><a href='#L48'>48</a>
108
- <a name='L49'></a><a href='#L49'>49</a>
109
- <a name='L50'></a><a href='#L50'>50</a>
110
- <a name='L51'></a><a href='#L51'>51</a>
111
- <a name='L52'></a><a href='#L52'>52</a>
112
- <a name='L53'></a><a href='#L53'>53</a>
113
- <a name='L54'></a><a href='#L54'>54</a>
114
- <a name='L55'></a><a href='#L55'>55</a>
115
- <a name='L56'></a><a href='#L56'>56</a>
116
- <a name='L57'></a><a href='#L57'>57</a>
117
- <a name='L58'></a><a href='#L58'>58</a>
118
- <a name='L59'></a><a href='#L59'>59</a>
119
- <a name='L60'></a><a href='#L60'>60</a>
120
- <a name='L61'></a><a href='#L61'>61</a>
121
- <a name='L62'></a><a href='#L62'>62</a>
122
- <a name='L63'></a><a href='#L63'>63</a>
123
- <a name='L64'></a><a href='#L64'>64</a>
124
- <a name='L65'></a><a href='#L65'>65</a>
125
- <a name='L66'></a><a href='#L66'>66</a>
126
- <a name='L67'></a><a href='#L67'>67</a>
127
- <a name='L68'></a><a href='#L68'>68</a>
128
- <a name='L69'></a><a href='#L69'>69</a>
129
- <a name='L70'></a><a href='#L70'>70</a>
130
- <a name='L71'></a><a href='#L71'>71</a>
131
- <a name='L72'></a><a href='#L72'>72</a>
132
- <a name='L73'></a><a href='#L73'>73</a>
133
- <a name='L74'></a><a href='#L74'>74</a>
134
- <a name='L75'></a><a href='#L75'>75</a>
135
- <a name='L76'></a><a href='#L76'>76</a>
136
- <a name='L77'></a><a href='#L77'>77</a>
137
- <a name='L78'></a><a href='#L78'>78</a>
138
- <a name='L79'></a><a href='#L79'>79</a>
139
- <a name='L80'></a><a href='#L80'>80</a>
140
- <a name='L81'></a><a href='#L81'>81</a>
141
- <a name='L82'></a><a href='#L82'>82</a>
142
- <a name='L83'></a><a href='#L83'>83</a>
143
- <a name='L84'></a><a href='#L84'>84</a>
144
- <a name='L85'></a><a href='#L85'>85</a>
145
- <a name='L86'></a><a href='#L86'>86</a>
146
- <a name='L87'></a><a href='#L87'>87</a>
147
- <a name='L88'></a><a href='#L88'>88</a>
148
- <a name='L89'></a><a href='#L89'>89</a>
149
- <a name='L90'></a><a href='#L90'>90</a>
150
- <a name='L91'></a><a href='#L91'>91</a>
151
- <a name='L92'></a><a href='#L92'>92</a>
152
- <a name='L93'></a><a href='#L93'>93</a>
153
- <a name='L94'></a><a href='#L94'>94</a>
154
- <a name='L95'></a><a href='#L95'>95</a>
155
- <a name='L96'></a><a href='#L96'>96</a>
156
- <a name='L97'></a><a href='#L97'>97</a>
157
- <a name='L98'></a><a href='#L98'>98</a>
158
- <a name='L99'></a><a href='#L99'>99</a>
159
- <a name='L100'></a><a href='#L100'>100</a>
160
- <a name='L101'></a><a href='#L101'>101</a>
161
- <a name='L102'></a><a href='#L102'>102</a>
162
- <a name='L103'></a><a href='#L103'>103</a>
163
- <a name='L104'></a><a href='#L104'>104</a>
164
- <a name='L105'></a><a href='#L105'>105</a>
165
- <a name='L106'></a><a href='#L106'>106</a>
166
- <a name='L107'></a><a href='#L107'>107</a>
167
- <a name='L108'></a><a href='#L108'>108</a>
168
- <a name='L109'></a><a href='#L109'>109</a>
169
- <a name='L110'></a><a href='#L110'>110</a>
170
- <a name='L111'></a><a href='#L111'>111</a>
171
- <a name='L112'></a><a href='#L112'>112</a>
172
- <a name='L113'></a><a href='#L113'>113</a>
173
- <a name='L114'></a><a href='#L114'>114</a>
174
- <a name='L115'></a><a href='#L115'>115</a>
175
- <a name='L116'></a><a href='#L116'>116</a>
176
- <a name='L117'></a><a href='#L117'>117</a>
177
- <a name='L118'></a><a href='#L118'>118</a>
178
- <a name='L119'></a><a href='#L119'>119</a>
179
- <a name='L120'></a><a href='#L120'>120</a>
180
- <a name='L121'></a><a href='#L121'>121</a>
181
- <a name='L122'></a><a href='#L122'>122</a>
182
- <a name='L123'></a><a href='#L123'>123</a>
183
- <a name='L124'></a><a href='#L124'>124</a>
184
- <a name='L125'></a><a href='#L125'>125</a>
185
- <a name='L126'></a><a href='#L126'>126</a>
186
- <a name='L127'></a><a href='#L127'>127</a>
187
- <a name='L128'></a><a href='#L128'>128</a>
188
- <a name='L129'></a><a href='#L129'>129</a>
189
- <a name='L130'></a><a href='#L130'>130</a>
190
- <a name='L131'></a><a href='#L131'>131</a>
191
- <a name='L132'></a><a href='#L132'>132</a>
192
- <a name='L133'></a><a href='#L133'>133</a>
193
- <a name='L134'></a><a href='#L134'>134</a>
194
- <a name='L135'></a><a href='#L135'>135</a>
195
- <a name='L136'></a><a href='#L136'>136</a>
196
- <a name='L137'></a><a href='#L137'>137</a>
197
- <a name='L138'></a><a href='#L138'>138</a>
198
- <a name='L139'></a><a href='#L139'>139</a>
199
- <a name='L140'></a><a href='#L140'>140</a>
200
- <a name='L141'></a><a href='#L141'>141</a>
201
- <a name='L142'></a><a href='#L142'>142</a>
202
- <a name='L143'></a><a href='#L143'>143</a>
203
- <a name='L144'></a><a href='#L144'>144</a>
204
- <a name='L145'></a><a href='#L145'>145</a>
205
- <a name='L146'></a><a href='#L146'>146</a>
206
- <a name='L147'></a><a href='#L147'>147</a>
207
- <a name='L148'></a><a href='#L148'>148</a>
208
- <a name='L149'></a><a href='#L149'>149</a>
209
- <a name='L150'></a><a href='#L150'>150</a>
210
- <a name='L151'></a><a href='#L151'>151</a>
211
- <a name='L152'></a><a href='#L152'>152</a>
212
- <a name='L153'></a><a href='#L153'>153</a>
213
- <a name='L154'></a><a href='#L154'>154</a>
214
- <a name='L155'></a><a href='#L155'>155</a>
215
- <a name='L156'></a><a href='#L156'>156</a>
216
- <a name='L157'></a><a href='#L157'>157</a>
217
- <a name='L158'></a><a href='#L158'>158</a>
218
- <a name='L159'></a><a href='#L159'>159</a>
219
- <a name='L160'></a><a href='#L160'>160</a>
220
- <a name='L161'></a><a href='#L161'>161</a>
221
- <a name='L162'></a><a href='#L162'>162</a>
222
- <a name='L163'></a><a href='#L163'>163</a>
223
- <a name='L164'></a><a href='#L164'>164</a>
224
- <a name='L165'></a><a href='#L165'>165</a>
225
- <a name='L166'></a><a href='#L166'>166</a>
226
- <a name='L167'></a><a href='#L167'>167</a>
227
- <a name='L168'></a><a href='#L168'>168</a>
228
- <a name='L169'></a><a href='#L169'>169</a>
229
- <a name='L170'></a><a href='#L170'>170</a>
230
- <a name='L171'></a><a href='#L171'>171</a>
231
- <a name='L172'></a><a href='#L172'>172</a>
232
- <a name='L173'></a><a href='#L173'>173</a>
233
- <a name='L174'></a><a href='#L174'>174</a>
234
- <a name='L175'></a><a href='#L175'>175</a>
235
- <a name='L176'></a><a href='#L176'>176</a>
236
- <a name='L177'></a><a href='#L177'>177</a>
237
- <a name='L178'></a><a href='#L178'>178</a>
238
- <a name='L179'></a><a href='#L179'>179</a>
239
- <a name='L180'></a><a href='#L180'>180</a>
240
- <a name='L181'></a><a href='#L181'>181</a>
241
- <a name='L182'></a><a href='#L182'>182</a>
242
- <a name='L183'></a><a href='#L183'>183</a>
243
- <a name='L184'></a><a href='#L184'>184</a>
244
- <a name='L185'></a><a href='#L185'>185</a>
245
- <a name='L186'></a><a href='#L186'>186</a>
246
- <a name='L187'></a><a href='#L187'>187</a>
247
- <a name='L188'></a><a href='#L188'>188</a>
248
- <a name='L189'></a><a href='#L189'>189</a>
249
- <a name='L190'></a><a href='#L190'>190</a>
250
- <a name='L191'></a><a href='#L191'>191</a>
251
- <a name='L192'></a><a href='#L192'>192</a>
252
- <a name='L193'></a><a href='#L193'>193</a>
253
- <a name='L194'></a><a href='#L194'>194</a>
254
- <a name='L195'></a><a href='#L195'>195</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">39x</span>
255
- <span class="cline-any cline-yes">39x</span>
256
- <span class="cline-any cline-yes">39x</span>
257
- <span class="cline-any cline-yes">39x</span>
258
- <span class="cline-any cline-yes">39x</span>
259
- <span class="cline-any cline-yes">39x</span>
260
- <span class="cline-any cline-yes">39x</span>
261
- <span class="cline-any cline-yes">39x</span>
262
- <span class="cline-any cline-yes">39x</span>
263
- <span class="cline-any cline-yes">39x</span>
264
- <span class="cline-any cline-yes">39x</span>
265
- <span class="cline-any cline-neutral">&nbsp;</span>
266
- <span class="cline-any cline-yes">39x</span>
267
- <span class="cline-any cline-yes">39x</span>
268
- <span class="cline-any cline-yes">39x</span>
269
- <span class="cline-any cline-neutral">&nbsp;</span>
270
- <span class="cline-any cline-yes">39x</span>
271
- <span class="cline-any cline-yes">10x</span>
272
- <span class="cline-any cline-neutral">&nbsp;</span>
273
- <span class="cline-any cline-yes">10x</span>
274
- <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-yes">10x</span>
277
- <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-no">&nbsp;</span>
279
- <span class="cline-any cline-no">&nbsp;</span>
280
- <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-no">&nbsp;</span>
283
- <span class="cline-any cline-no">&nbsp;</span>
284
- <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-neutral">&nbsp;</span>
286
- <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">39x</span>
288
- <span class="cline-any cline-yes">2x</span>
289
- <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-yes">2x</span>
293
- <span class="cline-any cline-no">&nbsp;</span>
294
- <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">2x</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-yes">2x</span>
300
- <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-yes">39x</span>
305
- <span class="cline-any cline-yes">78x</span>
306
- <span class="cline-any cline-yes">78x</span>
307
- <span class="cline-any cline-yes">858x</span>
308
- <span class="cline-any cline-yes">39x</span>
309
- <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-yes">78x</span>
312
- <span class="cline-any cline-neutral">&nbsp;</span>
313
- <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-neutral">&nbsp;</span>
315
- <span class="cline-any cline-yes">39x</span>
316
- <span class="cline-any cline-yes">204x</span>
317
- <span class="cline-any cline-yes">204x</span>
318
- <span class="cline-any cline-yes">204x</span>
319
- <span class="cline-any cline-no">&nbsp;</span>
320
- <span class="cline-any cline-no">&nbsp;</span>
321
- <span class="cline-any cline-no">&nbsp;</span>
322
- <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-yes">204x</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-neutral">&nbsp;</span>
330
- <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-yes">39x</span>
333
- <span class="cline-any cline-yes">1x</span>
334
- <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-yes">1x</span>
336
- <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-neutral">&nbsp;</span>
338
- <span class="cline-any cline-neutral">&nbsp;</span>
339
- <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">1x</span>
343
- <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-no">&nbsp;</span>
345
- <span class="cline-any cline-no">&nbsp;</span>
346
- <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-neutral">&nbsp;</span>
350
- <span class="cline-any cline-neutral">&nbsp;</span>
351
- <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-no">&nbsp;</span>
354
- <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-no">&nbsp;</span>
358
- <span class="cline-any cline-no">&nbsp;</span>
359
- <span class="cline-any cline-no">&nbsp;</span>
360
- <span class="cline-any cline-no">&nbsp;</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">1x</span>
363
- <span class="cline-any cline-neutral">&nbsp;</span>
364
- <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-neutral">&nbsp;</span>
367
- <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-neutral">&nbsp;</span>
372
- <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-yes">39x</span>
374
- <span class="cline-any cline-yes">23x</span>
375
- <span class="cline-any cline-yes">23x</span>
376
- <span class="cline-any cline-yes">23x</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-yes">23x</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">70x</span>
381
- <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-neutral">&nbsp;</span>
384
- <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-yes">23x</span>
388
- <span class="cline-any cline-neutral">&nbsp;</span>
389
- <span class="cline-any cline-neutral">&nbsp;</span>
390
- <span class="cline-any cline-neutral">&nbsp;</span>
391
- <span class="cline-any cline-neutral">&nbsp;</span>
392
- <span class="cline-any cline-yes">1x</span>
393
- <span class="cline-any cline-yes">1x</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-yes">1x</span>
396
- <span class="cline-any cline-yes">1x</span>
397
- <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-neutral">&nbsp;</span>
399
- <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-neutral">&nbsp;</span>
401
- <span class="cline-any cline-yes">1x</span>
402
- <span class="cline-any cline-yes">1x</span>
403
- <span class="cline-any cline-yes">1x</span>
404
- <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-yes">1x</span>
406
- <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-neutral">&nbsp;</span>
408
- <span class="cline-any cline-neutral">&nbsp;</span>
409
- <span class="cline-any cline-neutral">&nbsp;</span>
410
- <span class="cline-any cline-neutral">&nbsp;</span>
411
- <span class="cline-any cline-yes">23x</span>
412
- <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-neutral">&nbsp;</span>
414
- <span class="cline-any cline-neutral">&nbsp;</span>
415
- <span class="cline-any cline-yes">1x</span>
416
- <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-neutral">&nbsp;</span>
420
- <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-yes">1x</span>
426
- <span class="cline-any cline-yes">1x</span>
427
- <span class="cline-any cline-yes">1x</span>
428
- <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-yes">1x</span>
432
- <span class="cline-any cline-yes">1x</span>
433
- <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-neutral">&nbsp;</span>
437
- <span class="cline-any cline-yes">23x</span>
438
- <span class="cline-any cline-neutral">&nbsp;</span>
439
- <span class="cline-any cline-neutral">&nbsp;</span>
440
- <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-neutral">&nbsp;</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-yes">39x</span>
446
- <span class="cline-any cline-no">&nbsp;</span>
447
- <span class="cline-any cline-neutral">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { Thread, ThreadType } = require("../threads")
449
- const { definitions } = require("./triggerInfo")
450
- const webhooks = require("../api/controllers/webhook")
451
- const CouchDB = require("../db")
452
- const { queue } = require("./bullboard")
453
- const newid = require("../db/newid")
454
- const { updateEntityMetadata } = require("../utilities")
455
- const { MetadataTypes, WebhookType } = require("../constants")
456
- const { getProdAppID } = require("@budibase/backend-core/db")
457
- const { cloneDeep } = require("lodash/fp")
458
- const { getAppDB, getAppId } = require("@budibase/backend-core/context")
459
- &nbsp;
460
- const WH_STEP_ID = definitions.WEBHOOK.stepId
461
- const CRON_STEP_ID = definitions.CRON.stepId
462
- const Runner = new Thread(ThreadType.AUTOMATION)
463
- &nbsp;
464
- exports.processEvent = async job =&gt; {
465
- try {
466
- // need to actually await these so that an error can be captured properly
467
- console.log(
468
- `${job.data.automation.appId} automation ${job.data.automation._id} running`
469
- )
470
- return await Runner.run(job)
471
- } catch (err) {
472
- const errJson = <span class="cstat-no" title="statement not covered" >JSON.stringify(err)</span>
473
- <span class="cstat-no" title="statement not covered" > console.error(</span>
474
- `${job.data.automation.appId} automation ${job.data.automation._id} was unable to run - ${errJson}`
475
- )
476
- <span class="cstat-no" title="statement not covered" > console.trace(err)</span>
477
- <span class="cstat-no" title="statement not covered" > return { err }</span>
478
- }
479
- }
480
- &nbsp;
481
- exports.updateTestHistory = async (appId, automation, history) =&gt; {
482
- return updateEntityMetadata(
483
- MetadataTypes.AUTOMATION_TEST_HISTORY,
484
- automation._id,
485
- metadata =&gt; {
486
- <span class="missing-if-branch" title="if path not taken" >I</span>if (metadata &amp;&amp; Array.isArray(metadata.history)) {
487
- <span class="cstat-no" title="statement not covered" > metadata.history.push(history)</span>
488
- } else {
489
- metadata = {
490
- history: [history],
491
- }
492
- }
493
- return metadata
494
- }
495
- )
496
- }
497
- &nbsp;
498
- exports.removeDeprecated = definitions =&gt; {
499
- const base = cloneDeep(definitions)
500
- for (let key of Object.keys(base)) {
501
- if (base[key].deprecated) {
502
- delete base[key]
503
- }
504
- }
505
- return base
506
- }
507
- &nbsp;
508
- // end the repetition and the job itself
509
- exports.disableAllCrons = async appId =&gt; {
510
- const promises = []
511
- const jobs = await queue.getRepeatableJobs()
512
- for (let job of jobs) {
513
- <span class="cstat-no" title="statement not covered" > if (job.key.includes(`${appId}_cron`)) {</span>
514
- <span class="cstat-no" title="statement not covered" > promises.push(queue.removeRepeatableByKey(job.key))</span>
515
- <span class="cstat-no" title="statement not covered" > promises.push(queue.removeJobs(job.id))</span>
516
- }
517
- }
518
- return Promise.all(promises)
519
- }
520
- &nbsp;
521
- /**
522
- * This function handles checking of any cron jobs that need to be enabled/updated.
523
- * @param {string} appId The ID of the app in which we are checking for webhooks
524
- * @param {object|undefined} automation The automation object to be updated.
525
- */
526
- exports.enableCronTrigger = async (appId, automation) =&gt; {
527
- const trigger = automation ? automation.definition.trigger : <span class="branch-1 cbranch-no" title="branch not covered" >null</span>
528
- function isCronTrigger(auto) {
529
- return (
530
- auto &amp;&amp;
531
- auto.definition.trigger &amp;&amp;
532
- auto.definition.trigger.stepId === CRON_STEP_ID
533
- )
534
- }
535
- // need to create cron job
536
- <span class="missing-if-branch" title="if path not taken" >I</span>if (isCronTrigger(automation)) {
537
- // make a job id rather than letting Bull decide, makes it easier to handle on way out
538
- const jobId = <span class="cstat-no" title="statement not covered" >`${appId}_cron_${newid()}`</span>
539
- const job = <span class="cstat-no" title="statement not covered" >await queue.add(</span>
540
- {
541
- automation,
542
- event: { appId, timestamp: Date.now() },
543
- },
544
- { repeat: { cron: trigger.inputs.cron }, jobId }
545
- )
546
- // Assign cron job ID from bull so we can remove it later if the cron trigger is removed
547
- <span class="cstat-no" title="statement not covered" > trigger.cronJobId = job.id</span>
548
- // can't use getAppDB here as this is likely to be called from dev app,
549
- // but this call could be for dev app or prod app, need to just use what
550
- // was passed in
551
- const db = <span class="cstat-no" title="statement not covered" >new CouchDB(appId)</span>
552
- const response = <span class="cstat-no" title="statement not covered" >await db.put(automation)</span>
553
- <span class="cstat-no" title="statement not covered" > automation._id = response.id</span>
554
- <span class="cstat-no" title="statement not covered" > automation._rev = response.rev</span>
555
- }
556
- return automation
557
- }
558
- &nbsp;
559
- /**
560
- * This function handles checking if any webhooks need to be created or deleted for automations.
561
- * @param {string} appId The ID of the app in which we are checking for webhooks
562
- * @param {object|undefined} oldAuto The old automation object if updating/deleting
563
- * @param {object|undefined} newAuto The new automation object if creating/updating
564
- * @returns {Promise&lt;object|undefined&gt;} After this is complete the new automation object may have been updated and should be
565
- * written to DB (this does not write to DB as it would be wasteful to repeat).
566
- */
567
- exports.checkForWebhooks = async ({ oldAuto, newAuto }) =&gt; {
568
- const appId = getAppId()
569
- const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
570
- const newTrigger = newAuto ? newAuto.definition.trigger : null
571
- const triggerChanged =
572
- oldTrigger &amp;&amp; newTrigger &amp;&amp; oldTrigger.id !== newTrigger.id
573
- function isWebhookTrigger(auto) {
574
- return (
575
- auto &amp;&amp;
576
- auto.definition.trigger &amp;&amp;
577
- auto.definition.trigger.stepId === WH_STEP_ID
578
- )
579
- }
580
- // need to delete webhook
581
- if (
582
- isWebhookTrigger(oldAuto) &amp;&amp;
583
- (!isWebhookTrigger(newAuto) || <span class="branch-2 cbranch-no" title="branch not covered" >triggerChanged)</span> &amp;&amp;
584
- oldTrigger.webhookId
585
- ) {
586
- try {
587
- let db = getAppDB()
588
- // need to get the webhook to get the rev
589
- const webhook = await db.get(oldTrigger.webhookId)
590
- const ctx = {
591
- appId,
592
- params: { id: webhook._id, rev: webhook._rev },
593
- }
594
- // might be updating - reset the inputs to remove the URLs
595
- if (newTrigger) {
596
- delete newTrigger.webhookId
597
- newTrigger.inputs = {}
598
- }
599
- await webhooks.destroy(ctx)
600
- } catch (err) {
601
- // don't worry about not being able to delete, if it doesn't exist all good
602
- }
603
- }
604
- // need to create webhook
605
- if (
606
- (!isWebhookTrigger(oldAuto) || triggerChanged) &amp;&amp;
607
- isWebhookTrigger(newAuto)
608
- ) {
609
- const ctx = {
610
- appId,
611
- request: {
612
- body: new webhooks.Webhook(
613
- "Automation webhook",
614
- WebhookType.AUTOMATION,
615
- newAuto._id
616
- ),
617
- },
618
- }
619
- await webhooks.save(ctx)
620
- const id = ctx.body.webhook._id
621
- newTrigger.webhookId = id
622
- // the app ID has to be development for this endpoint
623
- // it can only be used when building the app
624
- // but the trigger endpoint will always be used in production
625
- const prodAppId = getProdAppID(appId)
626
- newTrigger.inputs = {
627
- schemaUrl: `api/webhooks/schema/${appId}/${id}`,
628
- triggerUrl: `api/webhooks/trigger/${prodAppId}/${id}`,
629
- }
630
- }
631
- return newAuto
632
- }
633
- &nbsp;
634
- /**
635
- * When removing an app/unpublishing it need to make sure automations are cleaned up (cron).
636
- * @param appId {string} the app that is being removed.
637
- * @return {Promise&lt;void&gt;} clean is complete if this succeeds.
638
- */
639
- exports.cleanupAutomations = <span class="fstat-no" title="function not covered" >as</span>ync appId =&gt; {
640
- <span class="cstat-no" title="statement not covered" > await exports.disableAllCrons(appId)</span>
641
- }
642
- &nbsp;</pre></td></tr></table></pre>
643
-
644
- <div class='push'></div><!-- for sticky footer -->
645
- </div><!-- /wrapper -->
646
- <div class='footer quiet pad2 space-top1 center small'>
647
- Code coverage generated by
648
- <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
649
- at Wed Apr 06 2022 08:58:17 GMT+0000 (Coordinated Universal Time)
650
- </div>
651
- </div>
652
- <script src="../prettify.js"></script>
653
- <script>
654
- window.onload = function () {
655
- prettyPrint();
656
- };
657
- </script>
658
- <script src="../sorter.js"></script>
659
- <script src="../block-navigation.js"></script>
660
- </body>
661
- </html>
662
-