@budibase/server 2.6.23 → 2.6.24-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/.dockerignore +7 -6
  2. package/Dockerfile +16 -8
  3. package/builder/assets/index.50121870.js +1869 -0
  4. package/builder/assets/index.a86e2071.css +6 -0
  5. package/builder/index.html +2 -2
  6. package/client/manifest.json +5229 -0
  7. package/dist/automation.js +32576 -0
  8. package/dist/automation.js.map +7 -0
  9. package/dist/index.js +45065 -13
  10. package/dist/index.js.map +7 -0
  11. package/dist/query.js +24462 -0
  12. package/dist/query.js.map +7 -0
  13. package/jest.config.ts +6 -3
  14. package/nodemon.json +8 -4
  15. package/package.json +35 -16
  16. package/pm2.config.js +1 -1
  17. package/scripts/build.js +48 -0
  18. package/src/api/controllers/application.ts +21 -22
  19. package/src/api/controllers/automation.ts +37 -9
  20. package/src/api/controllers/datasource.ts +114 -49
  21. package/src/api/controllers/deploy/index.ts +1 -0
  22. package/src/api/controllers/integration.ts +3 -3
  23. package/src/api/controllers/plugin/index.ts +1 -1
  24. package/src/api/controllers/row/external.ts +39 -15
  25. package/src/api/controllers/row/index.ts +18 -24
  26. package/src/api/controllers/row/internal.ts +1 -1
  27. package/src/api/controllers/row/staticFormula.ts +6 -1
  28. package/src/api/controllers/row/utils.ts +12 -0
  29. package/src/api/controllers/static/index.ts +3 -3
  30. package/src/api/controllers/table/index.ts +3 -0
  31. package/src/api/controllers/table/internal.ts +2 -6
  32. package/src/api/controllers/table/utils.ts +32 -1
  33. package/src/api/controllers/view/index.ts +5 -5
  34. package/src/api/controllers/webhook.ts +33 -9
  35. package/src/api/routes/application.ts +5 -0
  36. package/src/api/routes/automation.ts +0 -1
  37. package/src/api/routes/datasource.ts +10 -0
  38. package/src/api/routes/static.ts +3 -1
  39. package/src/api/routes/tests/{automation.spec.js → automation.spec.ts} +106 -31
  40. package/src/api/routes/tests/datasource.spec.ts +1 -1
  41. package/src/api/routes/tests/view.spec.js +4 -3
  42. package/src/api/routes/tests/{webhook.spec.js → webhook.spec.ts} +33 -11
  43. package/src/app.ts +0 -1
  44. package/src/automations/actions.ts +8 -0
  45. package/src/automations/logging/index.ts +21 -0
  46. package/src/automations/steps/bash.ts +4 -0
  47. package/src/automations/steps/collect.ts +58 -0
  48. package/src/automations/steps/createRow.ts +4 -0
  49. package/src/automations/steps/delay.ts +1 -0
  50. package/src/automations/steps/deleteRow.ts +4 -0
  51. package/src/automations/steps/discord.ts +4 -0
  52. package/src/automations/steps/executeQuery.ts +4 -0
  53. package/src/automations/steps/executeScript.ts +4 -0
  54. package/src/automations/steps/filter.ts +1 -0
  55. package/src/automations/steps/loop.ts +1 -0
  56. package/src/automations/steps/make.ts +22 -1
  57. package/src/automations/steps/openai.ts +106 -0
  58. package/src/automations/steps/outgoingWebhook.ts +4 -0
  59. package/src/automations/steps/queryRows.ts +4 -0
  60. package/src/automations/steps/sendSmtpEmail.ts +4 -0
  61. package/src/automations/steps/serverLog.ts +4 -0
  62. package/src/automations/steps/slack.ts +4 -0
  63. package/src/automations/steps/updateRow.ts +4 -0
  64. package/src/automations/steps/zapier.ts +22 -1
  65. package/src/automations/tests/make.spec.ts +54 -0
  66. package/src/automations/tests/openai.spec.ts +86 -0
  67. package/src/automations/tests/zapier.spec.ts +56 -0
  68. package/src/automations/triggers.ts +3 -2
  69. package/src/constants/index.ts +17 -16
  70. package/src/db/dynamoClient.ts +1 -1
  71. package/src/db/inMemoryView.ts +1 -0
  72. package/src/db/linkedRows/index.ts +5 -3
  73. package/src/environment.ts +3 -0
  74. package/src/integration-test/postgres.spec.ts +47 -5
  75. package/src/integrations/airtable.ts +33 -4
  76. package/src/integrations/arangodb.ts +20 -2
  77. package/src/integrations/base/sqlTable.ts +0 -1
  78. package/src/integrations/couchdb.ts +20 -4
  79. package/src/integrations/dynamodb.ts +36 -5
  80. package/src/integrations/elasticsearch.ts +18 -1
  81. package/src/integrations/firebase.ts +17 -0
  82. package/src/integrations/googlesheets.ts +66 -5
  83. package/src/integrations/index.ts +12 -7
  84. package/src/integrations/microsoftSqlServer.ts +33 -1
  85. package/src/integrations/mongodb.ts +18 -0
  86. package/src/integrations/mysql.ts +53 -26
  87. package/src/integrations/oracle.ts +38 -6
  88. package/src/integrations/postgres.ts +47 -12
  89. package/src/integrations/redis.ts +35 -4
  90. package/src/integrations/s3.ts +21 -3
  91. package/src/integrations/snowflake.ts +22 -1
  92. package/src/integrations/tests/googlesheets.spec.ts +41 -9
  93. package/src/middleware/builder.ts +26 -18
  94. package/src/migrations/functions/backfill/app/queries.ts +1 -1
  95. package/src/sdk/app/automations/index.ts +2 -0
  96. package/src/sdk/app/automations/utils.ts +7 -0
  97. package/src/sdk/app/datasources/datasources.ts +7 -1
  98. package/src/sdk/plugins/plugins.ts +1 -1
  99. package/src/startup.ts +2 -0
  100. package/src/tests/utilities/TestConfiguration.ts +4 -2
  101. package/src/tests/utilities/structures.ts +42 -0
  102. package/src/threads/automation.ts +91 -23
  103. package/src/threads/index.ts +9 -3
  104. package/src/threads/utils.ts +2 -0
  105. package/src/utilities/fileSystem/app.ts +14 -4
  106. package/src/utilities/fileSystem/clientLibrary.ts +8 -3
  107. package/src/utilities/fileSystem/filesystem.ts +3 -1
  108. package/src/utilities/redis.ts +25 -3
  109. package/src/utilities/rowProcessor/index.ts +4 -1
  110. package/src/utilities/rowProcessor/map.ts +1 -1
  111. package/src/websockets/builder.ts +95 -0
  112. package/src/websockets/client.ts +2 -2
  113. package/src/websockets/grid.ts +44 -44
  114. package/src/websockets/index.ts +13 -6
  115. package/src/websockets/websocket.ts +211 -7
  116. package/tsconfig.build.json +9 -1
  117. package/tsconfig.json +1 -14
  118. package/builder/assets/index.86c992bf.css +0 -6
  119. package/builder/assets/index.c16c35ca.js +0 -1794
  120. package/dist/api/controllers/analytics.js +0 -46
  121. package/dist/api/controllers/apikeys.js +0 -72
  122. package/dist/api/controllers/application.js +0 -574
  123. package/dist/api/controllers/auth.js +0 -80
  124. package/dist/api/controllers/automation.js +0 -303
  125. package/dist/api/controllers/backup.js +0 -37
  126. package/dist/api/controllers/component.js +0 -59
  127. package/dist/api/controllers/datasource.js +0 -306
  128. package/dist/api/controllers/deploy/Deployment.js +0 -53
  129. package/dist/api/controllers/deploy/index.js +0 -198
  130. package/dist/api/controllers/dev.js +0 -146
  131. package/dist/api/controllers/integration.js +0 -28
  132. package/dist/api/controllers/layout.js +0 -49
  133. package/dist/api/controllers/metadata.js +0 -63
  134. package/dist/api/controllers/migrations.js +0 -29
  135. package/dist/api/controllers/ops.js +0 -40
  136. package/dist/api/controllers/permission.js +0 -162
  137. package/dist/api/controllers/plugin/file.js +0 -24
  138. package/dist/api/controllers/plugin/github.js +0 -69
  139. package/dist/api/controllers/plugin/index.js +0 -112
  140. package/dist/api/controllers/plugin/npm.js +0 -58
  141. package/dist/api/controllers/plugin/uploaders.js +0 -11
  142. package/dist/api/controllers/plugin/url.js +0 -24
  143. package/dist/api/controllers/plugin/utils.js +0 -27
  144. package/dist/api/controllers/public/applications.js +0 -146
  145. package/dist/api/controllers/public/mapping/applications.js +0 -29
  146. package/dist/api/controllers/public/mapping/index.js +0 -11
  147. package/dist/api/controllers/public/mapping/queries.js +0 -36
  148. package/dist/api/controllers/public/mapping/rows.js +0 -24
  149. package/dist/api/controllers/public/mapping/tables.js +0 -23
  150. package/dist/api/controllers/public/mapping/types.js +0 -2
  151. package/dist/api/controllers/public/mapping/users.js +0 -29
  152. package/dist/api/controllers/public/metrics.js +0 -113
  153. package/dist/api/controllers/public/queries.js +0 -58
  154. package/dist/api/controllers/public/rows.js +0 -120
  155. package/dist/api/controllers/public/tables.js +0 -95
  156. package/dist/api/controllers/public/users.js +0 -93
  157. package/dist/api/controllers/public/utils.js +0 -56
  158. package/dist/api/controllers/query/import/index.js +0 -87
  159. package/dist/api/controllers/query/import/sources/base/index.js +0 -75
  160. package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
  161. package/dist/api/controllers/query/import/sources/curl.js +0 -99
  162. package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
  163. package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
  164. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
  165. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
  166. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
  167. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
  168. package/dist/api/controllers/query/index.js +0 -299
  169. package/dist/api/controllers/query/validation.js +0 -53
  170. package/dist/api/controllers/role.js +0 -109
  171. package/dist/api/controllers/routing.js +0 -105
  172. package/dist/api/controllers/row/ExternalRequest.js +0 -683
  173. package/dist/api/controllers/row/external.js +0 -339
  174. package/dist/api/controllers/row/index.js +0 -203
  175. package/dist/api/controllers/row/internal.js +0 -509
  176. package/dist/api/controllers/row/internalSearch.js +0 -28
  177. package/dist/api/controllers/row/staticFormula.js +0 -165
  178. package/dist/api/controllers/row/utils.js +0 -183
  179. package/dist/api/controllers/screen.js +0 -110
  180. package/dist/api/controllers/script.js +0 -30
  181. package/dist/api/controllers/static/index.js +0 -268
  182. package/dist/api/controllers/table/bulkFormula.js +0 -173
  183. package/dist/api/controllers/table/external.js +0 -279
  184. package/dist/api/controllers/table/index.js +0 -179
  185. package/dist/api/controllers/table/internal.js +0 -197
  186. package/dist/api/controllers/table/utils.js +0 -379
  187. package/dist/api/controllers/templates.js +0 -56
  188. package/dist/api/controllers/user.js +0 -124
  189. package/dist/api/controllers/view/exporters.js +0 -46
  190. package/dist/api/controllers/view/index.js +0 -193
  191. package/dist/api/controllers/view/utils.js +0 -177
  192. package/dist/api/controllers/view/viewBuilder.js +0 -158
  193. package/dist/api/controllers/webhook.js +0 -134
  194. package/dist/api/index.js +0 -55
  195. package/dist/api/routes/analytics.js +0 -34
  196. package/dist/api/routes/apikeys.js +0 -37
  197. package/dist/api/routes/application.js +0 -48
  198. package/dist/api/routes/auth.js +0 -33
  199. package/dist/api/routes/automation.js +0 -50
  200. package/dist/api/routes/backup.js +0 -35
  201. package/dist/api/routes/component.js +0 -35
  202. package/dist/api/routes/datasource.js +0 -43
  203. package/dist/api/routes/deploy.js +0 -37
  204. package/dist/api/routes/dev.js +0 -49
  205. package/dist/api/routes/index.js +0 -75
  206. package/dist/api/routes/integration.js +0 -37
  207. package/dist/api/routes/layout.js +0 -37
  208. package/dist/api/routes/metadata.js +0 -40
  209. package/dist/api/routes/migrations.js +0 -36
  210. package/dist/api/routes/ops.js +0 -52
  211. package/dist/api/routes/permission.js +0 -44
  212. package/dist/api/routes/plugin.js +0 -39
  213. package/dist/api/routes/public/applications.js +0 -174
  214. package/dist/api/routes/public/index.js +0 -140
  215. package/dist/api/routes/public/metrics.js +0 -30
  216. package/dist/api/routes/public/middleware/mapper.js +0 -97
  217. package/dist/api/routes/public/queries.js +0 -72
  218. package/dist/api/routes/public/rows.js +0 -158
  219. package/dist/api/routes/public/tables.js +0 -152
  220. package/dist/api/routes/public/users.js +0 -135
  221. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  222. package/dist/api/routes/query.js +0 -47
  223. package/dist/api/routes/role.js +0 -40
  224. package/dist/api/routes/routing.js +0 -39
  225. package/dist/api/routes/row.js +0 -239
  226. package/dist/api/routes/screen.js +0 -39
  227. package/dist/api/routes/script.js +0 -35
  228. package/dist/api/routes/static.js +0 -80
  229. package/dist/api/routes/table.js +0 -163
  230. package/dist/api/routes/templates.js +0 -37
  231. package/dist/api/routes/user.js +0 -43
  232. package/dist/api/routes/utils/validators.js +0 -238
  233. package/dist/api/routes/view.js +0 -42
  234. package/dist/api/routes/webhook.js +0 -43
  235. package/dist/app.js +0 -132
  236. package/dist/automations/actions.js +0 -137
  237. package/dist/automations/automationUtils.js +0 -173
  238. package/dist/automations/bullboard.js +0 -71
  239. package/dist/automations/index.js +0 -43
  240. package/dist/automations/logging/index.js +0 -53
  241. package/dist/automations/steps/bash.js +0 -111
  242. package/dist/automations/steps/createRow.js +0 -108
  243. package/dist/automations/steps/delay.js +0 -53
  244. package/dist/automations/steps/deleteRow.js +0 -96
  245. package/dist/automations/steps/discord.js +0 -116
  246. package/dist/automations/steps/executeQuery.js +0 -134
  247. package/dist/automations/steps/executeScript.js +0 -106
  248. package/dist/automations/steps/filter.js +0 -112
  249. package/dist/automations/steps/loop.js +0 -54
  250. package/dist/automations/steps/make.js +0 -120
  251. package/dist/automations/steps/outgoingWebhook.js +0 -166
  252. package/dist/automations/steps/queryRows.js +0 -220
  253. package/dist/automations/steps/sendSmtpEmail.js +0 -115
  254. package/dist/automations/steps/serverLog.js +0 -65
  255. package/dist/automations/steps/slack.js +0 -98
  256. package/dist/automations/steps/updateRow.js +0 -144
  257. package/dist/automations/steps/utils.js +0 -56
  258. package/dist/automations/steps/zapier.js +0 -117
  259. package/dist/automations/triggerInfo/app.js +0 -36
  260. package/dist/automations/triggerInfo/cron.js +0 -35
  261. package/dist/automations/triggerInfo/index.js +0 -40
  262. package/dist/automations/triggerInfo/rowDeleted.js +0 -36
  263. package/dist/automations/triggerInfo/rowSaved.js +0 -44
  264. package/dist/automations/triggerInfo/rowUpdated.js +0 -44
  265. package/dist/automations/triggerInfo/webhook.js +0 -40
  266. package/dist/automations/triggers.js +0 -181
  267. package/dist/automations/utils.js +0 -275
  268. package/dist/constants/definitions.js +0 -2
  269. package/dist/constants/index.js +0 -181
  270. package/dist/constants/layouts.js +0 -148
  271. package/dist/constants/screens.js +0 -51
  272. package/dist/db/defaultData/datasource_bb_default.js +0 -574
  273. package/dist/db/defaultData/employeeImport.js +0 -155
  274. package/dist/db/defaultData/expensesImport.js +0 -117
  275. package/dist/db/defaultData/inventoryImport.js +0 -109
  276. package/dist/db/defaultData/jobsImport.js +0 -152
  277. package/dist/db/dynamoClient.js +0 -124
  278. package/dist/db/inMemoryView.js +0 -62
  279. package/dist/db/index.js +0 -43
  280. package/dist/db/linkedRows/LinkController.js +0 -392
  281. package/dist/db/linkedRows/LinkDocument.js +0 -33
  282. package/dist/db/linkedRows/index.js +0 -206
  283. package/dist/db/linkedRows/linkUtils.js +0 -131
  284. package/dist/db/newid.js +0 -7
  285. package/dist/db/utils.js +0 -248
  286. package/dist/db/views/staticViews.js +0 -144
  287. package/dist/ddApm.js +0 -11
  288. package/dist/definitions/automations.js +0 -8
  289. package/dist/definitions/common.js +0 -2
  290. package/dist/definitions/datasource.js +0 -7
  291. package/dist/definitions/openapi.js +0 -6
  292. package/dist/environment.js +0 -109
  293. package/dist/events/AutomationEmitter.js +0 -53
  294. package/dist/events/BudibaseEmitter.js +0 -25
  295. package/dist/events/docUpdates/index.js +0 -17
  296. package/dist/events/docUpdates/processors.js +0 -18
  297. package/dist/events/docUpdates/syncUsers.js +0 -49
  298. package/dist/events/index.js +0 -11
  299. package/dist/events/utils.js +0 -43
  300. package/dist/integrations/airtable.js +0 -147
  301. package/dist/integrations/arangodb.js +0 -103
  302. package/dist/integrations/base/query.js +0 -32
  303. package/dist/integrations/base/sql.js +0 -600
  304. package/dist/integrations/base/sqlTable.js +0 -167
  305. package/dist/integrations/base/types.js +0 -2
  306. package/dist/integrations/couchdb.js +0 -125
  307. package/dist/integrations/dynamodb.js +0 -194
  308. package/dist/integrations/elasticsearch.js +0 -186
  309. package/dist/integrations/firebase.js +0 -174
  310. package/dist/integrations/googlesheets.js +0 -455
  311. package/dist/integrations/index.js +0 -135
  312. package/dist/integrations/microsoftSqlServer.js +0 -273
  313. package/dist/integrations/mongodb.js +0 -614
  314. package/dist/integrations/mysql.js +0 -256
  315. package/dist/integrations/oracle.js +0 -375
  316. package/dist/integrations/postgres.js +0 -300
  317. package/dist/integrations/queries/sql.js +0 -84
  318. package/dist/integrations/redis.js +0 -168
  319. package/dist/integrations/rest.js +0 -400
  320. package/dist/integrations/s3.js +0 -237
  321. package/dist/integrations/snowflake.js +0 -102
  322. package/dist/integrations/utils.js +0 -295
  323. package/dist/middleware/appInfo.js +0 -22
  324. package/dist/middleware/authorized.js +0 -112
  325. package/dist/middleware/builder.js +0 -93
  326. package/dist/middleware/currentapp.js +0 -103
  327. package/dist/middleware/joi-validator.js +0 -43
  328. package/dist/middleware/publicApi.js +0 -25
  329. package/dist/middleware/resourceId.js +0 -59
  330. package/dist/middleware/selfhost.js +0 -24
  331. package/dist/middleware/utils.js +0 -8
  332. package/dist/migrations/functions/appUrls.js +0 -42
  333. package/dist/migrations/functions/backfill/app/automations.js +0 -31
  334. package/dist/migrations/functions/backfill/app/datasources.js +0 -28
  335. package/dist/migrations/functions/backfill/app/layouts.js +0 -33
  336. package/dist/migrations/functions/backfill/app/queries.js +0 -50
  337. package/dist/migrations/functions/backfill/app/roles.js +0 -28
  338. package/dist/migrations/functions/backfill/app/screens.js +0 -28
  339. package/dist/migrations/functions/backfill/app/tables.js +0 -37
  340. package/dist/migrations/functions/backfill/app.js +0 -176
  341. package/dist/migrations/functions/backfill/global/configs.js +0 -67
  342. package/dist/migrations/functions/backfill/global/quotas.js +0 -60
  343. package/dist/migrations/functions/backfill/global/users.js +0 -50
  344. package/dist/migrations/functions/backfill/global.js +0 -205
  345. package/dist/migrations/functions/backfill/index.js +0 -32
  346. package/dist/migrations/functions/backfill/installation.js +0 -80
  347. package/dist/migrations/functions/syncQuotas.js +0 -52
  348. package/dist/migrations/functions/tableSettings.js +0 -130
  349. package/dist/migrations/functions/usageQuotas/index.js +0 -16
  350. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
  351. package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
  352. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  353. package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
  354. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  355. package/dist/migrations/index.js +0 -111
  356. package/dist/migrations/tests/helpers.js +0 -72
  357. package/dist/migrations/tests/structures.js +0 -37
  358. package/dist/sdk/app/applications/index.js +0 -28
  359. package/dist/sdk/app/applications/sync.js +0 -164
  360. package/dist/sdk/app/applications/utils.js +0 -21
  361. package/dist/sdk/app/automations/index.js +0 -29
  362. package/dist/sdk/app/automations/webhook.js +0 -54
  363. package/dist/sdk/app/backups/constants.js +0 -6
  364. package/dist/sdk/app/backups/exports.js +0 -160
  365. package/dist/sdk/app/backups/imports.js +0 -170
  366. package/dist/sdk/app/backups/index.js +0 -29
  367. package/dist/sdk/app/backups/statistics.js +0 -73
  368. package/dist/sdk/app/datasources/datasources.js +0 -166
  369. package/dist/sdk/app/datasources/index.js +0 -27
  370. package/dist/sdk/app/queries/index.js +0 -27
  371. package/dist/sdk/app/queries/queries.js +0 -60
  372. package/dist/sdk/app/rows/attachments.js +0 -61
  373. package/dist/sdk/app/rows/index.js +0 -28
  374. package/dist/sdk/app/rows/rows.js +0 -30
  375. package/dist/sdk/app/tables/index.js +0 -65
  376. package/dist/sdk/index.js +0 -27
  377. package/dist/sdk/plugins/index.js +0 -27
  378. package/dist/sdk/plugins/plugins.js +0 -53
  379. package/dist/sdk/users/index.js +0 -27
  380. package/dist/sdk/users/utils.js +0 -94
  381. package/dist/sdk/utils/index.js +0 -29
  382. package/dist/startup.js +0 -158
  383. package/dist/threads/automation.js +0 -450
  384. package/dist/threads/definitions.js +0 -2
  385. package/dist/threads/index.js +0 -140
  386. package/dist/threads/query.js +0 -265
  387. package/dist/threads/utils.js +0 -120
  388. package/dist/tsconfig.build.tsbuildinfo +0 -1
  389. package/dist/utilities/appDirectoryTemplate/package.json +0 -10
  390. package/dist/utilities/budibaseDir.js +0 -5
  391. package/dist/utilities/centralPath.js +0 -27
  392. package/dist/utilities/csv.js +0 -33
  393. package/dist/utilities/fileSystem/app.js +0 -88
  394. package/dist/utilities/fileSystem/clientLibrary.js +0 -138
  395. package/dist/utilities/fileSystem/filesystem.js +0 -180
  396. package/dist/utilities/fileSystem/index.js +0 -21
  397. package/dist/utilities/fileSystem/plugin.js +0 -76
  398. package/dist/utilities/fileSystem/processor.js +0 -34
  399. package/dist/utilities/fileSystem/template.js +0 -47
  400. package/dist/utilities/global.js +0 -146
  401. package/dist/utilities/index.js +0 -143
  402. package/dist/utilities/redis.js +0 -117
  403. package/dist/utilities/retry.js +0 -30
  404. package/dist/utilities/routing/index.js +0 -39
  405. package/dist/utilities/rowProcessor/index.js +0 -282
  406. package/dist/utilities/rowProcessor/map.js +0 -116
  407. package/dist/utilities/rowProcessor/utils.js +0 -87
  408. package/dist/utilities/schema.js +0 -112
  409. package/dist/utilities/scriptRunner.js +0 -26
  410. package/dist/utilities/security.js +0 -57
  411. package/dist/utilities/statusCodes.js +0 -9
  412. package/dist/utilities/usageQuota/rows.js +0 -88
  413. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  414. package/dist/utilities/users.js +0 -57
  415. package/dist/utilities/workerRequests.js +0 -171
  416. package/dist/watch.js +0 -53
  417. package/dist/websockets/client.js +0 -14
  418. package/dist/websockets/grid.js +0 -60
  419. package/dist/websockets/index.js +0 -17
  420. package/dist/websockets/websocket.js +0 -78
  421. package/src/automations/tests/zapier.spec.js +0 -27
  422. /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
  423. /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
  424. /package/dist/{api/controllers/static/templates/preview.hbs → preview.hbs} +0 -0
@@ -17,14 +17,15 @@ jest.mock("google-spreadsheet")
17
17
  const { GoogleSpreadsheet } = require("google-spreadsheet")
18
18
 
19
19
  const sheetsByTitle: { [title: string]: GoogleSpreadsheetWorksheet } = {}
20
+ const sheetsByIndex: GoogleSpreadsheetWorksheet[] = []
21
+ const mockGoogleIntegration = {
22
+ useOAuth2Client: jest.fn(),
23
+ loadInfo: jest.fn(),
24
+ sheetsByTitle,
25
+ sheetsByIndex,
26
+ }
20
27
 
21
- GoogleSpreadsheet.mockImplementation(() => {
22
- return {
23
- useOAuth2Client: jest.fn(),
24
- loadInfo: jest.fn(),
25
- sheetsByTitle,
26
- }
27
- })
28
+ GoogleSpreadsheet.mockImplementation(() => mockGoogleIntegration)
28
29
 
29
30
  import { structures } from "@budibase/backend-core/tests"
30
31
  import TestConfiguration from "../../tests/utilities/TestConfiguration"
@@ -53,6 +54,8 @@ describe("Google Sheets Integration", () => {
53
54
  },
54
55
  })
55
56
  await config.init()
57
+
58
+ jest.clearAllMocks()
56
59
  })
57
60
 
58
61
  function createBasicTable(name: string, columns: string[]): Table {
@@ -88,7 +91,7 @@ describe("Google Sheets Integration", () => {
88
91
  }
89
92
 
90
93
  describe("update table", () => {
91
- test("adding a new field will be adding a new header row", async () => {
94
+ it("adding a new field will be adding a new header row", async () => {
92
95
  await config.doInContext(structures.uuid(), async () => {
93
96
  const tableColumns = ["name", "description", "new field"]
94
97
  const table = createBasicTable(structures.uuid(), tableColumns)
@@ -103,7 +106,7 @@ describe("Google Sheets Integration", () => {
103
106
  })
104
107
  })
105
108
 
106
- test("removing an existing field will remove the header from the google sheet", async () => {
109
+ it("removing an existing field will remove the header from the google sheet", async () => {
107
110
  const sheet = await config.doInContext(structures.uuid(), async () => {
108
111
  const tableColumns = ["name"]
109
112
  const table = createBasicTable(structures.uuid(), tableColumns)
@@ -123,4 +126,33 @@ describe("Google Sheets Integration", () => {
123
126
  expect((sheet.setHeaderRow as any).mock.calls[0][0]).toHaveLength(1)
124
127
  })
125
128
  })
129
+
130
+ describe("getTableNames", () => {
131
+ it("can fetch table names", async () => {
132
+ await config.doInContext(structures.uuid(), async () => {
133
+ const sheetNames: string[] = []
134
+ for (let i = 0; i < 5; i++) {
135
+ const sheet = createSheet({ headerValues: [] })
136
+ sheetsByIndex.push(sheet)
137
+ sheetNames.push(sheet.title)
138
+ }
139
+
140
+ const res = await integration.getTableNames()
141
+
142
+ expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
143
+ expect(res).toEqual(sheetNames)
144
+ })
145
+ })
146
+ })
147
+
148
+ describe("testConnection", () => {
149
+ it("can test successful connections", async () => {
150
+ await config.doInContext(structures.uuid(), async () => {
151
+ const res = await integration.testConnection()
152
+
153
+ expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
154
+ expect(res).toEqual({ connected: true })
155
+ })
156
+ })
157
+ })
126
158
  })
@@ -9,8 +9,8 @@ import {
9
9
  checkDebounce,
10
10
  setDebounce,
11
11
  } from "../utilities/redis"
12
- import { db as dbCore, cache, permissions } from "@budibase/backend-core"
13
- import { BBContext, Database } from "@budibase/types"
12
+ import { db as dbCore, cache } from "@budibase/backend-core"
13
+ import { UserCtx, Database } from "@budibase/types"
14
14
 
15
15
  const DEBOUNCE_TIME_SEC = 30
16
16
 
@@ -23,7 +23,7 @@ const DEBOUNCE_TIME_SEC = 30
23
23
  * through the authorized middleware *
24
24
  ****************************************************/
25
25
 
26
- async function checkDevAppLocks(ctx: BBContext) {
26
+ async function checkDevAppLocks(ctx: UserCtx) {
27
27
  const appId = ctx.appId
28
28
 
29
29
  // if any public usage, don't proceed
@@ -35,15 +35,14 @@ async function checkDevAppLocks(ctx: BBContext) {
35
35
  if (!appId || !appId.startsWith(APP_DEV_PREFIX)) {
36
36
  return
37
37
  }
38
- if (!(await doesUserHaveLock(appId, ctx.user))) {
39
- ctx.throw(400, "User does not hold app lock.")
40
- }
41
38
 
42
- // they do have lock, update it
43
- await updateLock(appId, ctx.user)
39
+ // If this user already owns the lock, then update it
40
+ if (await doesUserHaveLock(appId, ctx.user)) {
41
+ await updateLock(appId, ctx.user)
42
+ }
44
43
  }
45
44
 
46
- async function updateAppUpdatedAt(ctx: BBContext) {
45
+ async function updateAppUpdatedAt(ctx: UserCtx) {
47
46
  const appId = ctx.appId
48
47
  // if debouncing skip this update
49
48
  // get methods also aren't updating
@@ -51,20 +50,29 @@ async function updateAppUpdatedAt(ctx: BBContext) {
51
50
  return
52
51
  }
53
52
  await dbCore.doWithDB(appId, async (db: Database) => {
54
- const metadata = await db.get(DocumentType.APP_METADATA)
55
- metadata.updatedAt = new Date().toISOString()
53
+ try {
54
+ const metadata = await db.get(DocumentType.APP_METADATA)
55
+ metadata.updatedAt = new Date().toISOString()
56
56
 
57
- metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user?.userId!)
57
+ metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user?.userId!)
58
58
 
59
- const response = await db.put(metadata)
60
- metadata._rev = response.rev
61
- await cache.app.invalidateAppMetadata(appId, metadata)
62
- // set a new debounce record with a short TTL
63
- await setDebounce(appId, DEBOUNCE_TIME_SEC)
59
+ const response = await db.put(metadata)
60
+ metadata._rev = response.rev
61
+ await cache.app.invalidateAppMetadata(appId, metadata)
62
+ // set a new debounce record with a short TTL
63
+ await setDebounce(appId, DEBOUNCE_TIME_SEC)
64
+ } catch (err: any) {
65
+ // if a 409 occurs, then multiple clients connected at the same time - ignore
66
+ if (err?.status === 409) {
67
+ return
68
+ } else {
69
+ throw err
70
+ }
71
+ }
64
72
  })
65
73
  }
66
74
 
67
- export default async function builder(ctx: BBContext) {
75
+ export default async function builder(ctx: UserCtx) {
68
76
  const appId = ctx.appId
69
77
  // this only functions within an app context
70
78
  if (!appId) {
@@ -33,7 +33,7 @@ export const backfill = async (appDb: any, timestamp: string | number) => {
33
33
  datasource = {
34
34
  type: "unknown",
35
35
  _id: query.datasourceId,
36
- source: SourceName.UNKNOWN,
36
+ source: "unknown" as SourceName,
37
37
  }
38
38
  } else {
39
39
  throw e
@@ -1,5 +1,7 @@
1
1
  import * as webhook from "./webhook"
2
+ import * as utils from "./utils"
2
3
 
3
4
  export default {
4
5
  webhook,
6
+ utils,
5
7
  }
@@ -0,0 +1,7 @@
1
+ import { Automation, AutomationActionStepId } from "@budibase/types"
2
+
3
+ export function checkForCollectStep(automation: Automation) {
4
+ return automation.definition.steps.some(
5
+ (step: any) => step.stepId === AutomationActionStepId.COLLECT
6
+ )
7
+ }
@@ -13,6 +13,7 @@ import {
13
13
  import { cloneDeep } from "lodash/fp"
14
14
  import { getEnvironmentVariables } from "../../utils"
15
15
  import { getDefinitions, getDefinition } from "../../../integrations"
16
+ import _ from "lodash"
16
17
 
17
18
  const ENV_VAR_PREFIX = "env."
18
19
 
@@ -41,7 +42,7 @@ async function enrichDatasourceWithValues(datasource: Datasource) {
41
42
  { onlyFound: true }
42
43
  ) as Datasource
43
44
  const definition = await getDefinition(processed.source)
44
- processed.config = checkDatasourceTypes(definition, processed.config)
45
+ processed.config = checkDatasourceTypes(definition!, processed.config)
45
46
  return {
46
47
  datasource: processed,
47
48
  envVars: env as Record<string, string>,
@@ -147,6 +148,11 @@ export function mergeConfigs(update: Datasource, old: Datasource) {
147
148
  }
148
149
  }
149
150
  }
151
+
152
+ if (old.config?.auth) {
153
+ update.config = _.merge(old.config, update.config)
154
+ }
155
+
150
156
  // update back to actual passwords for everything else
151
157
  for (let [key, value] of Object.entries(update.config)) {
152
158
  if (value !== PASSWORD_REPLACEMENT) {
@@ -36,6 +36,6 @@ export async function processUploaded(plugin: FileType, source?: PluginSource) {
36
36
  }
37
37
 
38
38
  const doc = await pro.plugins.storePlugin(metadata, directory, source)
39
- clientAppSocket.emit("plugin-update", { name: doc.name, hash: doc.hash })
39
+ clientAppSocket?.emit("plugin-update", { name: doc.name, hash: doc.hash })
40
40
  return doc
41
41
  }
package/src/startup.ts CHANGED
@@ -16,6 +16,7 @@ import * as bullboard from "./automations/bullboard"
16
16
  import * as pro from "@budibase/pro"
17
17
  import * as api from "./api"
18
18
  import sdk from "./sdk"
19
+ import { initialise as initialiseWebsockets } from "./websockets"
19
20
 
20
21
  let STARTUP_RAN = false
21
22
 
@@ -64,6 +65,7 @@ export async function startup(app?: any, server?: any) {
64
65
  fileSystem.init()
65
66
  await redis.init()
66
67
  eventInit()
68
+ initialiseWebsockets(app, server)
67
69
 
68
70
  // run migrations on startup if not done via http
69
71
  // not recommended in a clustered environment
@@ -373,7 +373,7 @@ class TestConfiguration {
373
373
 
374
374
  // HEADERS
375
375
 
376
- defaultHeaders(extras = {}) {
376
+ defaultHeaders(extras = {}, prodApp = false) {
377
377
  const tenantId = this.getTenantId()
378
378
  const authObj: AuthToken = {
379
379
  userId: this.defaultUserValues.globalUserId,
@@ -390,7 +390,9 @@ class TestConfiguration {
390
390
  ...extras,
391
391
  }
392
392
 
393
- if (this.appId) {
393
+ if (prodApp) {
394
+ headers[constants.Header.APP_ID] = this.prodAppId
395
+ } else if (this.appId) {
394
396
  headers[constants.Header.APP_ID] = this.appId
395
397
  }
396
398
  return headers
@@ -199,6 +199,48 @@ export function loopAutomation(tableId: string, loopOpts?: any): Automation {
199
199
  return automation as Automation
200
200
  }
201
201
 
202
+ export function collectAutomation(tableId?: string): Automation {
203
+ const automation: any = {
204
+ name: "looping",
205
+ type: "automation",
206
+ definition: {
207
+ steps: [
208
+ {
209
+ id: "b",
210
+ type: "ACTION",
211
+ internal: true,
212
+ stepId: AutomationActionStepId.EXECUTE_SCRIPT,
213
+ inputs: {
214
+ code: "return [1,2,3]",
215
+ },
216
+ schema: BUILTIN_ACTION_DEFINITIONS.EXECUTE_SCRIPT.schema,
217
+ },
218
+ {
219
+ id: "c",
220
+ type: "ACTION",
221
+ internal: true,
222
+ stepId: AutomationActionStepId.COLLECT,
223
+ inputs: {
224
+ collection: "{{ literal steps.1.value }}",
225
+ },
226
+ schema: BUILTIN_ACTION_DEFINITIONS.SERVER_LOG.schema,
227
+ },
228
+ ],
229
+ trigger: {
230
+ id: "a",
231
+ type: "TRIGGER",
232
+ event: "row:save",
233
+ stepId: AutomationTriggerStepId.ROW_SAVED,
234
+ inputs: {
235
+ tableId,
236
+ },
237
+ schema: TRIGGER_DEFINITIONS.ROW_SAVED.schema,
238
+ },
239
+ },
240
+ }
241
+ return automation as Automation
242
+ }
243
+
202
244
  export function basicRow(tableId: string) {
203
245
  return {
204
246
  name: "Test Contact",
@@ -19,6 +19,7 @@ import {
19
19
  AutomationStatus,
20
20
  AutomationMetadata,
21
21
  AutomationJob,
22
+ AutomationData,
22
23
  } from "@budibase/types"
23
24
  import {
24
25
  LoopStep,
@@ -30,6 +31,7 @@ import { WorkerCallback } from "./definitions"
30
31
  import { context, logging } from "@budibase/backend-core"
31
32
  import { processObject } from "@budibase/string-templates"
32
33
  import { cloneDeep } from "lodash/fp"
34
+ import { performance } from "perf_hooks"
33
35
  import * as sdkUtils from "../sdk/utils"
34
36
  import env from "../environment"
35
37
  const FILTER_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.FILTER.stepId
@@ -37,15 +39,23 @@ const LOOP_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.LOOP.stepId
37
39
  const CRON_STEP_ID = triggerDefs.CRON.stepId
38
40
  const STOPPED_STATUS = { success: true, status: AutomationStatus.STOPPED }
39
41
 
40
- function getLoopIterations(loopStep: LoopStep, input: LoopInput) {
41
- const binding = automationUtils.typecastForLooping(loopStep, input)
42
+ function getLoopIterations(loopStep: LoopStep) {
43
+ let binding = loopStep.inputs.binding
42
44
  if (!binding) {
43
45
  return 0
44
46
  }
47
+ const isString = typeof binding === "string"
48
+ try {
49
+ if (isString) {
50
+ binding = JSON.parse(binding)
51
+ }
52
+ } catch (err) {
53
+ // ignore error - wasn't able to parse
54
+ }
45
55
  if (Array.isArray(binding)) {
46
56
  return binding.length
47
57
  }
48
- if (typeof binding === "string") {
58
+ if (isString) {
49
59
  return automationUtils.stringSplit(binding).length
50
60
  }
51
61
  return 0
@@ -240,7 +250,9 @@ class Orchestrator {
240
250
  let loopStepNumber: any = undefined
241
251
  let loopSteps: LoopStep[] | undefined = []
242
252
  let metadata
253
+ let timeoutFlag = false
243
254
  let wasLoopStep = false
255
+ let timeout = this._job.data.event.timeout
244
256
  // check if this is a recurring automation,
245
257
  if (isProdAppID(this._appId) && isRecurring(automation)) {
246
258
  metadata = await this.getMetadata()
@@ -249,8 +261,18 @@ class Orchestrator {
249
261
  return
250
262
  }
251
263
  }
252
-
264
+ const start = performance.now()
253
265
  for (let step of automation.definition.steps) {
266
+ if (timeoutFlag) {
267
+ break
268
+ }
269
+
270
+ if (timeout) {
271
+ setTimeout(() => {
272
+ timeoutFlag = true
273
+ }, timeout || 12000)
274
+ }
275
+
254
276
  stepCount++
255
277
  let input: any,
256
278
  iterations = 1,
@@ -264,22 +286,17 @@ class Orchestrator {
264
286
 
265
287
  if (loopStep) {
266
288
  input = await processObject(loopStep.inputs, this._context)
267
- iterations = getLoopIterations(loopStep as LoopStep, input)
289
+ iterations = getLoopIterations(loopStep as LoopStep)
268
290
  }
269
291
  for (let index = 0; index < iterations; index++) {
270
292
  let originalStepInput = cloneDeep(step.inputs)
271
293
  // Handle if the user has set a max iteration count or if it reaches the max limit set by us
272
294
  if (loopStep && input.binding) {
273
- let newInput: any = await processObject(
274
- loopStep.inputs,
275
- cloneDeep(this._context)
276
- )
277
-
278
295
  let tempOutput = { items: loopSteps, iterations: iterationCount }
279
296
  try {
280
- newInput.binding = automationUtils.typecastForLooping(
297
+ loopStep.inputs.binding = automationUtils.typecastForLooping(
281
298
  loopStep as LoopStep,
282
- newInput
299
+ loopStep.inputs as LoopInput
283
300
  )
284
301
  } catch (err) {
285
302
  this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
@@ -290,13 +307,12 @@ class Orchestrator {
290
307
  loopStep = undefined
291
308
  break
292
309
  }
293
-
294
310
  let item = []
295
311
  if (
296
312
  typeof loopStep.inputs.binding === "string" &&
297
313
  loopStep.inputs.option === "String"
298
314
  ) {
299
- item = automationUtils.stringSplit(newInput.binding)
315
+ item = automationUtils.stringSplit(loopStep.inputs.binding)
300
316
  } else if (Array.isArray(loopStep.inputs.binding)) {
301
317
  item = loopStep.inputs.binding
302
318
  }
@@ -338,6 +354,7 @@ class Orchestrator {
338
354
  }
339
355
  }
340
356
  }
357
+
341
358
  if (
342
359
  index === env.AUTOMATION_MAX_ITERATIONS ||
343
360
  index === parseInt(loopStep.inputs.iterations)
@@ -466,8 +483,25 @@ class Orchestrator {
466
483
  }
467
484
  }
468
485
 
486
+ const end = performance.now()
487
+ const executionTime = end - start
488
+
489
+ console.info(`Execution time: ${executionTime} milliseconds`, {
490
+ _logKey: "automation",
491
+ executionTime,
492
+ })
493
+
469
494
  // store the logs for the automation run
470
- await storeLog(this._automation, this.executionOutput)
495
+ try {
496
+ await storeLog(this._automation, this.executionOutput)
497
+ } catch (e: any) {
498
+ if (e.status === 413 && e.request?.data) {
499
+ // if content is too large we shouldn't log it
500
+ delete e.request.data
501
+ e.request.data = { message: "removed due to large size" }
502
+ }
503
+ logging.logAlert("Error writing automation log", e)
504
+ }
471
505
  if (isProdAppID(this._appId) && isRecurring(automation) && metadata) {
472
506
  await this.updateMetadata(metadata)
473
507
  }
@@ -475,22 +509,56 @@ class Orchestrator {
475
509
  }
476
510
  }
477
511
 
478
- export function execute(job: Job, callback: WorkerCallback) {
512
+ export function execute(job: Job<AutomationData>, callback: WorkerCallback) {
479
513
  const appId = job.data.event.appId
514
+ const automationId = job.data.automation._id
480
515
  if (!appId) {
481
516
  throw new Error("Unable to execute, event doesn't contain app ID.")
482
517
  }
518
+ if (!automationId) {
519
+ throw new Error("Unable to execute, event doesn't contain automation ID.")
520
+ }
521
+ return context.doInAutomationContext({
522
+ appId,
523
+ automationId,
524
+ task: async () => {
525
+ const envVars = await sdkUtils.getEnvironmentVariables()
526
+ // put into automation thread for whole context
527
+ await context.doInEnvironmentContext(envVars, async () => {
528
+ const automationOrchestrator = new Orchestrator(job)
529
+ try {
530
+ const response = await automationOrchestrator.execute()
531
+ callback(null, response)
532
+ } catch (err) {
533
+ callback(err)
534
+ }
535
+ })
536
+ },
537
+ })
538
+ }
539
+
540
+ export function executeSynchronously(job: Job) {
541
+ const appId = job.data.event.appId
542
+ if (!appId) {
543
+ throw new Error("Unable to execute, event doesn't contain app ID.")
544
+ }
545
+
546
+ const timeoutPromise = new Promise((resolve, reject) => {
547
+ setTimeout(() => {
548
+ reject(new Error("Timeout exceeded"))
549
+ }, job.data.event.timeout || 12000)
550
+ })
551
+
483
552
  return context.doInAppContext(appId, async () => {
484
553
  const envVars = await sdkUtils.getEnvironmentVariables()
485
554
  // put into automation thread for whole context
486
- await context.doInEnvironmentContext(envVars, async () => {
555
+ return context.doInEnvironmentContext(envVars, async () => {
487
556
  const automationOrchestrator = new Orchestrator(job)
488
- try {
489
- const response = await automationOrchestrator.execute()
490
- callback(null, response)
491
- } catch (err) {
492
- callback(err)
493
- }
557
+ const response = await Promise.race([
558
+ automationOrchestrator.execute(),
559
+ timeoutPromise,
560
+ ])
561
+ return response
494
562
  })
495
563
  })
496
564
  }
@@ -38,6 +38,9 @@ export class Thread {
38
38
  this.count = opts.count ? opts.count : 1
39
39
  this.disableThreading = this.shouldDisableThreading()
40
40
  if (!this.disableThreading) {
41
+ console.debug(
42
+ `[${env.FORKED_PROCESS_NAME}] initialising worker farm type=${type}`
43
+ )
41
44
  const workerOpts: any = {
42
45
  autoStart: true,
43
46
  maxConcurrentWorkers: this.count,
@@ -45,6 +48,7 @@ export class Thread {
45
48
  env: {
46
49
  ...process.env,
47
50
  FORKED_PROCESS: "1",
51
+ FORKED_PROCESS_NAME: type,
48
52
  },
49
53
  },
50
54
  }
@@ -54,6 +58,10 @@ export class Thread {
54
58
  }
55
59
  this.workers = workerFarm(workerOpts, typeToFile(type), ["execute"])
56
60
  Thread.workerRefs.push(this.workers)
61
+ } else {
62
+ console.debug(
63
+ `[${env.FORKED_PROCESS_NAME}] skipping worker farm type=${type}`
64
+ )
57
65
  }
58
66
  }
59
67
 
@@ -72,9 +80,7 @@ export class Thread {
72
80
  function fire(worker: any) {
73
81
  worker.execute(job, (err: any, response: any) => {
74
82
  if (err && err.type === "TimeoutError") {
75
- reject(
76
- new Error(`Query response time exceeded ${timeout}ms timeout.`)
77
- )
83
+ reject(new Error(`Thread timeout exceeded ${timeout}ms timeout.`))
78
84
  } else if (err) {
79
85
  reject(err)
80
86
  } else {
@@ -26,8 +26,10 @@ function makeVariableKey(queryId: string, variable: string) {
26
26
  export function threadSetup() {
27
27
  // don't run this if not threading
28
28
  if (env.isTest() || env.DISABLE_THREADING || !env.isInThread()) {
29
+ console.debug(`[${env.FORKED_PROCESS_NAME}] thread setup skipped`)
29
30
  return
30
31
  }
32
+ console.debug(`[${env.FORKED_PROCESS_NAME}] thread setup running`)
31
33
  db.init()
32
34
  }
33
35
 
@@ -35,10 +35,20 @@ export const getComponentLibraryManifest = async (library: string) => {
35
35
  const filename = "manifest.json"
36
36
 
37
37
  if (env.isDev() || env.isTest()) {
38
- const path = join(NODE_MODULES_PATH, "@budibase", "client", filename)
39
- // always load from new so that updates are refreshed
40
- delete require.cache[require.resolve(path)]
41
- return require(path)
38
+ const paths = [
39
+ join(TOP_LEVEL_PATH, "packages/client", filename),
40
+ join(process.cwd(), "client", filename),
41
+ ]
42
+ for (let path of paths) {
43
+ if (fs.existsSync(path)) {
44
+ // always load from new so that updates are refreshed
45
+ delete require.cache[require.resolve(path)]
46
+ return require(path)
47
+ }
48
+ }
49
+ throw new Error(
50
+ `Unable to find ${filename} in development environment (may need to build).`
51
+ )
42
52
  }
43
53
 
44
54
  if (!appId) {
@@ -1,4 +1,4 @@
1
- import { join } from "path"
1
+ import path, { join } from "path"
2
2
  import { ObjectStoreBuckets } from "../../constants"
3
3
  import fs from "fs"
4
4
  import { objectStore } from "@budibase/backend-core"
@@ -6,6 +6,10 @@ import { resolve } from "../centralPath"
6
6
  import env from "../../environment"
7
7
  import { TOP_LEVEL_PATH } from "./filesystem"
8
8
 
9
+ export function devClientLibPath() {
10
+ return require.resolve("@budibase/client")
11
+ }
12
+
9
13
  /**
10
14
  * Client library paths in the object store:
11
15
  * Previously, the entire client library package was downloaded from NPM
@@ -89,9 +93,10 @@ export async function updateClientLibrary(appId: string) {
89
93
  let manifest, client
90
94
 
91
95
  if (env.isDev()) {
96
+ const clientPath = devClientLibPath()
92
97
  // Load the symlinked version in dev which is always the newest
93
- manifest = require.resolve("@budibase/client/manifest.json")
94
- client = require.resolve("@budibase/client")
98
+ manifest = join(path.dirname(path.dirname(clientPath)), "manifest.json")
99
+ client = clientPath
95
100
  } else {
96
101
  // Load the bundled version in prod
97
102
  manifest = resolve(TOP_LEVEL_PATH, "client", "manifest.json")
@@ -4,9 +4,11 @@ import { budibaseTempDir } from "../budibaseDir"
4
4
  import { join } from "path"
5
5
  import env from "../../environment"
6
6
  import tar from "tar"
7
+ import environment from "../../environment"
7
8
  const uuid = require("uuid/v4")
8
9
 
9
- export const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
10
+ export const TOP_LEVEL_PATH =
11
+ environment.TOP_LEVEL_PATH || join(__dirname, "..", "..", "..")
10
12
 
11
13
  /**
12
14
  * Upon first startup of instance there may not be everything we need in tmp directory, set it up.