@budibase/server 1.0.47 → 1.0.49-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/builder/assets/{index.937b2767.js → index.82e12602.js} +234 -231
  2. package/builder/assets/index.83c0944f.css +1 -0
  3. package/builder/assets/{vendor.f9faf6ab.js → vendor.d526bfe8.js} +12 -12
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +2334 -2013
  6. package/coverage/coverage-final.json +100 -95
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +210 -126
  10. package/coverage/lcov-report/api/controllers/auth.js.html +18 -6
  11. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +72 -36
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +53 -53
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +119 -0
  22. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +19 -19
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  26. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  27. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  29. package/coverage/lcov-report/api/controllers/row/index.html +48 -33
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +95 -158
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +41 -17
  33. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +551 -0
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +39 -57
  35. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  36. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  37. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +629 -0
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  39. package/coverage/lcov-report/api/controllers/table/index.html +49 -34
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +53 -77
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +59 -35
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +283 -76
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +30 -24
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +8 -8
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.html +18 -18
  65. package/coverage/lcov-report/api/routes/index.js.html +3 -3
  66. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/{hosting.js.html → migrations.js.html} +17 -14
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  83. package/coverage/lcov-report/automations/actions.js.html +24 -24
  84. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  85. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  86. package/coverage/lcov-report/automations/index.html +1 -1
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -19
  90. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  92. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  96. package/coverage/lcov-report/automations/steps/index.html +13 -13
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  102. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  104. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  115. package/coverage/lcov-report/automations/utils.js.html +32 -32
  116. package/coverage/lcov-report/constants/index.html +11 -11
  117. package/coverage/lcov-report/constants/index.js.html +68 -32
  118. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  119. package/coverage/lcov-report/constants/screens.js.html +4 -4
  120. package/coverage/lcov-report/db/client.js.html +18 -18
  121. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  122. package/coverage/lcov-report/db/index.html +15 -15
  123. package/coverage/lcov-report/db/index.js.html +3 -3
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +18 -18
  125. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +38 -41
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +15 -15
  128. package/coverage/lcov-report/db/newid.js.html +4 -4
  129. package/coverage/lcov-report/db/utils.js.html +86 -86
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +5 -5
  133. package/coverage/lcov-report/events/utils.js.html +3 -3
  134. package/coverage/lcov-report/index.html +117 -102
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +166 -64
  139. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  140. package/coverage/lcov-report/middleware/currentapp.js.html +29 -29
  141. package/coverage/lcov-report/middleware/index.html +30 -30
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  143. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +270 -42
  146. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +15 -15
  149. package/coverage/lcov-report/threads/index.js.html +10 -10
  150. package/coverage/lcov-report/threads/query.js.html +23 -8
  151. package/coverage/lcov-report/threads/utils.js.html +14 -14
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  154. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  155. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  156. package/coverage/lcov-report/utilities/global.js.html +26 -26
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +25 -25
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +115 -79
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  167. package/coverage/lcov-report/utilities/security.js.html +8 -8
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  170. package/coverage/lcov-report/utilities/usageQuota/index.js.html +356 -0
  171. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +302 -0
  172. package/coverage/lcov-report/{api/controllers/hosting.js.html → utilities/usageQuota/usageQuoteReset.js.html} +36 -48
  173. package/coverage/lcov-report/utilities/users.js.html +5 -5
  174. package/coverage/lcov-report/utilities/workerRequests.js.html +39 -108
  175. package/coverage/lcov.info +3665 -3040
  176. package/dist/api/controllers/application.js +61 -34
  177. package/dist/api/controllers/auth.js +4 -0
  178. package/dist/api/controllers/datasource.js +11 -0
  179. package/dist/api/controllers/migrations.js +21 -0
  180. package/dist/api/controllers/row/ExternalRequest.js +2 -1
  181. package/dist/api/controllers/row/internal.js +30 -53
  182. package/dist/api/controllers/row/internalSearch.js +12 -4
  183. package/dist/api/controllers/row/staticFormula.js +147 -0
  184. package/dist/api/controllers/row/utils.js +6 -8
  185. package/dist/api/controllers/static/index.js +59 -10
  186. package/dist/api/controllers/table/bulkFormula.js +160 -0
  187. package/dist/api/controllers/table/index.js +12 -9
  188. package/dist/api/controllers/table/internal.js +9 -0
  189. package/dist/api/controllers/table/utils.js +56 -14
  190. package/dist/api/controllers/user.js +2 -0
  191. package/dist/api/routes/index.js +2 -2
  192. package/dist/api/routes/migrations.js +9 -0
  193. package/dist/api/routes/static.js +2 -1
  194. package/dist/app.js +35 -5
  195. package/dist/automations/steps/createRow.js +2 -4
  196. package/dist/automations/steps/deleteRow.js +1 -4
  197. package/dist/constants/index.js +12 -5
  198. package/dist/db/linkedRows/index.js +4 -5
  199. package/dist/definitions/datasource.js +1 -0
  200. package/dist/environment.js +2 -0
  201. package/dist/integrations/base/sql.js +13 -6
  202. package/dist/integrations/googlesheets.js +340 -0
  203. package/dist/integrations/index.js +3 -0
  204. package/dist/integrations/utils.js +57 -8
  205. package/dist/middleware/authorized.js +55 -30
  206. package/dist/middleware/usageQuota.js +80 -13
  207. package/dist/migrations/functions/appUrls.js +37 -0
  208. package/dist/migrations/functions/quotas1.js +50 -0
  209. package/dist/migrations/functions/usageQuotas/index.js +20 -0
  210. package/dist/migrations/functions/usageQuotas/syncApps.js +32 -0
  211. package/dist/migrations/functions/usageQuotas/syncRows.js +35 -0
  212. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  213. package/dist/migrations/index.js +62 -0
  214. package/dist/package.json +8 -5
  215. package/dist/tests/utilities/TestConfiguration.js +13 -6
  216. package/dist/threads/query.js +4 -0
  217. package/dist/tsconfig.tsbuildinfo +1 -1
  218. package/dist/utilities/rowProcessor/index.js +18 -11
  219. package/dist/utilities/rowProcessor/utils.js +14 -4
  220. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +44 -31
  221. package/dist/utilities/usageQuota/rows.js +77 -0
  222. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  223. package/dist/utilities/workerRequests.js +0 -20
  224. package/nodemon.json +1 -1
  225. package/package.json +9 -6
  226. package/src/api/controllers/application.js +52 -24
  227. package/src/api/controllers/auth.js +4 -0
  228. package/src/api/controllers/datasource.js +12 -0
  229. package/src/api/controllers/migrations.js +13 -0
  230. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  231. package/src/api/controllers/row/internal.js +29 -50
  232. package/src/api/controllers/row/internalSearch.js +12 -4
  233. package/src/api/controllers/row/staticFormula.js +157 -0
  234. package/src/api/controllers/row/utils.js +6 -12
  235. package/src/api/controllers/static/index.js +63 -10
  236. package/src/api/controllers/table/bulkFormula.js +183 -0
  237. package/src/api/controllers/table/index.js +16 -24
  238. package/src/api/controllers/table/internal.js +9 -1
  239. package/src/api/controllers/table/utils.js +80 -11
  240. package/src/api/controllers/user.js +2 -0
  241. package/src/api/routes/index.js +2 -2
  242. package/src/api/routes/migrations.js +14 -0
  243. package/src/api/routes/static.js +5 -0
  244. package/src/api/routes/tests/application.spec.js +2 -2
  245. package/src/api/routes/tests/auth.spec.js +1 -2
  246. package/src/api/routes/tests/static.spec.js +98 -0
  247. package/src/app.ts +18 -5
  248. package/src/automations/steps/createRow.js +2 -4
  249. package/src/automations/steps/deleteRow.js +1 -4
  250. package/src/constants/index.js +17 -5
  251. package/src/db/linkedRows/index.js +4 -5
  252. package/src/definitions/common.ts +3 -0
  253. package/src/definitions/datasource.ts +3 -0
  254. package/src/environment.js +2 -0
  255. package/src/integrations/base/sql.ts +14 -7
  256. package/src/integrations/googlesheets.ts +353 -0
  257. package/src/integrations/index.ts +3 -0
  258. package/src/integrations/tests/sql.spec.js +16 -0
  259. package/src/integrations/utils.ts +71 -10
  260. package/src/middleware/authorized.js +64 -30
  261. package/src/middleware/tests/authorized.spec.js +6 -4
  262. package/src/middleware/tests/usageQuota.spec.js +18 -24
  263. package/src/middleware/usageQuota.js +91 -15
  264. package/src/migrations/functions/appUrls.ts +25 -0
  265. package/src/migrations/functions/quotas1.ts +20 -0
  266. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  267. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  268. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  269. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  270. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  271. package/src/migrations/functions/usageQuotas/syncRows.ts +21 -0
  272. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  273. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  274. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  275. package/src/migrations/index.ts +56 -0
  276. package/src/tests/utilities/TestConfiguration.js +14 -6
  277. package/src/threads/query.js +5 -0
  278. package/src/utilities/rowProcessor/index.js +24 -12
  279. package/src/utilities/rowProcessor/utils.js +23 -7
  280. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  281. package/src/utilities/usageQuota/index.js +92 -0
  282. package/src/utilities/usageQuota/rows.js +74 -0
  283. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  284. package/src/utilities/workerRequests.js +0 -23
  285. package/builder/assets/index.39e01193.css +0 -1
  286. package/dist/api/controllers/hosting.js +0 -30
  287. package/dist/api/routes/hosting.js +0 -11
  288. package/src/api/controllers/hosting.js +0 -22
  289. package/src/api/routes/hosting.js +0 -13
  290. package/src/api/routes/tests/hosting.spec.js +0 -36
  291. package/src/utilities/usageQuota.js +0 -73
@@ -0,0 +1,629 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for api/controllers/table/bulkFormula.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">api/controllers/table</a> bulkFormula.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">69.62% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>55/79</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">43.63% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>24/55</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">81.25% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>13/16</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">69.73% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>53/76</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ </div>
58
+ <div class='status-line medium'></div>
59
+ <pre><table class="coverage">
60
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
+ <a name='L2'></a><a href='#L2'>2</a>
62
+ <a name='L3'></a><a href='#L3'>3</a>
63
+ <a name='L4'></a><a href='#L4'>4</a>
64
+ <a name='L5'></a><a href='#L5'>5</a>
65
+ <a name='L6'></a><a href='#L6'>6</a>
66
+ <a name='L7'></a><a href='#L7'>7</a>
67
+ <a name='L8'></a><a href='#L8'>8</a>
68
+ <a name='L9'></a><a href='#L9'>9</a>
69
+ <a name='L10'></a><a href='#L10'>10</a>
70
+ <a name='L11'></a><a href='#L11'>11</a>
71
+ <a name='L12'></a><a href='#L12'>12</a>
72
+ <a name='L13'></a><a href='#L13'>13</a>
73
+ <a name='L14'></a><a href='#L14'>14</a>
74
+ <a name='L15'></a><a href='#L15'>15</a>
75
+ <a name='L16'></a><a href='#L16'>16</a>
76
+ <a name='L17'></a><a href='#L17'>17</a>
77
+ <a name='L18'></a><a href='#L18'>18</a>
78
+ <a name='L19'></a><a href='#L19'>19</a>
79
+ <a name='L20'></a><a href='#L20'>20</a>
80
+ <a name='L21'></a><a href='#L21'>21</a>
81
+ <a name='L22'></a><a href='#L22'>22</a>
82
+ <a name='L23'></a><a href='#L23'>23</a>
83
+ <a name='L24'></a><a href='#L24'>24</a>
84
+ <a name='L25'></a><a href='#L25'>25</a>
85
+ <a name='L26'></a><a href='#L26'>26</a>
86
+ <a name='L27'></a><a href='#L27'>27</a>
87
+ <a name='L28'></a><a href='#L28'>28</a>
88
+ <a name='L29'></a><a href='#L29'>29</a>
89
+ <a name='L30'></a><a href='#L30'>30</a>
90
+ <a name='L31'></a><a href='#L31'>31</a>
91
+ <a name='L32'></a><a href='#L32'>32</a>
92
+ <a name='L33'></a><a href='#L33'>33</a>
93
+ <a name='L34'></a><a href='#L34'>34</a>
94
+ <a name='L35'></a><a href='#L35'>35</a>
95
+ <a name='L36'></a><a href='#L36'>36</a>
96
+ <a name='L37'></a><a href='#L37'>37</a>
97
+ <a name='L38'></a><a href='#L38'>38</a>
98
+ <a name='L39'></a><a href='#L39'>39</a>
99
+ <a name='L40'></a><a href='#L40'>40</a>
100
+ <a name='L41'></a><a href='#L41'>41</a>
101
+ <a name='L42'></a><a href='#L42'>42</a>
102
+ <a name='L43'></a><a href='#L43'>43</a>
103
+ <a name='L44'></a><a href='#L44'>44</a>
104
+ <a name='L45'></a><a href='#L45'>45</a>
105
+ <a name='L46'></a><a href='#L46'>46</a>
106
+ <a name='L47'></a><a href='#L47'>47</a>
107
+ <a name='L48'></a><a href='#L48'>48</a>
108
+ <a name='L49'></a><a href='#L49'>49</a>
109
+ <a name='L50'></a><a href='#L50'>50</a>
110
+ <a name='L51'></a><a href='#L51'>51</a>
111
+ <a name='L52'></a><a href='#L52'>52</a>
112
+ <a name='L53'></a><a href='#L53'>53</a>
113
+ <a name='L54'></a><a href='#L54'>54</a>
114
+ <a name='L55'></a><a href='#L55'>55</a>
115
+ <a name='L56'></a><a href='#L56'>56</a>
116
+ <a name='L57'></a><a href='#L57'>57</a>
117
+ <a name='L58'></a><a href='#L58'>58</a>
118
+ <a name='L59'></a><a href='#L59'>59</a>
119
+ <a name='L60'></a><a href='#L60'>60</a>
120
+ <a name='L61'></a><a href='#L61'>61</a>
121
+ <a name='L62'></a><a href='#L62'>62</a>
122
+ <a name='L63'></a><a href='#L63'>63</a>
123
+ <a name='L64'></a><a href='#L64'>64</a>
124
+ <a name='L65'></a><a href='#L65'>65</a>
125
+ <a name='L66'></a><a href='#L66'>66</a>
126
+ <a name='L67'></a><a href='#L67'>67</a>
127
+ <a name='L68'></a><a href='#L68'>68</a>
128
+ <a name='L69'></a><a href='#L69'>69</a>
129
+ <a name='L70'></a><a href='#L70'>70</a>
130
+ <a name='L71'></a><a href='#L71'>71</a>
131
+ <a name='L72'></a><a href='#L72'>72</a>
132
+ <a name='L73'></a><a href='#L73'>73</a>
133
+ <a name='L74'></a><a href='#L74'>74</a>
134
+ <a name='L75'></a><a href='#L75'>75</a>
135
+ <a name='L76'></a><a href='#L76'>76</a>
136
+ <a name='L77'></a><a href='#L77'>77</a>
137
+ <a name='L78'></a><a href='#L78'>78</a>
138
+ <a name='L79'></a><a href='#L79'>79</a>
139
+ <a name='L80'></a><a href='#L80'>80</a>
140
+ <a name='L81'></a><a href='#L81'>81</a>
141
+ <a name='L82'></a><a href='#L82'>82</a>
142
+ <a name='L83'></a><a href='#L83'>83</a>
143
+ <a name='L84'></a><a href='#L84'>84</a>
144
+ <a name='L85'></a><a href='#L85'>85</a>
145
+ <a name='L86'></a><a href='#L86'>86</a>
146
+ <a name='L87'></a><a href='#L87'>87</a>
147
+ <a name='L88'></a><a href='#L88'>88</a>
148
+ <a name='L89'></a><a href='#L89'>89</a>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a>
153
+ <a name='L94'></a><a href='#L94'>94</a>
154
+ <a name='L95'></a><a href='#L95'>95</a>
155
+ <a name='L96'></a><a href='#L96'>96</a>
156
+ <a name='L97'></a><a href='#L97'>97</a>
157
+ <a name='L98'></a><a href='#L98'>98</a>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
165
+ <a name='L106'></a><a href='#L106'>106</a>
166
+ <a name='L107'></a><a href='#L107'>107</a>
167
+ <a name='L108'></a><a href='#L108'>108</a>
168
+ <a name='L109'></a><a href='#L109'>109</a>
169
+ <a name='L110'></a><a href='#L110'>110</a>
170
+ <a name='L111'></a><a href='#L111'>111</a>
171
+ <a name='L112'></a><a href='#L112'>112</a>
172
+ <a name='L113'></a><a href='#L113'>113</a>
173
+ <a name='L114'></a><a href='#L114'>114</a>
174
+ <a name='L115'></a><a href='#L115'>115</a>
175
+ <a name='L116'></a><a href='#L116'>116</a>
176
+ <a name='L117'></a><a href='#L117'>117</a>
177
+ <a name='L118'></a><a href='#L118'>118</a>
178
+ <a name='L119'></a><a href='#L119'>119</a>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a>
212
+ <a name='L153'></a><a href='#L153'>153</a>
213
+ <a name='L154'></a><a href='#L154'>154</a>
214
+ <a name='L155'></a><a href='#L155'>155</a>
215
+ <a name='L156'></a><a href='#L156'>156</a>
216
+ <a name='L157'></a><a href='#L157'>157</a>
217
+ <a name='L158'></a><a href='#L158'>158</a>
218
+ <a name='L159'></a><a href='#L159'>159</a>
219
+ <a name='L160'></a><a href='#L160'>160</a>
220
+ <a name='L161'></a><a href='#L161'>161</a>
221
+ <a name='L162'></a><a href='#L162'>162</a>
222
+ <a name='L163'></a><a href='#L163'>163</a>
223
+ <a name='L164'></a><a href='#L164'>164</a>
224
+ <a name='L165'></a><a href='#L165'>165</a>
225
+ <a name='L166'></a><a href='#L166'>166</a>
226
+ <a name='L167'></a><a href='#L167'>167</a>
227
+ <a name='L168'></a><a href='#L168'>168</a>
228
+ <a name='L169'></a><a href='#L169'>169</a>
229
+ <a name='L170'></a><a href='#L170'>170</a>
230
+ <a name='L171'></a><a href='#L171'>171</a>
231
+ <a name='L172'></a><a href='#L172'>172</a>
232
+ <a name='L173'></a><a href='#L173'>173</a>
233
+ <a name='L174'></a><a href='#L174'>174</a>
234
+ <a name='L175'></a><a href='#L175'>175</a>
235
+ <a name='L176'></a><a href='#L176'>176</a>
236
+ <a name='L177'></a><a href='#L177'>177</a>
237
+ <a name='L178'></a><a href='#L178'>178</a>
238
+ <a name='L179'></a><a href='#L179'>179</a>
239
+ <a name='L180'></a><a href='#L180'>180</a>
240
+ <a name='L181'></a><a href='#L181'>181</a>
241
+ <a name='L182'></a><a href='#L182'>182</a>
242
+ <a name='L183'></a><a href='#L183'>183</a>
243
+ <a name='L184'></a><a href='#L184'>184</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">39x</span>
244
+ <span class="cline-any cline-yes">39x</span>
245
+ <span class="cline-any cline-yes">39x</span>
246
+ <span class="cline-any cline-yes">39x</span>
247
+ <span class="cline-any cline-yes">39x</span>
248
+ <span class="cline-any cline-yes">39x</span>
249
+ <span class="cline-any cline-yes">39x</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-yes">1354x</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-yes">260x</span>
264
+ <span class="cline-any cline-yes">260x</span>
265
+ <span class="cline-any cline-yes">260x</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-yes">1094x</span>
268
+ <span class="cline-any cline-yes">1094x</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-no">&nbsp;</span>
271
+ <span class="cline-any cline-no">&nbsp;</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-no">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-yes">260x</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-yes">103x</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-yes">103x</span>
290
+ <span class="cline-any cline-yes">236x</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-yes">103x</span>
293
+ <span class="cline-any cline-yes">103x</span>
294
+ <span class="cline-any cline-yes">263x</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-yes">103x</span>
298
+ <span class="cline-any cline-yes">227x</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">227x</span>
301
+ <span class="cline-any cline-yes">2x</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-yes">227x</span>
304
+ <span class="cline-any cline-yes">227x</span>
305
+ <span class="cline-any cline-no">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-yes">227x</span>
310
+ <span class="cline-any cline-yes">227x</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-no">&nbsp;</span>
313
+ <span class="cline-any cline-no">&nbsp;</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-no">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">103x</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-yes">103x</span>
351
+ <span class="cline-any cline-yes">236x</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-yes">103x</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-yes">103x</span>
357
+ <span class="cline-any cline-yes">265x</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-yes">103x</span>
361
+ <span class="cline-any cline-yes">135x</span>
362
+ <span class="cline-any cline-yes">135x</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-no">&nbsp;</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-yes">103x</span>
371
+ <span class="cline-any cline-yes">101x</span>
372
+ <span class="cline-any cline-yes">33x</span>
373
+ <span class="cline-any cline-yes">33x</span>
374
+ <span class="cline-any cline-yes">33x</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-no">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-no">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-neutral">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-no">&nbsp;</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-yes">103x</span>
393
+ <span class="cline-any cline-yes">178x</span>
394
+ <span class="cline-any cline-yes">135x</span>
395
+ <span class="cline-any cline-no">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-yes">101x</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-yes">260x</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-yes">101x</span>
411
+ <span class="cline-any cline-no">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-yes">39x</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-yes">103x</span>
421
+ <span class="cline-any cline-yes">103x</span>
422
+ <span class="cline-any cline-yes">103x</span>
423
+ <span class="cline-any cline-yes">101x</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../../db")
427
+ const { FieldTypes, FormulaTypes } = require("../../../constants")
428
+ const { getAllInternalTables, clearColumns } = require("./utils")
429
+ const { doesContainStrings } = require("@budibase/string-templates")
430
+ const { cloneDeep } = require("lodash/fp")
431
+ const { isEqual, uniq } = require("lodash")
432
+ const { updateAllFormulasInTable } = require("../row/staticFormula")
433
+ &nbsp;
434
+ function isStaticFormula(column) {
435
+ return (
436
+ column.type === FieldTypes.FORMULA &amp;&amp;
437
+ <span class="branch-1 cbranch-no" title="branch not covered" > column.formulaType === FormulaTypes.STATIC</span>
438
+ )
439
+ }
440
+ &nbsp;
441
+ /**
442
+ * This retrieves the formula columns from a table schema that use a specified column name
443
+ * in the formula.
444
+ */
445
+ function getFormulaThatUseColumn(table, columnNames) {
446
+ let formula = []
447
+ columnNames = Array.isArray(columnNames) ? <span class="branch-0 cbranch-no" title="branch not covered" >columnNames </span>: [columnNames]
448
+ for (let column of Object.values(table.schema)) {
449
+ // not a static formula, or doesn't contain a relationship
450
+ if (!isStaticFormula(column)) {
451
+ continue
452
+ }
453
+ <span class="cstat-no" title="statement not covered" > if (!doesContainStrings(column.formula, columnNames)) {</span>
454
+ <span class="cstat-no" title="statement not covered" > continue</span>
455
+ }
456
+ <span class="cstat-no" title="statement not covered" > formula.push(column.name)</span>
457
+ }
458
+ return formula
459
+ }
460
+ &nbsp;
461
+ /**
462
+ * This functions checks for when a related table, column or related column is deleted, if any
463
+ * tables need to have the formula column removed.
464
+ */
465
+ async function checkIfFormulaNeedsCleared(
466
+ appId,
467
+ table,
468
+ { oldTable, deletion }
469
+ ) {
470
+ const db = new CouchDB(appId)
471
+ // start by retrieving all tables, remove the current table from the list
472
+ const tables = (await getAllInternalTables(appId)).filter(
473
+ tbl =&gt; tbl._id !== table._id
474
+ )
475
+ const schemaToUse = oldTable ? oldTable.schema : table.schema
476
+ let removedColumns = Object.values(schemaToUse).filter(
477
+ column =&gt; deletion || !table.schema[column.name]
478
+ )
479
+ // remove any formula columns that used related columns
480
+ for (let removed of removedColumns) {
481
+ let tableToUse = table
482
+ // if relationship, get the related table
483
+ if (removed.type === FieldTypes.LINK) {
484
+ tableToUse = tables.find(table =&gt; table._id === removed.tableId)
485
+ }
486
+ const columnsToDelete = getFormulaThatUseColumn(tableToUse, removed.name)
487
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (columnsToDelete.length &gt; 0) {
488
+ <span class="cstat-no" title="statement not covered" > await clearColumns(db, table, columnsToDelete)</span>
489
+ }
490
+ // need a special case, where a column has been removed from this table, but was used
491
+ // in a different, related tables formula
492
+ if (!table.relatedFormula) {
493
+ continue
494
+ }
495
+ <span class="cstat-no" title="statement not covered" > for (let relatedTableId of table.relatedFormula) {</span>
496
+ const relatedColumns = <span class="cstat-no" title="statement not covered" >Object.values(table.schema).filter(</span>
497
+ <span class="fstat-no" title="function not covered" > co</span>lumn =&gt; <span class="cstat-no" title="statement not covered" >column.tableId === relatedTableId</span>
498
+ )
499
+ const relatedTable = <span class="cstat-no" title="statement not covered" >tables.find(<span class="fstat-no" title="function not covered" >ta</span>ble =&gt; <span class="cstat-no" title="statement not covered" >table._id === relatedTableId)</span></span>
500
+ // look to see if the column was used in a relationship formula,
501
+ // relationships won't be used for this
502
+ <span class="cstat-no" title="statement not covered" > if (relatedTable &amp;&amp; relatedColumns &amp;&amp; removed.type !== FieldTypes.LINK) {</span>
503
+ let relatedFormulaToRemove = <span class="cstat-no" title="statement not covered" >[]</span>
504
+ <span class="cstat-no" title="statement not covered" > for (let column of relatedColumns) {</span>
505
+ <span class="cstat-no" title="statement not covered" > relatedFormulaToRemove = relatedFormulaToRemove.concat(</span>
506
+ getFormulaThatUseColumn(relatedTable, [
507
+ column.fieldName,
508
+ removed.name,
509
+ ])
510
+ )
511
+ }
512
+ <span class="cstat-no" title="statement not covered" > if (relatedFormulaToRemove.length &gt; 0) {</span>
513
+ <span class="cstat-no" title="statement not covered" > await clearColumns(db, relatedTable, uniq(relatedFormulaToRemove))</span>
514
+ }
515
+ }
516
+ }
517
+ }
518
+ }
519
+ &nbsp;
520
+ /**
521
+ * This function adds a note to related tables that they are
522
+ * used in a static formula - so that the link controller
523
+ * can manage hydrating related rows formula fields. This is
524
+ * specifically only for static formula.
525
+ */
526
+ async function updateRelatedFormulaLinksOnTables(
527
+ appId,
528
+ table,
529
+ { deletion } = <span class="branch-0 cbranch-no" title="branch not covered" >{ deletion: false }</span>
530
+ ) {
531
+ const db = new CouchDB(appId)
532
+ // start by retrieving all tables, remove the current table from the list
533
+ const tables = (await getAllInternalTables(appId)).filter(
534
+ tbl =&gt; tbl._id !== table._id
535
+ )
536
+ // clone the tables, so we can compare at end
537
+ const initialTables = cloneDeep(tables)
538
+ // first find the related column names
539
+ const relatedColumns = Object.values(table.schema).filter(
540
+ col =&gt; col.type === FieldTypes.LINK
541
+ )
542
+ // we start by removing the formula field from all tables
543
+ for (let otherTable of tables) {
544
+ if (!otherTable.relatedFormula) {
545
+ continue
546
+ }
547
+ const index = <span class="cstat-no" title="statement not covered" >otherTable.relatedFormula.indexOf(table._id)</span>
548
+ <span class="cstat-no" title="statement not covered" > if (index !== -1) {</span>
549
+ <span class="cstat-no" title="statement not covered" > otherTable.relatedFormula.splice(index, 1)</span>
550
+ }
551
+ }
552
+ // if deleting, just remove the table IDs, don't try add
553
+ if (!deletion) {
554
+ for (let relatedCol of relatedColumns) {
555
+ let columns = getFormulaThatUseColumn(table, relatedCol.name)
556
+ if (!columns || columns.length === 0) {
557
+ continue
558
+ }
559
+ const relatedTable = <span class="cstat-no" title="statement not covered" >tables.find(</span>
560
+ <span class="fstat-no" title="function not covered" > re</span>lated =&gt; <span class="cstat-no" title="statement not covered" >related._id === relatedCol.tableId</span>
561
+ )
562
+ // check if the table is already in the list of related formula, if it isn't, then add it
563
+ <span class="cstat-no" title="statement not covered" > if (</span>
564
+ relatedTable &amp;&amp;
565
+ (!relatedTable.relatedFormula ||
566
+ !relatedTable.relatedFormula.includes(table._id))
567
+ ) {
568
+ <span class="cstat-no" title="statement not covered" > relatedTable.relatedFormula = relatedTable.relatedFormula</span>
569
+ ? [...relatedTable.relatedFormula, table._id]
570
+ : [table._id]
571
+ }
572
+ }
573
+ }
574
+ // now we just need to compare all the tables and see if any need saved
575
+ for (let initial of initialTables) {
576
+ const found = tables.find(tbl =&gt; initial._id === tbl._id)
577
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (found &amp;&amp; !isEqual(initial, found)) {
578
+ <span class="cstat-no" title="statement not covered" > await db.put(found)</span>
579
+ }
580
+ }
581
+ }
582
+ &nbsp;
583
+ async function checkIfFormulaUpdated(appId, table, { oldTable }) {
584
+ // look to see if any formula values have changed
585
+ const shouldUpdate = Object.values(table.schema).find(
586
+ column =&gt;
587
+ isStaticFormula(column) &amp;&amp;
588
+ (<span class="branch-1 cbranch-no" title="branch not covered" >!oldTable </span>||
589
+ <span class="branch-2 cbranch-no" title="branch not covered" > !oldTable.schema[column.name] </span>||
590
+ <span class="branch-3 cbranch-no" title="branch not covered" > !isEqual(oldTable.schema[column.name], column))</span>
591
+ )
592
+ // if a static formula column has updated, then need to run the update
593
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (shouldUpdate != null) {
594
+ <span class="cstat-no" title="statement not covered" > await updateAllFormulasInTable(appId, table)</span>
595
+ }
596
+ }
597
+ &nbsp;
598
+ exports.runStaticFormulaChecks = async (
599
+ appId,
600
+ table,
601
+ { oldTable, deletion }
602
+ ) =&gt; {
603
+ await updateRelatedFormulaLinksOnTables(appId, table, { deletion })
604
+ await checkIfFormulaNeedsCleared(appId, table, { oldTable, deletion })
605
+ if (!deletion) {
606
+ await checkIfFormulaUpdated(appId, table, { oldTable })
607
+ }
608
+ }
609
+ &nbsp;</pre></td></tr></table></pre>
610
+
611
+ <div class='push'></div><!-- for sticky footer -->
612
+ </div><!-- /wrapper -->
613
+ <div class='footer quiet pad2 space-top1 center small'>
614
+ Code coverage generated by
615
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
616
+ at Mon Jan 31 2022 16:54:35 GMT+0000 (Coordinated Universal Time)
617
+ </div>
618
+ </div>
619
+ <script src="../../../prettify.js"></script>
620
+ <script>
621
+ window.onload = function () {
622
+ prettyPrint();
623
+ };
624
+ </script>
625
+ <script src="../../../sorter.js"></script>
626
+ <script src="../../../block-navigation.js"></script>
627
+ </body>
628
+ </html>
629
+