@budibase/worker 2.1.22-alpha.5 → 2.1.22-alpha.7

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 (171) hide show
  1. package/__mocks__/oauth.ts +57 -0
  2. package/coverage/clover.xml +1255 -1174
  3. package/coverage/coverage-final.json +77 -72
  4. package/coverage/lcov-report/index.html +96 -96
  5. package/coverage/lcov-report/src/api/controllers/global/auth.ts.html +110 -98
  6. package/coverage/lcov-report/src/api/controllers/global/configs.js.html +52 -52
  7. package/coverage/lcov-report/src/api/controllers/global/email.js.html +4 -4
  8. package/coverage/lcov-report/src/api/controllers/global/index.html +38 -38
  9. package/coverage/lcov-report/src/api/controllers/global/license.ts.html +7 -7
  10. package/coverage/lcov-report/src/api/controllers/global/roles.js.html +10 -10
  11. package/coverage/lcov-report/src/api/controllers/global/self.ts.html +59 -59
  12. package/coverage/lcov-report/src/api/controllers/global/templates.ts.html +11 -11
  13. package/coverage/lcov-report/src/api/controllers/global/users.ts.html +75 -69
  14. package/coverage/lcov-report/src/api/controllers/global/workspaces.js.html +7 -7
  15. package/coverage/lcov-report/src/api/controllers/system/accounts.ts.html +4 -4
  16. package/coverage/lcov-report/src/api/controllers/system/{environment.js.html → environment.ts.html} +21 -18
  17. package/coverage/lcov-report/src/api/controllers/system/index.html +63 -63
  18. package/coverage/lcov-report/src/api/controllers/system/migrations.ts.html +23 -23
  19. package/coverage/lcov-report/src/api/controllers/system/restore.ts.html +22 -22
  20. package/coverage/lcov-report/src/api/controllers/system/{status.js.html → status.ts.html} +29 -26
  21. package/coverage/lcov-report/src/api/controllers/system/tenants.ts.html +34 -163
  22. package/coverage/lcov-report/src/api/index.html +11 -11
  23. package/coverage/lcov-report/src/api/index.ts.html +113 -44
  24. package/coverage/lcov-report/src/api/routes/global/auth.js.html +38 -89
  25. package/coverage/lcov-report/src/api/routes/global/configs.js.html +26 -26
  26. package/coverage/lcov-report/src/api/routes/global/email.js.html +11 -11
  27. package/coverage/lcov-report/src/api/routes/global/index.html +11 -11
  28. package/coverage/lcov-report/src/api/routes/global/license.ts.html +6 -6
  29. package/coverage/lcov-report/src/api/routes/global/roles.js.html +7 -7
  30. package/coverage/lcov-report/src/api/routes/global/self.ts.html +8 -8
  31. package/coverage/lcov-report/src/api/routes/global/templates.ts.html +13 -13
  32. package/coverage/lcov-report/src/api/routes/global/users.js.html +17 -17
  33. package/coverage/lcov-report/src/api/routes/global/workspaces.js.html +10 -10
  34. package/coverage/lcov-report/src/api/routes/index.html +1 -1
  35. package/coverage/lcov-report/src/api/routes/index.ts.html +19 -19
  36. package/coverage/lcov-report/src/api/routes/system/accounts.ts.html +7 -7
  37. package/coverage/lcov-report/src/api/routes/system/{environment.js.html → environment.ts.html} +11 -11
  38. package/coverage/lcov-report/src/api/routes/system/index.html +4 -4
  39. package/coverage/lcov-report/src/api/routes/system/migrations.ts.html +7 -7
  40. package/coverage/lcov-report/src/api/routes/system/restore.ts.html +6 -6
  41. package/coverage/lcov-report/src/api/routes/system/{status.js.html → status.ts.html} +11 -11
  42. package/coverage/lcov-report/src/api/routes/system/{tenants.js.html → tenants.ts.html} +20 -17
  43. package/coverage/lcov-report/src/api/routes/validation/index.html +1 -1
  44. package/coverage/lcov-report/src/api/routes/validation/index.ts.html +2 -2
  45. package/coverage/lcov-report/src/api/routes/validation/users.ts.html +13 -13
  46. package/coverage/lcov-report/src/constants/index.html +10 -10
  47. package/coverage/lcov-report/src/constants/{index.js.html → index.ts.html} +103 -124
  48. package/coverage/lcov-report/src/constants/templates/index.html +1 -1
  49. package/coverage/lcov-report/src/constants/templates/index.js.html +12 -12
  50. package/coverage/lcov-report/src/db/index.html +1 -1
  51. package/coverage/lcov-report/src/db/index.ts.html +8 -8
  52. package/coverage/lcov-report/src/environment.ts.html +15 -15
  53. package/coverage/lcov-report/src/index.html +1 -1
  54. package/coverage/lcov-report/src/index.ts.html +40 -40
  55. package/coverage/lcov-report/src/middleware/cloudRestricted.js.html +23 -23
  56. package/coverage/lcov-report/src/middleware/index.html +21 -21
  57. package/coverage/lcov-report/src/migrations/functions/globalInfoSyncUsers.ts.html +3 -3
  58. package/coverage/lcov-report/src/migrations/functions/index.html +1 -1
  59. package/coverage/lcov-report/src/migrations/index.html +1 -1
  60. package/coverage/lcov-report/src/migrations/index.ts.html +17 -17
  61. package/coverage/lcov-report/src/sdk/accounts/accounts.ts.html +6 -6
  62. package/coverage/lcov-report/src/sdk/accounts/index.html +1 -1
  63. package/coverage/lcov-report/src/sdk/accounts/index.ts.html +2 -2
  64. package/coverage/lcov-report/src/sdk/index.html +1 -1
  65. package/coverage/lcov-report/src/sdk/index.ts.html +4 -4
  66. package/coverage/lcov-report/src/sdk/users/events.ts.html +43 -43
  67. package/coverage/lcov-report/src/sdk/users/index.html +19 -19
  68. package/coverage/lcov-report/src/sdk/users/index.ts.html +2 -2
  69. package/coverage/lcov-report/src/sdk/users/users.ts.html +99 -99
  70. package/coverage/lcov-report/src/tests/TestConfiguration.ts.html +275 -128
  71. package/coverage/lcov-report/src/tests/api/accounts.ts.html +12 -21
  72. package/coverage/lcov-report/src/tests/api/auth.ts.html +11 -20
  73. package/coverage/lcov-report/src/tests/api/base.ts.html +133 -0
  74. package/coverage/lcov-report/src/tests/api/configs.ts.html +44 -23
  75. package/coverage/lcov-report/src/tests/api/email.ts.html +9 -18
  76. package/coverage/lcov-report/src/tests/api/environment.ts.html +130 -0
  77. package/coverage/lcov-report/src/tests/api/index.html +106 -16
  78. package/coverage/lcov-report/src/tests/api/index.ts.html +62 -17
  79. package/coverage/lcov-report/src/tests/{structures/accounts.ts.html → api/migrations.ts.html} +31 -37
  80. package/coverage/lcov-report/src/tests/api/restore.ts.html +127 -0
  81. package/coverage/lcov-report/src/tests/api/self.ts.html +31 -16
  82. package/coverage/lcov-report/src/tests/api/status.ts.html +121 -0
  83. package/coverage/lcov-report/src/tests/api/tenants.ts.html +130 -0
  84. package/coverage/lcov-report/src/tests/api/users.ts.html +121 -25
  85. package/coverage/lcov-report/src/tests/controllers.js.html +2 -2
  86. package/coverage/lcov-report/src/tests/index.html +21 -21
  87. package/coverage/lcov-report/src/tests/index.ts.html +21 -9
  88. package/coverage/lcov-report/src/tests/mocks/email.js.html +2 -2
  89. package/coverage/lcov-report/src/tests/mocks/index.html +1 -1
  90. package/coverage/lcov-report/src/tests/mocks/index.ts.html +4 -4
  91. package/coverage/lcov-report/src/tests/structures/configs.js.html +14 -14
  92. package/coverage/lcov-report/src/tests/structures/groups.ts.html +2 -2
  93. package/coverage/lcov-report/src/tests/structures/index.html +9 -24
  94. package/coverage/lcov-report/src/tests/structures/index.ts.html +21 -15
  95. package/coverage/lcov-report/src/tests/structures/users.ts.html +13 -10
  96. package/coverage/lcov-report/src/utilities/appService.js.html +14 -14
  97. package/coverage/lcov-report/src/utilities/{email.js.html → email.ts.html} +172 -73
  98. package/coverage/lcov-report/src/utilities/fileSystem.js.html +4 -4
  99. package/coverage/lcov-report/src/utilities/index.html +23 -23
  100. package/coverage/lcov-report/src/utilities/index.js.html +2 -2
  101. package/coverage/lcov-report/src/utilities/{redis.js.html → redis.ts.html} +63 -48
  102. package/coverage/lcov-report/src/utilities/{templates.js.html → templates.ts.html} +41 -41
  103. package/coverage/lcov-report/src/utilities/users.js.html +8 -8
  104. package/coverage/lcov.info +2058 -1820
  105. package/jest.config.ts +1 -0
  106. package/package.json +8 -6
  107. package/scripts/localdomain.js +33 -7
  108. package/src/api/controllers/global/auth.ts +35 -31
  109. package/src/api/controllers/global/configs.js +17 -17
  110. package/src/api/controllers/global/self.ts +2 -2
  111. package/src/api/controllers/global/users.ts +3 -1
  112. package/src/api/controllers/system/{environment.js → environment.ts} +3 -2
  113. package/src/api/controllers/system/{status.js → status.ts} +4 -3
  114. package/src/api/controllers/system/tenants.ts +8 -51
  115. package/src/api/index.ts +29 -6
  116. package/src/api/routes/global/auth.js +22 -39
  117. package/src/api/routes/global/configs.js +9 -9
  118. package/src/api/routes/global/templates.ts +2 -2
  119. package/src/api/routes/global/tests/auth.spec.ts +134 -64
  120. package/src/api/routes/global/tests/configs.spec.ts +34 -35
  121. package/src/api/routes/global/tests/email.spec.ts +4 -3
  122. package/src/api/routes/global/tests/license.spec.ts +31 -0
  123. package/src/api/routes/global/tests/realEmail.spec.ts +2 -3
  124. package/src/api/routes/global/tests/roles.spec.ts +27 -0
  125. package/src/api/routes/global/tests/self.spec.ts +3 -4
  126. package/src/api/routes/global/tests/templates.spec.ts +35 -0
  127. package/src/api/routes/global/tests/users.spec.ts +51 -43
  128. package/src/api/routes/global/tests/workspaces.spec.ts +29 -0
  129. package/src/api/routes/system/environment.ts +8 -0
  130. package/src/api/routes/system/status.ts +8 -0
  131. package/src/api/routes/system/tenants.ts +13 -0
  132. package/src/api/routes/system/tests/accounts.spec.ts +5 -6
  133. package/src/api/routes/system/tests/environment.spec.ts +29 -0
  134. package/src/api/routes/system/tests/migrations.spec.ts +63 -0
  135. package/src/api/routes/system/tests/restore.spec.ts +36 -0
  136. package/src/api/routes/system/tests/status.spec.ts +48 -0
  137. package/src/api/routes/system/tests/tenants.spec.ts +61 -0
  138. package/src/constants/{index.js → index.ts} +57 -64
  139. package/src/constants/templates/index.js +2 -2
  140. package/src/middleware/cloudRestricted.js +2 -2
  141. package/src/middleware/tests/tenancy.spec.ts +73 -0
  142. package/src/tests/TestConfiguration.ts +97 -48
  143. package/src/tests/api/accounts.ts +5 -8
  144. package/src/tests/api/auth.ts +3 -6
  145. package/src/tests/api/base.ts +16 -0
  146. package/src/tests/api/configs.ts +15 -8
  147. package/src/tests/api/email.ts +3 -6
  148. package/src/tests/api/environment.ts +15 -0
  149. package/src/tests/api/index.ts +15 -0
  150. package/src/tests/api/migrations.ts +22 -0
  151. package/src/tests/api/restore.ts +14 -0
  152. package/src/tests/api/self.ts +11 -6
  153. package/src/tests/api/status.ts +12 -0
  154. package/src/tests/api/tenants.ts +15 -0
  155. package/src/tests/api/users.ts +38 -6
  156. package/src/tests/index.ts +4 -0
  157. package/src/tests/jestSetup.ts +7 -1
  158. package/src/tests/structures/configs.js +6 -6
  159. package/src/tests/structures/index.ts +4 -2
  160. package/src/tests/structures/users.ts +1 -0
  161. package/src/utilities/appService.js +3 -3
  162. package/src/utilities/{email.js → email.ts} +78 -45
  163. package/src/utilities/{redis.js → redis.ts} +29 -24
  164. package/src/utilities/templates.ts +49 -0
  165. package/tsconfig.build.json +3 -3
  166. package/__mocks__/node-fetch.ts +0 -1
  167. package/src/api/routes/system/environment.js +0 -8
  168. package/src/api/routes/system/status.js +0 -8
  169. package/src/api/routes/system/tenants.js +0 -12
  170. package/src/tests/structures/accounts.ts +0 -24
  171. package/src/utilities/templates.js +0 -49
@@ -96,15 +96,15 @@
96
96
  <a name='L31'></a><a href='#L31'>31</a>
97
97
  <a name='L32'></a><a href='#L32'>32</a>
98
98
  <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">7x</span>
100
- <span class="cline-any cline-yes">7x</span>
101
- <span class="cline-any cline-yes">7x</span>
102
- <span class="cline-any cline-yes">7x</span>
103
- <span class="cline-any cline-yes">7x</span>
99
+ <a name='L34'></a><a href='#L34'>34</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">17x</span>
100
+ <span class="cline-any cline-yes">17x</span>
101
+ <span class="cline-any cline-yes">17x</span>
102
+ <span class="cline-any cline-yes">17x</span>
103
+ <span class="cline-any cline-yes">17x</span>
104
104
  <span class="cline-any cline-neutral">&nbsp;</span>
105
105
  <span class="cline-any cline-neutral">&nbsp;</span>
106
- <span class="cline-any cline-yes">65x</span>
107
- <span class="cline-any cline-yes">65x</span>
106
+ <span class="cline-any cline-yes">93x</span>
107
+ <span class="cline-any cline-yes">93x</span>
108
108
  <span class="cline-any cline-neutral">&nbsp;</span>
109
109
  <span class="cline-any cline-no">&nbsp;</span>
110
110
  <span class="cline-any cline-no">&nbsp;</span>
@@ -119,18 +119,18 @@
119
119
  <span class="cline-any cline-no">&nbsp;</span>
120
120
  <span class="cline-any cline-neutral">&nbsp;</span>
121
121
  <span class="cline-any cline-neutral">&nbsp;</span>
122
- <span class="cline-any cline-yes">7x</span>
123
- <span class="cline-any cline-yes">65x</span>
122
+ <span class="cline-any cline-yes">17x</span>
123
+ <span class="cline-any cline-yes">93x</span>
124
124
  <span class="cline-any cline-neutral">&nbsp;</span>
125
125
  <span class="cline-any cline-neutral">&nbsp;</span>
126
126
  <span class="cline-any cline-neutral">&nbsp;</span>
127
127
  <span class="cline-any cline-neutral">&nbsp;</span>
128
- <span class="cline-any cline-yes">65x</span>
128
+ <span class="cline-any cline-yes">93x</span>
129
129
  <span class="cline-any cline-no">&nbsp;</span>
130
130
  <span class="cline-any cline-neutral">&nbsp;</span>
131
131
  <span class="cline-any cline-neutral">&nbsp;</span>
132
132
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const fetch = require("node-fetch")
133
- const { Headers } = require("@budibase/backend-core/constants")
133
+ const { Header } = require("@budibase/backend-core/constants")
134
134
  const { getTenantId, isTenantIdSet } = require("@budibase/backend-core/tenancy")
135
135
  const { checkSlashesInUrl } = require("../utilities")
136
136
  const env = require("../environment")
@@ -140,9 +140,9 @@ async function makeAppRequest(url, method, body) {
140
140
  return
141
141
  }
142
142
  const request = <span class="cstat-no" title="statement not covered" >{ headers: {} }</span>
143
- <span class="cstat-no" title="statement not covered" > request.headers[Headers.API_KEY] = env.INTERNAL_API_KEY</span>
143
+ <span class="cstat-no" title="statement not covered" > request.headers[Header.API_KEY] = env.INTERNAL_API_KEY</span>
144
144
  <span class="cstat-no" title="statement not covered" > if (isTenantIdSet()) {</span>
145
- <span class="cstat-no" title="statement not covered" > request.headers[Headers.TENANT_ID] = getTenantId()</span>
145
+ <span class="cstat-no" title="statement not covered" > request.headers[Header.TENANT_ID] = getTenantId()</span>
146
146
  }
147
147
  <span class="cstat-no" title="statement not covered" > if (body) {</span>
148
148
  <span class="cstat-no" title="statement not covered" > request.headers["Content-Type"] = "application/json"</span>
@@ -169,7 +169,7 @@ exports.syncUserInApps = async userId =&gt; {
169
169
  <div class='footer quiet pad2 space-top1 center small'>
170
170
  Code coverage generated by
171
171
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
172
- at Wed Nov 16 2022 12:02:15 GMT+0000 (Coordinated Universal Time)
172
+ at Thu Nov 17 2022 16:59:05 GMT+0000 (Coordinated Universal Time)
173
173
  </div>
174
174
  <script src="../../prettify.js"></script>
175
175
  <script>
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for src/utilities/email.js</title>
6
+ <title>Code coverage report for src/utilities/email.ts</title>
7
7
  <meta charset="utf-8" />
8
8
  <link rel="stylesheet" href="../../prettify.css" />
9
9
  <link rel="stylesheet" href="../../base.css" />
@@ -19,7 +19,7 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/utilities</a> email.js</h1>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/utilities</a> email.ts</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
@@ -30,9 +30,9 @@
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">62.71% </span>
33
+ <span class="strong">67.05% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>37/59</span>
35
+ <span class='fraction'>57/85</span>
36
36
  </div>
37
37
 
38
38
 
@@ -285,20 +285,71 @@
285
285
  <a name='L220'></a><a href='#L220'>220</a>
286
286
  <a name='L221'></a><a href='#L221'>221</a>
287
287
  <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">7x</span>
289
- <span class="cline-any cline-yes">7x</span>
290
- <span class="cline-any cline-yes">7x</span>
291
- <span class="cline-any cline-yes">7x</span>
292
- <span class="cline-any cline-yes">7x</span>
293
- <span class="cline-any cline-yes">7x</span>
294
- <span class="cline-any cline-yes">7x</span>
295
- <span class="cline-any cline-yes">7x</span>
296
- <span class="cline-any cline-yes">7x</span>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">17x</span>
322
+ <span class="cline-any cline-yes">17x</span>
323
+ <span class="cline-any cline-yes">17x</span>
324
+ <span class="cline-any cline-yes">17x</span>
325
+ <span class="cline-any cline-yes">17x</span>
326
+ <span class="cline-any cline-yes">17x</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-yes">17x</span>
329
+ <span class="cline-any cline-yes">17x</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
334
  <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-yes">7x</span>
299
- <span class="cline-any cline-yes">7x</span>
300
335
  <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-yes">7x</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-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-yes">17x</span>
350
+ <span class="cline-any cline-yes">17x</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-yes">17x</span>
302
353
  <span class="cline-any cline-neutral">&nbsp;</span>
303
354
  <span class="cline-any cline-neutral">&nbsp;</span>
304
355
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -340,6 +391,11 @@
340
391
  <span class="cline-any cline-neutral">&nbsp;</span>
341
392
  <span class="cline-any cline-neutral">&nbsp;</span>
342
393
  <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
399
  <span class="cline-any cline-yes">7x</span>
344
400
  <span class="cline-any cline-neutral">&nbsp;</span>
345
401
  <span class="cline-any cline-yes">2x</span>
@@ -361,6 +417,11 @@
361
417
  <span class="cline-any cline-neutral">&nbsp;</span>
362
418
  <span class="cline-any cline-neutral">&nbsp;</span>
363
419
  <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
425
  <span class="cline-any cline-yes">7x</span>
365
426
  <span class="cline-any cline-no">&nbsp;</span>
366
427
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -401,6 +462,10 @@
401
462
  <span class="cline-any cline-neutral">&nbsp;</span>
402
463
  <span class="cline-any cline-neutral">&nbsp;</span>
403
464
  <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
469
  <span class="cline-any cline-yes">9x</span>
405
470
  <span class="cline-any cline-neutral">&nbsp;</span>
406
471
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -433,7 +498,7 @@
433
498
  <span class="cline-any cline-neutral">&nbsp;</span>
434
499
  <span class="cline-any cline-neutral">&nbsp;</span>
435
500
  <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-yes">7x</span>
501
+ <span class="cline-any cline-yes">17x</span>
437
502
  <span class="cline-any cline-neutral">&nbsp;</span>
438
503
  <span class="cline-any cline-yes">2x</span>
439
504
  <span class="cline-any cline-no">&nbsp;</span>
@@ -452,18 +517,13 @@
452
517
  <span class="cline-any cline-neutral">&nbsp;</span>
453
518
  <span class="cline-any cline-neutral">&nbsp;</span>
454
519
  <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-yes">17x</span>
457
521
  <span class="cline-any cline-neutral">&nbsp;</span>
458
522
  <span class="cline-any cline-neutral">&nbsp;</span>
459
523
  <span class="cline-any cline-neutral">&nbsp;</span>
460
524
  <span class="cline-any cline-neutral">&nbsp;</span>
461
525
  <span class="cline-any cline-yes">7x</span>
462
526
  <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-yes">7x</span>
467
527
  <span class="cline-any cline-yes">7x</span>
468
528
  <span class="cline-any cline-yes">7x</span>
469
529
  <span class="cline-any cline-no">&nbsp;</span>
@@ -471,8 +531,11 @@
471
531
  <span class="cline-any cline-yes">7x</span>
472
532
  <span class="cline-any cline-neutral">&nbsp;</span>
473
533
  <span class="cline-any cline-yes">7x</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-yes">7x</span>
474
536
  <span class="cline-any cline-yes">7x</span>
475
537
  <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
539
  <span class="cline-any cline-yes">7x</span>
477
540
  <span class="cline-any cline-neutral">&nbsp;</span>
478
541
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -491,6 +554,9 @@
491
554
  <span class="cline-any cline-yes">7x</span>
492
555
  <span class="cline-any cline-yes">7x</span>
493
556
  <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
560
  <span class="cline-any cline-yes">7x</span>
495
561
  <span class="cline-any cline-yes">7x</span>
496
562
  <span class="cline-any cline-no">&nbsp;</span>
@@ -503,22 +569,40 @@
503
569
  <span class="cline-any cline-neutral">&nbsp;</span>
504
570
  <span class="cline-any cline-neutral">&nbsp;</span>
505
571
  <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-yes">7x</span>
572
+ <span class="cline-any cline-yes">17x</span>
507
573
  <span class="cline-any cline-yes">15x</span>
508
574
  <span class="cline-any cline-yes">15x</span>
509
575
  <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const nodemailer = require("nodemailer")
511
- const env = require("../environment")
512
- const { getScopedConfig } = require("@budibase/backend-core/db")
513
- const { EmailTemplatePurpose, TemplateTypes, Configs } = require("../constants")
514
- const { getTemplateByPurpose } = require("../constants/templates")
515
- const { getSettingsTemplateContext } = require("./templates")
516
- const { processString } = require("@budibase/string-templates")
517
- const { getResetPasswordCode, getInviteCode } = require("../utilities/redis")
518
- const { getGlobalDB } = require("@budibase/backend-core/tenancy")
576
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import env from "../environment"
577
+ import { EmailTemplatePurpose, TemplateType, Config } from "../constants"
578
+ import { getTemplateByPurpose } from "../constants/templates"
579
+ import { getSettingsTemplateContext } from "./templates"
580
+ import { processString } from "@budibase/string-templates"
581
+ import { getResetPasswordCode, getInviteCode } from "./redis"
582
+ import { User, Database } from "@budibase/types"
583
+ import { tenancy, db as dbCore } from "@budibase/backend-core"
584
+ const nodemailer = require("nodemailer")
585
+ &nbsp;
586
+ type SendEmailOpts = {
587
+ // workspaceId If finer grain controls being used then this will lookup config for workspace.
588
+ workspaceId?: string
589
+ // user If sending to an existing user the object can be provided, this is used in the context.
590
+ user: User
591
+ // from If sending from an address that is not what is configured in the SMTP config.
592
+ from?: string
593
+ // contents If sending a custom email then can supply contents which will be added to it.
594
+ contents?: string
595
+ // subject A custom subject can be specified if the config one is not desired.
596
+ subject?: string
597
+ // info Pass in a structure of information to be stored alongside the invitation.
598
+ info?: any
599
+ cc?: boolean
600
+ bcc?: boolean
601
+ automation?: boolean
602
+ }
519
603
  &nbsp;
520
604
  const TEST_MODE = false
521
- const TYPE = TemplateTypes.EMAIL
605
+ const TYPE = TemplateType.EMAIL
522
606
  &nbsp;
523
607
  const FULL_EMAIL_PURPOSES = [
524
608
  EmailTemplatePurpose.INVITATION,
@@ -527,8 +611,8 @@ const FULL_EMAIL_PURPOSES = [
527
611
  EmailTemplatePurpose.CUSTOM,
528
612
  ]
529
613
  &nbsp;
530
- function createSMTPTransport(config) {
531
- let options
614
+ function createSMTPTransport(config: any) {
615
+ let options: any
532
616
  let secure = config.secure
533
617
  // default it if not specified
534
618
  <span class="missing-if-branch" title="if path not taken" >I</span>if (secure == null) {
@@ -561,10 +645,15 @@ function createSMTPTransport(config) {
561
645
  return nodemailer.createTransport(options)
562
646
  }
563
647
  &nbsp;
564
- async function getLinkCode(purpose, email, user, info = null) {
648
+ async function getLinkCode(
649
+ purpose: EmailTemplatePurpose,
650
+ email: string,
651
+ user: User,
652
+ info: any = null
653
+ ) {
565
654
  switch (purpose) {
566
655
  case EmailTemplatePurpose.PASSWORD_RECOVERY:
567
- return getResetPasswordCode(user._id, info)
656
+ return getResetPasswordCode(user._id!, info)
568
657
  case EmailTemplatePurpose.INVITATION:
569
658
  return getInviteCode(email, info)
570
659
  <span class="branch-2 cbranch-no" title="branch not covered" > default:</span>
@@ -581,7 +670,12 @@ async function getLinkCode(purpose, email, user, info = null) {
581
670
  * @param {string|null} contents if using a custom template can supply contents for context.
582
671
  * @return {Promise&lt;string&gt;} returns the built email HTML if all provided parameters were valid.
583
672
  */
584
- async function buildEmail(purpose, email, context, { user, contents } = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
673
+ async function buildEmail(
674
+ purpose: EmailTemplatePurpose,
675
+ email: string,
676
+ context: any,
677
+ { user, contents }: any = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
678
+ ) {
585
679
  // this isn't a full email
586
680
  <span class="missing-if-branch" title="if path not taken" >I</span>if (FULL_EMAIL_PURPOSES.indexOf(purpose) === -1) {
587
681
  <span class="cstat-no" title="statement not covered" > throw `Unable to build an email of type ${purpose}`</span>
@@ -622,22 +716,26 @@ async function buildEmail(purpose, email, context, { user, contents } = <span cl
622
716
  * @param {boolean|null} automation Whether or not the configuration is being fetched for an email automation.
623
717
  * @return {Promise&lt;object|null&gt;} returns the SMTP configuration if it exists
624
718
  */
625
- async function getSmtpConfiguration(db, workspaceId = null, automation) {
626
- const params = {
627
- type: Configs.SMTP,
719
+ async function getSmtpConfiguration(
720
+ db: Database,
721
+ workspaceId?: string,
722
+ automation?: boolean
723
+ ) {
724
+ const params: any = {
725
+ type: Config.SMTP,
628
726
  }
629
727
  <span class="missing-if-branch" title="if path not taken" >I</span>if (workspaceId) {
630
728
  <span class="cstat-no" title="statement not covered" > params.workspace = workspaceId</span>
631
729
  }
632
730
  &nbsp;
633
- const customConfig = await getScopedConfig(db, params)
731
+ const customConfig = await dbCore.getScopedConfig(db, params)
634
732
  &nbsp;
635
- <span class="missing-if-branch" title="else path not taken" >E</span>if (customConfig) {
733
+ if (customConfig) {
636
734
  return customConfig
637
735
  }
638
736
  &nbsp;
639
737
  // Use an SMTP fallback configuration from env variables
640
- <span class="cstat-no" title="statement not covered" > if (!automation &amp;&amp; env.SMTP_FALLBACK_ENABLED) {</span>
738
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!automation &amp;&amp; env.SMTP_FALLBACK_ENABLED) {</span>
641
739
  <span class="cstat-no" title="statement not covered" > return {</span>
642
740
  port: env.SMTP_PORT,
643
741
  host: env.SMTP_HOST,
@@ -655,12 +753,12 @@ async function getSmtpConfiguration(db, workspaceId = null, automation) {
655
753
  * Checks if a SMTP config exists based on passed in parameters.
656
754
  * @return {Promise&lt;boolean&gt;} returns true if there is a configuration that can be used.
657
755
  */
658
- exports.isEmailConfigured = async (workspaceId = null) =&gt; {
756
+ export async function isEmailConfigured(workspaceId?: string) {
659
757
  // when "testing" or smtp fallback is enabled simply return true
660
758
  <span class="missing-if-branch" title="if path not taken" >I</span>if (TEST_MODE || env.SMTP_FALLBACK_ENABLED) {
661
759
  <span class="cstat-no" title="statement not covered" > return true</span>
662
760
  }
663
- const db = getGlobalDB()
761
+ const db = tenancy.getGlobalDB()
664
762
  const config = await getSmtpConfiguration(db, workspaceId)
665
763
  return config != null
666
764
  }
@@ -670,48 +768,49 @@ exports.isEmailConfigured = async (workspaceId = null) =&gt; {
670
768
  * send an email using it.
671
769
  * @param {string} email The email address to send to.
672
770
  * @param {string} purpose The purpose of the email being sent (e.g. reset password).
673
- * @param {string|undefined} workspaceId If finer grain controls being used then this will lookup config for workspace.
674
- * @param {object|undefined} user If sending to an existing user the object can be provided, this is used in the context.
675
- * @param {string|undefined} from If sending from an address that is not what is configured in the SMTP config.
676
- * @param {string|undefined} contents If sending a custom email then can supply contents which will be added to it.
677
- * @param {string|undefined} subject A custom subject can be specified if the config one is not desired.
678
- * @param {object|undefined} info Pass in a structure of information to be stored alongside the invitation.
679
- * @param {boolean|undefined} disableFallback Prevent email being sent from SMTP fallback to avoid spam.
771
+ * @param {object} opts The options for sending the email.
680
772
  * @return {Promise&lt;object&gt;} returns details about the attempt to send email, e.g. if it is successful; based on
681
773
  * nodemailer response.
682
774
  */
683
- exports.sendEmail = async (
684
- email,
685
- purpose,
686
- { workspaceId, user, from, contents, subject, info, cc, bcc, automation } = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
687
- ) =&gt; {
688
- const db = getGlobalDB()
689
- let config = (await getSmtpConfiguration(db, workspaceId, automation)) || <span class="branch-1 cbranch-no" title="branch not covered" >{}</span>
775
+ export async function sendEmail(
776
+ email: string,
777
+ purpose: EmailTemplatePurpose,
778
+ opts: SendEmailOpts
779
+ ) {
780
+ const db = tenancy.getGlobalDB()
781
+ let config =
782
+ (await getSmtpConfiguration(db, opts<span class="branch-0 cbranch-no" title="branch not covered" >?.w</span>orkspaceId, opts<span class="branch-0 cbranch-no" title="branch not covered" >?.a</span>utomation)) || <span class="branch-1 cbranch-no" title="branch not covered" >{}</span>
690
783
  <span class="missing-if-branch" title="if path not taken" >I</span>if (Object.keys(config).length === 0 &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!TEST_MODE)</span> {
691
784
  <span class="cstat-no" title="statement not covered" > throw "Unable to find SMTP configuration."</span>
692
785
  }
693
786
  const transport = createSMTPTransport(config)
694
787
  // if there is a link code needed this will retrieve it
695
- const code = await getLinkCode(purpose, email, user, info)
696
- const context = await getSettingsTemplateContext(purpose, code)
788
+ const code = await getLinkCode(purpose, email, opts.user, opts<span class="branch-0 cbranch-no" title="branch not covered" >?.i</span>nfo)
789
+ let context
790
+ if (code) {
791
+ context = await getSettingsTemplateContext(purpose, code)
792
+ }
697
793
  &nbsp;
698
- let message = {
699
- from: from || config.from,
794
+ let message: any = {
795
+ from: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.f</span>rom || config.from,
700
796
  html: await buildEmail(purpose, email, context, {
701
- user,
702
- contents,
797
+ user: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.u</span>ser,
798
+ contents: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.c</span>ontents,
703
799
  }),
704
800
  }
705
801
  &nbsp;
706
802
  message = {
707
803
  ...message,
708
804
  to: email,
709
- cc: cc,
710
- bcc: bcc,
805
+ cc: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.c</span>c,
806
+ bcc: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.b</span>cc,
711
807
  }
712
808
  &nbsp;
713
- <span class="missing-if-branch" title="else path not taken" >E</span>if (subject || config.subject) {
714
- message.subject = await processString(subject || config.subject, context)
809
+ if (opts<span class="branch-0 cbranch-no" title="branch not covered" >?.s</span>ubject || config.subject) {
810
+ message.subject = await processString(
811
+ opts<span class="branch-0 cbranch-no" title="branch not covered" >?.s</span>ubject || config.subject,
812
+ context
813
+ )
715
814
  }
716
815
  const response = await transport.sendMail(message)
717
816
  <span class="missing-if-branch" title="if path not taken" >I</span>if (TEST_MODE) {
@@ -725,7 +824,7 @@ exports.sendEmail = async (
725
824
  * @param {object} config an SMTP configuration - this is based on the nodemailer API.
726
825
  * @return {Promise&lt;boolean&gt;} returns true if the configuration is valid.
727
826
  */
728
- exports.verifyConfig = async config =&gt; {
827
+ export async function verifyConfig(config: any) {
729
828
  const transport = createSMTPTransport(config)
730
829
  await transport.verify()
731
830
  }
@@ -736,7 +835,7 @@ exports.verifyConfig = async config =&gt; {
736
835
  <div class='footer quiet pad2 space-top1 center small'>
737
836
  Code coverage generated by
738
837
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
739
- at Wed Nov 16 2022 12:02:15 GMT+0000 (Coordinated Universal Time)
838
+ at Thu Nov 17 2022 16:59:05 GMT+0000 (Coordinated Universal Time)
740
839
  </div>
741
840
  <script src="../../prettify.js"></script>
742
841
  <script>
@@ -68,10 +68,10 @@
68
68
  <a name='L3'></a><a href='#L3'>3</a>
69
69
  <a name='L4'></a><a href='#L4'>4</a>
70
70
  <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">7x</span>
71
+ <a name='L6'></a><a href='#L6'>6</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">17x</span>
72
72
  <span class="cline-any cline-neutral">&nbsp;</span>
73
- <span class="cline-any cline-yes">7x</span>
74
- <span class="cline-any cline-yes">35x</span>
73
+ <span class="cline-any cline-yes">17x</span>
74
+ <span class="cline-any cline-yes">85x</span>
75
75
  <span class="cline-any cline-neutral">&nbsp;</span>
76
76
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { readFileSync } = require("fs")
77
77
  &nbsp;
@@ -85,7 +85,7 @@ exports.readStaticFile = path =&gt; {
85
85
  <div class='footer quiet pad2 space-top1 center small'>
86
86
  Code coverage generated by
87
87
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
88
- at Wed Nov 16 2022 12:02:15 GMT+0000 (Coordinated Universal Time)
88
+ at Thu Nov 17 2022 16:59:05 GMT+0000 (Coordinated Universal Time)
89
89
  </div>
90
90
  <script src="../../prettify.js"></script>
91
91
  <script>