@budibase/server 1.0.161 → 1.0.162

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 (169) hide show
  1. package/builder/assets/{index.29f75f3c.js → index.54fa98bf.js} +1 -1
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +96 -88
  4. package/coverage/coverage-final.json +2 -2
  5. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/index.html +1 -1
  15. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.html +24 -24
  40. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/utils.js.html +14 -8
  42. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +111 -48
  43. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  44. package/coverage/lcov-report/api/index.html +1 -1
  45. package/coverage/lcov-report/api/index.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/index.html +1 -1
  57. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  74. package/coverage/lcov-report/automations/actions.js.html +1 -1
  75. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  76. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  77. package/coverage/lcov-report/automations/index.html +1 -1
  78. package/coverage/lcov-report/automations/index.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/index.html +1 -1
  86. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  105. package/coverage/lcov-report/constants/index.html +1 -1
  106. package/coverage/lcov-report/constants/index.js.html +1 -1
  107. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  108. package/coverage/lcov-report/constants/screens.js.html +1 -1
  109. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  110. package/coverage/lcov-report/db/index.html +1 -1
  111. package/coverage/lcov-report/db/index.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  116. package/coverage/lcov-report/db/newid.js.html +1 -1
  117. package/coverage/lcov-report/db/utils.js.html +1 -1
  118. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  119. package/coverage/lcov-report/events/index.html +1 -1
  120. package/coverage/lcov-report/events/index.js.html +1 -1
  121. package/coverage/lcov-report/events/utils.js.html +1 -1
  122. package/coverage/lcov-report/index.html +19 -19
  123. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  124. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  125. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  126. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  127. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  128. package/coverage/lcov-report/middleware/index.html +1 -1
  129. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  130. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  131. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  132. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  133. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  134. package/coverage/lcov-report/threads/automation.js.html +1 -1
  135. package/coverage/lcov-report/threads/index.html +1 -1
  136. package/coverage/lcov-report/threads/query.js.html +1 -1
  137. package/coverage/lcov-report/threads/utils.js.html +1 -1
  138. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  139. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  140. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  141. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  142. package/coverage/lcov-report/utilities/global.js.html +1 -1
  143. package/coverage/lcov-report/utilities/index.html +1 -1
  144. package/coverage/lcov-report/utilities/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  146. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  147. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  148. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  150. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  151. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  152. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  153. package/coverage/lcov-report/utilities/security.js.html +1 -1
  154. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  156. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  157. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  158. package/coverage/lcov-report/utilities/users.js.html +1 -1
  159. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  160. package/coverage/lcov.info +164 -148
  161. package/dist/api/controllers/view/utils.js +4 -2
  162. package/dist/api/controllers/view/viewBuilder.js +22 -8
  163. package/dist/package.json +5 -5
  164. package/dist/tsconfig.build.tsbuildinfo +1 -1
  165. package/package.json +6 -6
  166. package/src/api/controllers/view/tests/__snapshots__/viewBuilder.spec.js.snap +58 -1
  167. package/src/api/controllers/view/tests/viewBuilder.spec.js +18 -0
  168. package/src/api/controllers/view/utils.js +4 -2
  169. package/src/api/controllers/view/viewBuilder.js +32 -11
@@ -103,7 +103,7 @@ exports.save = <span class="fstat-no" title="function not covered" >as</span>ync
103
103
  <div class='footer quiet pad2 space-top1 center small'>
104
104
  Code coverage generated by
105
105
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
106
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
106
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
107
107
  </div>
108
108
  <script src="../../prettify.js"></script>
109
109
  <script>
@@ -589,7 +589,7 @@ exports.runStaticFormulaChecks = async (table, { oldTable, deletion }) =&gt; {
589
589
  <div class='footer quiet pad2 space-top1 center small'>
590
590
  Code coverage generated by
591
591
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
592
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
592
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
593
593
  </div>
594
594
  <script src="../../../prettify.js"></script>
595
595
  <script>
@@ -1024,7 +1024,7 @@ exports.bulkImport = <span class="fstat-no" title="function not covered" >as</sp
1024
1024
  <div class='footer quiet pad2 space-top1 center small'>
1025
1025
  Code coverage generated by
1026
1026
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1027
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
1027
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
1028
1028
  </div>
1029
1029
  <script src="../../../prettify.js"></script>
1030
1030
  <script>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
134
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
135
135
  </div>
136
136
  <script src="../../../prettify.js"></script>
137
137
  <script>
@@ -367,7 +367,7 @@ exports.validateCSVSchema = async function (ctx) {
367
367
  <div class='footer quiet pad2 space-top1 center small'>
368
368
  Code coverage generated by
369
369
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
370
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
370
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
371
371
  </div>
372
372
  <script src="../../../prettify.js"></script>
373
373
  <script>
@@ -187,7 +187,7 @@ exports.downloadTemplate = async function (ctx) {
187
187
  <div class='footer quiet pad2 space-top1 center small'>
188
188
  Code coverage generated by
189
189
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
190
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
190
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
191
191
  </div>
192
192
  <script src="../../prettify.js"></script>
193
193
  <script>
@@ -772,7 +772,7 @@ exports.getFlags = <span class="fstat-no" title="function not covered" >as</span
772
772
  <div class='footer quiet pad2 space-top1 center small'>
773
773
  Code coverage generated by
774
774
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
775
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
775
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
776
776
  </div>
777
777
  <script src="../../prettify.js"></script>
778
778
  <script>
@@ -148,7 +148,7 @@ exports.ExportFormats = {
148
148
  <div class='footer quiet pad2 space-top1 center small'>
149
149
  Code coverage generated by
150
150
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
151
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
151
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
152
152
  </div>
153
153
  <script src="../../../prettify.js"></script>
154
154
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">73.84% </span>
26
+ <span class="strong">75.86% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>144/195</span>
28
+ <span class='fraction'>154/203</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">63.85% </span>
33
+ <span class="strong">66.29% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>53/83</span>
35
+ <span class='fraction'>59/89</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">72% </span>
40
+ <span class="strong">76.92% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>18/25</span>
42
+ <span class='fraction'>20/26</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">74.09% </span>
47
+ <span class="strong">76.11% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>143/193</span>
49
+ <span class='fraction'>153/201</span>
50
50
  </div>
51
51
 
52
52
 
@@ -110,32 +110,32 @@
110
110
 
111
111
  <tr>
112
112
  <td class="file medium" data-value="utils.js"><a href="utils.js.html">utils.js</a></td>
113
- <td data-value="53.08" class="pic medium">
113
+ <td data-value="53.65" class="pic medium">
114
114
  <div class="chart"><div class="cover-fill" style="width: 53%"></div><div class="cover-empty" style="width: 47%"></div></div>
115
115
  </td>
116
- <td data-value="53.08" class="pct medium">53.08%</td>
117
- <td data-value="81" class="abs medium">43/81</td>
116
+ <td data-value="53.65" class="pct medium">53.65%</td>
117
+ <td data-value="82" class="abs medium">44/82</td>
118
118
  <td data-value="34.61" class="pct low">34.61%</td>
119
119
  <td data-value="26" class="abs low">9/26</td>
120
120
  <td data-value="66.66" class="pct medium">66.66%</td>
121
121
  <td data-value="9" class="abs medium">6/9</td>
122
- <td data-value="53.08" class="pct medium">53.08%</td>
123
- <td data-value="81" class="abs medium">43/81</td>
122
+ <td data-value="53.65" class="pct medium">53.65%</td>
123
+ <td data-value="82" class="abs medium">44/82</td>
124
124
  </tr>
125
125
 
126
126
  <tr>
127
127
  <td class="file high" data-value="viewBuilder.js"><a href="viewBuilder.js.html">viewBuilder.js</a></td>
128
- <td data-value="84.84" class="pic high">
129
- <div class="chart"><div class="cover-fill" style="width: 84%"></div><div class="cover-empty" style="width: 16%"></div></div>
128
+ <td data-value="92.5" class="pic high">
129
+ <div class="chart"><div class="cover-fill" style="width: 92%"></div><div class="cover-empty" style="width: 8%"></div></div>
130
130
  </td>
131
- <td data-value="84.84" class="pct high">84.84%</td>
132
- <td data-value="33" class="abs high">28/33</td>
133
- <td data-value="83.33" class="pct high">83.33%</td>
134
- <td data-value="30" class="abs high">25/30</td>
135
- <td data-value="75" class="pct medium">75%</td>
136
- <td data-value="4" class="abs medium">3/4</td>
137
- <td data-value="84.84" class="pct high">84.84%</td>
138
- <td data-value="33" class="abs high">28/33</td>
131
+ <td data-value="92.5" class="pct high">92.5%</td>
132
+ <td data-value="40" class="abs high">37/40</td>
133
+ <td data-value="86.11" class="pct high">86.11%</td>
134
+ <td data-value="36" class="abs high">31/36</td>
135
+ <td data-value="100" class="pct high">100%</td>
136
+ <td data-value="5" class="abs high">5/5</td>
137
+ <td data-value="92.5" class="pct high">92.5%</td>
138
+ <td data-value="40" class="abs high">37/40</td>
139
139
  </tr>
140
140
 
141
141
  </tbody>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
149
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
150
150
  </div>
151
151
  <script src="../../../prettify.js"></script>
152
152
  <script>
@@ -427,7 +427,7 @@ exports.exportView = async ctx =&gt; {
427
427
  <div class='footer quiet pad2 space-top1 center small'>
428
428
  Code coverage generated by
429
429
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
430
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
430
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
431
431
  </div>
432
432
  <script src="../../../prettify.js"></script>
433
433
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">53.08% </span>
26
+ <span class="strong">53.65% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>43/81</span>
28
+ <span class='fraction'>44/82</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">53.08% </span>
47
+ <span class="strong">53.65% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>43/81</span>
49
+ <span class='fraction'>44/82</span>
50
50
  </div>
51
51
 
52
52
 
@@ -211,7 +211,9 @@
211
211
  <a name='L146'></a><a href='#L146'>146</a>
212
212
  <a name='L147'></a><a href='#L147'>147</a>
213
213
  <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
215
217
  <span class="cline-any cline-neutral">&nbsp;</span>
216
218
  <span class="cline-any cline-neutral">&nbsp;</span>
217
219
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -220,6 +222,7 @@
220
222
  <span class="cline-any cline-yes">41x</span>
221
223
  <span class="cline-any cline-yes">41x</span>
222
224
  <span class="cline-any cline-yes">41x</span>
225
+ <span class="cline-any cline-yes">41x</span>
223
226
  <span class="cline-any cline-neutral">&nbsp;</span>
224
227
  <span class="cline-any cline-yes">41x</span>
225
228
  <span class="cline-any cline-yes">2x</span>
@@ -327,6 +330,7 @@
327
330
  <span class="cline-any cline-yes">41x</span>
328
331
  <span class="cline-any cline-neutral">&nbsp;</span>
329
332
  <span class="cline-any cline-no">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
334
  <span class="cline-any cline-no">&nbsp;</span>
331
335
  <span class="cline-any cline-no">&nbsp;</span>
332
336
  <span class="cline-any cline-no">&nbsp;</span>
@@ -368,6 +372,7 @@
368
372
  } = require("../../../db/utils")
369
373
  const env = require("../../../environment")
370
374
  const { getAppDB } = require("@budibase/backend-core/context")
375
+ const viewBuilder = require("./viewBuilder")
371
376
  &nbsp;
372
377
  exports.getView = async viewName =&gt; {
373
378
  const db = getAppDB()
@@ -475,7 +480,8 @@ exports.deleteView = async viewName =&gt; {
475
480
  exports.migrateToInMemoryView = <span class="fstat-no" title="function not covered" >as</span>ync (db, viewName) =&gt; {
476
481
  // delete the view initially
477
482
  const designDoc = <span class="cstat-no" title="statement not covered" >await db.get("_design/database")</span>
478
- const view = <span class="cstat-no" title="statement not covered" >designDoc.views[viewName]</span>
483
+ // run the view back through the view builder to update it
484
+ const view = <span class="cstat-no" title="statement not covered" >viewBuilder(designDoc.views[viewName].meta)</span>
479
485
  <span class="cstat-no" title="statement not covered" > delete designDoc.views[viewName]</span>
480
486
  <span class="cstat-no" title="statement not covered" > await db.put(designDoc)</span>
481
487
  <span class="cstat-no" title="statement not covered" > await exports.saveView(db, null, viewName, view)</span>
@@ -484,7 +490,7 @@ exports.migrateToInMemoryView = <span class="fstat-no" title="function not cover
484
490
  exports.migrateToDesignView = <span class="fstat-no" title="function not covered" >as</span>ync (db, viewName) =&gt; {
485
491
  let view = <span class="cstat-no" title="statement not covered" >await db.get(generateMemoryViewID(viewName))</span>
486
492
  const designDoc = <span class="cstat-no" title="statement not covered" >await db.get("_design/database")</span>
487
- <span class="cstat-no" title="statement not covered" > designDoc.views[viewName] = view.view</span>
493
+ <span class="cstat-no" title="statement not covered" > designDoc.views[viewName] = viewBuilder(view.view.meta)</span>
488
494
  <span class="cstat-no" title="statement not covered" > await db.put(designDoc)</span>
489
495
  <span class="cstat-no" title="statement not covered" > await db.remove(view._id, view._rev)</span>
490
496
  }
@@ -514,7 +520,7 @@ exports.getFromMemoryDoc = async (db, viewName) =&gt; {
514
520
  <div class='footer quiet pad2 space-top1 center small'>
515
521
  Code coverage generated by
516
522
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
517
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
523
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
518
524
  </div>
519
525
  <script src="../../../prettify.js"></script>
520
526
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">84.84% </span>
26
+ <span class="strong">92.5% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>28/33</span>
28
+ <span class='fraction'>37/40</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">83.33% </span>
33
+ <span class="strong">86.11% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>25/30</span>
35
+ <span class='fraction'>31/36</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">75% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>3/4</span>
42
+ <span class='fraction'>5/5</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">84.84% </span>
47
+ <span class="strong">92.5% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>28/33</span>
49
+ <span class='fraction'>37/40</span>
50
50
  </div>
51
51
 
52
52
 
@@ -225,7 +225,28 @@
225
225
  <a name='L160'></a><a href='#L160'>160</a>
226
226
  <a name='L161'></a><a href='#L161'>161</a>
227
227
  <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">42x</span>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">42x</span>
229
250
  <span class="cline-any cline-neutral">&nbsp;</span>
230
251
  <span class="cline-any cline-neutral">&nbsp;</span>
231
252
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -238,7 +259,13 @@
238
259
  <span class="cline-any cline-neutral">&nbsp;</span>
239
260
  <span class="cline-any cline-neutral">&nbsp;</span>
240
261
  <span class="cline-any cline-yes">42x</span>
241
- <span class="cline-any cline-no">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-yes">42x</span>
268
+ <span class="cline-any cline-yes">7x</span>
242
269
  <span class="cline-any cline-neutral">&nbsp;</span>
243
270
  <span class="cline-any cline-neutral">&nbsp;</span>
244
271
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -296,34 +323,34 @@
296
323
  <span class="cline-any cline-neutral">&nbsp;</span>
297
324
  <span class="cline-any cline-neutral">&nbsp;</span>
298
325
  <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-yes">11x</span>
326
+ <span class="cline-any cline-yes">19x</span>
300
327
  <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-yes">11x</span>
302
- <span class="cline-any cline-yes">11x</span>
303
- <span class="cline-any cline-yes">2x</span>
328
+ <span class="cline-any cline-yes">19x</span>
329
+ <span class="cline-any cline-yes">19x</span>
330
+ <span class="cline-any cline-yes">10x</span>
304
331
  <span class="cline-any cline-yes">1x</span>
305
332
  <span class="cline-any cline-neutral">&nbsp;</span>
306
333
  <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-yes">2x</span>
334
+ <span class="cline-any cline-yes">10x</span>
308
335
  <span class="cline-any cline-no">&nbsp;</span>
309
336
  <span class="cline-any cline-neutral">&nbsp;</span>
310
337
  <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-yes">2x</span>
312
- <span class="cline-any cline-no">&nbsp;</span>
313
- <span class="cline-any cline-yes">2x</span>
338
+ <span class="cline-any cline-yes">10x</span>
314
339
  <span class="cline-any cline-no">&nbsp;</span>
340
+ <span class="cline-any cline-yes">10x</span>
341
+ <span class="cline-any cline-yes">7x</span>
315
342
  <span class="cline-any cline-neutral">&nbsp;</span>
316
343
  <span class="cline-any cline-neutral">&nbsp;</span>
317
- <span class="cline-any cline-yes">2x</span>
344
+ <span class="cline-any cline-yes">3x</span>
318
345
  <span class="cline-any cline-neutral">&nbsp;</span>
319
- <span class="cline-any cline-yes">2x</span>
346
+ <span class="cline-any cline-yes">3x</span>
320
347
  <span class="cline-any cline-neutral">&nbsp;</span>
321
348
  <span class="cline-any cline-neutral">&nbsp;</span>
322
349
  <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-yes">2x</span>
350
+ <span class="cline-any cline-yes">10x</span>
324
351
  <span class="cline-any cline-neutral">&nbsp;</span>
325
352
  <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-yes">11x</span>
353
+ <span class="cline-any cline-yes">19x</span>
327
354
  <span class="cline-any cline-neutral">&nbsp;</span>
328
355
  <span class="cline-any cline-neutral">&nbsp;</span>
329
356
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -333,7 +360,7 @@
333
360
  <span class="cline-any cline-neutral">&nbsp;</span>
334
361
  <span class="cline-any cline-neutral">&nbsp;</span>
335
362
  <span class="cline-any cline-neutral">&nbsp;</span>
336
- <span class="cline-any cline-yes">11x</span>
363
+ <span class="cline-any cline-yes">12x</span>
337
364
  <span class="cline-any cline-neutral">&nbsp;</span>
338
365
  <span class="cline-any cline-neutral">&nbsp;</span>
339
366
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -349,26 +376,41 @@
349
376
  <span class="cline-any cline-neutral">&nbsp;</span>
350
377
  <span class="cline-any cline-neutral">&nbsp;</span>
351
378
  <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-yes">11x</span>
379
+ <span class="cline-any cline-yes">12x</span>
353
380
  <span class="cline-any cline-no">&nbsp;</span>
354
381
  <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-yes">11x</span>
356
- <span class="cline-any cline-yes">11x</span>
357
382
  <span class="cline-any cline-neutral">&nbsp;</span>
358
- <span class="cline-any cline-yes">11x</span>
383
+ <span class="cline-any cline-yes">12x</span>
384
+ <span class="cline-any cline-yes">12x</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-yes">12x</span>
387
+ <span class="cline-any cline-yes">7x</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-yes">7x</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-yes">1x</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-yes">7x</span>
359
398
  <span class="cline-any cline-neutral">&nbsp;</span>
360
- <span class="cline-any cline-yes">11x</span>
361
399
  <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">11x</span>
363
400
  <span class="cline-any cline-neutral">&nbsp;</span>
364
- <span class="cline-any cline-yes">11x</span>
365
- <span class="cline-any cline-yes">6x</span>
366
401
  <span class="cline-any cline-neutral">&nbsp;</span>
367
402
  <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-yes">12x</span>
404
+ <span class="cline-any cline-yes">12x</span>
368
405
  <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-yes">12x</span>
407
+ <span class="cline-any cline-yes">12x</span>
408
+ <span class="cline-any cline-yes">12x</span>
369
409
  <span class="cline-any cline-neutral">&nbsp;</span>
370
410
  <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-yes">11x</span>
411
+ <span class="cline-any cline-yes">12x</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-yes">12x</span>
372
414
  <span class="cline-any cline-neutral">&nbsp;</span>
373
415
  <span class="cline-any cline-neutral">&nbsp;</span>
374
416
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -399,8 +441,14 @@
399
441
  OR: "||",
400
442
  }
401
443
  &nbsp;
402
- const isEmptyExpression = <span class="fstat-no" title="function not covered" >ke</span>y =&gt; {
403
- <span class="cstat-no" title="statement not covered" > return `(</span>
444
+ const CONDITIONS = {
445
+ EMPTY: "EMPTY",
446
+ NOT_EMPTY: "NOT_EMPTY",
447
+ CONTAINS: "CONTAINS",
448
+ }
449
+ &nbsp;
450
+ const isEmptyExpression = key =&gt; {
451
+ return `(
404
452
  doc["${key}"] === undefined ||
405
453
  doc["${key}"] === null ||
406
454
  doc["${key}"] === "" ||
@@ -466,17 +514,17 @@ function parseFilterExpression(filters) {
466
514
  expression.push(TOKEN_MAP[filter.conjunction])
467
515
  }
468
516
  &nbsp;
469
- <span class="missing-if-branch" title="if path not taken" >I</span>if (filter.condition === "CONTAINS") {
517
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (filter.condition === CONDITIONS.CONTAINS) {
470
518
  <span class="cstat-no" title="statement not covered" > expression.push(</span>
471
519
  `doc["${filter.key}"].${TOKEN_MAP[filter.condition]}("${filter.value}")`
472
520
  )
473
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (filter.condition === "EMPTY") {
521
+ } else <span class="missing-if-branch" title="if path not taken" >I</span>if (filter.condition === CONDITIONS.EMPTY) {
474
522
  <span class="cstat-no" title="statement not covered" > expression.push(isEmptyExpression(filter.key))</span>
475
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (filter.condition === "NOT_EMPTY") {
476
- <span class="cstat-no" title="statement not covered" > expression.push(`!${isEmptyExpression(filter.key)}`)</span>
523
+ } else if (filter.condition === CONDITIONS.NOT_EMPTY) {
524
+ expression.push(`!${isEmptyExpression(filter.key)}`)
477
525
  } else {
478
526
  const value =
479
- typeof filter.value == "string" ? `"${filter.value}"` : <span class="branch-1 cbranch-no" title="branch not covered" >filter.value</span>
527
+ typeof filter.value == "string" ? `"${filter.value}"` : filter.value
480
528
  &nbsp;
481
529
  expression.push(
482
530
  `doc["${filter.key}"] ${TOKEN_MAP[filter.condition]} ${value}`
@@ -514,21 +562,36 @@ function viewTemplate({ field, tableId, groupBy, filters = [], calculation }) {
514
562
  <span class="missing-if-branch" title="if path not taken" >I</span>if (filters &amp;&amp; filters.length &gt; 0 &amp;&amp; filters[0].conjunction) {
515
563
  <span class="cstat-no" title="statement not covered" > delete filters[0].conjunction</span>
516
564
  }
517
- const parsedFilters = parseFilterExpression(filters)
518
- const filterExpression = parsedFilters ? `&amp;&amp; (${parsedFilters})` : ""
519
- &nbsp;
520
- const emitExpression = parseEmitExpression(field, groupBy)
521
- &nbsp;
522
- const reduction = field &amp;&amp; calculation ? { reduce: `_${calculation}` } : {}
523
565
  &nbsp;
524
- let schema = null
566
+ let schema = null,
567
+ statFilter = null
525
568
  &nbsp;
526
569
  if (calculation) {
527
570
  schema = {
528
571
  ...(groupBy ? GROUP_PROPERTY : FIELD_PROPERTY),
529
572
  ...SCHEMA_MAP[calculation],
530
573
  }
574
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (
575
+ !filters.find(
576
+ filter =&gt;
577
+ filter.key === field &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >filter.condition === CONDITIONS.NOT_EMPTY</span>
578
+ )
579
+ ) {
580
+ statFilter = parseFilterExpression([
581
+ { key: field, condition: CONDITIONS.NOT_EMPTY },
582
+ ])
583
+ }
531
584
  }
585
+ &nbsp;
586
+ const parsedFilters = parseFilterExpression(filters)
587
+ const filterExpression = parsedFilters ? `&amp;&amp; (${parsedFilters})` : ""
588
+ &nbsp;
589
+ const emitExpression = parseEmitExpression(field, groupBy)
590
+ const tableExpression = `doc.tableId === "${tableId}"`
591
+ const coreExpression = statFilter
592
+ ? `(${tableExpression} &amp;&amp; ${statFilter})`
593
+ : tableExpression
594
+ const reduction = field &amp;&amp; calculation ? { reduce: `_${calculation}` } : {}
532
595
  &nbsp;
533
596
  return {
534
597
  meta: {
@@ -540,7 +603,7 @@ function viewTemplate({ field, tableId, groupBy, filters = [], calculation }) {
540
603
  calculation,
541
604
  },
542
605
  map: `function (doc) {
543
- if (doc.tableId === "${tableId}" ${filterExpression}) {
606
+ if (${coreExpression} ${filterExpression}) {
544
607
  ${emitExpression}
545
608
  }
546
609
  }`,
@@ -556,7 +619,7 @@ module.exports = viewTemplate
556
619
  <div class='footer quiet pad2 space-top1 center small'>
557
620
  Code coverage generated by
558
621
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
559
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
622
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
560
623
  </div>
561
624
  <script src="../../../prettify.js"></script>
562
625
  <script>
@@ -409,7 +409,7 @@ exports.trigger = async ctx =&gt; {
409
409
  <div class='footer quiet pad2 space-top1 center small'>
410
410
  Code coverage generated by
411
411
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
412
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
412
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
413
413
  </div>
414
414
  <script src="../../prettify.js"></script>
415
415
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
104
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -349,7 +349,7 @@ module.exports = router
349
349
  <div class='footer quiet pad2 space-top1 center small'>
350
350
  Code coverage generated by
351
351
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
352
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
352
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
353
353
  </div>
354
354
  <script src="../prettify.js"></script>
355
355
  <script>
@@ -100,7 +100,7 @@ module.exports = router
100
100
  <div class='footer quiet pad2 space-top1 center small'>
101
101
  Code coverage generated by
102
102
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
103
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
103
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
104
104
  </div>
105
105
  <script src="../../prettify.js"></script>
106
106
  <script>
@@ -106,7 +106,7 @@ module.exports = router
106
106
  <div class='footer quiet pad2 space-top1 center small'>
107
107
  Code coverage generated by
108
108
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
109
- at Fri May 13 2022 15:44:56 GMT+0000 (Coordinated Universal Time)
109
+ at Mon May 16 2022 16:48:23 GMT+0000 (Coordinated Universal Time)
110
110
  </div>
111
111
  <script src="../../prettify.js"></script>
112
112
  <script>