@budibase/server 2.3.13 → 2.3.14-alpha.0

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 (551) hide show
  1. package/__mocks__/aws-sdk.ts +1 -1
  2. package/builder/assets/{index.4488f38d.css → index.a534ca24.css} +1 -1
  3. package/builder/assets/{index.b1cc0b01.js → index.d7529be1.js} +204 -204
  4. package/builder/index.html +2 -2
  5. package/coverage/clover.xml +11936 -7197
  6. package/coverage/coverage-final.json +356 -271
  7. package/coverage/lcov-report/index.html +420 -195
  8. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +6 -6
  9. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +5 -5
  10. package/coverage/lcov-report/src/api/controllers/application.ts.html +140 -140
  11. package/coverage/lcov-report/src/api/controllers/auth.ts.html +9 -9
  12. package/coverage/lcov-report/src/api/controllers/automation.ts.html +47 -47
  13. package/coverage/lcov-report/src/api/controllers/backup.ts.html +6 -6
  14. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +26 -26
  15. package/coverage/lcov-report/src/api/controllers/component.ts.html +5 -5
  16. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +37 -37
  17. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +14 -14
  18. package/coverage/lcov-report/src/api/controllers/deploy/index.html +1 -1
  19. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +81 -81
  20. package/coverage/lcov-report/src/api/controllers/dev.ts.html +26 -26
  21. package/coverage/lcov-report/src/api/controllers/index.html +37 -37
  22. package/coverage/lcov-report/src/api/controllers/integration.ts.html +4 -4
  23. package/coverage/lcov-report/src/api/controllers/layout.ts.html +15 -15
  24. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +9 -9
  25. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +4 -4
  26. package/coverage/lcov-report/src/api/controllers/permission.ts.html +34 -34
  27. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +2 -2
  28. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +4 -4
  29. package/coverage/lcov-report/src/api/controllers/plugin/index.html +1 -1
  30. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +18 -18
  31. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +5 -5
  32. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +5 -5
  33. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +3 -3
  34. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +3 -3
  35. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +6 -6
  36. package/coverage/lcov-report/src/api/controllers/public/index.html +1 -1
  37. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +2 -2
  38. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +1 -1
  39. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +7 -7
  40. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +2 -2
  41. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +2 -2
  42. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +2 -2
  43. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +2 -2
  44. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +4 -4
  45. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +5 -5
  46. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +4 -4
  47. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +6 -6
  48. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +4 -4
  49. package/coverage/lcov-report/src/api/controllers/query/import/index.html +1 -1
  50. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +7 -7
  51. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +1 -1
  52. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +3 -3
  53. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +5 -5
  54. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +7 -7
  55. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +1 -1
  56. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +9 -9
  57. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +13 -13
  58. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/curl/curl.spec.js.html +391 -0
  59. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/curl/index.html +116 -0
  60. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi2/index.html +116 -0
  61. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js.html +796 -0
  62. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi3/index.html +116 -0
  63. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js.html +805 -0
  64. package/coverage/lcov-report/src/api/controllers/query/import/tests/index.html +116 -0
  65. package/coverage/lcov-report/src/api/controllers/query/import/tests/index.spec.js.html +568 -0
  66. package/coverage/lcov-report/src/api/controllers/query/index.html +10 -10
  67. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +61 -55
  68. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +9 -9
  69. package/coverage/lcov-report/src/api/controllers/role.ts.html +8 -8
  70. package/coverage/lcov-report/src/api/controllers/routing.ts.html +6 -6
  71. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +431 -419
  72. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +211 -175
  73. package/coverage/lcov-report/src/api/controllers/row/index.html +42 -42
  74. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +79 -79
  75. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +34 -34
  76. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +6 -6
  77. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +22 -22
  78. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +31 -31
  79. package/coverage/lcov-report/src/api/controllers/screen.ts.html +26 -26
  80. package/coverage/lcov-report/src/api/controllers/script.ts.html +2 -2
  81. package/coverage/lcov-report/src/api/controllers/static/index.html +1 -1
  82. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +22 -22
  83. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +51 -51
  84. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +198 -195
  85. package/coverage/lcov-report/src/api/controllers/table/index.html +47 -47
  86. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +42 -42
  87. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +61 -61
  88. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +63 -63
  89. package/coverage/lcov-report/src/api/controllers/templates.ts.html +7 -7
  90. package/coverage/lcov-report/src/api/controllers/user.ts.html +28 -28
  91. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +2 -2
  92. package/coverage/lcov-report/src/api/controllers/view/index.html +1 -1
  93. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +16 -16
  94. package/coverage/lcov-report/src/api/controllers/view/tests/index.html +116 -0
  95. package/coverage/lcov-report/src/api/controllers/view/tests/viewBuilder.spec.js.html +277 -0
  96. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +5 -5
  97. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +7 -7
  98. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +25 -25
  99. package/coverage/lcov-report/src/api/index.html +1 -1
  100. package/coverage/lcov-report/src/api/index.ts.html +27 -27
  101. package/coverage/lcov-report/src/api/routes/analytics.ts.html +7 -7
  102. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +8 -8
  103. package/coverage/lcov-report/src/api/routes/application.ts.html +10 -10
  104. package/coverage/lcov-report/src/api/routes/auth.ts.html +6 -6
  105. package/coverage/lcov-report/src/api/routes/automation.ts.html +11 -11
  106. package/coverage/lcov-report/src/api/routes/backup.ts.html +8 -8
  107. package/coverage/lcov-report/src/api/routes/cloud.ts.html +8 -8
  108. package/coverage/lcov-report/src/api/routes/component.ts.html +8 -8
  109. package/coverage/lcov-report/src/api/routes/datasource.ts.html +9 -9
  110. package/coverage/lcov-report/src/api/routes/deploy.ts.html +8 -8
  111. package/coverage/lcov-report/src/api/routes/dev.ts.html +13 -13
  112. package/coverage/lcov-report/src/api/routes/index.html +1 -1
  113. package/coverage/lcov-report/src/api/routes/index.ts.html +35 -35
  114. package/coverage/lcov-report/src/api/routes/integration.ts.html +8 -8
  115. package/coverage/lcov-report/src/api/routes/layout.ts.html +8 -8
  116. package/coverage/lcov-report/src/api/routes/metadata.ts.html +9 -9
  117. package/coverage/lcov-report/src/api/routes/migrations.ts.html +7 -7
  118. package/coverage/lcov-report/src/api/routes/permission.ts.html +9 -9
  119. package/coverage/lcov-report/src/api/routes/plugin.ts.html +8 -8
  120. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +14 -17
  121. package/coverage/lcov-report/src/api/routes/public/index.html +1 -1
  122. package/coverage/lcov-report/src/api/routes/public/index.ts.html +52 -52
  123. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +1 -1
  124. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +4 -4
  125. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +9 -9
  126. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +12 -12
  127. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +12 -12
  128. package/coverage/lcov-report/src/api/routes/public/tests/compare.spec.js.html +583 -0
  129. package/coverage/lcov-report/src/api/routes/public/tests/index.html +42 -12
  130. package/coverage/lcov-report/src/api/routes/public/tests/users.spec.js.html +199 -0
  131. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +78 -27
  132. package/coverage/lcov-report/src/api/routes/public/users.ts.html +12 -12
  133. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +19 -19
  134. package/coverage/lcov-report/src/api/routes/public/utils/index.html +1 -1
  135. package/coverage/lcov-report/src/api/routes/query.ts.html +11 -11
  136. package/coverage/lcov-report/src/api/routes/role.ts.html +9 -9
  137. package/coverage/lcov-report/src/api/routes/routing.ts.html +8 -8
  138. package/coverage/lcov-report/src/api/routes/row.ts.html +11 -11
  139. package/coverage/lcov-report/src/api/routes/screen.ts.html +9 -9
  140. package/coverage/lcov-report/src/api/routes/script.ts.html +1 -1
  141. package/coverage/lcov-report/src/api/routes/static.ts.html +14 -14
  142. package/coverage/lcov-report/src/api/routes/table.ts.html +11 -11
  143. package/coverage/lcov-report/src/api/routes/templates.ts.html +8 -8
  144. package/coverage/lcov-report/src/api/routes/tests/analytics.spec.js.html +271 -0
  145. package/coverage/lcov-report/src/api/routes/tests/apikeys.spec.js.html +259 -0
  146. package/coverage/lcov-report/src/api/routes/tests/application.spec.ts.html +1066 -0
  147. package/coverage/lcov-report/src/api/routes/tests/auth.spec.js.html +154 -0
  148. package/coverage/lcov-report/src/api/routes/tests/automation.spec.js.html +1123 -0
  149. package/coverage/lcov-report/src/api/routes/tests/backup.spec.ts.html +223 -0
  150. package/coverage/lcov-report/src/api/routes/tests/cloud.seq.spec.ts.html +268 -0
  151. package/coverage/lcov-report/src/api/routes/tests/component.spec.js.html +178 -0
  152. package/coverage/lcov-report/src/api/routes/tests/datasource.spec.ts.html +799 -0
  153. package/coverage/lcov-report/src/api/routes/tests/dev.spec.js.html +202 -0
  154. package/coverage/lcov-report/src/api/routes/tests/environmentVariables.spec.ts.html +517 -0
  155. package/coverage/lcov-report/src/api/routes/tests/index.html +536 -0
  156. package/coverage/lcov-report/src/api/routes/tests/integration.spec.js.html +238 -0
  157. package/coverage/lcov-report/src/api/routes/tests/internalSearch.spec.js.html +670 -0
  158. package/coverage/lcov-report/src/api/routes/tests/layout.spec.js.html +259 -0
  159. package/coverage/lcov-report/src/api/routes/tests/metadata.spec.js.html +280 -0
  160. package/coverage/lcov-report/src/api/routes/tests/misc.spec.js.html +358 -0
  161. package/coverage/lcov-report/src/api/routes/tests/permissions.spec.js.html +484 -0
  162. package/coverage/lcov-report/src/api/routes/tests/plugin.spec.ts.html +622 -0
  163. package/coverage/lcov-report/src/api/routes/tests/query.seq.spec.js.html +1699 -0
  164. package/coverage/lcov-report/src/api/routes/tests/role.spec.js.html +478 -0
  165. package/coverage/lcov-report/src/api/routes/tests/routing.spec.js.html +430 -0
  166. package/coverage/lcov-report/src/api/routes/tests/row.spec.js.html +1804 -0
  167. package/coverage/lcov-report/src/api/routes/tests/screen.spec.js.html +391 -0
  168. package/coverage/lcov-report/src/api/routes/tests/static.spec.js.html +541 -0
  169. package/coverage/lcov-report/src/api/routes/tests/table.spec.js.html +991 -0
  170. package/coverage/lcov-report/src/api/routes/tests/templates.spec.js.html +154 -0
  171. package/coverage/lcov-report/src/api/routes/tests/user.spec.js.html +679 -0
  172. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +110 -41
  173. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +19 -19
  174. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +29 -23
  175. package/coverage/lcov-report/src/api/routes/tests/view.spec.js.html +1342 -0
  176. package/coverage/lcov-report/src/api/routes/tests/webhook.spec.js.html +484 -0
  177. package/coverage/lcov-report/src/api/routes/user.ts.html +9 -9
  178. package/coverage/lcov-report/src/api/routes/utils/index.html +1 -1
  179. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +42 -42
  180. package/coverage/lcov-report/src/api/routes/view.ts.html +10 -10
  181. package/coverage/lcov-report/src/api/routes/webhook.ts.html +10 -10
  182. package/coverage/lcov-report/src/app.ts.html +59 -44
  183. package/coverage/lcov-report/src/automations/actions.ts.html +24 -24
  184. package/coverage/lcov-report/src/automations/automationUtils.ts.html +4 -4
  185. package/coverage/lcov-report/src/automations/bullboard.ts.html +9 -9
  186. package/coverage/lcov-report/src/automations/index.html +27 -27
  187. package/coverage/lcov-report/src/automations/index.ts.html +5 -5
  188. package/coverage/lcov-report/src/automations/logging/index.html +1 -1
  189. package/coverage/lcov-report/src/automations/logging/index.ts.html +10 -10
  190. package/coverage/lcov-report/src/automations/steps/bash.ts.html +8 -8
  191. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +7 -7
  192. package/coverage/lcov-report/src/automations/steps/delay.ts.html +5 -5
  193. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +7 -7
  194. package/coverage/lcov-report/src/automations/steps/discord.ts.html +8 -8
  195. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +7 -7
  196. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +7 -7
  197. package/coverage/lcov-report/src/automations/steps/filter.ts.html +6 -6
  198. package/coverage/lcov-report/src/automations/steps/index.html +1 -1
  199. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +6 -6
  200. package/coverage/lcov-report/src/automations/steps/loop.ts.html +3 -3
  201. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +9 -9
  202. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +13 -13
  203. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +6 -6
  204. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +4 -4
  205. package/coverage/lcov-report/src/automations/steps/slack.ts.html +6 -6
  206. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +7 -7
  207. package/coverage/lcov-report/src/automations/steps/utils.ts.html +1 -1
  208. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +6 -6
  209. package/coverage/lcov-report/src/automations/tests/automation.spec.js.html +337 -0
  210. package/coverage/lcov-report/src/automations/tests/bash.spec.js.html +187 -0
  211. package/coverage/lcov-report/src/automations/tests/createRow.spec.ts.html +223 -0
  212. package/coverage/lcov-report/src/automations/tests/delay.spec.js.html +133 -0
  213. package/coverage/lcov-report/src/automations/tests/deleteRow.spec.ts.html +250 -0
  214. package/coverage/lcov-report/src/automations/tests/discord.spec.js.html +166 -0
  215. package/coverage/lcov-report/src/automations/tests/executeQuery.spec.js.html +229 -0
  216. package/coverage/lcov-report/src/automations/tests/executeScript.spec.js.html +229 -0
  217. package/coverage/lcov-report/src/automations/tests/filter.spec.js.html +232 -0
  218. package/coverage/lcov-report/src/automations/tests/index.html +341 -0
  219. package/coverage/lcov-report/src/automations/tests/loop.spec.ts.html +220 -0
  220. package/coverage/lcov-report/src/automations/tests/outgoingWebhook.spec.js.html +202 -0
  221. package/coverage/lcov-report/src/automations/tests/queryRows.spec.js.html +436 -0
  222. package/coverage/lcov-report/src/automations/tests/sendSmtpEmail.spec.js.html +298 -0
  223. package/coverage/lcov-report/src/automations/tests/serverLog.spec.js.html +151 -0
  224. package/coverage/lcov-report/src/automations/tests/updateRow.spec.js.html +217 -0
  225. package/coverage/lcov-report/src/automations/tests/utilities/index.html +1 -1
  226. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +1 -1
  227. package/coverage/lcov-report/src/automations/tests/zapier.spec.js.html +166 -0
  228. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +3 -3
  229. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +3 -3
  230. package/coverage/lcov-report/src/automations/triggerInfo/index.html +1 -1
  231. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +8 -8
  232. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +3 -3
  233. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +3 -3
  234. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +3 -3
  235. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +3 -3
  236. package/coverage/lcov-report/src/automations/triggers.ts.html +44 -44
  237. package/coverage/lcov-report/src/automations/unitTests/automationUtils.spec.ts.html +280 -0
  238. package/coverage/lcov-report/src/automations/unitTests/index.html +116 -0
  239. package/coverage/lcov-report/src/automations/utils.ts.html +63 -63
  240. package/coverage/lcov-report/src/constants/index.html +16 -16
  241. package/coverage/lcov-report/src/constants/index.ts.html +33 -99
  242. package/coverage/lcov-report/src/constants/layouts.ts.html +4 -4
  243. package/coverage/lcov-report/src/constants/screens.ts.html +5 -5
  244. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +33 -45
  245. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +2 -2
  246. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +2 -2
  247. package/coverage/lcov-report/src/db/defaultData/index.html +11 -11
  248. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +2 -2
  249. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +2 -2
  250. package/coverage/lcov-report/src/db/dynamoClient.ts.html +15 -15
  251. package/coverage/lcov-report/src/db/inMemoryView.ts.html +4 -4
  252. package/coverage/lcov-report/src/db/index.html +16 -16
  253. package/coverage/lcov-report/src/db/index.ts.html +19 -19
  254. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +26 -23
  255. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +4 -4
  256. package/coverage/lcov-report/src/db/linkedRows/index.html +10 -10
  257. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +23 -23
  258. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +10 -10
  259. package/coverage/lcov-report/src/db/newid.ts.html +4 -4
  260. package/coverage/lcov-report/src/db/tests/index.html +131 -0
  261. package/coverage/lcov-report/src/db/tests/linkController.spec.js.html +793 -0
  262. package/coverage/lcov-report/src/db/tests/linkTests.spec.js.html +277 -0
  263. package/coverage/lcov-report/src/db/utils.ts.html +52 -52
  264. package/coverage/lcov-report/src/definitions/automations.ts.html +2 -2
  265. package/coverage/lcov-report/src/definitions/index.html +1 -1
  266. package/coverage/lcov-report/src/environment.ts.html +34 -31
  267. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +6 -6
  268. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +6 -6
  269. package/coverage/lcov-report/src/events/index.html +1 -1
  270. package/coverage/lcov-report/src/events/index.ts.html +4 -4
  271. package/coverage/lcov-report/src/events/utils.ts.html +10 -10
  272. package/coverage/lcov-report/src/index.html +23 -23
  273. package/coverage/lcov-report/src/index.ts.html +1 -1
  274. package/coverage/lcov-report/src/integration-test/index.html +116 -0
  275. package/coverage/lcov-report/src/integration-test/postgres.spec.ts.html +2341 -0
  276. package/coverage/lcov-report/src/integrations/airtable.ts.html +5 -5
  277. package/coverage/lcov-report/src/integrations/arangodb.ts.html +5 -5
  278. package/coverage/lcov-report/src/integrations/base/index.html +30 -30
  279. package/coverage/lcov-report/src/integrations/base/query.ts.html +9 -9
  280. package/coverage/lcov-report/src/integrations/base/sql.ts.html +217 -187
  281. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +107 -107
  282. package/coverage/lcov-report/src/integrations/base/utils.ts.html +5 -5
  283. package/coverage/lcov-report/src/integrations/couchdb.ts.html +5 -5
  284. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +6 -6
  285. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +5 -5
  286. package/coverage/lcov-report/src/integrations/firebase.ts.html +5 -5
  287. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +11 -11
  288. package/coverage/lcov-report/src/integrations/index.html +27 -27
  289. package/coverage/lcov-report/src/integrations/index.ts.html +40 -40
  290. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +8 -8
  291. package/coverage/lcov-report/src/integrations/mongodb.ts.html +11 -11
  292. package/coverage/lcov-report/src/integrations/mysql.ts.html +10 -10
  293. package/coverage/lcov-report/src/integrations/oracle.ts.html +14 -14
  294. package/coverage/lcov-report/src/integrations/postgres.ts.html +68 -68
  295. package/coverage/lcov-report/src/integrations/queries/index.html +1 -1
  296. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +8 -8
  297. package/coverage/lcov-report/src/integrations/redis.ts.html +5 -5
  298. package/coverage/lcov-report/src/integrations/rest.ts.html +15 -15
  299. package/coverage/lcov-report/src/integrations/s3.ts.html +6 -6
  300. package/coverage/lcov-report/src/integrations/snowflake.ts.html +5 -5
  301. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +1 -1
  302. package/coverage/lcov-report/src/integrations/tests/airtable.spec.ts.html +310 -0
  303. package/coverage/lcov-report/src/integrations/tests/arangodb.spec.ts.html +199 -0
  304. package/coverage/lcov-report/src/integrations/tests/couchdb.spec.ts.html +349 -0
  305. package/coverage/lcov-report/src/integrations/tests/dynamodb.spec.ts.html +550 -0
  306. package/coverage/lcov-report/src/integrations/tests/elasticsearch.spec.ts.html +331 -0
  307. package/coverage/lcov-report/src/integrations/tests/firebase.spec.ts.html +376 -0
  308. package/coverage/lcov-report/src/integrations/tests/index.html +230 -5
  309. package/coverage/lcov-report/src/integrations/tests/microsoftSqlServer.spec.ts.html +253 -0
  310. package/coverage/lcov-report/src/integrations/tests/mongo.spec.ts.html +1087 -0
  311. package/coverage/lcov-report/src/integrations/tests/mysql.spec.ts.html +484 -0
  312. package/coverage/lcov-report/src/integrations/tests/oracle.spec.ts.html +373 -0
  313. package/coverage/lcov-report/src/integrations/tests/postgres.spec.ts.html +328 -0
  314. package/coverage/lcov-report/src/integrations/tests/redis.spec.ts.html +337 -0
  315. package/coverage/lcov-report/src/integrations/tests/rest.spec.ts.html +1870 -0
  316. package/coverage/lcov-report/src/integrations/tests/s3.spec.ts.html +421 -0
  317. package/coverage/lcov-report/src/integrations/tests/sql.spec.ts.html +1753 -0
  318. package/coverage/lcov-report/src/integrations/utils.ts.html +77 -77
  319. package/coverage/lcov-report/src/middleware/appInfo.ts.html +5 -5
  320. package/coverage/lcov-report/src/middleware/authorized.ts.html +29 -29
  321. package/coverage/lcov-report/src/middleware/builder.ts.html +17 -17
  322. package/coverage/lcov-report/src/middleware/currentapp.ts.html +53 -53
  323. package/coverage/lcov-report/src/middleware/index.html +15 -15
  324. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +1 -1
  325. package/coverage/lcov-report/src/middleware/publicApi.ts.html +4 -4
  326. package/coverage/lcov-report/src/middleware/resourceId.ts.html +28 -28
  327. package/coverage/lcov-report/src/middleware/selfhost.ts.html +1 -1
  328. package/coverage/lcov-report/src/middleware/tests/authorized.spec.js.html +574 -0
  329. package/coverage/lcov-report/src/middleware/tests/currentapp.spec.js.html +814 -0
  330. package/coverage/lcov-report/src/middleware/tests/index.html +161 -0
  331. package/coverage/lcov-report/src/middleware/tests/resourceId.spec.js.html +397 -0
  332. package/coverage/lcov-report/src/middleware/tests/selfhost.spec.js.html +214 -0
  333. package/coverage/lcov-report/src/middleware/utils.ts.html +4 -4
  334. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +4 -4
  335. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +5 -5
  336. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +5 -5
  337. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +1 -1
  338. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +5 -5
  339. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +7 -7
  340. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +5 -5
  341. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +5 -5
  342. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +4 -4
  343. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +19 -19
  344. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +6 -6
  345. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +1 -1
  346. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +7 -7
  347. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +6 -6
  348. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +15 -15
  349. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +1 -1
  350. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +5 -5
  351. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +8 -8
  352. package/coverage/lcov-report/src/migrations/functions/index.html +1 -1
  353. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +6 -6
  354. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +6 -6
  355. package/coverage/lcov-report/src/migrations/functions/tests/appUrls.spec.js.html +163 -0
  356. package/coverage/lcov-report/src/migrations/functions/tests/index.html +161 -0
  357. package/coverage/lcov-report/src/migrations/functions/tests/syncQuotas.spec.js.html +163 -0
  358. package/coverage/lcov-report/src/migrations/functions/tests/tableSettings.spec.ts.html +517 -0
  359. package/coverage/lcov-report/src/migrations/functions/tests/userEmailViewCasing.spec.js.html +190 -0
  360. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +1 -1
  361. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +2 -2
  362. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +5 -5
  363. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +4 -4
  364. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +6 -6
  365. package/coverage/lcov-report/src/migrations/functions/usageQuotas/tests/index.html +131 -0
  366. package/coverage/lcov-report/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts.html +190 -0
  367. package/coverage/lcov-report/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts.html +244 -0
  368. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +3 -3
  369. package/coverage/lcov-report/src/migrations/index.html +1 -1
  370. package/coverage/lcov-report/src/migrations/index.ts.html +32 -32
  371. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +1 -1
  372. package/coverage/lcov-report/src/migrations/tests/index.html +23 -8
  373. package/coverage/lcov-report/src/migrations/tests/index.spec.ts.html +511 -0
  374. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +1 -1
  375. package/coverage/lcov-report/src/sdk/app/applications/index.html +1 -1
  376. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +4 -4
  377. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +22 -22
  378. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +9 -9
  379. package/coverage/lcov-report/src/sdk/app/automations/index.html +1 -1
  380. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +3 -3
  381. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +10 -10
  382. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +3 -3
  383. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +41 -23
  384. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +18 -18
  385. package/coverage/lcov-report/src/sdk/app/backups/index.html +10 -10
  386. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +5 -5
  387. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +7 -7
  388. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +69 -60
  389. package/coverage/lcov-report/src/sdk/app/datasources/index.html +19 -19
  390. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +3 -3
  391. package/coverage/lcov-report/src/sdk/app/queries/index.html +1 -1
  392. package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +3 -3
  393. package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +11 -11
  394. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +6 -6
  395. package/coverage/lcov-report/src/sdk/app/rows/index.html +1 -1
  396. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +4 -4
  397. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +4 -4
  398. package/coverage/lcov-report/src/sdk/app/tables/index.html +1 -1
  399. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +10 -10
  400. package/coverage/lcov-report/src/sdk/index.html +1 -1
  401. package/coverage/lcov-report/src/sdk/index.ts.html +11 -11
  402. package/coverage/lcov-report/src/sdk/tests/attachments.spec.ts.html +313 -0
  403. package/coverage/lcov-report/src/sdk/tests/index.html +116 -0
  404. package/coverage/lcov-report/src/sdk/users/index.html +1 -1
  405. package/coverage/lcov-report/src/sdk/users/index.ts.html +3 -3
  406. package/coverage/lcov-report/src/sdk/users/utils.ts.html +31 -31
  407. package/coverage/lcov-report/src/sdk/utils/index.html +1 -1
  408. package/coverage/lcov-report/src/sdk/utils/index.ts.html +11 -11
  409. package/coverage/lcov-report/src/startup.ts.html +42 -42
  410. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +421 -193
  411. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +15 -15
  412. package/coverage/lcov-report/src/tests/utilities/index.html +28 -28
  413. package/coverage/lcov-report/src/tests/utilities/index.ts.html +1 -1
  414. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +77 -35
  415. package/coverage/lcov-report/src/threads/automation.ts.html +22 -22
  416. package/coverage/lcov-report/src/threads/index.html +1 -1
  417. package/coverage/lcov-report/src/threads/index.ts.html +24 -24
  418. package/coverage/lcov-report/src/threads/query.ts.html +76 -76
  419. package/coverage/lcov-report/src/threads/utils.ts.html +12 -12
  420. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +3 -3
  421. package/coverage/lcov-report/src/utilities/centralPath.ts.html +2 -2
  422. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +17 -17
  423. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +8 -8
  424. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +25 -25
  425. package/coverage/lcov-report/src/utilities/fileSystem/index.html +1 -1
  426. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +6 -6
  427. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +8 -8
  428. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +1 -1
  429. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +7 -7
  430. package/coverage/lcov-report/src/utilities/global.ts.html +40 -40
  431. package/coverage/lcov-report/src/utilities/index.html +34 -19
  432. package/coverage/lcov-report/src/utilities/index.ts.html +26 -26
  433. package/coverage/lcov-report/src/utilities/redis.ts.html +12 -12
  434. package/coverage/lcov-report/src/utilities/retry.ts.html +139 -0
  435. package/coverage/lcov-report/src/utilities/routing/index.html +1 -1
  436. package/coverage/lcov-report/src/utilities/routing/index.ts.html +4 -4
  437. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +19 -19
  438. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +49 -49
  439. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +3 -3
  440. package/coverage/lcov-report/src/utilities/rowProcessor/tests/index.html +116 -0
  441. package/coverage/lcov-report/src/utilities/rowProcessor/tests/utils.spec.ts.html +256 -0
  442. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +38 -38
  443. package/coverage/lcov-report/src/utilities/schema.ts.html +3 -3
  444. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +5 -5
  445. package/coverage/lcov-report/src/utilities/security.ts.html +22 -22
  446. package/coverage/lcov-report/src/utilities/usageQuota/index.html +1 -1
  447. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +35 -35
  448. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +1 -1
  449. package/coverage/lcov-report/src/utilities/users.ts.html +4 -4
  450. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +15 -15
  451. package/coverage/lcov-report/src/watch.ts.html +7 -7
  452. package/coverage/lcov-report/src/websocket.ts.html +5 -5
  453. package/coverage/lcov.info +20061 -12327
  454. package/dist/api/controllers/query/index.js +2 -0
  455. package/dist/api/controllers/row/ExternalRequest.js +4 -2
  456. package/dist/api/controllers/row/external.js +12 -1
  457. package/dist/api/controllers/table/external.js +8 -8
  458. package/dist/api/routes/public/tests/utils.js +29 -2
  459. package/dist/api/routes/tests/utilities/index.js +131 -0
  460. package/dist/app.js +8 -4
  461. package/dist/constants/index.js +4 -24
  462. package/dist/db/defaultData/datasource_bb_default.js +6 -5
  463. package/dist/db/linkedRows/LinkController.js +9 -8
  464. package/dist/environment.js +1 -0
  465. package/dist/integrations/base/sql.js +10 -3
  466. package/dist/package.json +8 -6
  467. package/dist/sdk/app/backups/exports.js +8 -2
  468. package/dist/sdk/app/datasources/datasources.js +3 -0
  469. package/dist/tests/utilities/TestConfiguration.js +626 -0
  470. package/dist/tests/utilities/controllers.js +40 -0
  471. package/dist/tests/utilities/structures.js +234 -0
  472. package/dist/tsconfig.build.tsbuildinfo +1 -1
  473. package/dist/utilities/retry.js +30 -0
  474. package/jest-testcontainers-config.js +8 -0
  475. package/jest.config.ts +28 -11
  476. package/package.json +9 -7
  477. package/scripts/load/create-many-apps.js +24 -0
  478. package/scripts/load/create-many-rows.js +30 -0
  479. package/scripts/load/utils.js +66 -0
  480. package/specs/openapi.json +6 -6
  481. package/specs/openapi.yaml +3 -3
  482. package/src/api/controllers/query/import/tests/index.spec.js +1 -1
  483. package/src/api/controllers/query/index.ts +2 -0
  484. package/src/api/controllers/row/ExternalRequest.ts +6 -2
  485. package/src/api/controllers/row/external.ts +13 -1
  486. package/src/api/controllers/table/external.ts +3 -2
  487. package/src/api/routes/public/applications.ts +0 -1
  488. package/src/api/routes/public/tests/compare.spec.js +1 -1
  489. package/src/api/routes/public/tests/users.spec.js +1 -1
  490. package/src/api/routes/public/tests/utils.ts +25 -8
  491. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
  492. package/src/api/routes/tests/analytics.spec.js +4 -1
  493. package/src/api/routes/tests/apikeys.spec.js +1 -1
  494. package/src/api/routes/tests/application.spec.ts +20 -6
  495. package/src/api/routes/tests/auth.spec.js +2 -2
  496. package/src/api/routes/tests/automation.spec.js +6 -2
  497. package/src/api/routes/tests/backup.spec.ts +4 -13
  498. package/src/api/routes/tests/{cloud.spec.ts → cloud.seq.spec.ts} +11 -15
  499. package/src/api/routes/tests/component.spec.js +1 -1
  500. package/src/api/routes/tests/datasource.spec.ts +20 -3
  501. package/src/api/routes/tests/dev.spec.js +1 -1
  502. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  503. package/src/api/routes/tests/integration.spec.js +1 -1
  504. package/src/api/routes/tests/layout.spec.js +1 -1
  505. package/src/api/routes/tests/metadata.spec.js +1 -1
  506. package/src/api/routes/tests/misc.spec.js +1 -1
  507. package/src/api/routes/tests/permissions.spec.js +4 -1
  508. package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +22 -1
  509. package/src/api/routes/tests/role.spec.js +6 -1
  510. package/src/api/routes/tests/routing.spec.js +1 -1
  511. package/src/api/routes/tests/row.spec.js +11 -3
  512. package/src/api/routes/tests/screen.spec.js +1 -1
  513. package/src/api/routes/tests/static.spec.js +2 -1
  514. package/src/api/routes/tests/table.spec.js +1 -1
  515. package/src/api/routes/tests/templates.spec.js +1 -1
  516. package/src/api/routes/tests/user.spec.js +12 -12
  517. package/src/api/routes/tests/utilities/TestFunctions.ts +25 -2
  518. package/src/api/routes/tests/utilities/index.ts +5 -3
  519. package/src/api/routes/tests/view.spec.js +4 -1
  520. package/src/api/routes/tests/webhook.spec.js +11 -2
  521. package/src/app.ts +9 -4
  522. package/src/automations/tests/automation.spec.js +4 -4
  523. package/src/automations/tests/bash.spec.js +1 -1
  524. package/src/automations/tests/discord.spec.js +1 -1
  525. package/src/automations/tests/executeQuery.spec.js +2 -3
  526. package/src/automations/tests/executeScript.spec.js +1 -1
  527. package/src/automations/tests/outgoingWebhook.spec.js +1 -1
  528. package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
  529. package/src/automations/tests/serverLog.spec.js +1 -1
  530. package/src/automations/tests/updateRow.spec.js +1 -1
  531. package/src/automations/tests/zapier.spec.js +1 -1
  532. package/src/constants/index.ts +1 -23
  533. package/src/db/defaultData/datasource_bb_default.ts +6 -10
  534. package/src/db/linkedRows/LinkController.ts +2 -1
  535. package/src/db/tests/linkController.spec.js +4 -1
  536. package/src/db/tests/linkTests.spec.js +1 -1
  537. package/src/environment.ts +1 -0
  538. package/src/integration-test/postgres.spec.ts +752 -0
  539. package/src/integrations/base/sql.ts +15 -5
  540. package/src/integrations/oracle.ts +1 -1
  541. package/src/migrations/functions/tests/appUrls.spec.js +1 -1
  542. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
  543. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +1 -1
  544. package/src/migrations/tests/index.spec.ts +13 -20
  545. package/src/sdk/app/backups/exports.ts +8 -2
  546. package/src/sdk/app/datasources/datasources.ts +3 -0
  547. package/src/tests/jestEnv.ts +2 -6
  548. package/src/tests/jestSetup.ts +8 -7
  549. package/src/tests/utilities/TestConfiguration.ts +126 -50
  550. package/src/tests/utilities/structures.ts +16 -2
  551. package/src/utilities/retry.ts +18 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">2.73% </span>
26
+ <span class="strong">67.57% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>8/293</span>
28
+ <span class='fraction'>198/293</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">53.22% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/186</span>
35
+ <span class='fraction'>99/186</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">81.81% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/33</span>
42
+ <span class='fraction'>27/33</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">2.74% </span>
47
+ <span class="strong">67.35% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>8/291</span>
49
+ <span class='fraction'>196/291</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -803,7 +803,11 @@
803
803
  <a name='L738'></a><a href='#L738'>738</a>
804
804
  <a name='L739'></a><a href='#L739'>739</a>
805
805
  <a name='L740'></a><a href='#L740'>740</a>
806
- <a name='L741'></a><a href='#L741'>741</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
807
811
  <span class="cline-any cline-neutral">&nbsp;</span>
808
812
  <span class="cline-any cline-neutral">&nbsp;</span>
809
813
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -815,23 +819,23 @@
815
819
  <span class="cline-any cline-neutral">&nbsp;</span>
816
820
  <span class="cline-any cline-neutral">&nbsp;</span>
817
821
  <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-yes">56x</span>
819
822
  <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-yes">58x</span>
820
824
  <span class="cline-any cline-neutral">&nbsp;</span>
821
825
  <span class="cline-any cline-neutral">&nbsp;</span>
822
826
  <span class="cline-any cline-neutral">&nbsp;</span>
823
827
  <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-yes">56x</span>
825
- <span class="cline-any cline-yes">56x</span>
826
- <span class="cline-any cline-yes">56x</span>
827
828
  <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-yes">56x</span>
829
- <span class="cline-any cline-yes">56x</span>
830
- <span class="cline-any cline-yes">56x</span>
829
+ <span class="cline-any cline-yes">58x</span>
830
+ <span class="cline-any cline-yes">58x</span>
831
+ <span class="cline-any cline-yes">58x</span>
831
832
  <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-yes">58x</span>
834
+ <span class="cline-any cline-yes">58x</span>
835
+ <span class="cline-any cline-yes">58x</span>
832
836
  <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-yes">56x</span>
834
837
  <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-yes">58x</span>
835
839
  <span class="cline-any cline-neutral">&nbsp;</span>
836
840
  <span class="cline-any cline-neutral">&nbsp;</span>
837
841
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -856,15 +860,17 @@
856
860
  <span class="cline-any cline-neutral">&nbsp;</span>
857
861
  <span class="cline-any cline-neutral">&nbsp;</span>
858
862
  <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
863
  <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
864
  <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-no">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-no">&nbsp;</span>
867
- <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-yes">264x</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-yes">264x</span>
868
+ <span class="cline-any cline-yes">264x</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-yes">264x</span>
871
+ <span class="cline-any cline-yes">264x</span>
872
+ <span class="cline-any cline-yes">2x</span>
873
+ <span class="cline-any cline-yes">2x</span>
868
874
  <span class="cline-any cline-no">&nbsp;</span>
869
875
  <span class="cline-any cline-no">&nbsp;</span>
870
876
  <span class="cline-any cline-no">&nbsp;</span>
@@ -879,21 +885,21 @@
879
885
  <span class="cline-any cline-neutral">&nbsp;</span>
880
886
  <span class="cline-any cline-neutral">&nbsp;</span>
881
887
  <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-yes">264x</span>
889
+ <span class="cline-any cline-yes">244x</span>
884
890
  <span class="cline-any cline-neutral">&nbsp;</span>
885
891
  <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-no">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-yes">20x</span>
893
+ <span class="cline-any cline-yes">2x</span>
888
894
  <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-no">&nbsp;</span>
890
- <span class="cline-any cline-no">&nbsp;</span>
891
- <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-yes">20x</span>
896
+ <span class="cline-any cline-yes">20x</span>
897
+ <span class="cline-any cline-yes">20x</span>
892
898
  <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
899
+ <span class="cline-any cline-yes">20x</span>
894
900
  <span class="cline-any cline-neutral">&nbsp;</span>
895
901
  <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-yes">20x</span>
897
903
  <span class="cline-any cline-neutral">&nbsp;</span>
898
904
  <span class="cline-any cline-neutral">&nbsp;</span>
899
905
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -907,62 +913,62 @@
907
913
  <span class="cline-any cline-neutral">&nbsp;</span>
908
914
  <span class="cline-any cline-neutral">&nbsp;</span>
909
915
  <span class="cline-any cline-neutral">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-yes">132x</span>
911
917
  <span class="cline-any cline-neutral">&nbsp;</span>
912
918
  <span class="cline-any cline-neutral">&nbsp;</span>
913
919
  <span class="cline-any cline-neutral">&nbsp;</span>
914
920
  <span class="cline-any cline-neutral">&nbsp;</span>
915
921
  <span class="cline-any cline-neutral">&nbsp;</span>
916
922
  <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-no">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-no">&nbsp;</span>
921
- <span class="cline-any cline-no">&nbsp;</span>
922
- <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-yes">132x</span>
924
+ <span class="cline-any cline-yes">2267x</span>
925
+ <span class="cline-any cline-yes">499x</span>
926
+ <span class="cline-any cline-yes">132x</span>
927
+ <span class="cline-any cline-yes">107x</span>
928
+ <span class="cline-any cline-yes">967x</span>
923
929
  <span class="cline-any cline-no">&nbsp;</span>
924
930
  <span class="cline-any cline-neutral">&nbsp;</span>
925
931
  <span class="cline-any cline-neutral">&nbsp;</span>
926
932
  <span class="cline-any cline-neutral">&nbsp;</span>
927
933
  <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-no">&nbsp;</span>
929
- <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-yes">132x</span>
935
+ <span class="cline-any cline-yes">2x</span>
930
936
  <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-yes">2x</span>
932
938
  <span class="cline-any cline-neutral">&nbsp;</span>
933
939
  <span class="cline-any cline-neutral">&nbsp;</span>
934
940
  <span class="cline-any cline-neutral">&nbsp;</span>
935
941
  <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-yes">1x</span>
937
943
  <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-yes">1x</span>
939
945
  <span class="cline-any cline-neutral">&nbsp;</span>
940
946
  <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-no">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-yes">132x</span>
948
+ <span class="cline-any cline-yes">106x</span>
943
949
  <span class="cline-any cline-neutral">&nbsp;</span>
944
950
  <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-yes">132x</span>
946
952
  <span class="cline-any cline-neutral">&nbsp;</span>
947
953
  <span class="cline-any cline-neutral">&nbsp;</span>
948
954
  <span class="cline-any cline-neutral">&nbsp;</span>
949
- <span class="cline-any cline-no">&nbsp;</span>
950
- <span class="cline-any cline-no">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-yes">648x</span>
956
+ <span class="cline-any cline-yes">648x</span>
957
+ <span class="cline-any cline-yes">17x</span>
952
958
  <span class="cline-any cline-neutral">&nbsp;</span>
953
959
  <span class="cline-any cline-neutral">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-yes">631x</span>
961
+ <span class="cline-any cline-yes">631x</span>
956
962
  <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-yes">631x</span>
964
+ <span class="cline-any cline-yes">631x</span>
965
+ <span class="cline-any cline-yes">359x</span>
960
966
  <span class="cline-any cline-neutral">&nbsp;</span>
961
967
  <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-no">&nbsp;</span>
963
- <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-yes">631x</span>
969
+ <span class="cline-any cline-yes">272x</span>
964
970
  <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-yes">359x</span>
966
972
  <span class="cline-any cline-neutral">&nbsp;</span>
967
973
  <span class="cline-any cline-neutral">&nbsp;</span>
968
974
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -978,25 +984,25 @@
978
984
  <span class="cline-any cline-neutral">&nbsp;</span>
979
985
  <span class="cline-any cline-neutral">&nbsp;</span>
980
986
  <span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-yes">347x</span>
982
988
  <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-yes">347x</span>
990
+ <span class="cline-any cline-yes">1373x</span>
991
+ <span class="cline-any cline-yes">1373x</span>
986
992
  <span class="cline-any cline-neutral">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-yes">1373x</span>
994
+ <span class="cline-any cline-yes">701x</span>
989
995
  <span class="cline-any cline-neutral">&nbsp;</span>
990
996
  <span class="cline-any cline-neutral">&nbsp;</span>
991
- <span class="cline-any cline-no">&nbsp;</span>
992
- <span class="cline-any cline-no">&nbsp;</span>
993
- <span class="cline-any cline-no">&nbsp;</span>
994
- <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-yes">347x</span>
998
+ <span class="cline-any cline-yes">347x</span>
999
+ <span class="cline-any cline-yes">347x</span>
1000
+ <span class="cline-any cline-yes">347x</span>
995
1001
  <span class="cline-any cline-neutral">&nbsp;</span>
996
1002
  <span class="cline-any cline-neutral">&nbsp;</span>
997
1003
  <span class="cline-any cline-neutral">&nbsp;</span>
998
- <span class="cline-any cline-no">&nbsp;</span>
999
- <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-yes">179x</span>
1005
+ <span class="cline-any cline-yes">1037x</span>
1000
1006
  <span class="cline-any cline-neutral">&nbsp;</span>
1001
1007
  <span class="cline-any cline-neutral">&nbsp;</span>
1002
1008
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1008,27 +1014,27 @@
1008
1014
  <span class="cline-any cline-neutral">&nbsp;</span>
1009
1015
  <span class="cline-any cline-neutral">&nbsp;</span>
1010
1016
  <span class="cline-any cline-neutral">&nbsp;</span>
1011
- <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-yes">179x</span>
1012
1018
  <span class="cline-any cline-neutral">&nbsp;</span>
1013
1019
  <span class="cline-any cline-neutral">&nbsp;</span>
1014
1020
  <span class="cline-any cline-neutral">&nbsp;</span>
1015
- <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-yes">103x</span>
1016
1022
  <span class="cline-any cline-neutral">&nbsp;</span>
1017
1023
  <span class="cline-any cline-neutral">&nbsp;</span>
1018
1024
  <span class="cline-any cline-neutral">&nbsp;</span>
1019
1025
  <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-yes">132x</span>
1021
1027
  <span class="cline-any cline-neutral">&nbsp;</span>
1022
1028
  <span class="cline-any cline-neutral">&nbsp;</span>
1023
1029
  <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-yes">132x</span>
1025
1031
  <span class="cline-any cline-neutral">&nbsp;</span>
1026
1032
  <span class="cline-any cline-neutral">&nbsp;</span>
1027
- <span class="cline-any cline-no">&nbsp;</span>
1028
- <span class="cline-any cline-no">&nbsp;</span>
1029
- <span class="cline-any cline-no">&nbsp;</span>
1030
- <span class="cline-any cline-no">&nbsp;</span>
1031
- <span class="cline-any cline-no">&nbsp;</span>
1033
+ <span class="cline-any cline-yes">132x</span>
1034
+ <span class="cline-any cline-yes">132x</span>
1035
+ <span class="cline-any cline-yes">132x</span>
1036
+ <span class="cline-any cline-yes">132x</span>
1037
+ <span class="cline-any cline-yes">1x</span>
1032
1038
  <span class="cline-any cline-neutral">&nbsp;</span>
1033
1039
  <span class="cline-any cline-neutral">&nbsp;</span>
1034
1040
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1043,37 +1049,37 @@
1043
1049
  <span class="cline-any cline-neutral">&nbsp;</span>
1044
1050
  <span class="cline-any cline-neutral">&nbsp;</span>
1045
1051
  <span class="cline-any cline-neutral">&nbsp;</span>
1046
- <span class="cline-any cline-no">&nbsp;</span>
1047
- <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-yes">132x</span>
1053
+ <span class="cline-any cline-yes">26x</span>
1048
1054
  <span class="cline-any cline-neutral">&nbsp;</span>
1049
1055
  <span class="cline-any cline-neutral">&nbsp;</span>
1050
1056
  <span class="cline-any cline-neutral">&nbsp;</span>
1051
- <span class="cline-any cline-no">&nbsp;</span>
1052
- <span class="cline-any cline-no">&nbsp;</span>
1053
- <span class="cline-any cline-no">&nbsp;</span>
1054
- <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-yes">106x</span>
1058
+ <span class="cline-any cline-yes">106x</span>
1059
+ <span class="cline-any cline-yes">106x</span>
1060
+ <span class="cline-any cline-yes">106x</span>
1055
1061
  <span class="cline-any cline-neutral">&nbsp;</span>
1056
- <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-yes">603x</span>
1057
1063
  <span class="cline-any cline-neutral">&nbsp;</span>
1058
1064
  <span class="cline-any cline-neutral">&nbsp;</span>
1059
1065
  <span class="cline-any cline-neutral">&nbsp;</span>
1060
1066
  <span class="cline-any cline-neutral">&nbsp;</span>
1061
1067
  <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-yes">301x</span>
1063
1069
  <span class="cline-any cline-neutral">&nbsp;</span>
1064
1070
  <span class="cline-any cline-neutral">&nbsp;</span>
1065
- <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-yes">302x</span>
1066
1072
  <span class="cline-any cline-no">&nbsp;</span>
1067
1073
  <span class="cline-any cline-no">&nbsp;</span>
1068
1074
  <span class="cline-any cline-neutral">&nbsp;</span>
1069
1075
  <span class="cline-any cline-neutral">&nbsp;</span>
1070
- <span class="cline-any cline-no">&nbsp;</span>
1071
- <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-yes">302x</span>
1077
+ <span class="cline-any cline-yes">101x</span>
1072
1078
  <span class="cline-any cline-neutral">&nbsp;</span>
1073
1079
  <span class="cline-any cline-neutral">&nbsp;</span>
1074
- <span class="cline-any cline-no">&nbsp;</span>
1075
- <span class="cline-any cline-no">&nbsp;</span>
1076
- <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-yes">302x</span>
1081
+ <span class="cline-any cline-yes">302x</span>
1082
+ <span class="cline-any cline-yes">302x</span>
1077
1083
  <span class="cline-any cline-neutral">&nbsp;</span>
1078
1084
  <span class="cline-any cline-no">&nbsp;</span>
1079
1085
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1127,7 +1133,7 @@
1127
1133
  <span class="cline-any cline-neutral">&nbsp;</span>
1128
1134
  <span class="cline-any cline-neutral">&nbsp;</span>
1129
1135
  <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-yes">106x</span>
1131
1137
  <span class="cline-any cline-neutral">&nbsp;</span>
1132
1138
  <span class="cline-any cline-neutral">&nbsp;</span>
1133
1139
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1135,21 +1141,21 @@
1135
1141
  <span class="cline-any cline-neutral">&nbsp;</span>
1136
1142
  <span class="cline-any cline-neutral">&nbsp;</span>
1137
1143
  <span class="cline-any cline-neutral">&nbsp;</span>
1138
- <span class="cline-any cline-no">&nbsp;</span>
1139
- <span class="cline-any cline-no">&nbsp;</span>
1140
- <span class="cline-any cline-no">&nbsp;</span>
1141
- <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-yes">179x</span>
1145
+ <span class="cline-any cline-yes">171x</span>
1146
+ <span class="cline-any cline-yes">171x</span>
1147
+ <span class="cline-any cline-yes">170x</span>
1142
1148
  <span class="cline-any cline-neutral">&nbsp;</span>
1143
- <span class="cline-any cline-no">&nbsp;</span>
1144
- <span class="cline-any cline-no">&nbsp;</span>
1145
- <span class="cline-any cline-no">&nbsp;</span>
1146
- <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-yes">1x</span>
1150
+ <span class="cline-any cline-yes">1x</span>
1151
+ <span class="cline-any cline-yes">1x</span>
1152
+ <span class="cline-any cline-yes">1x</span>
1147
1153
  <span class="cline-any cline-neutral">&nbsp;</span>
1148
1154
  <span class="cline-any cline-neutral">&nbsp;</span>
1149
1155
  <span class="cline-any cline-neutral">&nbsp;</span>
1150
1156
  <span class="cline-any cline-neutral">&nbsp;</span>
1151
1157
  <span class="cline-any cline-neutral">&nbsp;</span>
1152
- <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-yes">179x</span>
1153
1159
  <span class="cline-any cline-neutral">&nbsp;</span>
1154
1160
  <span class="cline-any cline-neutral">&nbsp;</span>
1155
1161
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1166,46 +1172,46 @@
1166
1172
  <span class="cline-any cline-neutral">&nbsp;</span>
1167
1173
  <span class="cline-any cline-neutral">&nbsp;</span>
1168
1174
  <span class="cline-any cline-neutral">&nbsp;</span>
1169
- <span class="cline-any cline-no">&nbsp;</span>
1170
- <span class="cline-any cline-no">&nbsp;</span>
1171
- <span class="cline-any cline-no">&nbsp;</span>
1172
- <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-yes">179x</span>
1176
+ <span class="cline-any cline-yes">179x</span>
1177
+ <span class="cline-any cline-yes">171x</span>
1178
+ <span class="cline-any cline-yes">171x</span>
1173
1179
  <span class="cline-any cline-no">&nbsp;</span>
1174
1180
  <span class="cline-any cline-neutral">&nbsp;</span>
1175
- <span class="cline-any cline-no">&nbsp;</span>
1176
- <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-yes">171x</span>
1182
+ <span class="cline-any cline-yes">171x</span>
1177
1183
  <span class="cline-any cline-neutral">&nbsp;</span>
1178
1184
  <span class="cline-any cline-neutral">&nbsp;</span>
1179
- <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-yes">171x</span>
1180
1186
  <span class="cline-any cline-neutral">&nbsp;</span>
1181
1187
  <span class="cline-any cline-neutral">&nbsp;</span>
1182
1188
  <span class="cline-any cline-neutral">&nbsp;</span>
1183
- <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-yes">3x</span>
1184
1190
  <span class="cline-any cline-neutral">&nbsp;</span>
1185
- <span class="cline-any cline-no">&nbsp;</span>
1186
- <span class="cline-any cline-no">&nbsp;</span>
1187
- <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-yes">168x</span>
1192
+ <span class="cline-any cline-yes">168x</span>
1193
+ <span class="cline-any cline-yes">167x</span>
1188
1194
  <span class="cline-any cline-neutral">&nbsp;</span>
1189
- <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-yes">1x</span>
1190
1196
  <span class="cline-any cline-neutral">&nbsp;</span>
1191
- <span class="cline-any cline-no">&nbsp;</span>
1192
- <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-yes">179x</span>
1198
+ <span class="cline-any cline-yes">1x</span>
1193
1199
  <span class="cline-any cline-no">&nbsp;</span>
1194
1200
  <span class="cline-any cline-neutral">&nbsp;</span>
1195
- <span class="cline-any cline-no">&nbsp;</span>
1196
- <span class="cline-any cline-no">&nbsp;</span>
1197
- <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-yes">1x</span>
1202
+ <span class="cline-any cline-yes">1x</span>
1203
+ <span class="cline-any cline-yes">1x</span>
1198
1204
  <span class="cline-any cline-neutral">&nbsp;</span>
1199
1205
  <span class="cline-any cline-neutral">&nbsp;</span>
1200
- <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-yes">1x</span>
1201
1207
  <span class="cline-any cline-neutral">&nbsp;</span>
1202
1208
  <span class="cline-any cline-no">&nbsp;</span>
1203
1209
  <span class="cline-any cline-neutral">&nbsp;</span>
1204
1210
  <span class="cline-any cline-neutral">&nbsp;</span>
1205
- <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-yes">1x</span>
1206
1212
  <span class="cline-any cline-neutral">&nbsp;</span>
1207
1213
  <span class="cline-any cline-neutral">&nbsp;</span>
1208
- <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-yes">179x</span>
1209
1215
  <span class="cline-any cline-neutral">&nbsp;</span>
1210
1216
  <span class="cline-any cline-neutral">&nbsp;</span>
1211
1217
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1213,15 +1219,15 @@
1213
1219
  <span class="cline-any cline-neutral">&nbsp;</span>
1214
1220
  <span class="cline-any cline-neutral">&nbsp;</span>
1215
1221
  <span class="cline-any cline-neutral">&nbsp;</span>
1216
- <span class="cline-any cline-no">&nbsp;</span>
1217
- <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-yes">132x</span>
1223
+ <span class="cline-any cline-yes">2x</span>
1218
1224
  <span class="cline-any cline-neutral">&nbsp;</span>
1219
- <span class="cline-any cline-no">&nbsp;</span>
1220
- <span class="cline-any cline-no">&nbsp;</span>
1221
- <span class="cline-any cline-no">&nbsp;</span>
1222
- <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-yes">130x</span>
1226
+ <span class="cline-any cline-yes">130x</span>
1227
+ <span class="cline-any cline-yes">179x</span>
1228
+ <span class="cline-any cline-yes">179x</span>
1223
1229
  <span class="cline-any cline-neutral">&nbsp;</span>
1224
- <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-yes">179x</span>
1225
1231
  <span class="cline-any cline-no">&nbsp;</span>
1226
1232
  <span class="cline-any cline-neutral">&nbsp;</span>
1227
1233
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1230,13 +1236,13 @@
1230
1236
  <span class="cline-any cline-neutral">&nbsp;</span>
1231
1237
  <span class="cline-any cline-no">&nbsp;</span>
1232
1238
  <span class="cline-any cline-neutral">&nbsp;</span>
1233
- <span class="cline-any cline-no">&nbsp;</span>
1234
- <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-yes">179x</span>
1240
+ <span class="cline-any cline-yes">179x</span>
1235
1241
  <span class="cline-any cline-no">&nbsp;</span>
1236
1242
  <span class="cline-any cline-neutral">&nbsp;</span>
1237
- <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-yes">179x</span>
1238
1244
  <span class="cline-any cline-neutral">&nbsp;</span>
1239
- <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-yes">179x</span>
1240
1246
  <span class="cline-any cline-neutral">&nbsp;</span>
1241
1247
  <span class="cline-any cline-neutral">&nbsp;</span>
1242
1248
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1245,12 +1251,12 @@
1245
1251
  <span class="cline-any cline-neutral">&nbsp;</span>
1246
1252
  <span class="cline-any cline-neutral">&nbsp;</span>
1247
1253
  <span class="cline-any cline-neutral">&nbsp;</span>
1248
- <span class="cline-any cline-no">&nbsp;</span>
1249
- <span class="cline-any cline-no">&nbsp;</span>
1250
- <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-yes">130x</span>
1255
+ <span class="cline-any cline-yes">130x</span>
1256
+ <span class="cline-any cline-yes">130x</span>
1251
1257
  <span class="cline-any cline-neutral">&nbsp;</span>
1252
- <span class="cline-any cline-no">&nbsp;</span>
1253
- <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-yes">130x</span>
1259
+ <span class="cline-any cline-yes">179x</span>
1254
1260
  <span class="cline-any cline-neutral">&nbsp;</span>
1255
1261
  <span class="cline-any cline-neutral">&nbsp;</span>
1256
1262
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1260,21 +1266,21 @@
1260
1266
  <span class="cline-any cline-neutral">&nbsp;</span>
1261
1267
  <span class="cline-any cline-neutral">&nbsp;</span>
1262
1268
  <span class="cline-any cline-neutral">&nbsp;</span>
1263
- <span class="cline-any cline-no">&nbsp;</span>
1264
- <span class="cline-any cline-no">&nbsp;</span>
1265
- <span class="cline-any cline-no">&nbsp;</span>
1266
- <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-yes">132x</span>
1270
+ <span class="cline-any cline-yes">132x</span>
1271
+ <span class="cline-any cline-yes">755x</span>
1272
+ <span class="cline-any cline-yes">631x</span>
1267
1273
  <span class="cline-any cline-neutral">&nbsp;</span>
1268
- <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-yes">124x</span>
1269
1275
  <span class="cline-any cline-neutral">&nbsp;</span>
1270
- <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-yes">124x</span>
1271
1277
  <span class="cline-any cline-no">&nbsp;</span>
1272
1278
  <span class="cline-any cline-neutral">&nbsp;</span>
1273
- <span class="cline-any cline-no">&nbsp;</span>
1274
- <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-yes">124x</span>
1280
+ <span class="cline-any cline-yes">124x</span>
1275
1281
  <span class="cline-any cline-no">&nbsp;</span>
1276
1282
  <span class="cline-any cline-neutral">&nbsp;</span>
1277
- <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-yes">124x</span>
1278
1284
  <span class="cline-any cline-neutral">&nbsp;</span>
1279
1285
  <span class="cline-any cline-neutral">&nbsp;</span>
1280
1286
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1282,7 +1288,7 @@
1282
1288
  <span class="cline-any cline-neutral">&nbsp;</span>
1283
1289
  <span class="cline-any cline-neutral">&nbsp;</span>
1284
1290
  <span class="cline-any cline-neutral">&nbsp;</span>
1285
- <span class="cline-any cline-no">&nbsp;</span>
1291
+ <span class="cline-any cline-yes">124x</span>
1286
1292
  <span class="cline-any cline-no">&nbsp;</span>
1287
1293
  <span class="cline-any cline-neutral">&nbsp;</span>
1288
1294
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1293,9 +1299,9 @@
1293
1299
  <span class="cline-any cline-no">&nbsp;</span>
1294
1300
  <span class="cline-any cline-no">&nbsp;</span>
1295
1301
  <span class="cline-any cline-neutral">&nbsp;</span>
1296
- <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-yes">124x</span>
1297
1303
  <span class="cline-any cline-neutral">&nbsp;</span>
1298
- <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-yes">132x</span>
1299
1305
  <span class="cline-any cline-neutral">&nbsp;</span>
1300
1306
  <span class="cline-any cline-neutral">&nbsp;</span>
1301
1307
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1303,23 +1309,23 @@
1303
1309
  <span class="cline-any cline-neutral">&nbsp;</span>
1304
1310
  <span class="cline-any cline-neutral">&nbsp;</span>
1305
1311
  <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>
1312
+ <span class="cline-any cline-yes">110x</span>
1313
+ <span class="cline-any cline-yes">110x</span>
1314
+ <span class="cline-any cline-yes">110x</span>
1309
1315
  <span class="cline-any cline-no">&nbsp;</span>
1310
1316
  <span class="cline-any cline-neutral">&nbsp;</span>
1311
- <span class="cline-any cline-no">&nbsp;</span>
1317
+ <span class="cline-any cline-yes">110x</span>
1312
1318
  <span class="cline-any cline-neutral">&nbsp;</span>
1313
- <span class="cline-any cline-no">&nbsp;</span>
1319
+ <span class="cline-any cline-yes">110x</span>
1314
1320
  <span class="cline-any cline-neutral">&nbsp;</span>
1315
1321
  <span class="cline-any cline-neutral">&nbsp;</span>
1316
- <span class="cline-any cline-no">&nbsp;</span>
1317
- <span class="cline-any cline-no">&nbsp;</span>
1322
+ <span class="cline-any cline-yes">110x</span>
1323
+ <span class="cline-any cline-yes">627x</span>
1318
1324
  <span class="cline-any cline-neutral">&nbsp;</span>
1319
1325
  <span class="cline-any cline-neutral">&nbsp;</span>
1320
1326
  <span class="cline-any cline-neutral">&nbsp;</span>
1321
1327
  <span class="cline-any cline-neutral">&nbsp;</span>
1322
- <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-yes">627x</span>
1323
1329
  <span class="cline-any cline-neutral">&nbsp;</span>
1324
1330
  <span class="cline-any cline-no">&nbsp;</span>
1325
1331
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1345,7 +1351,7 @@
1345
1351
  <span class="cline-any cline-no">&nbsp;</span>
1346
1352
  <span class="cline-any cline-no">&nbsp;</span>
1347
1353
  <span class="cline-any cline-neutral">&nbsp;</span>
1348
- <span class="cline-any cline-no">&nbsp;</span>
1354
+ <span class="cline-any cline-yes">110x</span>
1349
1355
  <span class="cline-any cline-neutral">&nbsp;</span>
1350
1356
  <span class="cline-any cline-neutral">&nbsp;</span>
1351
1357
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1364,9 +1370,9 @@
1364
1370
  <span class="cline-any cline-neutral">&nbsp;</span>
1365
1371
  <span class="cline-any cline-neutral">&nbsp;</span>
1366
1372
  <span class="cline-any cline-neutral">&nbsp;</span>
1367
- <span class="cline-any cline-no">&nbsp;</span>
1368
- <span class="cline-any cline-no">&nbsp;</span>
1369
- <span class="cline-any cline-no">&nbsp;</span>
1373
+ <span class="cline-any cline-yes">110x</span>
1374
+ <span class="cline-any cline-yes">110x</span>
1375
+ <span class="cline-any cline-yes">110x</span>
1370
1376
  <span class="cline-any cline-no">&nbsp;</span>
1371
1377
  <span class="cline-any cline-no">&nbsp;</span>
1372
1378
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1397,7 +1403,7 @@
1397
1403
  <span class="cline-any cline-neutral">&nbsp;</span>
1398
1404
  <span class="cline-any cline-neutral">&nbsp;</span>
1399
1405
  <span class="cline-any cline-neutral">&nbsp;</span>
1400
- <span class="cline-any cline-no">&nbsp;</span>
1406
+ <span class="cline-any cline-yes">110x</span>
1401
1407
  <span class="cline-any cline-no">&nbsp;</span>
1402
1408
  <span class="cline-any cline-neutral">&nbsp;</span>
1403
1409
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1422,7 +1428,7 @@
1422
1428
  <span class="cline-any cline-neutral">&nbsp;</span>
1423
1429
  <span class="cline-any cline-neutral">&nbsp;</span>
1424
1430
  <span class="cline-any cline-neutral">&nbsp;</span>
1425
- <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-yes">110x</span>
1426
1432
  <span class="cline-any cline-neutral">&nbsp;</span>
1427
1433
  <span class="cline-any cline-neutral">&nbsp;</span>
1428
1434
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1437,73 +1443,73 @@
1437
1443
  <span class="cline-any cline-neutral">&nbsp;</span>
1438
1444
  <span class="cline-any cline-neutral">&nbsp;</span>
1439
1445
  <span class="cline-any cline-neutral">&nbsp;</span>
1440
- <span class="cline-any cline-no">&nbsp;</span>
1446
+ <span class="cline-any cline-yes">149x</span>
1441
1447
  <span class="cline-any cline-neutral">&nbsp;</span>
1442
1448
  <span class="cline-any cline-neutral">&nbsp;</span>
1443
- <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-yes">789x</span>
1444
1450
  <span class="cline-any cline-neutral">&nbsp;</span>
1445
- <span class="cline-any cline-no">&nbsp;</span>
1451
+ <span class="cline-any cline-yes">170x</span>
1446
1452
  <span class="cline-any cline-neutral">&nbsp;</span>
1447
- <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-yes">665x</span>
1448
1454
  <span class="cline-any cline-neutral">&nbsp;</span>
1449
- <span class="cline-any cline-no">&nbsp;</span>
1450
- <span class="cline-any cline-no">&nbsp;</span>
1451
- <span class="cline-any cline-no">&nbsp;</span>
1452
- <span class="cline-any cline-no">&nbsp;</span>
1455
+ <span class="cline-any cline-yes">132x</span>
1456
+ <span class="cline-any cline-yes">132x</span>
1457
+ <span class="cline-any cline-yes">755x</span>
1458
+ <span class="cline-any cline-yes">738x</span>
1453
1459
  <span class="cline-any cline-neutral">&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-no">&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-yes">17x</span>
1461
+ <span class="cline-any cline-yes">17x</span>
1462
+ <span class="cline-any cline-yes">17x</span>
1463
+ <span class="cline-any cline-yes">17x</span>
1464
+ <span class="cline-any cline-yes">17x</span>
1465
+ <span class="cline-any cline-yes">17x</span>
1460
1466
  <span class="cline-any cline-neutral">&nbsp;</span>
1461
1467
  <span class="cline-any cline-neutral">&nbsp;</span>
1462
1468
  <span class="cline-any cline-neutral">&nbsp;</span>
1463
- <span class="cline-any cline-no">&nbsp;</span>
1469
+ <span class="cline-any cline-yes">132x</span>
1464
1470
  <span class="cline-any cline-neutral">&nbsp;</span>
1465
1471
  <span class="cline-any cline-neutral">&nbsp;</span>
1466
1472
  <span class="cline-any cline-neutral">&nbsp;</span>
1467
- <span class="cline-any cline-no">&nbsp;</span>
1468
- <span class="cline-any cline-no">&nbsp;</span>
1469
- <span class="cline-any cline-no">&nbsp;</span>
1473
+ <span class="cline-any cline-yes">132x</span>
1474
+ <span class="cline-any cline-yes">132x</span>
1475
+ <span class="cline-any cline-yes">132x</span>
1470
1476
  <span class="cline-any cline-no">&nbsp;</span>
1471
1477
  <span class="cline-any cline-neutral">&nbsp;</span>
1472
- <span class="cline-any cline-no">&nbsp;</span>
1473
- <span class="cline-any cline-no">&nbsp;</span>
1474
- <span class="cline-any cline-no">&nbsp;</span>
1478
+ <span class="cline-any cline-yes">132x</span>
1479
+ <span class="cline-any cline-yes">131x</span>
1480
+ <span class="cline-any cline-yes">131x</span>
1475
1481
  <span class="cline-any cline-no">&nbsp;</span>
1476
1482
  <span class="cline-any cline-neutral">&nbsp;</span>
1477
- <span class="cline-any cline-no">&nbsp;</span>
1483
+ <span class="cline-any cline-yes">131x</span>
1478
1484
  <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
1485
+ <span class="cline-any cline-yes">132x</span>
1486
+ <span class="cline-any cline-yes">132x</span>
1487
+ <span class="cline-any cline-yes">132x</span>
1482
1488
  <span class="cline-any cline-no">&nbsp;</span>
1483
1489
  <span class="cline-any cline-neutral">&nbsp;</span>
1484
1490
  <span class="cline-any cline-neutral">&nbsp;</span>
1485
- <span class="cline-any cline-no">&nbsp;</span>
1491
+ <span class="cline-any cline-yes">132x</span>
1486
1492
  <span class="cline-any cline-neutral">&nbsp;</span>
1487
1493
  <span class="cline-any cline-neutral">&nbsp;</span>
1488
1494
  <span class="cline-any cline-neutral">&nbsp;</span>
1489
1495
  <span class="cline-any cline-neutral">&nbsp;</span>
1490
- <span class="cline-any cline-no">&nbsp;</span>
1491
- <span class="cline-any cline-no">&nbsp;</span>
1496
+ <span class="cline-any cline-yes">132x</span>
1497
+ <span class="cline-any cline-yes">4x</span>
1492
1498
  <span class="cline-any cline-no">&nbsp;</span>
1493
1499
  <span class="cline-any cline-neutral">&nbsp;</span>
1494
1500
  <span class="cline-any cline-neutral">&nbsp;</span>
1495
- <span class="cline-any cline-no">&nbsp;</span>
1496
- <span class="cline-any cline-no">&nbsp;</span>
1501
+ <span class="cline-any cline-yes">132x</span>
1502
+ <span class="cline-any cline-yes">132x</span>
1497
1503
  <span class="cline-any cline-neutral">&nbsp;</span>
1498
- <span class="cline-any cline-no">&nbsp;</span>
1499
- <span class="cline-any cline-no">&nbsp;</span>
1500
- <span class="cline-any cline-no">&nbsp;</span>
1504
+ <span class="cline-any cline-yes">132x</span>
1505
+ <span class="cline-any cline-yes">132x</span>
1506
+ <span class="cline-any cline-yes">132x</span>
1501
1507
  <span class="cline-any cline-neutral">&nbsp;</span>
1502
1508
  <span class="cline-any cline-neutral">&nbsp;</span>
1503
1509
  <span class="cline-any cline-neutral">&nbsp;</span>
1504
1510
  <span class="cline-any cline-no">&nbsp;</span>
1505
1511
  <span class="cline-any cline-neutral">&nbsp;</span>
1506
- <span class="cline-any cline-no">&nbsp;</span>
1512
+ <span class="cline-any cline-yes">132x</span>
1507
1513
  <span class="cline-any cline-neutral">&nbsp;</span>
1508
1514
  <span class="cline-any cline-neutral">&nbsp;</span>
1509
1515
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1527,18 +1533,20 @@
1527
1533
  <span class="cline-any cline-neutral">&nbsp;</span>
1528
1534
  <span class="cline-any cline-neutral">&nbsp;</span>
1529
1535
  <span class="cline-any cline-neutral">&nbsp;</span>
1530
- <span class="cline-any cline-no">&nbsp;</span>
1531
1536
  <span class="cline-any cline-neutral">&nbsp;</span>
1532
- <span class="cline-any cline-no">&nbsp;</span>
1533
- <span class="cline-any cline-no">&nbsp;</span>
1534
1537
  <span class="cline-any cline-neutral">&nbsp;</span>
1538
+ <span class="cline-any cline-yes">132x</span>
1535
1539
  <span class="cline-any cline-neutral">&nbsp;</span>
1540
+ <span class="cline-any cline-yes">132x</span>
1541
+ <span class="cline-any cline-yes">110x</span>
1536
1542
  <span class="cline-any cline-neutral">&nbsp;</span>
1537
1543
  <span class="cline-any cline-neutral">&nbsp;</span>
1538
1544
  <span class="cline-any cline-neutral">&nbsp;</span>
1539
- <span class="cline-any cline-no">&nbsp;</span>
1540
1545
  <span class="cline-any cline-neutral">&nbsp;</span>
1541
- <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-neutral">&nbsp;</span>
1547
+ <span class="cline-any cline-yes">132x</span>
1548
+ <span class="cline-any cline-neutral">&nbsp;</span>
1549
+ <span class="cline-any cline-yes">132x</span>
1542
1550
  <span class="cline-any cline-neutral">&nbsp;</span>
1543
1551
  <span class="cline-any cline-neutral">&nbsp;</span>
1544
1552
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1555,6 +1563,7 @@
1555
1563
  FieldSchema,
1556
1564
  Row,
1557
1565
  Table,
1566
+ RelationshipTypes,
1558
1567
  } from "@budibase/types"
1559
1568
  import {
1560
1569
  breakRowIdField,
@@ -1563,7 +1572,7 @@ import {
1563
1572
  convertRowId,
1564
1573
  } from "../../../integrations/utils"
1565
1574
  import { getDatasourceAndQuery } from "./utils"
1566
- import { FieldTypes, RelationshipTypes } from "../../../constants"
1575
+ import { FieldTypes } from "../../../constants"
1567
1576
  import { breakExternalTableId, isSQL } from "../../../integrations/utils"
1568
1577
  import { processObjectSync } from "@budibase/string-templates"
1569
1578
  import { cloneDeep } from "lodash/fp"
@@ -1589,22 +1598,23 @@ export interface RunConfig {
1589
1598
  row?: Row
1590
1599
  rows?: Row[]
1591
1600
  tables?: Record&lt;string, Table&gt;
1601
+ includeSqlRelationships?: IncludeRelationship
1592
1602
  }
1593
1603
  &nbsp;
1594
- function <span class="fstat-no" title="function not covered" >buildFilters(</span>
1604
+ function buildFilters(
1595
1605
  id: string | undefined | string[],
1596
1606
  filters: SearchFilters,
1597
1607
  table: Table
1598
1608
  ) {
1599
- const primary = <span class="cstat-no" title="statement not covered" >table.primary</span>
1609
+ const primary = table.primary
1600
1610
  // if passed in array need to copy for shifting etc
1601
- let idCopy: undefined | string | any[] = <span class="cstat-no" title="statement not covered" >cloneDeep(id)</span>
1602
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (filters) {</span>
1611
+ let idCopy: undefined | string | any[] = cloneDeep(id)
1612
+ if (filters) {
1603
1613
  // need to map over the filters and make sure the _id field isn't present
1604
- let prefix = <span class="cstat-no" title="statement not covered" >1</span>
1605
- <span class="cstat-no" title="statement not covered" > for (let operator of Object.values(filters)) {</span>
1606
- <span class="cstat-no" title="statement not covered" > for (let field of Object.keys(operator || {})) {</span>
1607
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (removeKeyNumbering(field) === "_id") {</span>
1614
+ let prefix = 1
1615
+ for (let operator of Object.values(filters)) {
1616
+ for (let field of Object.keys(operator || <span class="branch-1 cbranch-no" title="branch not covered" >{})) {</span>
1617
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (removeKeyNumbering(field) === "_id") {
1608
1618
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (primary) {</span>
1609
1619
  const parts = <span class="cstat-no" title="statement not covered" >breakRowIdField(operator[field])</span>
1610
1620
  <span class="cstat-no" title="statement not covered" > for (let field of primary) {</span>
@@ -1619,21 +1629,21 @@ function <span class="fstat-no" title="function not covered" >buildFilters(</spa
1619
1629
  }
1620
1630
  }
1621
1631
  // there is no id, just use the user provided filters
1622
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!idCopy || !table) {</span>
1623
- <span class="cstat-no" title="statement not covered" > return filters</span>
1632
+ if (!idCopy || !table) {
1633
+ return filters
1624
1634
  }
1625
1635
  // if used as URL parameter it will have been joined
1626
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(idCopy)) {</span>
1627
- <span class="cstat-no" title="statement not covered" > idCopy = breakRowIdField(idCopy)</span>
1636
+ if (!Array.isArray(idCopy)) {
1637
+ idCopy = breakRowIdField(idCopy)
1628
1638
  }
1629
- const equal: any = <span class="cstat-no" title="statement not covered" >{}</span>
1630
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (primary &amp;&amp; idCopy) {</span>
1631
- <span class="cstat-no" title="statement not covered" > for (let field of primary) {</span>
1639
+ const equal: any = {}
1640
+ if (primary &amp;&amp; idCopy) {
1641
+ for (let field of primary) {
1632
1642
  // work through the ID and get the parts
1633
- <span class="cstat-no" title="statement not covered" > equal[field] = idCopy.shift()</span>
1643
+ equal[field] = idCopy.shift()
1634
1644
  }
1635
1645
  }
1636
- <span class="cstat-no" title="statement not covered" > return {</span>
1646
+ return {
1637
1647
  equal,
1638
1648
  }
1639
1649
  }
@@ -1646,63 +1656,63 @@ function <span class="fstat-no" title="function not covered" >buildFilters(</spa
1646
1656
  * simplify it down to the requirements. This function is quite complex as we try to be
1647
1657
  * relatively restrictive over what types of columns we will perform this action for.
1648
1658
  */
1649
- function <span class="fstat-no" title="function not covered" >cleanupConfig(c</span>onfig: RunConfig, table: Table): RunConfig {
1650
- const primaryOptions = <span class="cstat-no" title="statement not covered" >[</span>
1659
+ function cleanupConfig(config: RunConfig, table: Table): RunConfig {
1660
+ const primaryOptions = [
1651
1661
  FieldTypes.STRING,
1652
1662
  FieldTypes.LONGFORM,
1653
1663
  FieldTypes.OPTIONS,
1654
1664
  FieldTypes.NUMBER,
1655
1665
  ]
1656
1666
  // filter out fields which cannot be keys
1657
- const fieldNames = <span class="cstat-no" title="statement not covered" >Object.entries(table.schema)</span>
1658
- .filter(<span class="fstat-no" title="function not covered" >schema =&gt; <span class="cstat-no" title="statement not covered" >p</span>rimaryOptions.find(<span class="fstat-no" title="function not covered" >val =&gt; <span class="cstat-no" title="statement not covered" >v</span>al === schema[1].type)</span>)</span>
1659
- .map(<span class="fstat-no" title="function not covered" >([</span>fieldName]) =&gt; <span class="cstat-no" title="statement not covered" >fieldName)</span>
1660
- const iterateObject = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(o</span>bj: { [key: string]: any }) =&gt; {</span>
1661
- <span class="cstat-no" title="statement not covered" > for (let [field, value] of Object.entries(obj)) {</span>
1662
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (fieldNames.find(<span class="fstat-no" title="function not covered" >name =&gt; <span class="cstat-no" title="statement not covered" >n</span>ame === field) &amp;&amp; i</span>sRowId(value)) {</span>
1667
+ const fieldNames = Object.entries(table.schema)
1668
+ .filter(schema =&gt; primaryOptions.find(val =&gt; val === schema[1].type))
1669
+ .map(([fieldName]) =&gt; fieldName)
1670
+ const iterateObject = (obj: { [key: string]: any }) =&gt; {
1671
+ for (let [field, value] of Object.entries(obj)) {
1672
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (fieldNames.find(name =&gt; name === field) &amp;&amp; isRowId(value)) {
1663
1673
  <span class="cstat-no" title="statement not covered" > obj[field] = convertRowId(value)</span>
1664
1674
  }
1665
1675
  }
1666
1676
  }
1667
1677
  // check the row and filters to make sure they aren't a key of some sort
1668
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (config.filters) {</span>
1669
- <span class="cstat-no" title="statement not covered" > for (let [key, filter] of Object.entries(config.filters)) {</span>
1678
+ if (config.filters) {
1679
+ for (let [key, filter] of Object.entries(config.filters)) {
1670
1680
  // oneOf is an array, don't iterate it
1671
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1681
+ if (
1672
1682
  typeof filter !== "object" ||
1673
1683
  Object.keys(filter).length === 0 ||
1674
1684
  key === FilterType.ONE_OF
1675
1685
  ) {
1676
- <span class="cstat-no" title="statement not covered" > continue</span>
1686
+ continue
1677
1687
  }
1678
- <span class="cstat-no" title="statement not covered" > iterateObject(filter)</span>
1688
+ iterateObject(filter)
1679
1689
  }
1680
1690
  }
1681
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (config.row) {</span>
1682
- <span class="cstat-no" title="statement not covered" > iterateObject(config.row)</span>
1691
+ if (config.row) {
1692
+ iterateObject(config.row)
1683
1693
  }
1684
1694
  &nbsp;
1685
- <span class="cstat-no" title="statement not covered" > return config</span>
1695
+ return config
1686
1696
  }
1687
1697
  &nbsp;
1688
- function <span class="fstat-no" title="function not covered" >generateIdForRow(r</span>ow: Row | undefined, table: Table): string {
1689
- const primary = <span class="cstat-no" title="statement not covered" >table.primary</span>
1690
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row || !primary) {</span>
1691
- <span class="cstat-no" title="statement not covered" > return ""</span>
1698
+ function generateIdForRow(row: Row | undefined, table: Table): string {
1699
+ const primary = table.primary
1700
+ if (!row || !primary) {
1701
+ return ""
1692
1702
  }
1693
1703
  // build id array
1694
- let idParts = <span class="cstat-no" title="statement not covered" >[]</span>
1695
- <span class="cstat-no" title="statement not covered" > for (let field of primary) {</span>
1704
+ let idParts = []
1705
+ for (let field of primary) {
1696
1706
  // need to handle table name + field or just field, depending on if relationships used
1697
- const fieldValue = <span class="cstat-no" title="statement not covered" >row[`${table.name}.${field}`] || row[field]</span>
1698
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (fieldValue) {</span>
1699
- <span class="cstat-no" title="statement not covered" > idParts.push(fieldValue)</span>
1707
+ const fieldValue = row[`${table.name}.${field}`] || row[field]
1708
+ if (fieldValue) {
1709
+ idParts.push(fieldValue)
1700
1710
  }
1701
1711
  }
1702
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (idParts.length === 0) {</span>
1703
- <span class="cstat-no" title="statement not covered" > return ""</span>
1712
+ if (idParts.length === 0) {
1713
+ return ""
1704
1714
  }
1705
- <span class="cstat-no" title="statement not covered" > return generateRowIdField(idParts)</span>
1715
+ return generateRowIdField(idParts)
1706
1716
  }
1707
1717
  &nbsp;
1708
1718
  function <span class="fstat-no" title="function not covered" >getEndpoint(t</span>ableId: string | undefined, operation: string) {
@@ -1717,28 +1727,28 @@ function <span class="fstat-no" title="function not covered" >getEndpoint(t</spa
1717
1727
  }
1718
1728
  }
1719
1729
  &nbsp;
1720
- function <span class="fstat-no" title="function not covered" >basicProcessing(r</span>ow: Row, table: Table): Row {
1721
- const thisRow: Row = <span class="cstat-no" title="statement not covered" >{}</span>
1730
+ function basicProcessing(row: Row, table: Table): Row {
1731
+ const thisRow: Row = {}
1722
1732
  // filter the row down to what is actually the row (not joined)
1723
- <span class="cstat-no" title="statement not covered" > for (let fieldName of Object.keys(table.schema)) {</span>
1724
- const pathValue = <span class="cstat-no" title="statement not covered" >row[`${table.name}.${fieldName}`]</span>
1725
- const value = <span class="cstat-no" title="statement not covered" >pathValue != null ? pathValue : row[fieldName]</span>
1733
+ for (let fieldName of Object.keys(table.schema)) {
1734
+ const pathValue = row[`${table.name}.${fieldName}`]
1735
+ const value = pathValue != null ? pathValue : row[fieldName]
1726
1736
  // all responses include "select col as table.col" so that overlaps are handled
1727
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (value != null) {</span>
1728
- <span class="cstat-no" title="statement not covered" > thisRow[fieldName] = value</span>
1737
+ if (value != null) {
1738
+ thisRow[fieldName] = value
1729
1739
  }
1730
1740
  }
1731
- <span class="cstat-no" title="statement not covered" > thisRow._id = generateIdForRow(row, table)</span>
1732
- <span class="cstat-no" title="statement not covered" > thisRow.tableId = table._id</span>
1733
- <span class="cstat-no" title="statement not covered" > thisRow._rev = "rev"</span>
1734
- <span class="cstat-no" title="statement not covered" > return processFormulas(table, thisRow)</span>
1741
+ thisRow._id = generateIdForRow(row, table)
1742
+ thisRow.tableId = table._id
1743
+ thisRow._rev = "rev"
1744
+ return processFormulas(table, thisRow)
1735
1745
  }
1736
1746
  &nbsp;
1737
- function <span class="fstat-no" title="function not covered" >fixArrayTypes(r</span>ow: Row, table: Table) {
1738
- <span class="cstat-no" title="statement not covered" > for (let [fieldName, schema] of Object.entries(table.schema)) {</span>
1739
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1747
+ function fixArrayTypes(row: Row, table: Table) {
1748
+ for (let [fieldName, schema] of Object.entries(table.schema)) {
1749
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
1740
1750
  schema.type === FieldTypes.ARRAY &amp;&amp;
1741
- typeof row[fieldName] === "string"
1751
+ <span class="branch-1 cbranch-no" title="branch not covered" > typeof row[fieldName] === "string"</span>
1742
1752
  ) {
1743
1753
  <span class="cstat-no" title="statement not covered" > try {</span>
1744
1754
  <span class="cstat-no" title="statement not covered" > row[fieldName] = JSON.parse(row[fieldName])</span>
@@ -1748,27 +1758,27 @@ function <span class="fstat-no" title="function not covered" >fixArrayTypes(r</s
1748
1758
  }
1749
1759
  }
1750
1760
  }
1751
- <span class="cstat-no" title="statement not covered" > return row</span>
1761
+ return row
1752
1762
  }
1753
1763
  &nbsp;
1754
- function <span class="fstat-no" title="function not covered" >isOneSide(f</span>ield: FieldSchema) {
1755
- <span class="cstat-no" title="statement not covered" > return (</span>
1764
+ function isOneSide(field: FieldSchema) {
1765
+ return (
1756
1766
  field.relationshipType &amp;&amp; field.relationshipType.split("-")[0] === "one"
1757
1767
  )
1758
1768
  }
1759
1769
  &nbsp;
1760
- export class <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >ExternalRequest {</span></span>
1770
+ export class ExternalRequest {
1761
1771
  private operation: Operation
1762
1772
  private tableId: string
1763
1773
  private datasource?: Datasource
1764
- private <span class="cstat-no" title="statement not covered" >tables: { [key: string]: Table } = {}</span>
1774
+ private tables: { [key: string]: Table } = {}
1765
1775
  &nbsp;
1766
- <span class="fstat-no" title="function not covered" > constructor(o</span>peration: Operation, tableId: string, datasource?: Datasource) {
1767
- <span class="cstat-no" title="statement not covered" > this.operation = operation</span>
1768
- <span class="cstat-no" title="statement not covered" > this.tableId = tableId</span>
1769
- <span class="cstat-no" title="statement not covered" > this.datasource = datasource</span>
1770
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (datasource &amp;&amp; datasource.entities) {</span>
1771
- <span class="cstat-no" title="statement not covered" > this.tables = datasource.entities</span>
1776
+ constructor(operation: Operation, tableId: string, datasource?: Datasource) {
1777
+ this.operation = operation
1778
+ this.tableId = tableId
1779
+ this.datasource = datasource
1780
+ if (datasource &amp;&amp; datasource.entities) {
1781
+ this.tables = datasource.entities
1772
1782
  }
1773
1783
  }
1774
1784
  &nbsp;
@@ -1782,38 +1792,38 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1782
1792
  }
1783
1793
  }
1784
1794
  &nbsp;
1785
- <span class="fstat-no" title="function not covered" > inputProcessing(r</span>ow: Row | undefined, table: Table) {
1786
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row) {</span>
1787
- <span class="cstat-no" title="statement not covered" > return { row, manyRelationships: [] }</span>
1795
+ inputProcessing(row: Row | undefined, table: Table) {
1796
+ if (!row) {
1797
+ return { row, manyRelationships: [] }
1788
1798
  }
1789
1799
  // we don't really support composite keys for relationships, this is why [0] is used
1790
1800
  // @ts-ignore
1791
- const tablePrimary: string = <span class="cstat-no" title="statement not covered" >table.primary[0]</span>
1792
- let newRow: Row = <span class="cstat-no" title="statement not covered" >{},</span>
1793
- manyRelationships: ManyRelationship[] = <span class="cstat-no" title="statement not covered" >[]</span>
1794
- <span class="cstat-no" title="statement not covered" > for (let [key, field] of Object.entries(table.schema)) {</span>
1801
+ const tablePrimary: string = table.primary[0]
1802
+ let newRow: Row = {},
1803
+ manyRelationships: ManyRelationship[] = []
1804
+ for (let [key, field] of Object.entries(table.schema)) {
1795
1805
  // if set already, or not set just skip it
1796
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1806
+ if (
1797
1807
  row[key] == null ||
1798
1808
  newRow[key] ||
1799
1809
  field.autocolumn ||
1800
1810
  field.type === FieldTypes.FORMULA
1801
1811
  ) {
1802
- <span class="cstat-no" title="statement not covered" > continue</span>
1812
+ continue
1803
1813
  }
1804
1814
  // if its an empty string then it means return the column to null (if possible)
1805
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (row[key] === "") {</span>
1815
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (row[key] === "") {
1806
1816
  <span class="cstat-no" title="statement not covered" > newRow[key] = null</span>
1807
1817
  <span class="cstat-no" title="statement not covered" > continue</span>
1808
1818
  }
1809
1819
  // parse floats/numbers
1810
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type === FieldTypes.NUMBER &amp;&amp; !isNaN(parseFloat(row[key]))) {</span>
1811
- <span class="cstat-no" title="statement not covered" > newRow[key] = parseFloat(row[key])</span>
1820
+ if (field.type === FieldTypes.NUMBER &amp;&amp; !isNaN(parseFloat(row[key]))) {
1821
+ newRow[key] = parseFloat(row[key])
1812
1822
  }
1813
1823
  // if its not a link then just copy it over
1814
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type !== FieldTypes.LINK) {</span>
1815
- <span class="cstat-no" title="statement not covered" > newRow[key] = row[key]</span>
1816
- <span class="cstat-no" title="statement not covered" > continue</span>
1824
+ if (field.type !== FieldTypes.LINK) {
1825
+ newRow[key] = row[key]
1826
+ continue
1817
1827
  }
1818
1828
  const { tableName: linkTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(field?.tableId)</span>
1819
1829
  // table has to exist for many to many
@@ -1867,29 +1877,29 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1867
1877
  // we return the relationships that may need to be created in the through table
1868
1878
  // we do this so that if the ID is generated by the DB it can be inserted
1869
1879
  // after the fact
1870
- <span class="cstat-no" title="statement not covered" > return { row: newRow, manyRelationships }</span>
1880
+ return { row: newRow, manyRelationships }
1871
1881
  }
1872
1882
  &nbsp;
1873
- <span class="fstat-no" title="function not covered" > squashRelationshipColumns(</span>
1883
+ squashRelationshipColumns(
1874
1884
  table: Table,
1875
1885
  row: Row,
1876
1886
  relationships: RelationshipsJson[]
1877
1887
  ): Row {
1878
- <span class="cstat-no" title="statement not covered" > for (let relationship of relationships) {</span>
1879
- const linkedTable = <span class="cstat-no" title="statement not covered" >this.tables[relationship.tableName]</span>
1880
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkedTable || !row[relationship.column]) {</span>
1881
- <span class="cstat-no" title="statement not covered" > continue</span>
1888
+ for (let relationship of relationships) {
1889
+ const linkedTable = this.tables[relationship.tableName]
1890
+ if (!linkedTable || !row[relationship.column]) {
1891
+ continue
1882
1892
  }
1883
- const display = <span class="cstat-no" title="statement not covered" >linkedTable.primaryDisplay</span>
1884
- <span class="cstat-no" title="statement not covered" > for (let key of Object.keys(row[relationship.column])) {</span>
1885
- const related: Row = <span class="cstat-no" title="statement not covered" >row[relationship.column][key]</span>
1886
- <span class="cstat-no" title="statement not covered" > row[relationship.column][key] = {</span>
1887
- primaryDisplay: display ? related[display] : undefined,
1893
+ const display = linkedTable.primaryDisplay
1894
+ for (let key of Object.keys(row[relationship.column])) {
1895
+ const related: Row = row[relationship.column][key]
1896
+ row[relationship.column][key] = {
1897
+ primaryDisplay: display ? <span class="branch-0 cbranch-no" title="branch not covered" >related[display] </span>: undefined,
1888
1898
  _id: related._id,
1889
1899
  }
1890
1900
  }
1891
1901
  }
1892
- <span class="cstat-no" title="statement not covered" > return row</span>
1902
+ return row
1893
1903
  }
1894
1904
  &nbsp;
1895
1905
  /**
@@ -1900,68 +1910,68 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1900
1910
  * will be separate rows, with all of the data in each row. We have to decipher what comes
1901
1911
  * from where (which tables) and how to convert that into budibase columns.
1902
1912
  */
1903
- <span class="fstat-no" title="function not covered" > updateRelationshipColumns(</span>
1913
+ updateRelationshipColumns(
1904
1914
  table: Table,
1905
1915
  row: Row,
1906
1916
  rows: { [key: string]: Row },
1907
1917
  relationships: RelationshipsJson[]
1908
1918
  ) {
1909
- const columns: { [key: string]: any } = <span class="cstat-no" title="statement not covered" >{}</span>
1910
- <span class="cstat-no" title="statement not covered" > for (let relationship of relationships) {</span>
1911
- const linkedTable = <span class="cstat-no" title="statement not covered" >this.tables[relationship.tableName]</span>
1912
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkedTable) {</span>
1919
+ const columns: { [key: string]: any } = {}
1920
+ for (let relationship of relationships) {
1921
+ const linkedTable = this.tables[relationship.tableName]
1922
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkedTable) {
1913
1923
  <span class="cstat-no" title="statement not covered" > continue</span>
1914
1924
  }
1915
- const fromColumn = <span class="cstat-no" title="statement not covered" >`${table.name}.${relationship.from}`</span>
1916
- const toColumn = <span class="cstat-no" title="statement not covered" >`${linkedTable.name}.${relationship.to}`</span>
1925
+ const fromColumn = `${table.name}.${relationship.from}`
1926
+ const toColumn = `${linkedTable.name}.${relationship.to}`
1917
1927
  // this is important when working with multiple relationships
1918
1928
  // between the same tables, don't want to overlap/multiply the relations
1919
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1929
+ if (
1920
1930
  !relationship.through &amp;&amp;
1921
1931
  row[fromColumn]?.toString() !== row[toColumn]?.toString()
1922
1932
  ) {
1923
- <span class="cstat-no" title="statement not covered" > continue</span>
1933
+ continue
1924
1934
  }
1925
- let linked = <span class="cstat-no" title="statement not covered" >basicProcessing(row, linkedTable)</span>
1926
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linked._id) {</span>
1927
- <span class="cstat-no" title="statement not covered" > continue</span>
1935
+ let linked = basicProcessing(row, linkedTable)
1936
+ if (!linked._id) {
1937
+ continue
1928
1938
  }
1929
- <span class="cstat-no" title="statement not covered" > columns[relationship.column] = linked</span>
1939
+ columns[relationship.column] = linked
1930
1940
  }
1931
- <span class="cstat-no" title="statement not covered" > for (let [column, related] of Object.entries(columns)) {</span>
1932
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row._id) {</span>
1941
+ for (let [column, related] of Object.entries(columns)) {
1942
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!row._id) {
1933
1943
  <span class="cstat-no" title="statement not covered" > continue</span>
1934
1944
  }
1935
- const rowId: string = <span class="cstat-no" title="statement not covered" >row._id</span>
1936
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(rows[rowId][column])) {</span>
1937
- <span class="cstat-no" title="statement not covered" > rows[rowId][column] = []</span>
1945
+ const rowId: string = row._id
1946
+ if (!Array.isArray(rows[rowId][column])) {
1947
+ rows[rowId][column] = []
1938
1948
  }
1939
1949
  // make sure relationship hasn't been found already
1940
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1950
+ if (
1941
1951
  !rows[rowId][column].find(
1942
1952
  <span class="fstat-no" title="function not covered" > (r</span>elation: Row) =&gt; <span class="cstat-no" title="statement not covered" >relation._id === related._id</span>
1943
1953
  )
1944
1954
  ) {
1945
- <span class="cstat-no" title="statement not covered" > rows[rowId][column].push(related)</span>
1955
+ rows[rowId][column].push(related)
1946
1956
  }
1947
1957
  }
1948
- <span class="cstat-no" title="statement not covered" > return rows</span>
1958
+ return rows
1949
1959
  }
1950
1960
  &nbsp;
1951
- <span class="fstat-no" title="function not covered" > outputProcessing(</span>
1961
+ outputProcessing(
1952
1962
  rows: Row[] = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
1953
1963
  table: Table,
1954
1964
  relationships: RelationshipsJson[]
1955
1965
  ) {
1956
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!rows || rows.length === 0 || rows[0].read === true) {</span>
1957
- <span class="cstat-no" title="statement not covered" > return []</span>
1966
+ if (!rows || rows.length === 0 || rows[0].read === true) {
1967
+ return []
1958
1968
  }
1959
- let finalRows: { [key: string]: Row } = <span class="cstat-no" title="statement not covered" >{}</span>
1960
- <span class="cstat-no" title="statement not covered" > for (let row of rows) {</span>
1961
- const rowId = <span class="cstat-no" title="statement not covered" >generateIdForRow(row, table)</span>
1962
- <span class="cstat-no" title="statement not covered" > row._id = rowId</span>
1969
+ let finalRows: { [key: string]: Row } = {}
1970
+ for (let row of rows) {
1971
+ const rowId = generateIdForRow(row, table)
1972
+ row._id = rowId
1963
1973
  // this is a relationship of some sort
1964
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (finalRows[rowId]) {</span>
1974
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (finalRows[rowId]) {
1965
1975
  <span class="cstat-no" title="statement not covered" > finalRows = this.updateRelationshipColumns(</span>
1966
1976
  table,
1967
1977
  row,
@@ -1970,13 +1980,13 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1970
1980
  )
1971
1981
  <span class="cstat-no" title="statement not covered" > continue</span>
1972
1982
  }
1973
- const thisRow = <span class="cstat-no" title="statement not covered" >fixArrayTypes(basicProcessing(row, table), table)</span>
1974
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (thisRow._id == null) {</span>
1983
+ const thisRow = fixArrayTypes(basicProcessing(row, table), table)
1984
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (thisRow._id == null) {
1975
1985
  <span class="cstat-no" title="statement not covered" > throw "Unable to generate row ID for SQL rows"</span>
1976
1986
  }
1977
- <span class="cstat-no" title="statement not covered" > finalRows[thisRow._id] = thisRow</span>
1987
+ finalRows[thisRow._id] = thisRow
1978
1988
  // do this at end once its been added to the final rows
1979
- <span class="cstat-no" title="statement not covered" > finalRows = this.updateRelationshipColumns(</span>
1989
+ finalRows = this.updateRelationshipColumns(
1980
1990
  table,
1981
1991
  row,
1982
1992
  finalRows,
@@ -1985,12 +1995,12 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1985
1995
  }
1986
1996
  &nbsp;
1987
1997
  // Process some additional data types
1988
- let finalRowArray = <span class="cstat-no" title="statement not covered" >Object.values(finalRows)</span>
1989
- <span class="cstat-no" title="statement not covered" > finalRowArray = processDates(table, finalRowArray)</span>
1990
- <span class="cstat-no" title="statement not covered" > finalRowArray = processFormulas(table, finalRowArray) as Row[]</span>
1998
+ let finalRowArray = Object.values(finalRows)
1999
+ finalRowArray = processDates(table, finalRowArray)
2000
+ finalRowArray = processFormulas(table, finalRowArray) as Row[]
1991
2001
  &nbsp;
1992
- <span class="cstat-no" title="statement not covered" > return finalRowArray.map(<span class="fstat-no" title="function not covered" >(r</span>ow: Row) =&gt;</span>
1993
- <span class="cstat-no" title="statement not covered" > this.squashRelationshipColumns(table, row, relationships)</span>
2002
+ return finalRowArray.map((row: Row) =&gt;
2003
+ this.squashRelationshipColumns(table, row, relationships)
1994
2004
  )
1995
2005
  }
1996
2006
  &nbsp;
@@ -1999,30 +2009,30 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1999
2009
  * this will be used by the underlying library to build whatever relationship mechanism
2000
2010
  * it has (e.g. SQL joins).
2001
2011
  */
2002
- <span class="fstat-no" title="function not covered" > buildRelationships(t</span>able: Table): RelationshipsJson[] {
2003
- const relationships = <span class="cstat-no" title="statement not covered" >[]</span>
2004
- <span class="cstat-no" title="statement not covered" > for (let [fieldName, field] of Object.entries(table.schema)) {</span>
2005
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type !== FieldTypes.LINK) {</span>
2006
- <span class="cstat-no" title="statement not covered" > continue</span>
2012
+ buildRelationships(table: Table): RelationshipsJson[] {
2013
+ const relationships = []
2014
+ for (let [fieldName, field] of Object.entries(table.schema)) {
2015
+ if (field.type !== FieldTypes.LINK) {
2016
+ continue
2007
2017
  }
2008
- const { tableName: linkTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(field.tableId)</span>
2018
+ const { tableName: linkTableName } = breakExternalTableId(field.tableId)
2009
2019
  // no table to link to, this is not a valid relationships
2010
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkTableName || !this.tables[linkTableName]) {</span>
2020
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkTableName || !this.tables[linkTableName]) {
2011
2021
  <span class="cstat-no" title="statement not covered" > continue</span>
2012
2022
  }
2013
- const linkTable = <span class="cstat-no" title="statement not covered" >this.tables[linkTableName]</span>
2014
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!table.primary || !linkTable.primary) {</span>
2023
+ const linkTable = this.tables[linkTableName]
2024
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!table.primary || !linkTable.primary) {
2015
2025
  <span class="cstat-no" title="statement not covered" > continue</span>
2016
2026
  }
2017
- const definition: any = <span class="cstat-no" title="statement not covered" >{</span>
2027
+ const definition: any = {
2018
2028
  // if no foreign key specified then use the name of the field in other table
2019
- from: field.foreignKey || table.primary[0],
2029
+ from: field.foreignKey || <span class="branch-1 cbranch-no" title="branch not covered" >table.primary[0],</span>
2020
2030
  to: field.fieldName,
2021
2031
  tableName: linkTableName,
2022
2032
  // need to specify where to put this back into
2023
2033
  column: fieldName,
2024
2034
  }
2025
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.through) {</span>
2035
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (field.through) {
2026
2036
  const { tableName: throughTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(</span>
2027
2037
  field.through
2028
2038
  )
@@ -2033,33 +2043,33 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2033
2043
  <span class="cstat-no" title="statement not covered" > definition.fromPrimary = table.primary[0]</span>
2034
2044
  <span class="cstat-no" title="statement not covered" > definition.toPrimary = linkTable.primary[0]</span>
2035
2045
  }
2036
- <span class="cstat-no" title="statement not covered" > relationships.push(definition)</span>
2046
+ relationships.push(definition)
2037
2047
  }
2038
- <span class="cstat-no" title="statement not covered" > return relationships</span>
2048
+ return relationships
2039
2049
  }
2040
2050
  &nbsp;
2041
2051
  /**
2042
2052
  * This is a cached lookup, of relationship records, this is mainly for creating/deleting junction
2043
2053
  * information.
2044
2054
  */
2045
- <span class="fstat-no" title="function not covered" > async l</span>ookupRelations(tableId: string, row: Row) {
2046
- const related: { [key: string]: any } = <span class="cstat-no" title="statement not covered" >{}</span>
2047
- const { tableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(tableId)</span>
2048
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableName) {</span>
2055
+ async lookupRelations(tableId: string, row: Row) {
2056
+ const related: { [key: string]: any } = {}
2057
+ const { tableName } = breakExternalTableId(tableId)
2058
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableName) {
2049
2059
  <span class="cstat-no" title="statement not covered" > return related</span>
2050
2060
  }
2051
- const table = <span class="cstat-no" title="statement not covered" >this.tables[tableName]</span>
2061
+ const table = this.tables[tableName]
2052
2062
  // @ts-ignore
2053
- const primaryKey = <span class="cstat-no" title="statement not covered" >table.primary[0]</span>
2063
+ const primaryKey = table.primary[0]
2054
2064
  // make a new request to get the row with all its relationships
2055
2065
  // we need this to work out if any relationships need removed
2056
- <span class="cstat-no" title="statement not covered" > for (let field of Object.values(table.schema)) {</span>
2057
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2066
+ for (let field of Object.values(table.schema)) {
2067
+ if (
2058
2068
  field.type !== FieldTypes.LINK ||
2059
2069
  !field.fieldName ||
2060
2070
  isOneSide(field)
2061
2071
  ) {
2062
- <span class="cstat-no" title="statement not covered" > continue</span>
2072
+ continue
2063
2073
  }
2064
2074
  const isMany = <span class="cstat-no" title="statement not covered" >field.relationshipType === RelationshipTypes.MANY_TO_MANY</span>
2065
2075
  const tableId = <span class="cstat-no" title="statement not covered" >isMany ? field.through : field.tableId</span>
@@ -2085,7 +2095,7 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2085
2095
  const storeTo = <span class="cstat-no" title="statement not covered" >isMany ? field.throughFrom || linkPrimaryKey : fieldName</span>
2086
2096
  <span class="cstat-no" title="statement not covered" > related[storeTo] = { rows, isMany, tableId }</span>
2087
2097
  }
2088
- <span class="cstat-no" title="statement not covered" > return related</span>
2098
+ return related
2089
2099
  }
2090
2100
  &nbsp;
2091
2101
  /**
@@ -2098,15 +2108,15 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2098
2108
  * isn't supposed to exist anymore and delete those. This is better than the usual method of delete them
2099
2109
  * all and then re-create, as theres no chance of losing data (e.g. delete succeed, but write fail).
2100
2110
  */
2101
- <span class="fstat-no" title="function not covered" > async h</span>andleManyRelationships(
2111
+ async handleManyRelationships(
2102
2112
  mainTableId: string,
2103
2113
  row: Row,
2104
2114
  relationships: ManyRelationship[]
2105
2115
  ) {
2106
2116
  // if we're creating (in a through table) need to wipe the existing ones first
2107
- const promises = <span class="cstat-no" title="statement not covered" >[]</span>
2108
- const related = <span class="cstat-no" title="statement not covered" >await this.lookupRelations(mainTableId, row)</span>
2109
- <span class="cstat-no" title="statement not covered" > for (let relationship of relationships) {</span>
2117
+ const promises = []
2118
+ const related = await this.lookupRelations(mainTableId, row)
2119
+ for (let relationship of relationships) {
2110
2120
  const { key, tableId, isUpdate, id, ...rest } = <span class="cstat-no" title="statement not covered" >relationship</span>
2111
2121
  const body: { [key: string]: any } = <span class="cstat-no" title="statement not covered" >processObjectSync(rest, row, {})</span>
2112
2122
  const linkTable = <span class="cstat-no" title="statement not covered" >this.getTable(tableId)</span>
@@ -2137,7 +2147,7 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2137
2147
  }
2138
2148
  }
2139
2149
  // finally cleanup anything that needs to be removed
2140
- <span class="cstat-no" title="statement not covered" > for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {</span>
2150
+ for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {
2141
2151
  const table: Table | undefined = <span class="cstat-no" title="statement not covered" >this.getTable(tableId)</span>
2142
2152
  // if its not the foreign key skip it, nothing to do
2143
2153
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
@@ -2162,7 +2172,7 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2162
2172
  }
2163
2173
  }
2164
2174
  }
2165
- <span class="cstat-no" title="statement not covered" > await Promise.all(promises)</span>
2175
+ await Promise.all(promises)
2166
2176
  }
2167
2177
  &nbsp;
2168
2178
  /**
@@ -2172,78 +2182,78 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2172
2182
  * Creating the specific list of fields that we desire, and excluding the ones that are no use to us
2173
2183
  * is more performant and has the added benefit of protecting against this scenario.
2174
2184
  */
2175
- <span class="fstat-no" title="function not covered" > buildFields(</span>
2185
+ buildFields(
2176
2186
  table: Table,
2177
2187
  includeRelations: IncludeRelationship = <span class="branch-0 cbranch-no" title="branch not covered" >IncludeRelationship.INCLUDE</span>
2178
2188
  ) {
2179
- function <span class="fstat-no" title="function not covered" >extractRealFields(t</span>able: Table, existing: string[] = <span class="branch-0 cbranch-no" title="branch not covered" >[])</span> {
2180
- <span class="cstat-no" title="statement not covered" > return Object.entries(table.schema)</span>
2189
+ function extractRealFields(table: Table, existing: string[] = []) {
2190
+ return Object.entries(table.schema)
2181
2191
  .filter(
2182
- <span class="fstat-no" title="function not covered" > column =&gt;</span>
2183
- <span class="cstat-no" title="statement not covered" > column[1].type !== FieldTypes.LINK &amp;&amp;</span>
2192
+ column =&gt;
2193
+ column[1].type !== FieldTypes.LINK &amp;&amp;
2184
2194
  column[1].type !== FieldTypes.FORMULA &amp;&amp;
2185
- !existing.find(<span class="fstat-no" title="function not covered" >(f</span>ield: string) =&gt; <span class="cstat-no" title="statement not covered" >field === column[0])</span>
2195
+ !existing.find((field: string) =&gt; field === column[0])
2186
2196
  )
2187
- .map(<span class="fstat-no" title="function not covered" >column =&gt; <span class="cstat-no" title="statement not covered" >`</span>${table.name}.${column[0]}`)</span>
2197
+ .map(column =&gt; `${table.name}.${column[0]}`)
2188
2198
  }
2189
- let fields = <span class="cstat-no" title="statement not covered" >extractRealFields(table)</span>
2190
- <span class="cstat-no" title="statement not covered" > for (let field of Object.values(table.schema)) {</span>
2191
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type !== FieldTypes.LINK || !includeRelations) {</span>
2192
- <span class="cstat-no" title="statement not covered" > continue</span>
2199
+ let fields = extractRealFields(table)
2200
+ for (let field of Object.values(table.schema)) {
2201
+ if (field.type !== FieldTypes.LINK || !includeRelations) {
2202
+ continue
2193
2203
  }
2194
- const { tableName: linkTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(field.tableId)</span>
2195
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (linkTableName) {</span>
2196
- const linkTable = <span class="cstat-no" title="statement not covered" >this.tables[linkTableName]</span>
2197
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (linkTable) {</span>
2198
- const linkedFields = <span class="cstat-no" title="statement not covered" >extractRealFields(linkTable, fields)</span>
2199
- <span class="cstat-no" title="statement not covered" > fields = fields.concat(linkedFields)</span>
2204
+ const { tableName: linkTableName } = breakExternalTableId(field.tableId)
2205
+ if (linkTableName) {
2206
+ const linkTable = this.tables[linkTableName]
2207
+ if (linkTable) {
2208
+ const linkedFields = extractRealFields(linkTable, fields)
2209
+ fields = fields.concat(linkedFields)
2200
2210
  }
2201
2211
  }
2202
2212
  }
2203
- <span class="cstat-no" title="statement not covered" > return fields</span>
2213
+ return fields
2204
2214
  }
2205
2215
  &nbsp;
2206
- <span class="fstat-no" title="function not covered" > async r</span>un(config: RunConfig) {
2207
- const { operation, tableId } = <span class="cstat-no" title="statement not covered" >this</span>
2208
- let { datasourceId, tableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(tableId)</span>
2209
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableName) {</span>
2216
+ async run(config: RunConfig) {
2217
+ const { operation, tableId } = this
2218
+ let { datasourceId, tableName } = breakExternalTableId(tableId)
2219
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableName) {
2210
2220
  <span class="cstat-no" title="statement not covered" > throw "Unable to run without a table name"</span>
2211
2221
  }
2212
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.datasource) {</span>
2213
- <span class="cstat-no" title="statement not covered" > this.datasource = await sdk.datasources.get(datasourceId!)</span>
2214
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.datasource || !this.datasource.entities) {</span>
2222
+ if (!this.datasource) {
2223
+ this.datasource = await sdk.datasources.get(datasourceId!)
2224
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.datasource || !this.datasource.entities) {
2215
2225
  <span class="cstat-no" title="statement not covered" > throw "No tables found, fetch tables before query."</span>
2216
2226
  }
2217
- <span class="cstat-no" title="statement not covered" > this.tables = this.datasource.entities</span>
2227
+ this.tables = this.datasource.entities
2218
2228
  }
2219
- const table = <span class="cstat-no" title="statement not covered" >this.tables[tableName]</span>
2220
- let isSql = <span class="cstat-no" title="statement not covered" >isSQL(this.datasource)</span>
2221
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!table) {</span>
2229
+ const table = this.tables[tableName]
2230
+ let isSql = isSQL(this.datasource)
2231
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!table) {
2222
2232
  <span class="cstat-no" title="statement not covered" > throw `Unable to process query, table "${tableName}" not defined.`</span>
2223
2233
  }
2224
2234
  // look for specific components of config which may not be considered acceptable
2225
- let { id, row, filters, sort, paginate, rows } = <span class="cstat-no" title="statement not covered" >cleanupConfig(</span>
2235
+ let { id, row, filters, sort, paginate, rows } = cleanupConfig(
2226
2236
  config,
2227
2237
  table
2228
2238
  )
2229
2239
  //if the sort column is a formula, remove it
2230
- <span class="cstat-no" title="statement not covered" > for (let sortColumn of Object.keys(sort || {})) {</span>
2231
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (table.schema[sortColumn]?.type === "formula") {</span>
2240
+ for (let sortColumn of Object.keys(sort || {})) {
2241
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (table.schema[sortColumn]?.type === "formula") {
2232
2242
  <span class="cstat-no" title="statement not covered" > delete sort?.[sortColumn]</span>
2233
2243
  }
2234
2244
  }
2235
- <span class="cstat-no" title="statement not covered" > filters = buildFilters(id, filters || {}, table)</span>
2236
- const relationships = <span class="cstat-no" title="statement not covered" >this.buildRelationships(table)</span>
2245
+ filters = buildFilters(id, filters || {}, table)
2246
+ const relationships = this.buildRelationships(table)
2237
2247
  // clean up row on ingress using schema
2238
- const processed = <span class="cstat-no" title="statement not covered" >this.inputProcessing(row, table)</span>
2239
- <span class="cstat-no" title="statement not covered" > row = processed.row</span>
2240
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2248
+ const processed = this.inputProcessing(row, table)
2249
+ row = processed.row
2250
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
2241
2251
  operation === Operation.DELETE &amp;&amp;
2242
2252
  (filters == null || Object.keys(filters).length === 0)
2243
2253
  ) {
2244
2254
  <span class="cstat-no" title="statement not covered" > throw "Deletion must be filtered"</span>
2245
2255
  }
2246
- let json = <span class="cstat-no" title="statement not covered" >{</span>
2256
+ let json = {
2247
2257
  endpoint: {
2248
2258
  datasourceId,
2249
2259
  entityId: tableName,
@@ -2251,7 +2261,9 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2251
2261
  },
2252
2262
  resource: {
2253
2263
  // have to specify the fields to avoid column overlap (for SQL)
2254
- fields: isSql ? this.buildFields(table) : [],
2264
+ fields: isSql
2265
+ ? this.buildFields(table, config.includeSqlRelationships)
2266
+ : <span class="branch-1 cbranch-no" title="branch not covered" >[],</span>
2255
2267
  },
2256
2268
  filters,
2257
2269
  sort,
@@ -2267,18 +2279,18 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2267
2279
  },
2268
2280
  }
2269
2281
  // can't really use response right now
2270
- const response = <span class="cstat-no" title="statement not covered" >await getDatasourceAndQuery(json)</span>
2282
+ const response = await getDatasourceAndQuery(json)
2271
2283
  // handle many to many relationships now if we know the ID (could be auto increment)
2272
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (operation !== Operation.READ &amp;&amp; processed.manyRelationships) {</span>
2273
- <span class="cstat-no" title="statement not covered" > await this.handleManyRelationships(</span>
2274
- table._id || "",
2284
+ if (operation !== Operation.READ &amp;&amp; processed.manyRelationships) {
2285
+ await this.handleManyRelationships(
2286
+ table._id || <span class="branch-1 cbranch-no" title="branch not covered" >"",</span>
2275
2287
  response[0],
2276
2288
  processed.manyRelationships
2277
2289
  )
2278
2290
  }
2279
- const output = <span class="cstat-no" title="statement not covered" >this.outputProcessing(response, table, relationships)</span>
2291
+ const output = this.outputProcessing(response, table, relationships)
2280
2292
  // if reading it'll just be an array of rows, return whole thing
2281
- <span class="cstat-no" title="statement not covered" > return operation === Operation.READ &amp;&amp; Array.isArray(response)</span>
2293
+ return operation === Operation.READ &amp;&amp; Array.isArray(response)
2282
2294
  ? output
2283
2295
  : { row: output[0], table }
2284
2296
  }
@@ -2290,7 +2302,7 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
2290
2302
  <div class='footer quiet pad2 space-top1 center small'>
2291
2303
  Code coverage generated by
2292
2304
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2293
- at Tue Feb 14 2023 15:13:55 GMT+0000 (Coordinated Universal Time)
2305
+ at Tue Feb 14 2023 18:11:53 GMT+0000 (Coordinated Universal Time)
2294
2306
  </div>
2295
2307
  <script src="../../../../prettify.js"></script>
2296
2308
  <script>